2016年大连icpc现场赛部分题解

A Wrestling Match
大概就是会给你n个人m场比赛(每场比赛的两个人一个好人一个坏人)以及好人和坏人的数量 问是否能分出好人和坏人
师哥说是个二分图的匹配问题 用染色法做
emmmmm当时做的时候没看都…后来补题的时候做的不知道对不对对…我也不知道怎么a的反正是ac了(滑稽

#include <iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<map>
using namespace std;
typedef long long LL;
struct qwe
{
    int for1,to;
} s[20005];
int cnt=0,head[1005],ans1[1005],ans2[1005],i,j,k,po,flag,flag1,flag2,a,b,m,n,z,x;
void add_in(int mn,int nm)
{
    s[cnt].to=nm;
    s[cnt].for1=head[mn];
    head[mn]=cnt;
    cnt++;
}
void querty(int mn)
{
    int i=mn,j,k=ans1[mn];
    for(j=head[i]; j!=-1; j=s[j].for1)
    {
        if(ans2[s[j].to]==1)
        {
            if(ans1[s[j].to]==0)
            {
                ans1[s[j].to]=k^3;
                querty(s[j].to);
            }
            else if(ans1[s[j].to]!=(k^3))
            {
                po=3;
            }
        }
    }
}
int main()
{
    while(~scanf("%d%d%d%d",&m,&n,&a,&b))
    {
        cnt=0;
        flag=1;
        for(i=0; i<=m; i++)
            head[i]=-1,ans1[i]=0,ans2[i]=0;
        for(i=0; i<n; i++)
        {
            scanf("%d%d",&z,&x);
            add_in(z,x);
            add_in(x,z);
            ans2[z]=1;
            ans2[x]=1;
        }
        for(i=0; i<a; i++)
        {
            scanf("%d",&z);
            ans1[z]=1;
            ans2[z]=2;
        }
        for(i=0; i<b; i++)
        {
            scanf("%d",&z);
            ans1[z]=2;
            ans2[z]=2;
        }
        for(i=1; i<=m; i++)
        {
            if(!ans2[i])
                flag=0;
        }
        if(flag)
        {
            flag1=0;
            po=0;
            for(i=1;i<=m;i++)
            {
                if(ans1[i]!=0)
                {
                    for(j=head[i];j!=-1;j=s[j].for1)
                    {
                        if(ans1[s[j].to]==0)
                        {
                            ans1[s[j].to]=ans1[i]^3;
                        }
                        else
                            if(!(ans1[s[j].to]^ans1[i]))
                            {
                                po=3;
                                break;
                            }
                    }
                }
            }
            if(po>1)
            {
                flag=0;
            }
            //printf("%d\n",flag);
            if(flag)
            for(i=1; i<=m; i++)
            {
                //printf("%d %d\n",ans1[i],ans2[i]);
                if(ans2[i]==1)
                {
                    if(ans1[i]==0)
                    {
                        ans1[i]=flag1+1;
                        querty(i);
                    }
                    flag1++;
                    flag1%=2;
                }
                else
                {
                    for(j=head[i];j!=-1;j=s[j].for1)
                    {
                        if(ans1[s[j].to]==0)
                            ans1[s[j].to]=ans1[i]^3;
                        else
                            if(!(ans1[s[j].to]^ans1[i]))
                            {
                                po=3;
                                break;
                            }
                    }
                }
                if(po>1)
                    break;
            }
            if(po>1)
                flag=0;
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

C Game of Taking Stones
是个典型的约瑟夫博弈…然而当时并不会做而且还要用到java大数…

D A Simple Math Problem
题目大意是给你两个数 一个是 a+b 另一个是ab/gcd(a,b)让你求a和b的值 然后 这题 会发现 这两个数的gcd 就是a和b的gcd
H To begin or not to begin
题目大意是给你k个黑球和一个红球 两个人轮流拿 谁先摸到红球获胜 问你谁先开始获胜的可能性高 1是先拿的高 2是后拿的高 0是两个一样
这题猜的结论 就先算几个找规律就往完了…
I Convex
题目大意给你一个n边凸包每个顶点到中心的距离一样 给你n和边长 每两条边之间的夹角 然后让你求这个凸包的面积
日常 1/2
sin(m)ab 就完了…
J Find Small A
给你n个数字 让你看它的二进制里头 有多少个97(指后8位和97一样)
用位运算…

其他的 补题(待续中…

猜你喜欢

转载自blog.csdn.net/qq_41886199/article/details/83277849
今日推荐