题目链接:Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)

总结:Bwa两发,C读假题。发挥很一般,补题感觉到E都是能做的,红温。

A. Diverse Game

fag:签到

B. Fun Game

fag:位运算 + 思维

Description:给定一个两个\(01\)字符串\(s, t\),对于\(s\),每次可以选择一个区间\(l, r\),令\(s_i \wedge s_{i - l + 1}\)替换\(s_i, l <= i <= r\)。问能否将

\(s\)转化为\(t\)。

Solution:1与(0, 1)异或会将其改变, 0与任何数异或为0

  • 那么假设\(s\)串中第一个不同的位置前面有\(1\),那么后面的数都可以与这个数异或,从而变得相等。如果没有但是\(s_i\)是

    \(1\),则可以自己变为\(0\),或者不行。
  • 即看\(s,t\)串中谁先出现\(1\),因为后面的数可以依靠的数改变。

Competing:有点慌乱,乱交了两发。难绷

void solve() {
int n;
cin >> n; string s, t;
cin >> s >> t; for (int i = 0; i < n; i++) {
if (s[i] == '1') {
cout << "Yes\n";
return;
}
if (t[i] == '1') {
cout << "No\n";
return;
}
}
cout << "Yes\n";
}

C. Hungry Games

fag: 前缀和 + 二分

Description:给定\(n\)个数和一个\(x\)。选择一个区间\(l, r\),玩家的毒性\(g\),初始为\(0\),首先\(g += a_i\);如果\(g <= x\)游戏继续,否则\(g = 0\),游戏继续。求有多少个子区间使玩家毒性最终不为\(0\)。

Solution:一般求区间个数,我会考虑前缀和或者双指针,因为所求区间个数往往很大。

  • 我们简单模拟下,开始\(g\)不断增大,然后变为\(0\),然后再增大。那么对于变为\(0\)之后再增大这部分是不是等价于以这个位置为起点,进行相同的操作。显然我们暴力求解会计算很多相同的状态,考虑优化。
  • 我们用\(cnt[i]\)表示以这个点为起点的方案数。那么\(cnt[i] = (j - i) + cnt[j + 1]\),其中\(j\)是变为\(0\)的位置。
  • 我们需要用后面的位置更新前面的位置,所以我们从后面开始计算。那么怎么计算\(j\)的位置呢?因为\(g\)是递增的,考虑二分。
void solve(){
int n, x;
cin >> n >> x;
vector<int> a(n + 5, 1e18), s(n + 5, 1e18); s[0] = 0;
for (int i = 1; i <= n; i ++){
cin >> a[i];
s[i] = s[i - 1] + a[i]; // 前缀和
} vector<int> cnt(n + 5);
LL ans = 0;
for (int i = n; i; i --){
// 我们从后往前计算答案,cnt[i]表示以i为起点有多少符合条件的子串
// 我们从i点开始找到第一个不符合条件的点(第一个子串的结尾)
int idx = lower_bound(s.begin(), s.end(), s[i - 1] + x + 1) - s.begin();
// 但是它在idx处清0了,因此从idx + 1起又开始从新计算答案(但是我们已经记录下来了)
cnt[i] += cnt[idx + 1] + (idx - i);
ans += cnt[i];
}
cout << ans << endl;
}

D. Funny Game

fag:并查集 + 鸽巢原理

Solution:给定\(n\)个数,有\(n - 1\)操作,每次操作可以选择两个数\(a_u, a_v\),满足\(|a_u - a_v|\)被\(x\)整除(假设这是第\(x\)次操作)然后将这两个点相连,问最后能否形成一个连通图,如果能给出操作序列。

Description:样例全是\(Yes\),考虑是否一定有解。然后从后往前操作比从前往后操作更优(可能满足后面操作的数被前面选中)。假设当前有\(n\)个数,对\(n - 1\)取余后,根据鸽巢原理一定有两个数余数相等。因此能够选出符合条件的数。然后将这两个数合并,还剩\(n - 1\)个数,对\(n - 2\)取余,同理是有解的。

  • 考虑每次如何保证每次取的数是两个不同的连通块,使用并查集维护信息,每次只取代表节点即可(\(f[x] == x\))。
int f[N];

void init(){
for (int i = 0; i < N; i ++)
f[i] = i;
} int find(int x){
if (x != f[x])
f[x] = find(f[x]); return f[x];
} bool merge(int x, int y){
int fx = find(x), fy = find(y);
if (fx == fy)
return false; f[fx] = fy;
return true;
} void solve(){
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i ++){
cin >> a[i];
} vector<pii> ans(n);
for (int i = n - 1; i; i --){
vector<int> p(n, -1);
for (int j = 1; j <= n; j ++){
if (find(j) == j){
int r = a[j] % i;
if (p[r] != -1){
merge(p[r], j);
ans[i] = {p[r], j};
break;
}
else
p[r] = j;
} }
}
cout << "Yes\n";
for (int i = 1; i < n; i ++){
cout << ans[i].fi << " " << ans[i].se << endl;
} }

E. Wooden Game

fag:贪心 + 二进制

Description:有\(k\)棵树,每次操作可以任意删去一颗子树,可以操作任意次。求删去子树大小按位或的最大值。

Solution:题目求按位或的最大值,我们显然要想到位运算。

  • 对于每一棵树,如果他的大小为\(a_i\),那么我们可以取\([0, a_i]\)的任意一个值出来运算,只需要删去一定数量的叶子节点。

  • 等价于每个数的可以为\([0, a_i]\),求它们异或的最大值。

  • 我们从最高位开始一位一位看,如果该位有两个数都是\(1\),那么该位可以取\(1\),后面的所有位都可以取\(1\)。将其中一个数减\(1\)即可。

  • 该位只有一个数为\(1\),那么该位取\(1\)。

void solve(){
cin >> n; vector<int> a(n);
vector<int> cnt(32);
for (int i = 0; i < n; i ++){
cin >> a[i];
for (int j = 0; j < a[i] - 1; j ++){
int x;
cin >> x;
}
for (int j = 31; ~j; j --){
if ((a[i] >> j) & 1)
cnt[j] ++;
}
} int ans = 0;
for (int i = 31; ~i; i --){
if (cnt[i] >= 2){
ans |= (1LL << (i + 1)) - 1;
break;
}
else if (cnt[i]){
ans |= 1LL << i;
}
} cout << ans << endl;
}

Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)的更多相关文章

  1. E. The Supersonic Rocket Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2)

    http://codeforces.com/contest/1017/problem/E 凸包模板+kmp #include <cstdio> #include <cstdlib&g ...

  2. D. Huge Strings Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)

    http://codeforces.com/contest/868/problem/D 优化:两个串合并 原有状态+ 第一个串的尾部&第二个串的头部的状态 串变为第一个串的头部&第二个 ...

  3. Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)

    A. Bark to Unlock 题目链接:http://codeforces.com/contest/868/problem/A 题目意思:密码是两个字符组成的,现在你有n个由两个字符组成的字符串 ...

  4. Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combine

    最近只想喊666,因为我是真得菜,大晚上到网吧打代码还是很不错的嘛 A. Bark to Unlock time limit per test 2 seconds memory limit per t ...

  5. Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2)

    第一次参加cf的比赛 有点小幸运也有点小遗憾 给自己定个小目标 1500[对啊我就是很菜qvq A. The Rank 难度:普及- n位学生 每个学生有四个分数 然鹅我们只需要知道他的分数和 按分数 ...

  6. Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) G. The Tree

    G. The Tree time limit per test 3 seconds memory limit per test 256 megabytes input standard input o ...

  7. Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) E. The Supersonic Rocket

    这道题比赛之后被重新加了几个case,很多人现在都过不了了 算法就是先求凸包,然后判断两个凸包相等 我们可以吧凸包序列化为两点距离和角度 角度如果直接拿向量的叉积是不对的,,因为钝角和锐角的叉积有可能 ...

  8. 【Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) D】The Wu

    [链接] 我是链接,点我呀:) [题意] 给你n个字符串放在multiset中. 这些字符串都是长度为m的01串. 然后给你q个询问 s,k 问你set中存在多少个字符串t 使得∑(t[i]==s[i ...

  9. Qualification Rounds(Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)+状态压缩)

    题目链接 传送门 题意 现总共有\(n\)个题目\(k\)支参赛队伍,已知每个题目各队伍是否会写,现问你能否从题目中选出一个子序列使得每支队伍最多只会写一半的题目. 思路 对于每个题目我们用二进制压缩 ...

  10. Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A,B,C【真的菜·】

    8说了 #include<bits/stdc++.h> using namespace std; #define int long long signed main(){ string s ...

随机推荐

  1. Air780E的I2C软件使用指南

    ​ 今天我们学习合宙低功耗4G模组Air780E的I2C接口操作方法,文末[阅读原文]获取最新资料. 一.I2C概述 Air780E可支持1路I2C接口,如果复用的话最多有两路: ​ I2C配置: 兼 ...

  2. SAX,DOM,JAXP,JDOM,DOM4J比较分析

    第一:首先介绍一下SAX,DOM,JAXP,JDOM,DOM4J的基本知识:(注意:至于 JAXP JAXB JAXM JAXR JAX-RPC 分别指什么,查看http://gceclub.sun. ...

  3. 在vue中使用html2canvas生成图片

    首先,在vue中引入html2canvas,执行命令 npm install --save html2canvas 然后在需要生成图片的页面中引入 import html2canvas from 'h ...

  4. Docker之磁盘清理

    Docker 很占用空间,每当我们运行容器.拉取镜像.部署应用.构建自己的镜像时,我们的磁盘空间会被大量占用. 如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何 ...

  5. 使用redis 的订阅服务

    1.业务使用场景 我们在使用表单动态添加字段,如果新增字段,再保存数据,这个时候就会出错,出错的原因是seata 再本地缓存元数据,修改物理表的时候,这个元数据并没有发生变化,因此需要刷新元数据,因为 ...

  6. TypeScript 笔记(一)

    1. TypeScript 的介绍 完整教程TypeScript 入门教程 TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准,由微软开发的自由和开源的编 ...

  7. Mysql的个人习惯

    一定要有主键 一般使用的innodb引擎中会根据主健创建聚簇索引,这种方式会使得数据排列的更连续,减少随机IO 关于数据长度 考虑数据范围,够用的前提下,数据长度是越简单越好,数据类型是越小越好. 尽 ...

  8. 【报错解决】使用代理后从Github中clone仓库报错

    当电脑使用代理后,会造成Github的clone和push等功能无法正常使用 报错内容:Failed to connect to github.com port 443 after ***** ms: ...

  9. element 表格增加多选框 ,增加多选

    1. el-table 增加如下代码,就会出现多选框 <el-table-column type="selection" class="checkbox-inp&q ...

  10. linux 安装navicat16-premium-cs 并破解

    https://ylyhappy.gitee.io/posts/linux/install-navciat.html #破解navicat16 使用 navicat-keygen for linux ...