题解 SP4226 MSE06H - Japan(树状数组+逆序对)
Posted valentino
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 SP4226 MSE06H - Japan(树状数组+逆序对)相关的知识,希望对你有一定的参考价值。
这道题一开始让我很雾......
不过 思路其实非常清晰:如果i<j a[i].x<a[j].x a[i].y>a[j].y 那么就会产生一个交点 大家画个图就出来了
具体操作也很好实现:
定义一个结构体 x升序排列 当x相同就y升序排列
按照我们的排序方式 把a[i].y踢出来跑树状数组求逆序对就可以了
附上AC代码
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> using namespace std; const int N=1005; int l,n,m,k,c[1005],a[1005]; long long ans=0; struct nodee int x,y; qwq[N*N]; int lowbit(int x) return x&-x; void add(int pos,int x) for(int i=pos;i<=n;i+=lowbit(i)) c[i]+=x; int query(int pos) long long sum=0; for(int i=pos;i>=1;i-=lowbit(i)) sum+=c[i]; return sum; bool cmp(nodee a,nodee b) return (a.x<b.x)||((a.x==b.x)&&(a.y<b.y)); int main() scanf("%d",&l); for(int i=1;i<=l;i++) memset(c,0,sizeof(c)); memset(a,0,sizeof(a)); scanf("%d%d%d",&n,&m,&k); for(int j=1;j<=k;j++) scanf("%d%d",&qwq[j].x,&qwq[j].y); sort(qwq+1,qwq+1+k,cmp); ans=0; for(int j=k;j>=1;j--) add(qwq[j].y,1); ans+=query(qwq[j].y-1); printf("Test case %d: %lld\n",i,ans); return 0;
最后还是要插两句 我开始的逆序对用了离散化 并且在最后求逆序对跑的顺序 不知道为什么 在luogu,Virtual Judge和POJ都是RE,后来还变成了TLE(好过分嘤嘤嘤) 我不知道这是怎么肥四! 这道题应该可以跑归并 我没有尝试 大家有兴趣可以试试 贴一下我RE的代码 至今不知道错在哪 欢迎大佬指正
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> using namespace std; const int N=10005; int l,n,m,k,c[N],a[N]; long long ans=0; struct node int tot,num; qaq[N]; struct nodee int x,y; qwq[N]; int lowbit(int x) return x&-x; void add(int pos,int x) for(int i=pos;i<=1005;i+=lowbit(i)) c[i]+=x; int query(int pos) long long sum=0; for(int i=pos;i>=1;i-=lowbit(i)) sum+=c[i]; return sum; bool cmp(nodee a,nodee b) return (a.x<b.x)||((a.x==b.x)&&(a.y<b.y)); bool cmpp(node a,node b) return a.tot<b.tot; int main() scanf("%d",&l); for(int i=1;i<=l;i++) scanf("%d%d%d",&n,&m,&k); for(int j=1;j<=k;j++) scanf("%d%d",&qwq[j].x,&qwq[j].y); sort(qwq+1,qwq+1+k,cmp); for(int j=1;j<=k;j++) qaq[j].tot=qwq[j].y; qaq[j].num=j; sort(qaq+1,qaq+1+k,cmpp); for(int j=1;j<=k;j++) a[qaq[j].num]=j; ans=0; for(int j=1;j<=k;j++) add(a[j],1); ans+=(j-query(a[j])); printf("Test case %d: %lld\n",i,ans); return 0;
以上是关于题解 SP4226 MSE06H - Japan(树状数组+逆序对)的主要内容,如果未能解决你的问题,请参考以下文章
Azure Pipelines Nuget 还原失败 MSB4226
XV Open Cup named after E.V. Pankratiev Stage 6, Grand Prix of Japan Problem J. Hyperrectangle