BZOJ3295: [Cqoi2011]动态逆序对(洛谷P3157)
2018-02-12 20:19
253 查看
CDQ分治
BZOJ题目传送门洛谷题目传送门
我们可以把删除给反过来,变成从最终序列不断加入元素成为原始序列。
于是这道题就变成了元素下标分别为(时间、位置、值)的一个三维偏序问题(tj<ti,xj<xi,yj>yitj<ti,xj<xi,yj>yi)。没有查询的元素tt随便给。
然后就变成CDQ分治裸题了。
先按照tt排序,在区间内按照xx排,用树状数组维护yy。统计时正着扫一遍计算大于yy的逆序对数,倒着扫一遍计算小于yy的逆序对数。然后递归就行了。
注意要开long longlong long
代码:
#include<cctype> #include<cstdio> #include<cstring> #include<algorithm> #define N 100005 #define F inline using namespace std; typedef long long LL; struct px{ int x,y,t,z; }q ,tem ; int n,m,i,t ,ans ,mp ; F char readc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; return *l++; } F int _read(){ int x=0; char ch=readc(); while (!isdigit(ch)) ch=readc(); while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=readc(); return x; } F void writec(LL x){ if (x>9) writec(x/10); putchar(x%10+48); } F void _write(LL x){ writec(x),putchar('\n'); } #define lbt(x) (x&-x) F void nsrt(int x,int p){ while (x<=n) t[x]+=p,x+=lbt(x); } F int srch(int x){ for (i=0;x;i+=t[x],x-=lbt(x)); return i; } F bool cmp1(px a,px b){ return a.x==b.x?a.y<b.y:a.x<b.x; } F bool cmp2(px a,px b){ return a.t<b.t; } F void cdq(int l,int r){ if (l==r) return; int mid=l+r>>1; for (int i=l;i<=mid;i++) tem[i]=q[i],tem[i].z=0; for (int i=mid+1;i<=r;i++) tem[i]=q[i],tem[i].z=1; sort(tem+l,tem+r+1,cmp1); for (int i=l;i<=r;i++) if (!tem[i].z) nsrt(tem[i].y,1); else ans[tem[i].t]+=srch(n)-srch(tem[i].y); for (int i=l;i<=r;i++) if (!tem[i].z) nsrt(tem[i].y,-1); for (int i=r;i>=l;i--) if (!tem[i].z) nsrt(tem[i].y,1); else ans[tem[i].t]+=srch(tem[i].y); for (int i=l;i<=r;i++) if (!tem[i].z) nsrt(tem[i].y,-1); cdq(l,mid),cdq(mid+1,r); } int main(){ n=_read(),m=_read(); int ti=n; LL sum=0; for (int i=1;i<=n;i++) q[i].x=i,mp[q[i].y=_read()]=i; for (int i=1;i<=m;i++) q[mp[_read()]].t=ti--; for (int i=1;i<=n;i++) if (!q[i].t) q[i].t=ti--; sort(q+1,q+n+1,cmp2),cdq(1,n); for (int i=1;i<=n;i++) sum+=ans[i]; for (int i=n;i>n-m;i--) _write(sum),sum-=ans[i]; return 0; }
相关文章推荐
- BZOJ3295: [Cqoi2011]动态逆序对 莫队
- bzoj3295 [Cqoi2011]动态逆序对
- bzoj3295: [Cqoi2011]动态逆序对(题解2)
- bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
- BZOJ3295 CQOI2011 动态逆序对
- BZOJ3295: [Cqoi2011]动态逆序对
- BZOJ 3295: [Cqoi2011]动态逆序对 分块大法好
- BZOJ3295 [Cqoi2011]动态逆序对 【CDQ分治】
- BZOJ3295 [Cqoi2011]动态逆序对 【CDQ分治】
- BZOJ 3295 [CQOI2011] 动态逆序对
- bzoj 3295: [Cqoi2011]动态逆序对 (CDQ分治+树状数组)
- [BZOJ3295][Cqoi2011]动态逆序对(树状数组套线段树||cdq分治)
- bzoj3295: [Cqoi2011]动态逆序对 三维数点
- bzoj3295 [Cqoi2011]动态逆序对(CDQ分治)
- BZOJ3295:[Cqoi2011]动态逆序对 (BIT套treap/CDQ分治+BIT)
- bzoj3295: [Cqoi2011]动态逆序对
- COGS-1715 [CQOI2011]动态逆序对(树状数组+线段树)
- [bzoj3295][Cqoi2011][动态逆序对] (树套树)
- bzoj3295【CQOI2011】动态逆序对
- bzoj 3295: [Cqoi2011]动态逆序对(树套树)