Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)
题目链接: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)的更多相关文章
- 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 ...
- D. Huge Strings Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)
http://codeforces.com/contest/868/problem/D 优化:两个串合并 原有状态+ 第一个串的尾部&第二个串的头部的状态 串变为第一个串的头部&第二个 ...
- 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个由两个字符组成的字符串 ...
- 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 ...
- Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2)
第一次参加cf的比赛 有点小幸运也有点小遗憾 给自己定个小目标 1500[对啊我就是很菜qvq A. The Rank 难度:普及- n位学生 每个学生有四个分数 然鹅我们只需要知道他的分数和 按分数 ...
- 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 ...
- Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) E. The Supersonic Rocket
这道题比赛之后被重新加了几个case,很多人现在都过不了了 算法就是先求凸包,然后判断两个凸包相等 我们可以吧凸包序列化为两点距离和角度 角度如果直接拿向量的叉积是不对的,,因为钝角和锐角的叉积有可能 ...
- 【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 ...
- Qualification Rounds(Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)+状态压缩)
题目链接 传送门 题意 现总共有\(n\)个题目\(k\)支参赛队伍,已知每个题目各队伍是否会写,现问你能否从题目中选出一个子序列使得每支队伍最多只会写一半的题目. 思路 对于每个题目我们用二进制压缩 ...
- 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 ...
随机推荐
- Python 在PDF中绘制线条、矩形、椭圆形
在PDF中绘制图形可以增强文档的视觉效果.通过添加不同类型的形状,如实线.虚线.矩形.圆形等,可以使文档更加生动有趣,提高读者的阅读兴趣.这对于制作报告.演示文稿或是教材特别有用.本文将通过以下几个示 ...
- 8、tnsnames文件配置
监听的配置文件 2.tnsnames.ora文件 tnsnames.ora文件:客户端的 配置tnsnames.ora监听文件 1.使用netca命令 指定图像映射机器 [oracle@db11g a ...
- linux history 想显示历史命令的时间和作者
vi ~/.profile 增加 HISTTIMEFORMAT="%F %T `whoami` `who am i|awk '{print $1,$5}'|sed 's/ (/@/'|sed ...
- Tomcat并发数优化的方法总结
web应用的并发提升,除了负载均衡.在小企业中也可以通过一些软件的上的设置来进行一些优化.下面是一些在服务器上修改tomcat参数的优化方法,非常简单实用!(这些方法通过网络整理的) 1,让Tomca ...
- elementUI中的级联选择器,默认赋值不起作用
今天遇到再使用element的级联选择器功能的时候,是多选,默认赋值不起作用. 后来查到是因为少了multiple属性,但是multiple属性要放在props绑定的对象中,而不是直接放在标签上 &l ...
- 2022-2023 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2022)
F. Foreign Football 一共有\(n\)支队伍,每支队伍的名称为\(s_i\),给定一个\(n \times n\)的矩阵,\(a_{i,j}\)代表第\(i\)支队伍和第\(j\)支 ...
- Educational Codeforces Round 102 (Rated for Div
Educational Codeforces Round 102 (Rated for Div. 2) No More Inversions 给定\(k\),序列\(a\)长度为\(n\):\(1,2 ...
- feign 使用
feign 是netflix 提供的申明式的httpclient调用框架 整合方法 1.添加依赖 <dependency> <groupId>org.springframewo ...
- 算法(第四版)C# 习题题解——3.2
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...
- openEuler欧拉配置MySQL8的MGR单主双从
一. 系统优化(三个节点全部操作) 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 关闭selinux echo "S ...