[Codeforces] Round #779 (Div. 2) A~D1

image

A. Marin and Photoshoot

题目链接

题意

给出一个01串,可以在其中添加若干1,使得任意区间内, 0的个数不超过1的个数。

思路

原字符串有00的地方插入11
原字符串有010的地方插入1

代码

void solve() { int n; cin >> n; cin >> a; vector<char> v; v.push_back(a[0]); for(int i = 1; i < n; i ++) { if(a[i - 1] == '0' && a[i] == '0') { v.push_back('1'); v.push_back('1'); } else if(a[i - 1] == '0' && a[i] == '1' && a[i + 1] == '0') { v.push_back('1'); } } cout << v.size() - 1<< endl; }

B. Marin and Anti-coprime Permutation

题目链接

题意

求有多少种排列,满足gcd(1*p1, 2*p2, 3*p3,...,n*pn) > 1

思路

排列组合
n为奇数时无解
n为偶数时,每一个奇数位的地方只能放偶数,每一个偶数位的地方只能放奇数,就有((n/2)!)^2

代码

void solve() { int n; cin >> n; if(n % 2 == 1) { cout << 0 << endl; } else { ll tmp = 1; for(int i = 1; i <= n / 2; i ++) { tmp *= i; tmp %= mod; tmp *= i; tmp %= mod; } ll ans = 0; cout << tmp % mod << endl; } }

C. Shinju and the Lost Permutation

题目链接

题意

对于一个全排列p,有以下定义
1、p的前缀最大值b,bi=max(a1,a2...an)
2、p的幂为当前b序列里有多少个不同的元素
3、滚动,即把最后一个数放到第一个,后面的往后放
现在有一个长度为n的C序列,ci代表第i-1操作后p的幂,问是否存在一个由p构成的a序列符合条件

思路

首先对于C序列,肯定只有一个Ci=1,代表a序列滚动到这时的第一个元素是最大的
从这个1的位置往后滚动,只有三种情况,b序列增加一个不同的元素,或者b序列的不同元素减少(减少的数量任意,但是不能减少到1),或者b序列的不同元素数量不变,这些情况都是合理的
所以只需要判一下从1的位置开始往后,是否出现增加了两个及以上的不同元素即可,再特判一下出现多个1的情况

代码

void solve() { int n; cin >> n; bool fg = false; vector<int> c; int x, pos; for(int i = 1; i <= n; i ++) cin >> x, c.push_back(x); for(int i = 0; i < n; i ++) { if(c[i] == 1 && !fg) pos = i, fg = true; else if(c[i] == 1 && fg) { cout << "NO" << endl; return; } } if(!fg) { cout << "NO" << endl; } else { rotate(c.begin(), c.begin() + pos, c.end()); for(int i = 1; i < n; i ++) { //cout << c[i] << " "; if(c[i] - c[i - 1] > 1) { cout << "NO" << endl; return; } } cout << "YES" << endl; } }

D1. 388535 (Easy Version)

题目链接

题意

对于题目给定的A序列,问是否有一个x可以将(0~r)的排列转变成A序列,即Ai=Bi^x

思路

拆分成每一位来考虑
首先对于B排列,每一位上的0和1的数量都是固定的,那^x后,如果x的这一位是1,就会将B排列的这一位上的1和0的数量交换
如果x的这一位是0,那B排列的这一位上的1和0的数量就保持不变
而且B排列是从0~r,每一位上的0的数量肯定大于等于1的数量
所以就可以直接统计A序列里每一位上的1和0的数量,如果出现1的数量大于0的数量,就代表x的这一位是1,发生了数量交换

代码

void solve() { int l, r; cin >> l >> r; memset(nice, 0, sizeof nice); for(int i = l; i <= r; i ++) { cin >> a[i]; } ll ans = 0; for(int i = 0; i < 19; i ++) { for(int j = l; j <= r; j ++) { if((a[j] >> i) & 1) nice[i] ++; else nice[i] --; } if(nice[i] > 0) ans += 1 << i; } cout << ans << endl; }

__EOF__

本文作者ZIENxc
本文链接https://www.cnblogs.com/ZIENxc/p/16066480.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   行舟C  阅读(165)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示