【题意】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的更多相关文章

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

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

  2. 【Codeforces】Round #491 (Div. 2) 总结

    [Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...

  3. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  4. 【C#】线程之Task

    Task开启线程 有两种启动方式: 1.构造创建线程,然后启动 var taskForAction = new Task(() => { //do something }); taskForAc ...

  5. 【CodeForces】601 D. Acyclic Organic Compounds

    [题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...

  6. 【Codeforces】849D. Rooter's Song

    [算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...

  7. 【CodeForces】983 E. NN country 树上倍增+二维数点

    [题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...

  8. 【CodeForces】925 C.Big Secret 异或

    [题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...

  9. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

随机推荐

  1. 【IdentityServer4文档】- 支持和咨询选项

    支持和咨询选项 我们为 IdentityServer 提供多个免费和商业支持及咨询选项. 免费支持 免费支持是基于社区的,而且使用的是公共论坛 StackOverflow 有越来越多的使用 Ident ...

  2. 用php实现一个双向队列 如何实现?

    PHP面试题作业 class DuiLie { private $array = array();//声明空数组 public function setFirst($item){ return arr ...

  3. C/S结构

    C/S结构 编辑 同义词 C/S架构一般指C/S结构 C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Serv ...

  4. Delphi:ADOConnection连接SQLServer自动断网问题解决

    =============================== 解决方法一:异常时关闭连接,WinXP,win7 32位大部分情况都是起作用的,不过在有些windows操作系统下(如家庭版)不起作用, ...

  5. canvas drawImage 不显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 操作 使用XML的方法

    XmlHelper是一个工具类 public static class XMLHelper { /// <summary> /// XML的编码方式,默认是UTF-8 /// </s ...

  7. poj1065-Wooden Sticks

    题目 有很多小木棍需要机器处理.每个小木棍有重量和长度两个属性.不断把小木棍放入机器中,如果小木棍\(a\)放完后放入小木棍\(b\),那么如果\(a.weight<=b.weight\ and ...

  8. 可持久化Treap

    终于写了一次可持久化Treap,做的是可持久化序列的模板题. Treap Treap=Tree+Heap,是一个随机化的数据结构.它的每个节点至少有两个关键字,一个是我们要存储的\(val\),一个是 ...

  9. CSS定义input disabled样式

    disabled 属性规定应该禁用 input 元素.被禁用的 input 元素既不可用,也不可点击.可以设置 disabled 属性,直到满足某些其他的条件为止(比如选择了一个复选框等等).然后,就 ...

  10. 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告

    [USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...