bzoj3295【CDQ分治】
来源:互联网 发布:备孕前准备 知乎 编辑:程序博客网 时间:2024/06/07 00:27
答案在long long 范围内
#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;typedef long long LL;inline int read(){ int x=0;bool f=0;char c=getchar(); for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0; for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0'; return f?-x:x;}const int N=100010,M=50010;int n,m,A[N],pos[N],add[N],ans[N],ss[N];LL ans0=0;struct na{ int x,y,t,id;}e[N+M],e1[N+M],e2[N+M];inline bool cmp(const na &a,const na &b){ if (a.y!=b.y) return a.y<b.y; return a.t<b.t;} inline void add1(int x,int a)//维护前缀和{ for (;x<=n;x+=x&-x) ss[x]+=a;}inline int cal1(int x){ int rec=0; for (;x;x-=x&-x) rec+=ss[x]; return rec;} inline void add2(int x,int a)//维护后缀和{ for (;x;x-=x&-x) ss[x]+=a;}inline int cal2(int x){ int rec=0; for (;x<=n;x+=x&-x) rec+=ss[x]; return rec;} void solve(int hd,int tl,int l,int r){ if (hd>=tl||l>=r) return; int mid=l+r>>1; for (int i=hd;i<=tl;i++) { if (e[i].t<=mid&&!e[i].id) add2(e[i].x,1); if (e[i].t>mid&&e[i].id) ans[e[i].id]+=cal2(e[i].x+1); } for (int i=hd;i<=tl;i++) if (e[i].t<=mid&&!e[i].id) add2(e[i].x,-1); for (int i=tl;i>=hd;i--) { if (e[i].t<=mid&&!e[i].id) add1(e[i].x,1); if (e[i].t>mid&&e[i].id) ans[e[i].id]+=cal1(e[i].x-1); } for (int i=tl;i>=hd;i--) if (e[i].t<=mid&&!e[i].id) add1(e[i].x,-1); int l1=0,l2=0,lp=hd; for (int i=hd;i<=tl;i++) if (e[i].t<=mid) e1[++l1]=e[i]; else e2[++l2]=e[i]; for (int i=1;i<=l1;i++) e[lp++]=e1[i]; for (int i=1;i<=l2;i++) e[lp++]=e2[i]; solve(hd,hd+l1-1,l,mid); solve(hd+l1,tl,mid+1,r);} int main(){ n=read();m=read(); for (int i=1;i<=n;i++) pos[A[i]=read()]=i; for (int i=n;i;i--) ans0+=cal1(A[i]-1),add1(A[i],1); memset(ss,0,sizeof ss); for (int i=1;i<=m;i++) { e[i].y=read();e[i].x=pos[e[i].y]; e[i].id=i;add[e[i].x]=e[i].t=m+1-i; } for (int i=1;i<=n;i++) { if (!add[i]) add[i]=1; e[i+m].x=i;e[i+m].y=A[i];e[i+m].t=add[i]; } sort(e+1,e+n+m+1,cmp); solve(1,n+m,1,m); for (int i=1;i<=m;i++) printf("%lld\n",ans0),ans0-=ans[i]; return 0;}
0 0
- bzoj3295【CDQ分治】
- cdq分治bzoj3295
- BZOJ3295/CQOI2011 题解(CDQ分治)
- [BZOJ3295] [Cqoi2011]动态逆序对 && CDQ分治
- 【cdq分治】[HYSBZ/BZOJ3295]动态逆序对
- 【bzoj3295】动态逆序对 CDQ分治
- [BZOJ3295]动态逆序对CDQ分治
- [BZOJ3295] [Cqoi2011]动态逆序对 (树套树)or(CDQ分治)
- 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
- CDQ分治——BZOJ3295/Luogu3157 [CQOI2011]动态逆序对
- [BZOJ3295][CQOI2011]动态逆序对-CDQ分治+树状数组
- BZOJ3295: [Cqoi2011]动态逆序对(CDQ分治)
- bzoj3295 [Cqoi2011]动态逆序对(CDQ分治)
- bzoj3295[Cqoi2011]动态逆序对(cdq分治||可持久化线段树)
- [BZOJ3295][Cqoi2011]动态逆序对(树状数组套线段树||cdq分治)
- 整体二分&CDQ分治:[BZOJ2527][POI2011] meteors [BZOJ3295][CQOI2011] 动态逆序对
- 【BZOJ3295】动态逆序对(CQOI2011)-CDQ分治:三维偏序
- bzoj3295[Cqoi2011]动态逆序对 cdq分治(树套树/主席树)
- Spring配置项<context:annotation-config/>解释说明
- scrala 初探(一)
- c/c++中字符输入问题
- LINUX系统启动流程
- java集合类详解
- bzoj3295【CDQ分治】
- Ural1540 Battle for the Ring
- 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
- HttpURLConnection用法详解
- 分糖果问题--蓝桥杯
- HTTP协议的8种请求类型
- 第十五周项目2-(1)用哈希法组织关键字
- 【MySql】---Host 'XXX' is not allowed to connect to this MySQL server
- Java中session的销毁