https://codeforces.com/problemset/problem/407/C

(自用,勿看)

手模一下找一找规律,可以发现,对于一个修改(l,r,k),相当于在[l,r]内各位分别加上[1,0,0,0,0,..]做k+1次前缀和得到的数组

比如(l=3,r=6,k=2),[1,0,0,..]做k+1=3次前缀和后为[1,3,6,10,15,..],因此这次修改相当于a[l]+=1,a[l+1]+=3,a[l+2]+=6,a[l+3]+=10

很容易想到k从大到小排序,用差分维护,不断做前缀和“解包”(不展开写了..)

然后我就不会了。。因为每一次是“区间加”,我只能做到从某个位置到末尾全部加,没有办法把多余的消掉

膜了大佬,发现只要每一层差分的时候都在合适位置减去合适值就行了,找规律(例如l=3,r=6,k=2,一开始是1,0,0,0,-1,第一次变成1,1,1,1,0,再变成1,1,1,1,-4,第二次变成1,2,3,4,0,再变成1,2,3,4,-10,第三次变成1,3,6,10,0)(考虑第p次,[1,0,0,0..]做p+1次前缀和得到数组c,那么在r+1位置处减去c[r-l+1],第0次(即第1次开始前)也要减)

然后多个同一阶的差分数列可以直接相加,因此就有了O((n+m)k)的做法

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<vector>
  5. using namespace std;
  6. #define fi first
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. typedef long long ll;
  11. typedef unsigned long long ull;
  12. typedef pair<ll,ll> pll;
  13. const ll md=;
  14. ll n,m;
  15. vector<pll> a1[];
  16. ll an[][];
  17. ll tt[][];//tt[i]是对1,0,0,0,..做i+1次前缀和得到的数组
  18. ll a[];
  19. int main()
  20. {
  21. ll i,j,k,x,y,z;pll t;
  22. scanf("%lld%lld",&n,&m);
  23. for(i=;i<=n;i++)
  24. scanf("%lld",&a[i]);
  25. for(i=;i<=n;i++)
  26. tt[][i]=;
  27. for(i=;i<=;i++)
  28. {
  29. for(j=;j<=n;j++)
  30. {
  31. tt[i][j]=(tt[i][j-]+tt[i-][j]);
  32. (tt[i][j]>=md) && (tt[i][j]-=md);
  33. //printf("at%lld %lld %lld\n",i,j,tt[i][j]);
  34. }
  35. }
  36. for(i=;i<=m;i++)
  37. {
  38. scanf("%lld%lld%lld",&x,&y,&z);
  39. a1[z].pb(mp(x,y));
  40. }
  41. for(i=;i>=;i--)
  42. {
  43. for(j=;j<a1[i].size();j++)
  44. {
  45. x=a1[i][j].fi;y=a1[i][j].se;
  46. ++an[i][x];
  47. (an[i][x]>=md) && (an[i][x]-=md);
  48. ++y;
  49. for(k=i;k>=;k--)
  50. {
  51. an[k][y]-=tt[i-k][y-x];
  52. //printf("2t%lld %lld %lld\n",i-k,y-x,tt[i-k][y-x]);
  53. //printf("1t%lld %lld %lld\n",k,y,tt[i-k][y-x]);
  54. (an[k][y]<) && (an[k][y]+=md);
  55. }
  56. }
  57. for(k=;k<=n;k++)
  58. {
  59. an[i][k]+=an[i][k-];
  60. (an[i][k]>=md) && (an[i][k]-=md);
  61. }
  62. if(i!=)
  63. {
  64. for(k=;k<=n;k++)
  65. {
  66. an[i-][k]+=an[i][k];
  67. (an[i-][k]>=md) && (an[i-][k]-=md);
  68. }
  69. }
  70. //printf("1t%lld\n",i);
  71. //for(k=1;k<=n;k++)
  72. // printf("%lld ",an[i][k]);
  73. //puts("");
  74. }
  75. for(i=;i<=n;i++)
  76. {
  77. a[i]+=an[][i];
  78. (a[i]>=md) && (a[i]-=md);
  79. }
  80. for(i=;i<=n;i++)
  81. printf("%lld ",a[i]);
  82. return ;
  83. }

http://210.33.19.103/contest/1025

A题(sequence)同此题

Curious Array Codeforces - 407C(高阶差分(?)) || sequence的更多相关文章

  1. Curious Array CodeForces - 407C (高阶差分)

    高阶差分板子题 const int N = 1e5+111; int a[N], n, m, k; int C[N][111], d[N][111]; signed main() { scanf(&q ...

  2. codeforces 407C Curious Array

    codeforces 407C Curious Array UPD: 我觉得这个做法比较好理解啊 参考题解:https://www.cnblogs.com/ChopsticksAN/p/4908377 ...

  3. Codeforces 408 E. Curious Array

    $ >Codeforces \space 408 E. Curious Array<$ 题目大意 : 有一个长度为 \(n\) 的序列 \(a\) ,\(m\) 次操作,每一次操作给出 \ ...

  4. Codeforces 601B. Lipshitz Sequence(单调栈)

    Codeforces 601B. Lipshitz Sequence 题意:,q个询问,每次询问给出l,r,求a数组[l,r]中所有子区间的L值的和. 思路:首先要观察到,斜率最大值只会出现在相邻两点 ...

  5. Greg and Array CodeForces 296C 差分数组

    Greg and Array CodeForces 296C 差分数组 题意 是说有n个数,m种操作,这m种操作就是让一段区间内的数增加或则减少,然后有k种控制,这k种控制是说让m种操作中的一段区域内 ...

  6. CodeForces 408E Curious Array(组合数学+差分)

    You've got an array consisting of n integers: a[1], a[2], ..., a[n]. Moreover, there are m queries, ...

  7. Codeforces 626A Robot Sequence(模拟)

    A. Robot Sequence time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  8. Petya and Array CodeForces - 1042D (树状数组)

    D. Petya and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. codeforces 622A Infinite Sequence

    A. Infinite Sequence time limit per test 1 second memory limit per test 256 megabytes input standard ...

随机推荐

  1. jmeter使用笔记——脚本录制,JMeter使用plugins插件进行服务器性能监控

    脚本录制: 1.badboy录制 2.代理服务器录制 ①工作台添加HTTP代理服务器 ②设置目标控制器,分组,排除模式,包含模式(使用正则表达式筛选) ③设置浏览器,手动设置代理服务器,localho ...

  2. 浅谈如何删除JSP编译后的空行

    当你在客户端用view source看JSP生成的代码时,会发现有很多空行,他们是由< %...% >后的回车换行而生成的,也就是说每一行由< %...% >包含的JSP代码到 ...

  3. RTMP协议的理解

    RTMP协议:real time message protocol 工作原理: 先采集摄像头视频和麦克风音频信息,再进行音视频的编码(mpeg),通过FMLE(Flash Media Live Enc ...

  4. codeforces 701C C. They Are Everywhere(尺取法)

    题目链接: C. They Are Everywhere time limit per test 2 seconds   memory limit per test 256 megabytes inp ...

  5. hdu-4991 Ordered Subsequence(dp+树状数组)

    题目链接: Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 32768/32768 K (Ja ...

  6. 002-Fatal error in launcher: Unable to create process using '""

    这个问题出在先安装Python3之后再安装python2, 使用pip安装的时候出现的故障 原因是python3的环境变量写入在了用户的环境变量上 但是一旦安装python2之后, Python会把信 ...

  7. codevs 4768跳石头

    传送门 4768 跳石头  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold  题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在 ...

  8. js 常见的小数取整问题

    1.四舍五入取整 Math.round(5/2)   // 3 2.直接去掉小数,取整 parseInt(5/2);     //  2 3.向上取整,有小数整数部分就加1 Math.ceil(1/3 ...

  9. yolo原理学习

    1.[yolov1]    第一步:将图像划分为S*S的栅格(grid cell),这里分成了7*7的grid cell.栅格的任务是:检测中心落在该栅格中的物体(注意,栅格中心未必与物体的中心重合, ...

  10. CF 809D Hitchhiking in the Baltic States——splay+dp

    题目:http://codeforces.com/contest/809/problem/D 如果值是固定的,新加入一个值,可以让第一个值大于它的那个长度的值等于它. 如今值是一段区间,就对区间内的d ...