当前位置:   article > 正文

CodeForces 1250G [贪心]_codeforce 1250g

codeforce 1250g

题目链接:https://codeforces.com/contest/1250/problem/G

 

解题思路:

题目的另一个意思就是每次按动reset意思就是原来的sa,sb(表示a,b现在的积分)变成了sa = sa -  min(sa,sb),sb = sb - min(sa,sb),根据这一的性质我们就可以都得到一个结论就是,当只执行到第i轮时,最后一次按下了reset是在第k轮,那么这是sa[i] = pre_a[i] - min(pre_a[k],pre_b[k]),sb[i] = pre_b[i] - min(pre_a[k],pre_b[k])。pre[]表示数组前缀和,再记w[k] = min(pre_a[k],pre_b[k]

m 是题中最大积分的限制

那么如果人想在第i轮赢得话,必须就要满足存在k使得pre_a[i] - m < w[k] <= pre_b[i] - m, k < i。根据这个式子就可以去判断如果到了第i轮是否有可以取胜的策略,那么接下来我们就只要保证人到第i轮之前积分不会爆m就可以了,这个就直接贪心就好了,因为已经确定了在第几轮的时候可以赢了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int mx = 2e5+5;
  4. const int mod = 1e9 + 7;
  5. typedef long long ll;
  6. int n,m;
  7. int a[mx],b[mx],ans[mx];
  8. ll sa[mx],sb[mx];
  9. ll w[mx];
  10. int get_id() {
  11. for (int i=1;i<=n;i++) {
  12. ll L = sa[i] - m;
  13. ll R = sb[i] - m;
  14. int l = upper_bound(w+1,w+i,L) - w;
  15. int r = upper_bound(w+1,w+i,R) - w;
  16. if (l < r) {
  17. //cout << l << " " << i << endl;
  18. return l;
  19. }
  20. w[i] = min(sa[i],sb[i]);
  21. }
  22. return -1;
  23. }
  24. int solve(int id) {
  25. ll now1 = 0,now2 = 0;
  26. int siz = 0;
  27. for (int i=1;i<id;i++) {
  28. now1 += a[i];
  29. now2 += b[i];
  30. if (now1 + a[i+1] >= m) {
  31. ll mi = min(now1,now2);
  32. ans[siz++] = i;
  33. now1 -= mi,now2 -= mi;
  34. if (now1 + a[i+1] >= m) return 0;
  35. }
  36. }
  37. ans[siz++] = id;
  38. return siz;
  39. }
  40. bool check() {
  41. for (int i=1;i<=n;i++)
  42. if (sa[i]<m&&sb[i]>=m)
  43. return 1;
  44. return 0;
  45. }
  46. int main(){
  47. int t;
  48. scanf("%d",&t);
  49. while (t--) {
  50. scanf("%d%d",&n,&m);
  51. for (int i=1;i<=n;i++) {
  52. scanf("%d",a+i);
  53. sa[i] = sa[i-1] + a[i];
  54. }
  55. for (int i=1;i<=n;i++) {
  56. scanf("%d",b+i);
  57. sb[i] = sb[i-1] + b[i];
  58. }
  59. if (check()) {
  60. puts("0\n");
  61. continue;
  62. }
  63. int id = get_id();
  64. int siz = solve(id);
  65. if (!siz || id == -1) {
  66. puts("-1");
  67. continue;
  68. }
  69. printf("%d\n",siz);
  70. for (int i=0;i<siz;i++) {
  71. printf("%d%c",ans[i],i==siz-1?'\n':' ');
  72. }
  73. }
  74. return 0;
  75. }

 

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

闽ICP备14008679号