ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[CQOI2011] 动态逆序对

2022-07-01 22:35:07  阅读:128  来源: 互联网

标签:int fl mid long ++ query 动态 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;
}

标签:int,fl,mid,long,++,query,动态,CQOI2011,逆序
来源: https://www.cnblogs.com/nibabadeboke/p/16436116.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有