ARC160F Count Sorted Arrays 题解
Coffee_zzz · · 题解
考虑把排列
可以时刻维护每个
感性理解,其实只有
时间复杂度
const int N=15,W=1<<15;
int n,m,V,f[N][N],g[W],h[W];
ll dp[W],ans=1;
bool get(int s,int x,int y){
return ((s>>x)&1)>((s>>y)&1);
}
void solve(){
cin>>n>>m,V=1<<n;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) f[i][j]=1;
for(int s=0;s<V;s++) g[s]=s;
for(int i=0;i<=n;i++) h[((1<<i)-1)<<(n-i)]=1;
for(int c=1;c<=m;c++){
int x,y;
cin>>x>>y;
x=(x+ans)%n,y=(y+ans+ans)%n;
if(x>y) swap(x,y);
if(!f[x][y]){
cout<<ans<<endl;
continue;
}
for(int i=0;i<n;i++) f[x][i]=f[i][x]=f[y][i]=f[i][y]=0;
for(int s=0;s<V;s++){
if(get(g[s],x,y)) g[s]^=(1<<x)^(1<<y);
for(int i=0;i<n;i++){
if(get(g[s],min(i,x),max(i,x))) f[x][i]=f[i][x]=1;
if(get(g[s],min(i,y),max(i,y))) f[y][i]=f[i][y]=1;
}
}
for(int s=0;s<V;s++) dp[s]=0;
dp[0]=1;
for(int s=1;s<V;s++){
if(!h[g[s]]) continue;
for(int i=0;i<n;i++) if(s&(1<<i)) dp[s]+=dp[s^(1<<i)];
}
ans=dp[V-1];
cout<<ans<<endl;
}
}