Codeforces Round #485

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;
}

posted on 2018-05-30 19:40  No_CE_in_Vegetable  阅读(89)  评论(0编辑  收藏  举报

导航