Codeforces #383 Div.2

这是半年之后第一次来打CF了,打完之后的结果就是——发现自己半年根本没有任何的进步,还是一如既往的粗心。
不禁想起了NOIP2016 D1T1爆零的故事。


【NOIP2016】
考场上看到T1十分水,然后敲敲敲,拿第一个样例测了一下,明明答案不对,还是以为自己对了(盲人OI,Best OI)。然后第二个样例真的莫名其妙的过了●▽●。(艹)
然后就爆零了。


言归正传,这次的CF是比较水的。
A.第一题快速幂搞一搞|找规律膜一膜。

B.弄一个桶排序,然后对于每一个数,ai^x=tmp。然后看看tmp有多少个就好了。但是要注意两点:
1.数组要开的大一些,或者加个判断,因为10^5之内的两个数异或是有可能大于10^5的。
2.注意x等于0的时候,应该特殊判断(题目中明确要求两个数下标不同)。

C.只需要找出所有环,如果有的点不在环上,输出-1。剩下的环,如果是偶数,除以2然后取一个lcm就好了。

D.背包问题,数组开小pp了,终测GG。

E.类似一个二分图的构造,可以得到一个结论,无论如何是有解的(懵),然后我们只有、需要在2 * i-1和2 * i 之间连边,然后染色即可。


又浪了一场,丢人了。不过好在还是上分了,rating 到1600了。

【代码】
A

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 20005
#define mlog 16
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; 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();}
    return x*f;
}

int n,a=8;

int main()
{
    n=read();
    int ans=1;
    while (n)
    {
        if (n&1) (ans*=a)%=10;
        (a*=a)%=10;
        n>>=1;
    }
    printf("%d\n",ans);
}

B

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 100005
#define mlog 16
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; 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();}
    return x*f;
}

int x,a[maxn],n,b[maxn];
long long ans=0;

int main()
{
    n=read(); x=read();
    for (int i=1;i<=n;++i) a[i]=read(),b[a[i]]++;
    for (int i=1;i<=n;++i)
    {
        int tmp=a[i]^x;
        if (tmp>100000) continue;
        ans+=b[tmp];
        if (tmp==a[i]) ans--;
    }
    cout<<ans/2<<endl;
}

C

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 105
#define mlog 16
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; 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();}
    return x*f;
}

int n,a[maxn],bel[maxn],dfn[maxn],idx=0,low[maxn],sta[maxn],top=0,ins[maxn];
int siz[maxn],vcnt=0;

void tarjan(int k)
{
//  printf("tarjan %d\n",k);
    sta[++top]=k;
    ins[k]=1;
    dfn[k]=low[k]=++idx;
    if (!dfn[a[k]])
    {
        tarjan(a[k]);
        low[k]=min(low[k],low[a[k]]);
    }
    else if (ins[a[k]]) low[k]=min(low[k],dfn[a[k]]);
    if (low[k]==dfn[k])
    {
        vcnt++;
        int x=-1,cnt=0;
        while (x!=k)
        {
            x=sta[top--];
            bel[x]=vcnt;
            ins[x]=0;
            cnt++;
        }
        siz[vcnt]=cnt;
//      printf("%d is %d\n",vcnt,cnt);
    }
} 

long long gcd(long long a,long long b)
{
    return b==0?a:gcd(b,a%b);
}

long long lcm(long long a,long long b)
{
    return a/gcd(a,b)*b;
}

int main()
{
    n=read();
    for (int i=1;i<=n;++i) a[i]=read();
    for (int i=1;i<=n;++i)
        if (!dfn[i])
            tarjan(i);
//  for (int i=1;i<=n;++i) printf("%d ",siz[bel[i]]); printf("\n");
    long long out=1;
    for (int i=1;i<=n;++i)
    {
        if (siz[bel[i]]==1&&a[i]!=i)
        {
            printf("-1\n");
            return 0;
        }
        else
        {
            if (siz[bel[i]]%2)
            {
                out=lcm(out,(long long)siz[bel[i]]);
            }
            else out=lcm(out,(long long)siz[bel[i]]/2);
        }
    }
    cout<<out<<endl;
}

D

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 1005
#define maxm 100005
#define mlog 16
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; 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();}
    return x*f;
}

int n,m,w;
int v[maxn],b[maxn];
int l[maxm],r[maxm];
int f[maxn]; 

vector <int> son[maxn]; 

int find(int k)
{
    if (f[k]==k) return k;
    else return f[k]=find(f[k]);
}

vector <int> tag;
int dp[maxn][maxn];

int main()
{
    n=read();for (int i=1;i<=n;++i) f[i]=i;
    m=read();
    w=read();
//  printf("w is %d\n",w); 
    for (int i=1;i<=n;++i) v[i]=read();
    for (int i=1;i<=n;++i) b[i]=read();
    for (int i=1;i<=m;++i) l[i]=read(),r[i]=read();
    for (int i=1;i<=m;++i)
    {
//      printf("connect %d and %d\n",l[i],r[i]);
        int fl=find(l[i]),fr=find(r[i]);
        f[fl]=fr;
    }
//  for (int i=1;i<=n;++i) printf("%d ",f[i]); printf("\n");
    for (int i=1;i<=n;++i) if (f[i]!=i) son[find(i)].push_back(i);
    for (int i=1;i<=n;++i) if (f[i]==i) tag.push_back(i);
    memset(dp,-0x3f,sizeof dp);
    dp[0][0]=0;
    for (int i=0;i<tag.size();++i)
    {
        for (int j=0;j<=w;++j) dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
//      printf("now state is %d\n",i+1);
        int now=tag[i],noww=v[now],nowb=b[now];
//      printf("add %d %d\n",noww,nowb);
        for (int j=noww;j<=w;++j)
            dp[i+1][j]=max(dp[i+1][j],dp[i][j-noww]+nowb);
        for (int j=0;j<son[now].size();++j) noww+=v[son[now][j]],nowb+=b[son[now][j]];
//      printf("add %d %d\n",noww,nowb);
        for (int j=noww;j<=w;++j)
        {
            dp[i+1][j]=max(dp[i+1][j],dp[i][j-noww]+nowb);
//          printf("j is %d %d %d %d\n",j,dp[i][j-noww],nowb,dp[i+1][j]);
        }
        for (int j=0;j<son[now].size();++j)
        {
            for (int k=v[son[now][j]];k<=w;++k)
                dp[i+1][k]=max(dp[i+1][k],dp[i][k-v[son[now][j]]]+b[son[now][j]]);
//          printf("add %d %d\n",v[son[now][j]],b[son[now][j]]);
        }
//      for (int j=0;j<=w;++j) printf("%d ",dp[i+1][j]);
    }
//  for (int i=0;i<=tag.size();++i)
//  {
//      for (int j=0;j<=w;++j)
//          printf("%d ",dp[i][j]);
//      printf("\n");
//  }
    int ans=-0x3f3f3f3f;
    for (int i=0;i<=w;++i) ans=max(ans,dp[tag.size()][i]);
    printf("%d\n",ans);
}

E

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 200005
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; 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();}
    return x*f;
}

int out[maxn],a[maxn];
int list[maxn][2],n;
vector <int> v[maxn];

void dfs(int k,int col)
{
//  printf("%d is %d\n",k,col);
    out[k]=col;
    for (int i=0;i<v[k].size();++i)
        if (!out[v[k][i]])
            dfs(v[k][i],3-col);
}

int main()
{
    n=read();
    for (int i=1;i<=n;++i)
    {
        list[i][0]=read();
        list[i][1]=read();
        v[list[i][0]].push_back(list[i][1]);
        v[list[i][1]].push_back(list[i][0]);
        v[i*2-1].push_back(i*2);
        v[i*2].push_back(i*2-1);
    }
    for (int i=1;i<=2*n;++i)
        if (!out[i]) dfs(i,1);
    for (int i=1;i<=n;++i)
        printf("%d %d\n",out[list[i][0]],out[list[i][1]]);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值