当前位置:   article > 正文

div2 919

div2 919

div2配套训练

A:A. Satisfying Constraints

思路:大于的有一个上界,小于的有一个下界,中间的如果在这两个界之间,直接减就行

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e6+100;
  4. using ll=long long;
  5. #define rep(i,a,n) for(ll i=a;i<=n;i++)
  6. #define frep(i,a,n) for(ll i=a;i>=n;i--)
  7. int n;
  8. int q[N];
  9. void solve()
  10. {
  11. cin>>n;
  12. int cnt=0;
  13. int maxn=0;
  14. int minn=1e9;
  15. int ans=0;
  16. rep(i,1,n)
  17. {
  18. int a,b;
  19. cin>>a>>b;
  20. if(a==1)
  21. {
  22. maxn=max(maxn,b);
  23. }
  24. else if(a==2)
  25. {
  26. minn=min(minn,b);
  27. }
  28. else
  29. {
  30. q[++cnt]=b;
  31. }
  32. }
  33. rep(i,1,cnt)
  34. {
  35. if(q[i]>=maxn&&q[i]<=minn)
  36. {
  37. ans--;
  38. }
  39. }
  40. if(ans+minn-maxn+1<=0)
  41. {
  42. cout<<0<<'\n';
  43. }
  44. else
  45. cout<<ans+minn-maxn+1<<'\n';
  46. }
  47. int main()
  48. {
  49. ios::sync_with_stdio(0);
  50. cin.tie(0);
  51. cout.tie(0);
  52. int t;
  53. cin>>t;
  54. while(t--)
  55. {
  56. solve();
  57. }
  58. }

B:B. Summation Game

思路:我们首先可以贪心的思考两个点:

1.由于这些数字一定是正的,所以操作二一定会尽全力的执行(就是有数并且他有次数他一定会执行)2.操作一则不一定全部执行,但如果执行的话一定扔掉最大的那些数字(排序的原因)

总结:于是我们就得到了一个思路:就是暴力枚举操作1,然后操作二直接执行,期间可以用前缀和优化一下。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e6+100;
  4. using ll=long long;
  5. #define rep(i,a,n) for(ll i=a;i<=n;i++)
  6. #define frep(i,a,n) for(ll i=a;i>=n;i--)
  7. int n,k,x;
  8. ll a[N],sum[N];
  9. bool cmp(int a,int b)
  10. {
  11. return a>b;
  12. }
  13. //自定义排序
  14. void solve()
  15. {
  16. ll ans=-1e9;
  17. cin>>n>>k>>x;
  18. rep(i,1,n)
  19. {
  20. cin>>a[i];
  21. }
  22.    //输入
  23. sort(a+1,a+1+n,cmp);
  24.    //使得正的在前面
  25. rep(i,1,n)
  26. {
  27. sum[i]=sum[i-1]+a[i];
  28. }
  29.    //前缀和
  30. rep(i,0,k)
  31. {
  32. ll _sum=sum[n]-sum[i];//这是删除数后的和
  33.    //比如 1 2 3 4 5 ,如果i=1的话,那么_sum=2+3+4+5
  34. if(i+x>n)
  35. {
  36. ans=max(_sum-2*(sum[n]-sum[i]),ans);
  37.    //如果i+x>n就是-1×的数字越界了所以需要特判
  38. }
  39. else
  40. ans=max(_sum-2*(sum[i+x]-sum[i]),ans);
  41. }
  42. cout<<ans<<'\n';
  43. }
  44. int main()
  45. {
  46. ios::sync_with_stdio(0);
  47. cin.tie(0);
  48. cout.tie(0);
  49. int t;
  50. cin>>t;
  51. while(t--)
  52. {
  53. solve();
  54. }
  55. }

C: Partitioning the Array

思路:首先题目要求是我们要求出一个K,使得有m>1使得每隔k个数的二个数字同余。

于是m是所有这样每隔两个数的因子,那么就完美符合条件了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define rep(i,a,n) for(int i=a;i<=n;i++)
  4. #define frep(i,a,n) for(int i=a;i>=n;i--)
  5. const int N=1e6+10;
  6. int a[N];
  7. void solve()
  8. {
  9. int n;
  10. cin>>n;
  11. rep(i,1,n)
  12. {
  13. cin>>a[i];
  14. }
  15. int ans=0;
  16. rep(k,1,n)//枚举k
  17. {
  18. if(n%k==0)
  19. {
  20. int g=0;//计算m
  21. for(int i=1;i+k<=n;i++)
  22. {
  23. g=__gcd(g,abs(a[i+k]-a[i]));
  24. }
  25. ans+=(g!=1);//不为1就可以计算贡献
  26. }
  27. }
  28. cout<<ans<<'\n';
  29. }
  30. int main()
  31. {
  32. ios_base::sync_with_stdio(0); cin.tie(0);
  33. int t;
  34. cin>>t;
  35. while(t--)
  36. {
  37. solve();
  38. }
  39. return 0;
  40. }

D:Array Repetition

思路:暴力枚举k,然后进行二分查找那个数字对应的范围,并不断往前找

 
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define rep(i,a,n) for(int i=a;i<=n;i++)
  4. #define frep(i,a,n) for(int i=a;i>=n;i--)
  5. using ll = long long;
  6. using pii = pair<ll, ll>;
  7. #define fi first
  8. #define se second
  9. const int N=1e6+10;
  10. using i128 = __int128_t;
  11. int a[N];
  12. void solve()
  13. {
  14. ll n,q;
  15. cin>>n>>q;
  16. vector<pii>v;
  17. map<ll,ll>mp;
  18. i128 len=0;
  19. rep(i,1,n)
  20. {
  21. int t,x;
  22. cin>>t>>x;
  23. if(t==1)
  24. {
  25. len=len+1;
  26. mp[1ll*len]=x;
  27. }
  28. else
  29. {
  30. if(len>1e18)
  31. {
  32. continue;
  33. }
  34. ll t=0;
  35. if(len<=1e18)
  36. {
  37. t=len;
  38. len=len*(x+1);
  39. }
  40. if(len>1e18)
  41. {
  42. len=1e18+1;
  43. }
  44. v.push_back({len,t});
  45. }
  46. }
  47. sort(v.begin(),v.end());
  48. while(q--)
  49. {
  50. ll x=0;
  51. cin>>x;
  52. while(!mp.count(x))
  53. {
  54. auto it=lower_bound(v.begin(),v.end(),(pii){x,0ll});
  55. ll len=(*it).se;
  56. x%=len;
  57. if(x==0)
  58. {
  59. x=len;
  60. }
  61. }
  62. cout<<mp[x]<<" ";
  63. }
  64. cout<<'\n';
  65. }
  66. int main()
  67. {
  68. ios_base::sync_with_stdio(0); cin.tie(0);
  69. int t;
  70. cin>>t;
  71. while(t--)
  72. {
  73. solve();
  74. }
  75. return 0;
  76. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55167
推荐阅读
  

闽ICP备14008679号