[POI2007]立方体大作战tet

题目

BZOJ
洛谷

做法

很巧妙的题,注意每种颜色只有两个
消除一种颜色,其实就是看中间有多少个没有被消除的块,这种动态距离问题显然能用树状数组解决
洛谷输出方案,暴力往下爬就行

My complete code

#include<bits/stdc++.h>
using namespace std;
typedef int LL;
const LL maxn=1e6+9;
LL n,top,ans,xiaochu;
LL pre[maxn],tree[maxn],sta[maxn];
inline LL Lowbit(LL x){ return x&-x; }
inline void Add(LL x,LL val){ for(;x<=2*n;x+=Lowbit(x)) tree[x]+=val; }
inline LL Query(LL x){ LL ret(0); for(;x;x-=Lowbit(x)) ret+=tree[x]; return ret; }
int main(){
	scanf("%d",&n);
	for(LL i=1;i<=2*n;++i) Add(i,1);
	for(LL i=1;i<=2*n;++i){
		LL col; scanf("%d",&col);
		if(!pre[col]) pre[col]=i;
		else{
			ans+=Query(i-1)-Query(pre[col]);
			LL dis(Query(i-1)-Query(pre[col])),now(i);
			while(dis){
				sta[++top]=now-xiaochu-1;
				--now;
				--dis;
			}
			Add(i,-1); Add(pre[col],-1);
			xiaochu+=2;
		}
	}
	printf("%d
",ans);
	for(LL i=1;i<=top;++i) printf("%d
",sta[i]);
	return 0;
} 
原文地址:https://www.cnblogs.com/y2823774827y/p/10474785.html