• Codeforces Round 895 (Div. 3)


    A.每次最多能把差缩小2*c克,向上取整

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 2e5+10,mod=998244353;
    4. #define int long long
    5. using node=tuple<int,int,int,int>;
    6. typedef long long LL;
    7. typedef pair<int, int> PII;
    8. int n,m,q;
    9. int a[N];
    10. void solve()
    11. {
    12. int a,b,c;cin>>a>>b>>c;
    13. cout<<(abs(a-b)+2*c-1)/(2*c)<<"\n";
    14. }
    15. signed main() {
    16. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    17. int t=1;
    18. cin>>t;
    19. while(t--) solve();
    20. }

    B.直接枚举每个格子能走多大

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 2e5+10,M=2*N,mod=998244353;
    4. #define int long long
    5. typedef long long LL;
    6. typedef pair<int, int> PII;
    7. int a[N],b[N];
    8. int n, m;
    9. void solve()
    10. {
    11. cin>>n;
    12. for(int i=1;i<=n;i++){
    13. cin>>a[i]>>b[i];
    14. }
    15. int mx=1000000,mn=0;
    16. for(int i=1;i<=n;i++)
    17. {
    18. mx=min(mx,a[i]+((b[i]-1)/2));
    19. }
    20. cout<<mx<<"\n";
    21. }
    22. signed main() {
    23. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    24. int t=1;
    25. cin>>t;
    26. while(t--) solve();
    27. }

    C.首先容易构造的是gcd=2,相当于是一个偶数/2,那么这种情况要特判

    l==r,只能找他的质因子了,

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 2e5+10,M=2*N,mod=998244353;
    4. #define int long long
    5. typedef long long LL;
    6. typedef pair<int, int> PII;
    7. int a[N],b[N];
    8. int n, m;
    9. void solve()
    10. {
    11. int l,r;cin>>l>>r;
    12. if(l==r)
    13. {
    14. for(int i=2;i<=l/i;i++){
    15. if(l%i==0){
    16. int x=l/i;
    17. cout<<x<<" "<<l-x<<"\n";
    18. return ;
    19. }
    20. }
    21. cout<<"-1\n";
    22. return ;
    23. }
    24. for(int i=l;i<=r;i++)
    25. {
    26. if(i%2==0&&i!=2){
    27. cout<<i/2<<" "<<i/2<<"\n";
    28. return ;
    29. }
    30. }
    31. cout<<"-1\n";
    32. }
    33. signed main() {
    34. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    35. int t=1;
    36. cin>>t;
    37. while(t--) solve();
    38. }

    D.容斥原理

    a+b-a*b,特判另一个数包含另一个数的集合就行

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 2e5+10,M=2*N,mod=998244353;
    4. #define int long long
    5. typedef long long LL;
    6. typedef pair<int, int> PII;
    7. int a[N],b[N];
    8. int n, m;
    9. int gcd(int a, int b) // 欧几里得算法
    10. {
    11. return b ? gcd(b, a % b) : a;
    12. }
    13. int lcm(int a,int b){
    14. return a*b/gcd(a,b);
    15. }
    16. void solve()
    17. {
    18. cin>>n;
    19. int x,y;cin>>x>>y;
    20. if(x%y==0)
    21. { int z=n/y-n/x;
    22. cout<<-((z+1)*z)/2<<"\n";
    23. }
    24. else if(y%x==0)
    25. {
    26. int z=n/x-n/y;
    27. cout<<((n-z+1+n)*z)/2<<"\n";
    28. }
    29. else if(x!=1&&y!=1&&x!=y){
    30. int now=n/(lcm(x,y));
    31. int z=n/x-now;
    32. int res=(n-z+1+n)*z/2;
    33. z=n/y-now;
    34. res-=((z+1)*z)/2;
    35. cout<<res<<"\n";
    36. }
    37. else cout<<"-1\n";
    38. }
    39. signed main() {
    40. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    41. int t=1;
    42. cin>>t;
    43. while(t--) solve();
    44. }

    E.直接线段树维护区间0的异或和 和 1的异或和,翻转操作就是互换而已

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 2e5+10,mod=998244353;
    4. #define int long long
    5. typedef long long LL;
    6. typedef pair<int, int> PII;
    7. struct node{
    8. int l,r;
    9. int s0,s1,w,add;
    10. }tr[N*4];
    11. int n,m,q;
    12. int a[N],b[N];
    13. string s;
    14. void pushup(int u){
    15. tr[u].s0=tr[u<<1].s0^tr[u<<1|1].s0;
    16. tr[u].s1=tr[u<<1].s1^tr[u<<1|1].s1;
    17. }
    18. void pushdown(int u){
    19. if(tr[u].add){
    20. tr[u<<1].add^=1;
    21. tr[u<<1|1].add^=1;
    22. swap(tr[u<<1].s0,tr[u<<1].s1);
    23. swap(tr[u<<1|1].s0,tr[u<<1|1].s1);
    24. }
    25. tr[u].add=0;
    26. }
    27. void build(int u,int l,int r){
    28. tr[u]={l,r,0,0,0,0};
    29. if(l==r){
    30. tr[u].w=b[l];
    31. if(b[l]==1) tr[u].s1=a[l];
    32. else tr[u].s0=a[l];
    33. }
    34. else{
    35. int mid=l+r>>1;
    36. build(u<<1,l,mid);
    37. build(u<<1|1,mid+1,r);
    38. pushup(u);
    39. }
    40. }
    41. void modify(int u,int l,int r){
    42. if(tr[u].l>=l&&tr[u].r<=r)
    43. {
    44. tr[u].add^=1;
    45. swap(tr[u].s1,tr[u].s0);
    46. }
    47. else{
    48. pushdown(u);
    49. int mid=tr[u].l+tr[u].r>>1;
    50. if(l<=mid) modify(u<<1,l,r);
    51. if(r>mid) modify(u<<1|1,l,r);
    52. pushup(u);
    53. }
    54. }
    55. // node query(int u,int l,int r){
    56. // if(tr[u].l>=l&&tr[u].r<=r){
    57. // return tr[u];
    58. // }
    59. // else{
    60. // pushdown(u);
    61. // node res={0,0,0,0,0};
    62. // int mid=tr[u].l+tr[u].r>>1;
    63. // if(l<=mid){
    64. // res=query(u<<1,l,r);
    65. // }
    66. // if(r>mid) modify(u<<1|1,mid+1,r);
    67. // }
    68. // }
    69. void solve()
    70. {
    71. cin>>n;
    72. for(int i=1;i<=n;i++) cin>>a[i];
    73. cin>>s;
    74. s="?"+s;
    75. for(int i=1;i<=n;i++) b[i]=s[i]-'0';
    76. build(1,1,n);
    77. int q;cin>>q;
    78. while(q--){
    79. int op;
    80. cin>>op;
    81. if(op==1){
    82. int l,r;cin>>l>>r;
    83. modify(1,l,r);
    84. }
    85. else{
    86. int x;cin>>x;
    87. if(x==1) cout<<tr[1].s1<<" ";
    88. else cout<<tr[1].s0<<" ";
    89. }
    90. }
    91. cout<<"\n";
    92. }
    93. signed main() {
    94. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    95. int t=1;
    96. cin>>t;
    97. while(t--) solve();
    98. }

    F.画图样例其实可以知道,按照拓扑序直接处理即可,最后会有多个环,每个环的贡献最大是让一个点贡献不能*2,其他都可以

    我写的比较麻烦,先拓扑序把不是环的点先存了,再把每个环tarjan缩点,然后单独处理每个环,每个环算完出发点后又dfs存答案0.0

    所以用了dfs+拓扑排序+tarjan

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 2e5+10,M=2*N,mod=998244353;
    4. #define int long long
    5. typedef long long LL;
    6. typedef pair<int, int> PII;
    7. int a[N],b[N];
    8. int n, m;
    9. int G[N];
    10. int dfn[N], low[N], timestamp;
    11. int stk[N], top;
    12. bool in_stk[N],Size[N];
    13. int id[N], scc_cnt;
    14. vector<int> g[N];
    15. int din[N],dout[N];
    16. void tarjan(int u)
    17. {
    18. dfn[u] = low[u] = ++ timestamp;
    19. stk[ ++ top] = u, in_stk[u] = true;
    20. int j = G[u];
    21. if (!dfn[j])
    22. {
    23. tarjan(j);
    24. low[u] = min(low[u], low[j]);
    25. }
    26. else if (in_stk[j]) low[u] = min(low[u], dfn[j]);
    27. if (dfn[u] == low[u])
    28. {
    29. ++ scc_cnt;
    30. int y;
    31. do {
    32. y = stk[top -- ];
    33. in_stk[y] = false;
    34. id[y] = scc_cnt;
    35. } while (y != u);
    36. }
    37. }
    38. void solve()
    39. {
    40. cin>>n;
    41. top=timestamp=scc_cnt=0;
    42. for(int i=0;i<=n;i++){
    43. G[i]=0;
    44. g[i].clear();
    45. low[i]=dfn[i]=id[i]=0;
    46. in_stk[i]=false;
    47. din[i]=dout[i]=0;
    48. }
    49. for(int i=1;i<=n;i++){
    50. cin>>a[i];
    51. G[i]=a[i];
    52. din[a[i]]++;
    53. }
    54. for(int i=1;i<=n;i++) cin>>b[i];
    55. for(int i=1;i<=n;i++)
    56. {
    57. if(!dfn[i]) tarjan(i);
    58. }
    59. queue<int> q;
    60. vector<int> res;
    61. for(int i=1;i<=n;i++) if(din[i]==0) q.push(i);
    62. while(q.size()){
    63. auto t=q.front();
    64. q.pop();res.push_back(t);
    65. int v=G[t];
    66. if(--din[v]==0){
    67. q.push(v);
    68. }
    69. }
    70. for(int i=1;i<=n;i++){
    71. g[id[i]].push_back(i);
    72. }
    73. vector<bool> st(n+10,false);
    74. function<void(int)> dfs=[&](int u){
    75. if(st[u]) return ;
    76. st[u]=true;
    77. res.push_back(u);
    78. dfs(G[u]);
    79. };
    80. for(int i=1;i<=scc_cnt;i++)
    81. {
    82. if(g[i].size()==1) continue;
    83. else{
    84. sort(g[i].begin(),g[i].end());
    85. m=g[i].size();
    86. int now=0,mx=0,idx=0;
    87. for(auto x:g[i]) now+=2*b[x];
    88. for(int x:g[i])
    89. {
    90. if(mx<now-b[x]) idx=x,mx=max(mx,now-b[x]);
    91. }
    92. dfs(G[idx]);
    93. }
    94. }
    95. for(auto x:res) cout<<x<<" ";
    96. cout<<"\n";
    97. }
    98. signed main() {
    99. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    100. int t=1;
    101. cin>>t;
    102. while(t--) solve();
    103. }

    G.首先把左右两边的1去掉没用,

    然后思考中间的值,因为处理完后左右两边一定不是1,所以如果区间乘大于1e9

    说明至少有60个2相乘,那么中间的1肯定也只能要

    然后如果不大于

    那么说明中间区间的数加起来不大于60(去掉中间是1的数)

    那么直接枚举左右端点即可

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const int N = 2e5+10,M=2*N,mod=998244353;
    4. #define int long long
    5. typedef long long LL;
    6. typedef pair<int, int> PII;
    7. int a[N],b[N];
    8. int n, m;
    9. void solve()
    10. {
    11. cin>>n;
    12. for(int i=1;i<=n;i++) cin>>a[i];
    13. int l=1,r=n;
    14. while(a[l]==1&&l<r){
    15. l++;
    16. }
    17. while(a[r]==1&&l<r){
    18. r--;
    19. }
    20. int res=1;
    21. for(int i=l;i<=r;i++){
    22. res*=a[i];
    23. if(res>1e9){
    24. cout<<l<<" "<<r<<"\n";
    25. return ;
    26. }
    27. }
    28. int idx=0,sum=0;
    29. for(int i=1;i<=n;i++){
    30. if(a[i]>1) b[++idx]=i;
    31. sum+=a[i];
    32. }
    33. int ans=sum,ansl=1,ansr=1;
    34. for(int i=1;i<=idx;i++){
    35. res=1;
    36. l=b[i];
    37. int s=0;
    38. for(int j=i;j<=idx;j++){
    39. res*=a[b[j]];
    40. r=b[j];
    41. s+=a[b[j]];
    42. int val=sum-s-(r-l+1-(j-i+1))+res;
    43. if(val>ans){
    44. ans=val;
    45. ansl=l,ansr=r;
    46. }
    47. }
    48. }
    49. cout<<ansl<<" "<<ansr<<"\n";
    50. }
    51. signed main() {
    52. cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    53. int t=1;
    54. cin>>t;
    55. while(t--) solve();
    56. }

  • 相关阅读:
    云计算与大数据第5章 云计算安全题库及答案
    一文掌握Python多线程与多进程
    可完全替代FTP的文件传输工具大集合
    轻松使用androidstudio交叉编译libredwg库
    阅读 | 001《人工智能导论》(一)绪论及知识表示篇
    nodejs+vue面向中小学课堂教学辅助软件系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计
    ANR问题的分析与解决思路
    上门预约按摩家政小程序开发;
    智慧安防视频监控系统EasyCVR平台突然运行异常,是什么原因?
    Idea怎么配置Maven才能优先从本地仓库获取依赖
  • 原文地址:https://blog.csdn.net/qq_61657632/article/details/132770010