暑假集训7月15

二分图染色(最近是被DFS折磨的一段颇有遗憾的时光)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10,M=2e5+10;
int h[N],e[M],ne[M],idx;
int color[N];
int n,m;
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u,int c)
{
    color[u]=c;
    for (int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if (!color[j])
        {
            if (!dfs(j,3-c))
                return false;
        }
        else if (color[j]==c)
            return false;
    }
    return true;
}
signed main()
{
    memset(h,-1,sizeof h);
    cin>>n>>m;
    while (m--)
    {
        int a,b;
        cin>>a>>b;
        add(a,b);
        add(b,a);
    }
    bool flag=1;
    for (int i=1;i<=n;i+=)
    {
        if (!color[i])
        {
            if (!dfs(i,1))
            {
                flag=0;
                break;
            }
        }
    }
    if (flag)puts("Yes");
    else puts("No");
    return 0;
}

 

K - Birthday Puzzle

#include <iostream>
#include <algorithm>
#include <cstring>
#include <math.h>

using namespace std;
int a[25],n;
long long int sum;

void dfs(int u, long long int x)
{
    sum += x;

    if(u >= n)
    return ;
    for(int i=u+1; i<=n; i++)
    {
        dfs(i, x|a[i]);
    }
}
int main()
{
    cin>>n;
    for(int i =1; i <= n; i++)
    {
        cin>>a[i];
    }
    dfs(0, 0);
    cout<<sum<<"\n";
    return 0;
}

 

I - Ultimate Army(栈)

大概就是,若出现5(3之类的表示5是3的直接上级,5(表示5是别人的上级,所以它要入栈,若出现))之类的表示有一层同级关系已经找完了,就不管这一层了,栈里出一个元素,然后找另一层。

大概就是,一层一层地看。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1000000+66;
int vis[maxn];
char ch[maxn];
stack<int>s;
int main()
{
    int n;
    scanf("%d",&n);
    scanf("%s",ch);
    int len=strlen(ch);
    int num=0;
    s.push(0);
    for(int i=0; i<len; i++)
    {
        if(ch[i]>='0'&&ch[i]<='9')
        {
            num=num*10+ch[i]-'0';//可能是多位数,计算它
        }
        else
        {
            if(!num)
            {
                if(ch[i]==')')
                {
                    s.pop();//当没有数时,而且此时为右括号,则出栈
                }
            }
            else//有数时
            {
 
                vis[num]=s.top();//取栈顶的
 
                if(ch[i]=='(')
                {
                    s.push(num);//若是左括号,则进栈
                }
            }
            num=0;
        }
    }
    for(int i=1; i<=n; i++)
    {
        if(i!=n)
        {
            printf("%d ",vis[i]);
        }else
        {
            printf("%d\n",vis[i]);
        }
    }
    return 0;
}

 

posted @ 2022-07-15 09:34  好腻友Π  阅读(19)  评论(0)    收藏  举报