原题链接:788E - New task

Description

游行寺家里人们的发色多种多样,有基佬紫、原谅绿、少女粉、高级黑、相簿白等。

日向彼方:吾令人观其气,气成五彩,此天子气也。

琉璃:我们是不是可以组个五人战队了?

游行寺家的n个人排成一排。第i个人的发色是Ai。

能组成战队的条件是:

那五人假设是第a,b,c,d,e人(),需要满足 

中间的三人称为有头者,最旁边俩人称为学姐。

根据字面意思,有头者一定要有头,学姐可以无头。
反正就是b,c,d这三人一定要有头。

有着恶趣味的琉璃每次操作会把一个人 变成有头或者无头,

每次操作后琉璃想知道游行寺家可能产生多少种不同的战队。只要有成员不同,俩战队就是不同的。

Input

第一行一个整数n,第二行n个整数表示人们的发色。

第三行一个整数m,表示操作数。

接下来有m行,每行第一个数表示操作类型,第二个数表示被操作那人的编号。

类型为1就是把他变无头,类型2就是变有头。

Output

每次操作后输出答案,答案对10^9+7取模

Sample Input

  1. 8
  2. 3 4 4 2 4 5 4 1
  3. 3
  4. 1 5
  5. 2 5
  6. 1 2

Sample Output

  1. 1
  2. 6
  3. 2

HINT

对于100%的数据:

扔在最前面的碎碎念:

一开始真的不知道怎么写……于是盯着别人的代码研究了好久。在这道题上卡了一个上午……最后发现数组开小了(那一刻有种想打死自己的冲动。通过后又发现时间和空间都跟标程差很多……想了想建树的方式好像可以优化?于是改了一波。最后的代码跑得跟标程差不多快>_<敲开心。

子序列要求:

大体思路就是:离散化→树状数组预处理出L、R数组→对每个值建一棵子线段树→在子线段树上进行操作。

在离散化时可以处理的信息:1.num[i]:第i个点离散化后的数值,2.s[i]:值为i的点数,3.p[i]:第i个点在1~s[num[i]]中的位置。

利用树状数组预处理的信息:1.L[i]:在第i个点左边且数值不大于点i的数值的点数,2.R[i]:在第i个点右边且数值不大于点i的数值的点数。

子线段树上的结点需要维护这几个信息:1.l&r:左右儿子,2.sz:区间内点数(即可以作为有头者的点数),3.s[1]:区间内a,b的方案数,4.s[2]:区间内a,b,c的方案数,5.s[3]:区间内a,b,c,d,e的方案数,6.s[4]:区间内c,d,e的方案数,7.s[5]:区间内d,e的方案数。s数组可由左右儿子的信息合并得到。

其余的详见代码=v=(其实只是因为我懒)

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define LL long long
  5. using namespace std;
  6. const int N=1e5+;
  7. const int mod=1e9+;
  8. int n,m,cnt,sum,x,y,last;
  9. int num[N],t[N],L[N],R[N],root[N],s[N],p[N],ans;
  10. struct node{int w,pos;}a[N];
  11. struct tree{int l,r,sz,s[];}tr[N*];
  12. int read()
  13. {
  14. int x=,f=;char c=getchar();
  15. while(c<''||c>''){if(x=='-')f=-;c=getchar();}
  16. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  17. return x*f;
  18. }
  19. bool cmp(node a,node b){return a.w==b.w?a.pos<b.pos:a.w<b.w;}
  20. int lowbit(int x){return x&(-x);}
  21. void insert(int x)
  22. {
  23. while(x<=n)
  24. {
  25. t[x]++;
  26. x+=lowbit(x);
  27. }
  28. }
  29. int query(int x)
  30. {
  31. int ans=;
  32. while(x){ans+=t[x];x-=lowbit(x);}
  33. return ans;
  34. }
  35. void up(int x)
  36. {
  37. int l=tr[x].l,r=tr[x].r;
  38. tr[x].sz=(tr[l].sz+tr[r].sz)%mod;
  39. tr[x].s[]=(tr[l].s[]+tr[r].s[])%mod;
  40. tr[x].s[]=(tr[l].s[]+tr[r].s[])%mod;
  41. tr[x].s[]=(tr[l].s[]+tr[r].s[]+(LL)tr[l].s[]*tr[r].sz)%mod;
  42. tr[x].s[]=(tr[l].s[]+tr[r].s[]+(LL)tr[l].sz*tr[r].s[])%mod;
  43. tr[x].s[]=(tr[l].s[]+tr[r].s[]+(LL)tr[l].s[]*tr[r].s[]+(LL)tr[l].s[]*tr[r].s[])%mod;
  44. //LL!!!
  45. }
  46. void change(int &x,int l,int r,int pos,int v)
  47. {
  48. if(x==)x=++sum;
  49. if(l==r)
  50. {
  51. tr[x].sz=v*;
  52. tr[x].s[]=v*L[pos];
  53. tr[x].s[]=v*R[pos];
  54. tr[x].s[]=tr[x].s[]=tr[x].s[]=;
  55. tr[x].l=tr[x].r=;
  56. return;
  57. }
  58. else
  59. {
  60. int mid=(l+r)>>;
  61. if(p[pos]<=mid)change(tr[x].l,l,mid,pos,v);
  62. else change(tr[x].r,mid+,r,pos,v);
  63. up(x);
  64. }
  65. }
  66. int main()
  67. {
  68. n=read();
  69. for(int i=;i<=n;i++)
  70. a[i].w=read(),a[i].pos=i;
  71. sort(a+,a+n+,cmp);
  72. for(int i=;i<=n;i++)
  73. {
  74. if(a[i].w!=a[i-].w)
  75. {
  76. if(cnt)s[cnt]=i--last;
  77. last=i-;
  78. cnt++;
  79. }
  80. num[a[i].pos]=cnt;
  81. p[a[i].pos]=i-last;
  82. }
  83. s[cnt]=n-last;
  84. for(int i=;i<=n;i++)
  85. L[i]=query(num[i]),insert(num[i]);
  86. memset(t,,sizeof(t));
  87. for(int i=n;i>=;i--)
  88. R[i]=query(num[i]),insert(num[i]);
  89. for(int i=;i<=n;i++)
  90. {
  91. ans=(ans-tr[root[num[i]]].s[]+mod)%mod;
  92. change(root[num[i]],,s[num[i]],i,);
  93. ans=(ans+tr[root[num[i]]].s[])%mod;
  94. }
  95. m=read();
  96. for(int i=;i<=m;i++)
  97. {
  98. x=read();y=read();
  99. ans=(ans-tr[root[num[y]]].s[]+mod)%mod;
  100. change(root[num[y]],,s[num[y]],y,x-);
  101. ans=(ans+tr[root[num[y]]].s[])%mod;
  102. printf("%d\n",ans);
  103. }
  104. return ;
  105. }

【SRM-06 D】五色战队&&【codeforces 788E】 New task的更多相关文章

  1. Codeforces 788E - New task(线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1E,而且被!我!自!己!搞!出!来!了! 虽然我承认它难度及摆放的位置异常异常虚高,并且就算我到了现场也不可 ...

  2. {CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队

    D 五色战队 SRM 06 背景&&描述         游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等.         日向彼方:吾令人观其气,气成五彩, ...

  3. 汕头市队赛 SRM 06 C 秀恩爱

    C 秀恩爱 SRM 06 背景&&描述         KPM坐在直升机上俯瞰小渔村景象.         渔村可看作二维平面,密密麻麻地到处都是单身狗,KPM当前所在坐标为(sx,s ...

  4. 汕头市队赛 SRM 06 A 撕书

    A 撕书 SRM 06 背景&&描述 游行寺汀正在杀书.         书总共有n页,每页都可以看作是一个小写英文字母,所以我们可以把书看成长度为n的字符串s.         琉璃 ...

  5. 汕头市队赛 SRM 06 B 起伏的排名

    B 起伏的排名 SRM 06 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     在上个星期她打了n场麻将,每场麻将都有n名玩家.KPM自然记得自己的n次排名.   ...

  6. New task CodeForces - 788E (线段树优化dp)

    比较套路的一个题, 对每个数维护一颗线段树来转移就好了. #include <iostream> #include <algorithm> #include <cstdi ...

  7. ContestHunter暑假欢乐赛 SRM 06

    T1二分check...为什么这么显然的我没看出来TAT,还在想倒着加入并查集check什么的,题写太多思维定势啦QAQ T2是NOIP题的弱化版...当时没看出来,写了个DP.可以看出这一位比上一位 ...

  8. 【CodeForces】788E New task

    [题意]n个数,每个数有附加属性0或1,初始全为1.m个操作,每个操作可以改变一个数字的属性为0或1.对于每次操作后的序列求有多少子序列满足要求:5个数字,中间3个数相等且属性为1,左右两个数小于等于 ...

  9. Codeforces 653F Paper task SA

    Paper task 如果不要求本质不同直接st表二分找出最右端, 然后计数就好了. 要求本质不同, 先求个sa, 然后用lcp求本质不同就好啦. #include<bits/stdc++.h& ...

随机推荐

  1. IncDec Sequence(差分)

    题意:给定一个序列,可以对一个区间进行加1或减1的操作,问最少需要多少次可以将序列的值一样. Solution 我们将序列差分,得到一个差分数组. 对于每一个区间操作,我们可以把它转化为在查分数组上某 ...

  2. centos7/centos6修改系统默认语言

    应用环境: 一直在使用centos7.x,系统默认的语言也是英文环境,工作内容偶遇中文,顺便搜罗修改一番,小记如下. 测试环境: 测试步骤: CentOS 7.x 1. 查看当前语言环境 [root@ ...

  3. mysql 替换字符中部分字符,替换使用指定字符

    update table_name set name= replace(name,'我是','是');

  4. 从Java的角度修复文件下载漏洞

    从Java的角度谈下文件下载漏洞的产生,然后到他的修复方案.这里我的修复方案是白名单,而没有采用黑名单的方式. 首先先看一段存在文件下载漏洞的代码code: HTML视图页面  download.ht ...

  5. 洛谷P3723 礼物

    以前看到过,但是搞不倒.知道了算法之后就好搞了. 题意:给定两个长为n的序列,你可以把某个序列全部加上某个数c,变成循环同构序列. 求你操作后的min∑(ai - bi)² 解: 设加上的数为c,那么 ...

  6. STL学习笔记:空间配置器allocator

    allocator必要接口: allocator::value_type allocator::pointer allocator::const_pointer allocator::referenc ...

  7. poj 2385 Apple Catching(记录结果再利用的动态规划)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 有两颗苹果树,在每一时刻只有其中一棵苹果树会掉苹果,而Bessie可以在很短的时 ...

  8. jQuery、layer实现弹出层的打开、关闭功能实例详解

    本文主要介绍了jQuery.layer实现弹出层的打开.关闭功能,需要的朋友可以参考下,希望能帮助到大家. 打开弹出层: 在list页面带入layer.js 在list页面点击时,弹出form弹出层, ...

  9. 简单贪心) Repair the Wall hdu2124

    Repair the Wall http://acm.hdu.edu.cn/showproblem.php?pid=2124 Time Limit: 5000/1000 MS (Java/Others ...

  10. 微信小程序:下拉刷新

    下拉刷新 1.需要在json文件中,设置"enablePullDownRefresh": true,表示该页面使用下拉刷新 2.在微信内置函数onPullDownRefresh中进 ...