题目大意:给定一个长度为2n的序列,1~n各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数
题解:容易想到(,对于每个数,直接取最近的消掉即可
证明
这个可以用树状数组很方便的维护,但是要相信科技的力量!!!
(我才不会说我用listTLE了呢)
我的收获:分类讨论证明(吼难啊,vector乱搞神啊
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,ans;
bool vis[100005];
vector<int> l;
vector<int>::iterator it;
void eliminate(int x)
{
int i=1;
for(it=l.begin();it!=l.end();it++,i++)
if(*it==x){ans+=l.size()-i;l.erase(it);return ;}
}
void init()
{
cin>>n;
for(int i=1,x;i<=n<<1;i++){
scanf("%d",&x);
if(vis[x]) eliminate(x);
else vis[x]=true,l.push_back(x);
}
cout<<ans<<endl;
}
int main()
{
init();
return 0;
}