Inverse Pair
题意:给出一个有序的全排列,每个元素可以+1,也可以不加,求更新后序列的最少的逆序列对个数。
先一组一组找逆序对,把逆序对中第二个+1,然后树状数组求逆序对。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define ll long long
#define lowbit(x) x&-x
#define N 200005
int a[N],d[N],c[N],book[N],n;
bool cmp(int x,int y){//排除离散化
if(a[x]==a[y]) return x>y;
else return a[x]>a[y];
}
void update(int x,int y){
while(x<=n){
c[x]+=y;
x+=lowbit(x);
}
}
int getsum(int x){
int sum=0;
while(x>=1){
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
book[a[i]]=2;
}
for(int i=1;i<=n;i++){
if(book[a[i]]==2&&book[a[i]-1]==2){
book[a[i]]=0;
book[a[i]-1]=1;
}
else if(book[a[i]]==2) book[a[i]]=0;
a[i]=a[i]+book[a[i]];
d[i]=i;
}
// for(int i=1;i<=n;i++){
// cin>>a[i];
// d[i]=i;
// }
sort(d+1,d+1+n,cmp);
ll ans=0;
for(int i=1;i<=n;i++){
update(d[i],1);
ans+=getsum(d[i]-1);
}
cout<<ans<<endl;
}
还有一种,先贴这儿
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define ll long long
#define lowbit(x) x&-x
ll c[8000005],a[200005];
void update(int x,int y,int n){
for(int i=x;i<=n;i+=lowbit(i)) c[i]+=y;
}
int getsum(int x){
ll sum=0;
for(int i=x;i>=1;i-=lowbit(i)) sum+=c[i];
return sum;
}
signed main()
{
ll n; cin>>n;
ll ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
ll x=getsum(n)-getsum(a[i]);
ll y=getsum(n)-getsum(a[i]+1);
if(x<=y){
ans+=x;
update(a[i],1,n);
}
else{
ans+=y;
update(a[i]+1,1,n);
}
}
cout<<ans<<endl;
}
Just a joke
对于线:删除一条边后剩一个单独的点,相当于一个轮回
对于环:同理,但需要先删除一条边变成线
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
#define ll long long
//#define lowbit(x) x&-x
//#define N 200005
//typedef __int128 ll;
//typedef pair<int,int>pll;
int a[110][110];
int find(int x){
if(x==f[x]) return f[x];
else return f[x]=find(f[x]);
}
signed main()
{
int n,m; cin>>n>>m;
int h=0;//环的个数
for(int i=1;i<=n;i++) f[i]=i;
while(m--){
int u,v; cin>>u>>v;
int t1=find(u),t2=find(v);
if(t1!=t2) f[t1]=find(t2);
else h++;
}
int cnt=0;
for(int i=1;i<=n;i++){
if(f[i]==i) cnt++;
}
if((cnt+h)%2==0) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}