Codeforces Round 895 (Div. 3) A ~ F

Dashboard - Codeforces Round 895 (Div. 3) - Codeforces

A

问多少次能使a 和 b相等,就是abs(a - b) / 2除c向上取整,也就是abs(a - b)除2c向上取整。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;void solve()
{int a, b, c;cin >> a >> b >> c;a = abs(a - b), c *= 2;cout << (a + c - 1) / c << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

真是一篇好阅读理解,读了好久

就是说陷阱会在踩到后经过s秒触发,触发后不能通过,最少往前走d + s / 2(向上取整)格子后就回不来了,把所有的d + s / 2比较取最小值然后减一就是答案。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;void solve()
{int n;cin >> n;int ans = 2e9;for(int i = 0; i < n; i ++){int a, b;cin >> a >> b;a = a + (b + 1) / 2;ans = min(ans, a);}cout << ans - 1 << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

 C

如果是>2的偶数的话,x - 2和x就是一组解

如果l == r且l是奇数的话,可以求l的因子,设因子为d,x - d 和 d 都可以被d整除,这样也可以求出一组解

之后注意一些边界条件就好了。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;void solve()
{int l, r;cin >> l >> r;if(r < 4){cout << -1 << endl;return;}if(r % 2 && l == r){for(int i = 2; i * i <= l; i ++){if(l % i == 0){cout << l - i << ' ' << i << endl;return;}}cout << -1 << endl;return;}if(r % 2){cout << r - 3 << ' ' << 2 << endl;}else cout << r - 2 << ' ' << 2 << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

 贪心。

设lcm为x和y的最大公倍数,lcm的倍数的位置有重合,先加后减等于零,在这里操作是没意义的。

加操作有意义的点的数量:n / x - n / lcm

减操作有意义的点的数量:n / y - n / lcm

加的话从n开始加,依次递减n-1、n-2这样

减的话从1开始加,依次递增2、3这样。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;void solve()
{ll n, x, y;cin >> n >> x >> y;ll gcd = __gcd(x, y);ll lcm = x * y / gcd;ll a = n / x - n / lcm, b = n / y - n / lcm;a = a * (2 * n - a + 1) / 2;b = b * (b + 1) / 2;cout << a - b << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

E

 前缀和。

 做出这道题需要了解的两个性质:

1. x ^ x = 0;

2. 0 ^ x = x;

根据这两条性质我们就可以求出任意一段连续区间的异或和,使用前缀数组实现,用b[]表示

b[n]表示从第一项异或到第n项

b[r] ^ b[l - 1]就等于 b[l - 1] ^ b[l] ^ ... ^ b[r] ^ b[l - 1] = b[l] ^ ... ^ b[r];

 对于第一个操作,区间修改,如果一个数x的对应位置上的树为1,被修改后变成0,就相当于x没被启用,变成0了,就相当于异或x本身,

如果一个数x的对应位置上的树为0,被修改后变成1,就相当于x被启用了,变成了1,也相当于异或x本身。

先用一个ans计算出被启用的数的异或和,之后每进行一次区间修改就相当于异或一遍这个区间内的异或和,非常的easy。

然后第二个操作,如果是查1,直接输出ans就好了

如果是查2,输出前n项异或前缀和异或ans就好了

听说有人线段树过了,挺nb的,之后再学一学。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;int a[N], b[N];void solve()
{int n;cin >> n;for(int i = 1; i <= n; i ++){cin >> a[i];b[i] = b[i - 1] ^ a[i]; }string s;cin >> s;s = ' ' + s;int ans = 0;for(int i = 1; i <= n; i ++){if(s[i] == '1'){ans ^= a[i];}}int Q;cin >> Q;while(Q --){int op;cin >> op;if(op == 1){int l, r;cin >> l >> r;int res = b[r] ^ b[l - 1];ans ^= res;}else{int x;cin >> x;if(x == 1)cout << ans << ' ';else cout << (b[n] ^ ans) << ' ';}}cout << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

赛后学的线段树做法:

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;int n;
int a[N];
string s;
struct Node
{int l, r;int sum0, sum1;int f;
}tr[N * 4];void pushup(int u)
{tr[u].sum0 = tr[u << 1].sum0 ^ tr[u << 1 | 1].sum0;tr[u].sum1 = tr[u << 1].sum1 ^ tr[u << 1 | 1].sum1;
}void pushdown(int u)
{Node &root = tr[u], &left = tr[u << 1], &right = tr[u << 1 | 1];if(tr[u].f){swap(left.sum0, left.sum1);swap(right.sum0, right.sum1);left.f ^= tr[u].f;right.f ^= tr[u].f;tr[u].f = 0;}
}void build(int u, int l, int r)
{if(l == r){if(s[l] == '0')tr[u] = {l, r, a[l], 0, 0};else tr[u] = {l, r, 0, a[l], 0};}else{tr[u] = {l, r, 0, 0, 0};int mid = l + r >> 1;build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);pushup(u);}
}void modify(int u, int l, int r)
{if(tr[u].l >= l && tr[u].r <= r){swap(tr[u].sum0, tr[u].sum1);tr[u].f ^= 1;}else{pushdown(u);int mid = tr[u].l + tr[u].r >> 1;if(l <= mid)modify(u << 1, l, r);if(r > mid)modify(u << 1 | 1, l, r);pushup(u);}
}void solve()
{cin >> n;for(int i = 1; i <= n; i ++)cin >> a[i];cin >> s;s = ' ' + s;build(1, 1, n);int Q;cin >> Q;while(Q --){int op;cin >> op;if(op == 1){int l, r;cin >> l >> r;modify(1, l, r);}else{int x;cin >> x;if(x == 0)cout << tr[1].sum0 << ' ';else cout << tr[1].sum1 << ' ';}}cout << endl;
}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

Node节点存两个值sum0和sum1,f作为懒标记。

F

i在要a[i]之前被卖出,其实就是拓扑排序,先输出没在环中的点,然后每个环中,值最小的那个点最后卖出一定是最优的,类似贪心。

其实我在想如果一个点同时出现在两个环中该怎么办,然后发现这种情况其实不存在

比如

如果一个点出现在多个环中,边数会比点数还多,因为又要求每个点的出度都为1,所以这种情况显然是与输入要求矛盾的,所以一个点一定最多出现在一个环内,证毕。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'using namespace std;typedef pair<int, int> PII;
typedef long long ll;const int N = 100010;int n;
int h[N], e[N], ne[N], idx;
int d[N];
int a[N], b[N];
bool st[N];
vector<int> ans;
queue<int> q;void add(int a, int b)
{e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}void bfs()
{while(q.size()){int t = q.front();q.pop();ans.push_back(t);for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(st[j])continue;d[j] --;if(!d[j]){q.push(j);st[j] = true;}}}
}void solve()
{idx = 0;ans.clear();cin >> n;priority_queue<PII, vector<PII>, greater<PII>> heap;for(int i = 1; i <= n; i ++)d[i] = 0;for(int i = 1; i <= n; i ++){st[i] = false;h[i] = -1;cin >> a[i];add(i, a[i]);d[a[i]] ++;}for(int i = 1; i <= n; i ++){cin >> b[i];heap.push({b[i], i});if(!d[i]){st[i] = true;q.push(i);}}bfs();while(ans.size() < n){int ver;while(heap.size()){PII t = heap.top();heap.pop();if(!st[t.second]){ver = t.second;break;}}st[ver] = true;for(int i = h[ver]; i != -1; i = ne[i]){int j = e[i];if(st[j])continue;d[j] --;if(!d[j]){q.push(j);st[j] = true;}}bfs();ans.push_back(ver);}for(int i = 0; i < n; i ++)cout << ans[i] << ' ';cout << endl;}int main()
{IOSint _;cin >> _;while(_ --){solve();}return 0;
}

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

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

相关文章

卡尔曼滤波公式推导(总结)

假设 小车在t时刻的初始状态可以用Pt&#xff08;当前位置&#xff09;&#xff0c;Vt&#xff08;当前速度&#xff09;&#xff0c;Ut表示加速度&#xff1a; 预测&#xff1a; 利用上一个时刻的旧状态和系统的动量模型&#xff08;如加速度&#xff0c;速度等&#xff09;…

MySQL(六)

集群 单节点数据库 优点&#xff1a;适合数据量小的网站&#xff0c;如企业网站。 缺点&#xff1a;单个数据库无法满足日益增长的读写请求&#xff1b; 为什么要使用集群 高可用性&#xff1a;站点高可用&#xff0c;冗余站点&#xff1b;服务高可用&#xff0c;冗余服务…

分享一个基于SpringBoot+Vue的房屋在线装修预约系统源码

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

C++学习笔记(重载、类)

C 1、函数重载2、类2.1、类的方法和属性2.2、类的方法的定义2.3、构造器和析构器2.4、基类与子类2.5、类的public、protected、private继承2.6、类的方法的重载2.7、子类方法的覆盖2.8、继承中的构造函数和析构函数 1、函数重载 函数重载大概可以理解为&#xff0c;定义两个名…

如何保持 SSH 会话不中断?

哈喽大家好&#xff0c;我是咸鱼 不知道小伙伴们有没有遇到过下面的情况&#xff1a; 使用终端&#xff08;XShell、secureCRT 或 MobaXterm 等&#xff09;登录 Linux 服务器之后如果有一段时间没有进行交互&#xff0c;SSH 会话就会断开 如果正在执行一些非后台命令&#…

Navicat连接mysql8.0:提示无法加载身份验证插件“caching_sha2_password”

Navicat连接mysql时&#xff0c;提示&#xff1a;Unable to load authentication plugin ‘caching_sha2_password‘. 原因&#xff1a;mysql 8.0 默认使用 caching_sha2_password 身份验证机制。 D:\MySQL8.0\install\bin>mysql -uroot -p123456789 #登录 mysql: [War…

单元测试界的高富帅,Pytest框架 (三) 用例标记和测试执行篇

pytest用例标记和测试执行篇 上一篇文章入门篇咱们介绍了pytest的前后置方法和fixture机制&#xff0c;这个章节主要给大家介绍pytest中的标记机制和用例执行的方法。pytest可以通过标记将数据传入于测试函数中&#xff0c;也可以通过标记中对执行的用例做筛选&#xff0c;接下…

04深度学习-目标检测-深度学习方法详解-Two-stage的目标检测算法

一、 深度学习目标检测算法介绍 第二篇我们介绍了目标检测中传统的算法和目标检测的方式&#xff0c;第三篇我们对传统的目标检测算法和深度学习目标检测算法简单做了比较&#xff0c;此篇记录了深度学习目标检测算法内容&#xff0c;深入讲述一下深度学习算法在目标检测的原理…

Transformer-2. 注意力分数

上一节记录了注意力机制的基础&#xff0c;这一节主要做几个实现&#xff0c;沐神说qkv在不同任务中的角色不一&#xff0c;所以后续内容才会搞懂qkv是啥玩意。 上节使用了高斯核来对查询和键之间的关系建模。 高斯核指数部分可以视为注意力评分函数&#xff08;attention sco…

etcd分布式存储

etcd分布式存储 etcd简介etcd下载安装etcd常用命令etcd配置参数etcd集群golang操作etcd

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server&#xff0c;Redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 l…

企业架构LNMP学习笔记24

学习目标和内容&#xff1a; 1、能够描述高可用HA的作用 2、能够理解VIP的切换&#xff1a;虚拟IP。 3、能够描述keepalived作用&#xff1a;保持活跃。主备的服务器的关系。 4、能够理解主master和备backup服务器关系 5、能够实现主备服务器高可用配置&#xff1a;主服务…