标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。