Codeforces Round #791 (Div. 2) A-C
A
题解
知识点:数学,贪心。
考虑 和 的余数情况。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; int main(){ std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t; cin>>t; while(t--){ long long n; cin>>n; if(n<4 || n&1) cout<<-1<<'\n'; else{ long long d = n/6,r = n%6; cout<<d + (r != 0)<<' '; cout<<n/4<<'\n'; } } return 0; }
B
题解
知识点:STL,模拟。
如果执行操作 ,那么所有数都变成 ,我们可以理解为把数组清空了,但 的基础值是 ,下次单点修改时只需要知道清空之后,这个元素有没有被修改过,即在数组中是否存在,分别做不同的处理。可以用 维护下标与值的映射。(也可以记录上次整体修改的访问时间,用一个数组保存每个位置在哪次整体修改之后修改的访问时间)
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; int main(){ std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n,q; cin>>n>>q; map<int,int> a; long long sum = 0; for(int i = 1;i<=n;i++) cin>>a[i],sum+=a[i]; int pre = 0; while(q--){ int t; cin>>t; if(t == 1){ int i,x; cin>>i>>x; if(a.count(i)) sum += x-a[i]; else sum = sum - pre + x; a[i] = x; cout<<sum<<'\n'; } else if(t == 2){ int x; cin>>x; sum = 1LL * n * x; pre = x; a.clear(); cout<<sum<<'\n'; } } return 0; }
C
题解
知识点:树状数组,模拟。
如果一个区块被攻击,那么肯定对应的所有行或者所有列都存在棋子,分别计算存在棋子的行和列的数量,行或列有一个满足与区块行或列相等,那么区块所有格子都能被攻击到。用树状数组的单点修改和区间和维护行和列的棋子存在状态和计算,用数组维护各行和列的当前棋子数量辅助树状数组的修改。
用线段树也可以,常数比较大。
(qwq太菜惹,抄大佬的板子)
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; template <typename T> struct Fenwick{ const int n; vector<T> a; Fenwick(int n):n(n),a(n){} void add(int x,T v) { for (int i = x+1;i<=n;i += i&-i){ a[i-1] += v; } } T sum(int x) { T ans = 0; for (int i = x;i>0;i -= i&-i){ ans += a[i-1]; } return ans; } T rangeSum(int l,int r){ return sum(r) - sum(l); } }; int row[100007],col[100007]; int main(){ std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n,q; cin>>n>>q; Fenwick<int> rowb(n+7),colb(n+7); while(q--){ int t; cin>>t; if(t == 1){ int x,y; cin>>x>>y; row[x]++; col[y]++; if(row[x] == 1) rowb.add(x,1); if(col[y] == 1) colb.add(y,1); } else if(t == 2){ int x,y; cin>>x>>y; row[x]--; col[y]--; if(row[x] == 0) rowb.add(x,-1); if(col[y] == 0) colb.add(y,-1); } else if(t == 3){ int x1,x2,y1,y2; cin>>x1>>y1>>x2>>y2; if(rowb.rangeSum(x1,x2+1) == x2-x1+1 || colb.rangeSum(y1,y2+1) == y2-y1+1) cout<<"Yes"<<'\n'; else cout<<"No"<<'\n'; } } return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16275512.html
分类:
CF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧