OI 笑传 #13

news/2025/10/1 15:30:42/文章来源:https://www.cnblogs.com/hm2nsite/p/19122471

今天是思维题大手子。

CF2130B

左转这个东西很烦,把它规约掉。

由于是一定要到 \(n\) 的,因此左转之后必须要右转,考虑单位元,也就是左走一格之后往右走一格是怎么个事。也就是多加一倍这两个格子里的数。

考虑这两个格子的组合,就只有 \([0,1],[1,1],[1,2],[2,2]\),相当于我们一次走到头之后,可以从中间选择一些两个格子来回走,让数字和 \(+1,+2\) 或者 \(+3\)

于是一定不能让 \(0,1\) 挨一块,不然怎么样都可以凑。

但是这样之后 \(+2,+3\) 的区段一定是存在的,因为题目保证至少包含各一个 \(0,1,2\)

于是不能凑出的情况就是我们一次走到头之后差值不是 \(2\)\(3\) 的倍数。\(000022221111\) 这样构造即可。

code

Show me the code
#define psb push_back
#define mkp make_pair
#define ls p<<1
#define rs (p<<1)+1
#define rep(i,a,b) for( int i=(a); i<=(b); ++i)
#define per(i,a,b) for( int i=(a); i>=(b); --i)
#define rd read()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){ll x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}
const int N=1e4+4;
bool ql[N];
void solve(){int n,s;cin>>n>>s;vector<int> vc;int ct[5];memset(ct,0,sizeof ct);vc.clear();int sum=0;for(int i=1;i<=n;i++){int x;cin>>x;ct[x]++;sum+=x;vc.push_back(x);}if(sum>s){for(int v:vc)cout<<v<<' ';cout<<'\n';return ;}if(sum==s){cout<<-1<<'\n';return ;}int delta=s-sum;if(ql[delta]){cout<<-1<<'\n';return ;}else{for(int i=1;i<=ct[0];i++)cout<<0<<' ';for(int i=1;i<=ct[2];i++)cout<<2<<' ';for(int i=1;i<=ct[1];i++)cout<<1<<' ';cout<<'\n';}return ;  
}
int main(){ql[2]=1;ql[3]=1;for(int i=1;i<=5000;i++){if(ql[i])ql[i+2]=ql[i+3]=1;}int t;cin>>t;while(t--){solve();}return 0;
}

CF2129A

注意到让 \(g(S')=0\) 是容易的,就是找到一个建好的图上的生成树。

然后注意到在题设里面成环这种东西很唐是因为这相当于把值域盖了两次。

于是猜一下我们在让 \(g(S')=0\) 的时候最大化 \(f(S')\) 就是对的,最大化 \(f\) 的方法是最大生成树。

交了下发现猜的是对的。

code

Show me the code
#define psb push_back
#define mkp make_pair
#define ls p<<1
#define rs (p<<1)+1
#define rep(i,a,b) for( int i=(a); i<=(b); ++i)
#define per(i,a,b) for( int i=(a); i>=(b); --i)
#define rd read()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){ll x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}
const int N=6000;
struct e{int u,v,w,id;
}ek[N];
bool cmp(e x,e y){return x.w>y.w;
}
int fa[N];
int _find(int u){return u==fa[u]?u:fa[u]=_find(fa[u]);}
void solve(){memset(ek,0,sizeof ek);int n;cin>>n;for(int i=1;i<=n;i++){int a,b;cin>>a>>b;ek[i]={a,b,abs(a-b),i};}sort(ek+1,ek+1+n,cmp);for(int i=1;i<=2*n;i++)fa[i]=i;vector<int> ans;for(int i=1;i<=n;i++){int t1=_find(ek[i].u),t2=_find(ek[i].v);if(t1==t2)continue;ans.push_back(ek[i].id);fa[t1]=t2;}cout<<ans.size()<<'\n';sort(ans.begin(),ans.end());for(int v:ans)cout<<v<<' ';cout<<'\n';return ;
}
int main(){int t;cin>>t;while(t--){solve();}  return 0;
}

CF2129B

很好的题,仍然考虑单位元。

我们从小到大考虑这些数,原因是一个数如果尽可能小或者尽可能大,它进行 \(2\times n-i\) 的变换的变化量也是最大的,之后对其他比它大的元素变换,不会改变这两个数之间的关系(是或者不是逆序对)。

举例子,假设 \(n=5,a_1=2,a_2=4\),我们钦定 \(a_1=2\) 是最优的。

此时,若你再去考虑 \(a_2\),你会发现无论取 \(a_2=4\) 还是 \(a_2=6\)\(a_1,a_2\) 永远不会再变成逆序对。

也就是说,这样考虑是没有后效性的。

于是我们可以轻易统计出变换还是不变换一个数对逆序对数量的贡献,取最小值加入答案即可。

code

Show me the code
#define psb push_back
#define mkp make_pair
#define ls p<<1
#define rs (p<<1)+1
#define rep(i,a,b) for( int i=(a); i<=(b); ++i)
#define per(i,a,b) for( int i=(a); i>=(b); --i)
#define rd read()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){ll x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}
const int N=6000;
int a[N];
void solve(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i]; int ans=0;for(int i=1;i<=n;i++){int p=0;for(int j=1;j<=n;j++){if(i==a[j]){p=j;break;}}int up=0,dn=0;for(int j=1;j<p;j++){if(a[j]>i)up++;}for(int j=p+1;j<=n;j++){if(a[j]>i)dn++;}ans+=min(up,dn);}cout<<ans<<'\n';
}
int main(){int t;cin>>t;while(t--){// init();solve();}return 0;
}

CF2119D

也是好题,需要一些关键的转化,但是这种转化看起来比较公式啊,之前没见过导致的。

发现对着一个 \(a\)\(f(a)\) 非常恶心,于是从一种移除点的方式入手去构造 \(a\),就是考虑算贡献。

考虑一个长为 \(n\) 的序列 \(p\) 来表示我们移除点的顺序,因为题目中并未要求将全部点移除,因此我们用 \(p_i=0\) 来表示我们在第 \(i\) 次操作中没有移除任何点。

由题目中对 \(a\) 的限制,这个排列应满足 \(0\le p_i\le i\),且不为零的 \(p_i\) 应互不相同,因为你不能把一个位置移除两次。

这样,我们可以找到所有删除序列为 \(p\)\(a\) 的数量,也就是简单的将所有不为 \(0\)\(p_i\) 相乘。这个应该很容易理解。这样,这个 \(p\) 会在每一个 \(a\)\(f(a)\) 中贡献一次。定义所有删除序列为 \(p\)\(a\) 的数量为排列 \(p\) 的权值。

于是我们只需要统计出所有满足条件的 \(p\) 的权值和就可以了。这个东西是好 DP 的。

\(f_{i,j}\) 表示前 \(i\)\(a_i\) 删了 \(j\) 个位置的权值和。

\(p_i=0\) 时,也就是不删点,有 \(f_{i,j} \leftarrow f_{i-1,j}\)

\(p_i \ne 0\) 时,我们前面已经删了 \(j-1\) 的点,此时我们能删的位置还有 \(i\) 个,我们在这一次能删的地方还有 \(i-j+1\) 个。

但这样统计权值就不好办了,因为我们不确定要删的是哪个数。

我们再进行一步转化,令 \(f_{i,j}\) 表示考虑了后 \(n\sim i\) 个位置,删了 \(j\) 个位置的权值和。

为什么现在要从后往前考虑呢,因为能把 \(i\) 位置删了的 \(p\) 只能是 \(p_i\sim p_n\)

若我们决策删掉 \(i\),也就是说我们要把 \(i\) 塞到 \(p_i\sim p_n\) 的一个里面,会对答案产生 \(i\) 的贡献。但是由于我们已经给 \(j-1\)\(p\) 塞过不为零的值了,还能给 \(n-i+1-(j-1)\) 个为 \(0\) 的位置塞。于是 \(f_{i,j} \leftarrow f_{i+1,j-1}\times (n-i+1-(j-1)) \times i\)

若我们决策不删 \(i\),也就是说我们要把 \(0\) 塞到 \(p_i\sim p_n\) 的一个里面,不会对答案产生贡献,于是 \(f_{i,j} \leftarrow f_{i+1,j}\)

初始值是 \(f_{n,0}=1,f_{n,1}=n\),答案是 \(\sum_{i=0}^{n} f_{1,i}\),因为没有要求全删完。

如此转移即可。代码挺短的。

code

Show me the code
#define psb push_back
#define mkp make_pair
#define ls p<<1
#define rs (p<<1)+1
#define rep(i,a,b) for( int i=(a); i<=(b); ++i)
#define per(i,a,b) for( int i=(a); i>=(b); --i)
#define rd read()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){ll x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}
const int N=5005;
int dp[N][N];
int n,m;
void init(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)dp[i][j]=0;}return ;
}
void solve(){cin>>n>>m;dp[n][0]=1;dp[n][1]=n;for(int i=n-1;i>=1;i--){for(int j=0;j<=n-i+1;j++){if(j==0){dp[i][j]=dp[i+1][j];continue;}dp[i][j]=(1ll*dp[i+1][j-1]*((n-i+1)-(j-1))%m*i%m+dp[i+1][j])%m;}}ll ans=0;for(int i=0;i<=n;i++){ans=(ans+dp[1][i])%m;}cout<<ans<<'\n';
}
int main(){int t;cin>>t;while(t--){init();solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

*补*““逆元求组合数”(费马小定理

组合数快速求法 #include <bits/stdc++.h> #define ll long long #define MAXN 1010 using namespace std; namespace SHuxinn{ll pri[MAXN];ll ni[MAXN];ll ans1 , ans2;ll pow(ll a , ll b){ll ans = 1 , base…

C# WPF中Binding的 Source属性和ElementName属性有什么区别

好的,这是一个WPF数据绑定中非常核心和常见的问题。Source 和 ElementName 都是用来设置绑定源(即数据的来源)的属性,但它们的应用场景和灵活性有显著区别。 下面通过一个对比表格和详细解释来说明它们的区别。 核…

Typora to Obsidian 迁移助手 (Typora-to-Obsidian-Migration-Helper)

一个交互式的、基于状态机模式的 Python 脚本,旨在帮助用户安全、高效地将 Typora 笔记库迁移至 Obsidian。它将多个繁琐的手动步骤整合为一个自动化的、可控的流程。本脚本基于历史文章中模块程序组合而成,能够实现…

网站怎么做关键词搜索网站建设 无法打开asp

发送报文处理 增加一个功能码映射关系 //功能码映射关系public readonly Dictionary<string, byte> ReadFuncCodes = new Dictionary<string, byte>();<

二七网站建设网站分析与优化

每当MyBatis设置PreparedStatement的参数或从ResultSet中检索值时&#xff0c;都会使用TypeHandler以适合Java类型的方式来检索值。下表描述了默认的TypeHandlers。 自MyBatis 3.4.5版本起&#xff0c;默认支持JSR-310&#xff08;日期和时间API&#xff09;。 Type HandlerJ…

台州网站建设技术支持网站上的3d产品展示怎么做

目录 一、压力的方向(FORCE) 1、为正的情况 2、为负的情况 二、压强的方向(PRESSURE)

深入解析:【APK安全】敏感数据泄漏风险与防御指南

深入解析:【APK安全】敏感数据泄漏风险与防御指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

大型网站建设与维护过程学做家常菜的网站有哪些

1、过期删除策略 1.1、介绍 Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将已过期的键值对删除&#xff0c;而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时&#xff0c;Redis 会把该 key 带上过期时间存储到一个过期字典…

网站设置密码最近韩国电影片

标题&#xff1a;递增三元组 给定三个整数数组 A [A1, A2, … AN], B [B1, B2, … BN], C [C1, C2, … CN]&#xff0c; 请你统计有多少个三元组(i, j, k) 满足&#xff1a; 1 < i, j, k < NAi < Bj < Ck 【输入格式】 第一行包含一个整数N。 第二行包含N个整…

详细介绍:开源 java android app 开发(十七)封库--混淆源码

详细介绍:开源 java android app 开发(十七)封库--混淆源码2025-10-01 15:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

Meta基础设施演进与AI技术革命

本文详细介绍了Meta从传统社交网络基础设施向AI驱动架构的演进历程,涵盖分布式系统构建、GPU集群扩展、自研芯片开发、散热解决方案等关键技术挑战与创新突破。Meta基础设施演进与AI时代 在过去的21年里,Meta从连接美…

完整教程:Spring AI整合聊天模型DeepSeek

完整教程:Spring AI整合聊天模型DeepSeekpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025 年焚烧炉厂家 TOP 企业品牌推荐排行榜!权威甄选实力与口碑俱佳的江苏焚烧炉 / 无锡焚烧炉推荐这十家公司!

随着工业领域的快速发展,危险废物、工业废弃物的产生量持续增加,焚烧炉作为实现废弃物减量化、无害化处理的关键设备,其市场需求不断攀升。但当前焚烧炉行业面临诸多问题,部分厂家缺乏核心技术,设备排放难以达到环…

2025 年防腐涂料厂家 TOP 企业品牌推荐排行榜,乙烯基、环氧煤沥青、环氧防腐涂料、防腐涂料地坪 、防腐涂料水池推荐这十家公司!

在当前工业生产、建筑工程、石油化工等众多领域,防腐涂料扮演着至关重要的角色,它能有效延长设施设备的使用寿命,降低维护成本。然而,如今防腐涂料行业市场鱼龙混杂,产品质量参差不齐,不同品牌的技术水平、产品性…

Mysql DBA学习笔记(主从复制) - 实践

Mysql DBA学习笔记(主从复制) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

网站中文章内图片做超链接wordpress微信登录页面模板

日志只有这一行&#xff0c;比较难排查 排查途径&#xff1a; 1、从上图找到唯一的文件输出output.js&#xff0c;断点查看堆栈信息&#xff0c;如下图&#xff0c;可以看到这个错误是由于哪个文件引起的 以为从App.vue中定位到原因了&#xff0c;其实也不对&#xff0c;继续…

百度注册网站网站字体大小合适

文章目录 Redis主从部署1.下载安装Redis2.单点双副本主从配置1.修改配置信息2.修改配置文件redis.conf3.拷贝配置文件到每一个实例文件夹里4.修改每一个实例的端口和工作目录5.配置主从关系6.检查效果 3.哨兵模式监控主从1.创建实例目录2.复制配置文件并进行修改3.启动并测试 4…

2025双氧水厂家权威推荐榜:优质供应与专业定制实力之选

2025双氧水厂家权威推荐榜:优质供应与专业定制实力之选 在当今精细化工与工业制造领域,双氧水作为重要的基础化学品,其品质稳定性和供应专业性直接影响着下游产业的生产效率与产品质量。随着环保要求的日益严格和应…

Win环境下包管理工具

目录1 Win下包管理工具1.1 简介1.2 winget1.2.1 简介1.2.2 操作使用1.2.3 安装指定盘1.2.4 软件源来源&加速1.2.4.1 软件源1.2.4.2 加速1.3 Scoop1.3.1 简介1.3.2 操作&安装1.3.3 常用命令1.3.4 软件源来源&am…

那个公司做网站制作图

基站即公用移动通信基站&#xff0c;是无线电台站的一种形式&#xff0c;是指在一定的无线电覆盖区中&#xff0c;通过移动通信交换中心&#xff0c;与移动电话终端之间进行信息传递的无线电收发信电台。 目前&#xff0c;在 5G时代 &#xff0c;“ 宏基站 为主&#xff0c; 小…