【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. [算法]哈夫曼树+莫 ...
随机推荐
- iOS- UIButton/UIImageView/UISlider/UISwitch操作
如果看不到图片 可以尝试更换浏览器(推荐Safari ) 一.控件的属性 1.CGRect frame 1> 表示控件的位置和尺寸(以父控件的左上角为坐标原点(0, 0)) 2> 修改这个 ...
- ubuntu 安装xdebug
Add XDebug to Ubuntu 14.04 Submitted by Wilbur on Tue, 06/17/2014 - 12:49pm It's pretty easy to add ...
- Centos安装TFTP/NFS/PXE服务器网络引导安装系统
客户端网卡要求支持以PXE启动,配置都在服务端进行,通过PXE网络启动安装系统流程: 客户端以PXE启动发送DHCP请求: 服务器DHCP应答,包括客户端的IP地址,引导文件所在TFTP服务器: 客户 ...
- MD5加密的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 小程序出现 “2 not found” 解决方案
今天新建小程序的时候出现 ,控制台出现“2 not found” 报错. 解决方法: 在控制台输入 openVendor() , 然后会弹出开发工具的文件夹,删除掉下图这两个程序,重启开发工具就可 ...
- Nginx + Keepalived使用文档
第一步: 下载keepalived地址:http://www.keepalived.org/download.html 解压安装: tar -zxvf keepalived-1.2.18.tar.gz ...
- sql批量更新关系型数据库
更改gb_groupd里的chargingrulesname的值UPDATE tb_group SET tb_group.chargingrulesname =tb_chargingrules.c ...
- BZOJ1297:[SCOI2009]迷路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1297 windy在有向图中迷路了. 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 ...
- HDU2222:Keywords Search——题解
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意: 给定 n 个长度不超过 50 的由小写英文字母组成的单词,以及一篇长为 m 的文章,问有多少个 ...
- [Leetcode] valid palindrome 验证回文
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...