[bzoj1106] [POI2007]立方体大作战tet
两对数中间相交应该是可以随便取得。。如果一对数被包含的话,就应该先选这对数。
按顺序读入,凑成一对数就扔掉,树状数组更新对其他位置的影响。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 const int maxn=50023; 7 int t[maxn<<1],pre[maxn]; 8 int i,j,k,n,m,ans; 9 10 inline void del(int x){while(x<=n)t[x]--,x+=x&-x;} 11 inline void add(int x){while(x<=n)t[x]++,x+=x&-x;} 12 inline int get(int x){int sm=0;while(x)sm+=t[x],x-=x&-x;return sm;} 13 int ra;char rx; 14 inline int read(){ 15 rx=getchar(),ra=0; 16 while(rx<'0'||rx>'9')rx=getchar(); 17 while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra; 18 } 19 int main(){ 20 n=read()<<1; 21 for(i=1;i<=n;i++){ 22 j=read(); 23 if(!pre[j])pre[j]=i,add(i);else 24 ans+=get(i)-get(pre[j]-1)-1, 25 del(pre[j]); 26 } 27 printf("%d\n",ans); 28 }