• 2023 (ICPC) Jiangxi Provincial Contest -- Official Contest


    A. Drill Wood to Make Fire

     输出S*V\geq N即可

    1. #include<bits/stdc++.h>
    2. #define int long long
    3. #define x first
    4. #define y second
    5. using namespace std;
    6. const int N=1100;
    7. typedef pair<int,int>pii;
    8. int m,n;
    9. int a[N][N];
    10. void solve()
    11. {
    12. int s,v,n;
    13. cin>>n>>s>>v;
    14. if(s*v>=n)
    15. cout<<1<<endl;
    16. else cout<<0<<endl;
    17. }
    18. signed main()
    19. {
    20. ios::sync_with_stdio(false);
    21. int t=1;cin>>t;
    22. while(t--)solve();
    23. return 0;
    24. }

    I. Tree

    题意:给你一颗有N个节点的树,你有两个操作

    第一个操作:将xy之间的边权w\bigoplus z

    第二个操作输出与x直接相连的边的异或

    思路:因为异或是不进位加法,所以我们可以直接将树上每一条直接相连的边的异或值保存下来

    然后需要修改的时候就可以直接修改

    代码:

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. const int N=5e5+10;
    4. typedef pair<int,int>pii;
    5. int n,q;
    6. void solve()
    7. {
    8. int a[N];
    9. scanf("%d%d",&n,&q);
    10. for(int i=1;i<=n;i++)a[i]=0;
    11. for(int i=1;i<n;i++)
    12. {
    13. int x,y,w;
    14. scanf("%d%d%d",&x,&y,&w);
    15. a[x]^=w;
    16. a[y]^=w;
    17. }
    18. while(q--)
    19. {
    20. int op;
    21. scanf("%d",&op);
    22. if(op==1)
    23. {
    24. int x,y,z;
    25. scanf("%d%d%d",&x,&y,&z);
    26. a[x]^=z;
    27. a[y]^=z;
    28. }
    29. else
    30. {
    31. int x;
    32. scanf("%d",&x);
    33. printf("%d\n",a[x]);
    34. }
    35. }
    36. }
    37. int main()
    38. {
    39. int t=1;
    40. while(t--)solve();
    41. return 0;
    42. }

    J. Function

    题意:给你n形如(x-i)^2+b{_{i}}的二次函数,有两个操作

    一个操作是增加一个二次函数(x-a)^2+b

    另一个是查询当x=a的时候函数值最小是多少

    思路:因为是二次函数我们假设b{_{i}}是固定的我们就可以观察出,只要让(x-i)^2=n

    就可以发现最小值就可能在^{\sqrt{n}}附近,所以我们只要查询^{\sqrt{n}}附近的函数值即可

    代码:

    1. #include<bits/stdc++.h>
    2. #define int long long
    3. #define x first
    4. #define y second
    5. using namespace std;
    6. const int N=110000;
    7. typedef pair<int,int>pii;
    8. int m,n;
    9. int v[N];
    10. void solve()
    11. {
    12. cin>>n;
    13. for(int i=1;i<=n;i++)
    14. cin>>v[i];
    15. cin>>m;
    16. int t= ::sqrt(1.0*n);
    17. while(m--)
    18. {
    19. int op;
    20. cin>>op;
    21. if(op)
    22. {
    23. int a;
    24. cin>>a;
    25. int minv=0x3f3f3f3f;
    26. for(int i=a-sqrt(n);i<=a+sqrt(n)+1;i++)
    27. {
    28. if(i>=0&&i<=n&&v[i])minv=min(minv,(i-a)*(i-a)+v[i]);
    29. }
    30. cout<<minv<<endl;
    31. }
    32. else
    33. {
    34. int a,b;
    35. cin>>a>>b;
    36. if(v[a])
    37. v[a]=min(v[a],b);
    38. else v[a]=b;
    39. }
    40. }
    41. }
    42. signed main()
    43. {
    44. ios::sync_with_stdio(false);
    45. int t=1;//cin>>t;
    46. while(t--)solve();
    47. return 0;
    48. }

    K. Split

    题意:给你一个非递增加序列a,有两种操作

    第一个操作,给你一个1<x<n,使得a{_{x}}=a{_{x-1}}+a{_{x+1}}-a{_{x}}

    第二个操作,将序列分成k个小块,其中每个小块的最大值-最小值之和要最小,并且输出每个小块中最大值-最小值之和最小值

    思路:

    首先看操作2,由于是递减序列每个块中的最小值都是分界线的左边,而分界线的右边就是下一个块中最大值,换句话说,如果有k个块那么我们可以写成a{_{1}}-a{_{i}}+a{_{i+1}}-a{_{j}}+a{_{j+1}} +\dots-a{_{k-1}}+a{_{k}}-a{_{n}}

    将公式转化一下变成, a{_{1}}-a{_{n}}+a{_{i+1}}-a{_{i}}+a{_{j+1}}-a{_{j}} +\dots+a{_{k}}-a{_{k-1}}

    后面的刚好构成了差分数组,而因为序列是递减的我们可以保证a{_{1}}-a{_{n}}一定是正的,而后面差分数我们要保证尽可能的小,这样答案才会小,所以我们将对他进行排序然后依次枚举即可。

    然后再看修改操作a{_{x}}=a{_{x-1}}+a{_{x+1}}-a{_{x}}

    我们枚举出第x-1,x,x+1项,a{_{x-1}},a{_{x}},a{_{x+1}}

    修改后,a{_{x-1}},a{_{x-1}}+a{_{x+1}}-a{_{x}},a{_{x+1}}

    然后对他进行差分a{_{x-1}}-a{_{x-1}}+a{_{x+1}}-a{_{x}},a{_{x-1}}-a{_{x+1}}+a{_{x+1}}-a{_{x}}

    得到 a{_{x+1}}-a{_{x}},a{_{x-1}}-a{_{x}}差分数组仅仅只是交换了个位置,并不会对答案有变化。

    所以时间复杂度是O(Nlogn)

    代码:

    1. #include<bits/stdc++.h>
    2. #define int long long
    3. #define x first
    4. #define y second
    5. using namespace std;
    6. const int N=1100000;
    7. typedef pair<int,int>pii;
    8. int k,m,n;
    9. int a[N];
    10. int d[N];
    11. void solve()
    12. {
    13. cin>>n;
    14. for(int i=0;i<n;i++)
    15. cin>>a[i];
    16. for(int i=1;i<n;i++)
    17. d[i]=a[i]-a[i-1];
    18. sort(d+1,d+n);
    19. for(int i=1;i<n;i++)
    20. d[i]=d[i-1]+d[i];
    21. cin>>m;
    22. while(m--)
    23. {
    24. int op,x;
    25. cin>>op>>x;
    26. if(op==1)
    27. {
    28. cout<<a[0]-a[n-1]+d[x-1]<<endl;
    29. }
    30. }
    31. }
    32. signed main()
    33. {
    34. ios::sync_with_stdio(false);
    35. int t=1;//cin>>t;
    36. while(t--)solve();
    37. return 0;
    38. }

    L. Zhang Fei Threading Needles - Thick with Fine

    输出N-1即可 

  • 相关阅读:
    Rabbitmq 简单介绍
    Linux嵌入式I2C协议笔记
    Linux云服务环境安装-Mysql8.0篇
    探秘STM32MDK:编译过程与文件类型解析
    线性方程组求解的迭代方法&Python实现
    Qt QSS中 background-image,border-image,以及image属性差别
    95. 不同的二叉搜索树 II
    测试人生 | 从功能到外企测开,工作1年半拿下年薪30万的测开 offer,这个95后小姐姐未来可期~
    设计模式原则——接口隔离原则
    C/C++创建tty,创建终端
  • 原文地址:https://blog.csdn.net/qq_33269561/article/details/130903207