码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #485

时间:2018-05-30 21:04:32      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:sig   就是   关系   getch   scanf   ati   有一个   ret   标记   

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

Codeforces Round #485

标签:sig   就是   关系   getch   scanf   ati   有一个   ret   标记   

原文地址:https://www.cnblogs.com/NoCEinVegetable/p/9112919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!