当时考试时间剩下太短了然后就挂掉了。。其实是个简单的数据结构。
话说一看最小还以为是动规呢。。
将两堆头对头排。比如样例就是 541|273
因为是必须有优先级次序,依次拿的话,看优先级大小相邻的两个物品位置,中间隔着多少其他物品就行了。因为你要移动相邻的两个,你肯定得把它们中间的所有物品移动一遍(因为两个都得先后在最上边)。
标好号,用前缀和,拿树状数组维护,拿走之后变为0。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define N 200000 #define pos(i,a,b) for(int i=(a);i<=(b);i++) int n1,n2; int n; inline int read() { int su=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch<='9'&&ch>='0') { su=su*10+ch-'0'; ch=getchar(); } return su; } struct haha { int num; int pos; }cun[N]; int c[N]; inline int lowbit(int x) { return x&(-x); } inline void add(int i,int x) { while(i<=n) { c[i]+=x; i+=lowbit(i); } } int temp; inline int cmp(const haha &a,const haha &b) { return a.num>b.num; } int ans; inline int tot(int x) { int sum=0; while(x>0) { sum+=c[x]; x-=lowbit(x); } return sum; } inline int Sum(int i,int j) { if(tot(j)>tot(i-1)) return tot(j)-tot(i-1); else return tot(i)-tot(j-1); } inline int haha() { n1=read(); n2=read(); n=n1+n2; pos(i,1,n1) { cun[i].num=read(); if(cun[i].num>temp) { temp=cun[i].num; ans=i; } cun[i].pos=n1-i+1; } pos(i,1,n2) { cun[n1+i].num=read(); if(cun[n1+i].num>temp) { temp=cun[n1+i].num; ans=i; } cun[n1+i].pos=n1+i; } sort(cun+1,cun+n1+n2+1,cmp); ans--; pos(i,1,n) add(i,1); add(cun[1].pos,-1); //cout<<tot(n); pos(i,2,n) { ans+=Sum(cun[i].pos,cun[i-1].pos); ans--; add(cun[i].pos,-1); } printf("%d",ans); } int sb=haha(); int main() {;;}