B. Petr and Permutations
大致题意:给出一个1~n的排列,已知该序列是由1,2,3,,,,n随机交换k次数得来,其中(k=3*n)或(k=7*n-1)判断该序列是交换多少次得来。
交换任意两个数会使逆序对个数变化奇数个,而(3*n)和(7*n-1)奇偶性不同,因此我们可以直接判断该序列的逆序对个数的奇偶性与(n)的奇偶性是否相同即可。
(场上我像智障一样打错变量名wa了两发,不然就上黄了。。。)
#include<bits/stdc++.h>
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define Clear(a,b) memset(a,b,sizeof(a))
#define inout(x) printf("%d",(x))
#define douin(x) scanf("%lf",&x)
#define strin(x) scanf("%s",(x))
#define op operator
typedef unsigned long long ULL;
typedef const int cint;
typedef long long LL;
using namespace std;
template<typename Q>
void inin(Q &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
x=f?-x:x;
}
int n,a[1000010],b[1000010];
int ans;
void guibing(int l,int r)
{
if(l==r)return ;
int mid=(l+r)>>1;
guibing(l,mid),guibing(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
b[k++]=a[i++];
else
{
b[k++]=a[j++];
ans+=(mid-i+1);
ans%=2;
}
}
while(i<=mid)b[k++]=a[i++];
while(j<=r)b[k++]=a[j++];
for(i=l;i<=r;i++)
a[i]=b[i];
}
int main()
{
inin(n);
re(i,1,n)inin(a[i]);
guibing(1,n);
int ans1=n%2;
int ans2=ans%2;
if(ans1==ans2)cout<<"Petr";
else cout<<"Um_nik";
return 0;
}
C. AND Graph
大致题意:给出(n),(m),和(m)个数(x_i<=2^n-1)若(x_i)&(x_j=0)则把这两个数连一条无向边,求这(m)个数构成了多少个连通块。
5个人没有一个人想出来解法,然而这个题就是一手(nlog_2^n)暴搜。。。当然会搜到不属于这m个数的数,这又有什么关系呢?打一手"wocao"标记即可。。。我A掉之后很无语
#include<bits/stdc++.h>
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define Clear(a,b) memset(a,b,sizeof(a))
#define inout(x) printf("%d",(x))
#define douin(x) scanf("%lf",&x)
#define strin(x) scanf("%s",(x))
#define op operator
typedef unsigned long long ULL;
typedef const int cint;
typedef long long LL;
using namespace std;
template<typename Q>
void inin(Q &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
x=f?-x:x;
}
int n,bo[5000050],m,a[5000050],wocao[5000050],ans,nn;
void dfs(int x)
{
if(bo[x])return ;
bo[x]=1;
if(wocao[x])dfs(nn^x);
re(i,0,n)
if(x&(1<<i))dfs(x^(1<<i));
}
int main()
{
inin(n),inin(m);
nn=(1<<n)-1;
re(i,1,m)inin(a[i]),wocao[a[i]]=1;
re(i,1,m)if(!bo[a[i]])
{
ans++;
dfs(a[i]);
}
cout<<ans;
return 0;
}