• [CQOI2011] 动态逆序对


    题目大意

    给一个排列,删除\(m\)个元素,每删一个前,输出逆序对个数。

    \(\text{Solution}\)

    一道较为简单的\(CDQ\)分治,考虑每删一个数,后逆序对数个数的变化,即上次的\(ans\)减删除数前比他大的,后比他小的。
    那么我们可以静态的求这个数,给每一个数加一个消失时间\(T_i\),当\(T_i > T_j\)时,\(j\)才能对\(i\)产生贡献。
    码代码时很轻松,但忘了开\(long\) \(long\),调试了好久,所以······

    \(\text{Code}\)

    #include<cstdio>
    #include<algorithm>
    #define LL long long
    using namespace std;
    const int N = 1e5 + 5;
    LL b[N],c[N],inc[N],ans = 0,f[N];
    int n,m;
    
    struct nd{int x,y,z;}a[N],na[N];
    int lowbit(int x){return x & -x;}
    void add(int x,int v){while (x <= n) f[x] += v,x += lowbit(x);}
    LL query(int x)
    {
    	LL res = 0;
    	while (x) res += f[x],x -= lowbit(x);
    	return res;
    }
    bool cmp(nd x,nd y){return x.x > y.x;}
    void solve(int l,int r,int fl)
    {
    	if (l == r) return;
    	int mid = l + r >> 1;
    	solve(l,mid,fl),solve(mid + 1,r,fl);
    	int i = l,j = mid + 1,cnt = l;
    	while (i <= mid && j <= r)
    	{
    		if (a[i].z > a[j].z) add(a[i].y,1),na[cnt++] = a[i],i++;
    		else
    		{
    			if (fl) inc[a[j].y] += query(a[j].y);
    			else inc[a[j].y] += query(n) - query(a[j].y);
    			na[cnt++] = a[j],j++;
    		}
    	}
    	while (i <= mid) add(a[i].y,1),na[cnt++] = a[i],i++;
    	while (j <= r) 
    	{
    		if (fl) inc[a[j].y] += query(a[j].y);
    		else inc[a[j].y] += query(n) - query(a[j].y);
    		na[cnt++] = a[j],j++;	
    	}
    	for (int k = l; k <= mid; k++) add(a[k].y,-1);
    	for (int k = l; k <= r; k++) a[k] = na[k];
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for (int i = 1; i <= n; i++) 
    		a[i].x = i,scanf("%lld",&a[i].y),ans += query(n) - query(a[i].y),add(a[i].y,1);
    	for (int i = 1; i <= n; i++) add(a[i].y,-1),b[i] = n;
    	for (int i = 1; i <= m; i++) scanf("%lld",&c[i]),b[c[i]] = i;
    	for (int i = 1; i <= n; i++) a[i].z = b[a[i].y];
    	solve(1,n,0),sort(a + 1,a + 1 + n,cmp),solve(1,n,1);
    	for (int i = 1; i <= m; i++) printf("%lld\n",ans),ans -= inc[c[i]],inc[c[i]] = 0;
    }
    
  • 相关阅读:
    RN起步常见问题
    spa(单页应用)中,使用history模式时,微信长按识别二维码在ios下失效的问题
    vue 使用axios 跨域请求数据的问题
    vue 使用axios 跨域请求数据的问题
    vue 集成 axios 发送post请求 payload导致后台无法接收到数据问题
    vue-cli 脚手架目录结构说明
    vue-cli 前端开发,后台接口跨域代理调试问题
    ios video标签部分mp4文件无法播放的问题
    青岛旅游攻略
    iOS8使用TestFlight进行内部测试功能尝鲜
  • 原文地址:https://www.cnblogs.com/nibabadeboke/p/16436116.html
Copyright © 2020-2023  润新知