【CodeForces】788E New task
【题意】n个数,每个数有附加属性0或1,初始全为1。m个操作,每个操作可以改变一个数字的属性为0或1。对于每次操作后的序列求有多少子序列满足要求:5个数字,中间3个数相等且属性为1,左右两个数小于等于中间三个数且属性任意。n,m<=10^5。
【算法】线段树
【题解】朴素的算法,奇妙的使用>_<!
离散化后,e[i]为i的权值。
用a[i]记录比1~i-1中≤e[i]的数的个数,b[i]表示i+1~n中≤e[i]的数的个数。
a和b可以用树状数组维护,树状数组下标为离散化后的权值,按顺序加入和查询即可。
那么,显然中间3个数是关键。
离散化后对于每个权值(1~p)建线段树(1~n),根编号为权值,对于线段树x维护下列值:
S[k]表示子树k代表区间内x的数量。
B[k]表示子树k代表区间内只选择第二个点的方案数。
D[k]表示子树k代表区间内只选择第四个点的方案数。
BC[k]表示只选择第二三个点的方案数。
CD[k]表示只选择第三四个点的方案数。
BCD[k]表示选择第二三四个点的方案数。
update的方法见代码。
参考CF用户MemorySlices的代码,非常漂亮,就直接贴了。
#include<bits/stdc++.h>
#define N 100005
#define M 3000005
#define L(__) (son[__][0])
#define R(__) (son[__][1])
#define oo (1<<30)
using namespace std;
const int mo=1e9+;
int n,m,w[N],lw,a[N],b[N],tr[N],e[N],B[M],BC[M],BCD[M],CD[M],D[M],S[M],son[M][],len,ans;
int lowbit(int x){ return x&(-x);}
void modify(int x){ while(x<=n) tr[x]++,x+=lowbit(x);}
int query(int x){ int s=; while(x) s+=tr[x],x-=lowbit(x); return s;}
void update(int t)
{
S[t]=(S[L(t)]+S[R(t)])%mo;
B[t]=(B[L(t)]+B[R(t)])%mo;
D[t]=(D[L(t)]+D[R(t)])%mo;
BC[t]=(BC[L(t)]+BC[R(t)]+1LL*B[L(t)]*S[R(t)])%mo;
CD[t]=(CD[L(t)]+CD[R(t)]+1LL*S[L(t)]*D[R(t)])%mo;
BCD[t]=(BCD[L(t)]+BCD[R(t)]+1LL*BC[L(t)]*D[R(t)]+1LL*B[L(t)]*CD[R(t)])%mo;
}
void MOD(int t,int l,int r,int s,int x,int y,int d)
{
int mid=(l+r)>>,k=(s>mid);
if(l==r){ B[t]=x,D[t]=y,S[t]+=d; return ;}
if(!son[t][k]) son[t][k]=++len;
if(!k) MOD(L(t),l,mid,s,x,y,d);
else MOD(R(t),mid+,r,s,x,y,d);
update(t);
}
int main()
{
int i,op,x;
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d",&e[i]),w[++lw]=e[i];
sort(w+,w+lw+),lw=unique(w+,w+lw+)-w-;
for(i=;i<=n;i++) e[i]=lower_bound(w+,w+lw+,e[i])-w;
memset(tr,,sizeof(tr));
for(i=;i<=n;i++) a[i]=query(e[i]),modify(e[i]);
memset(tr,,sizeof(tr));
for(i=n;i>=;i--) b[i]=query(e[i]),modify(e[i]);
len=lw;
for(i=;i<=n;i++){
ans=(ans-BCD[e[i]]+mo)%mo;
MOD(e[i],,n,i,a[i],b[i],);
ans=(ans+BCD[e[i]])%mo;
}
scanf("%d",&m);
while(m--){
scanf("%d %d",&op,&x);
ans=(ans-BCD[e[x]]+mo)%mo;
if(op==)
MOD(e[x],,n,x,,,-);
else
MOD(e[x],,n,x,a[x],b[x],);
ans=(ans+BCD[e[x]])%mo;
printf("%d\n",ans);
}
return ;
}
更神奇的操作:http://blog.csdn.net/gjghfd/article/details/74897844 留坑
【CodeForces】788E New task的更多相关文章
- {CodeForces】788E New task && 汕头市队赛SRM06 D 五色战队
D 五色战队 SRM 06 背景&&描述 游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等. 日向彼方:吾令人观其气,气成五彩, ...
- 【Codeforces】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
- 【C#】线程之Task
Task开启线程 有两种启动方式: 1.构造创建线程,然后启动 var taskForAction = new Task(() => { //do something }); taskForAc ...
- 【CodeForces】601 D. Acyclic Organic Compounds
[题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...
- 【Codeforces】849D. Rooter's Song
[算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...
- 【CodeForces】983 E. NN country 树上倍增+二维数点
[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...
- 【CodeForces】925 C.Big Secret 异或
[题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...
- 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
[题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...
随机推荐
- HTML页面垂直滚动条不见
<body style="overflow-y:scroll;"> </body>
- 【alpha】Scrum站立会议第3次....10.18
小组名称:nice! 小组成员:李权 于淼 杨柳 刘芳芳 项目内容:约跑app(约吧--暂定) 1.任务进度 2.燃尽图 功能列表 1.登录注册 2.创建跑步计划 3.筛选跑友 4.加一起跑步的人为好 ...
- 【week2】 累计进度条、psp、饼图
每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间 2016年9月9日 读书 构建之法-5.6章 19:00 20:00 0 60min 2016年9月10日 看博客 ...
- intellij idea 之 CheckStyle 代码格式校验
- QT分析之QApplication的初始化
原文地址:http://blog.163.com/net_worm/blog/static/1277024192010097430321/ 在开始分析之前交代一下,一是分析的QT在Window平台实现 ...
- Python使用又拍云进行第三方文件拉取
在爬虫过程中,需要将图片或其他文件进行存储到云上,但在下载图片时,看官方文档,貌似需要先下载到后再上传又拍云,感觉效率很低下.经查找资料实现Python直接对第三方资源进行文件拉取操作,即不需要下载到 ...
- UML图之协作图
创建方法: 1,new----collaboration diagram 2,根据序列图按F5转换 增加对象链接(图2-4-4) (1) 选择Object Link 工具栏按钮. (2) 单击要 ...
- 【题解】NOIP2015推销员
……普及组的题目都做不出来……(:´д`)ゞ……再这样下去要退役了啊…… 不过不管怎样感觉这题还是蛮好的,也要记录一下下~ 我们注意到数据的范围,n 是 1e5, 又有 1e5组询问,暴力大概是 \( ...
- [洛谷P2057][SHOI2007]善意的投票
题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...
- 【以前的空间】link cut tree
这篇文章讲的很好很详细,但是写了几天后发现似乎是挺残的版本. 2049: [Sdoi2008]Cave 洞穴勘测 3282: Tree 2002: [Hnoi2010]Bounce 弹飞绵羊 1036 ...