Training camp day1

https://vjudge.net/contest/312902?tdsourcetag=s_pctim_aiomsg#overview

A

B

C

D

E

#include<bits/stdc++.h>
using namespace std;

char mp[1005][1005];
int mpf[1005][1005];
int dir[4][2]= {-1,0,1,0,0,-1,0,1};
int flagw[10000005];

struct note
{
    int x,y;
};
queue<note> que;
int main()
{
    int n,m,q;
    scanf("%d%d%d",&n,&m,&q);
    for(int i=1; i<=n; i++)
        scanf("%s",mp[i]+1);
    int flag=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            if(mp[i][j]=='.')
            {
                flag++;
                note t;
                t.x=i;
                t.y=j;
                que.push(t);
                int w=0;
                while(!que.empty())
                {

                    note t=que.front();
                    que.pop();
                    if(mp[t.x][t.y]!='.') continue;
                    mpf[t.x][t.y]=flag;
                    mp[t.x][t.y]='#';
                    for(int k=0; k<4; k++)
                    {
                        int nx,ny;
                        nx=t.x+dir[k][0];
                        ny=t.y+dir[k][1];
                        if(nx>n||nx<1||ny>m||ny<1) continue;
                        if(mp[nx][ny]=='*')
                            w++;
                        else  if (mp [NX] [ny] == ' . ' ) 
                        { 
                            note tt; 
                            tt.x = NX; 
                            tt.y = ny; 
                            que.push (tt); 
                        } 
                    } 
                } 
                Flagw [flag] = w; 
            } 
        } 
    For ( int i = 1 ; i <= q; i ++ ) 
    { 
        int a, b; 
        scanf ("%d%d",&a,&b);
        printf("%d\n",flagw[mpf[a][b]]);
    }
}
View Code

F

G

H

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
ll sum[maxn];
ll val[maxn];
int head[2*maxn],ver[2*maxn],nxt[2*maxn];
ll edge[2*maxn];
int tot;
int ans=0;
void add(int u,int v,ll w)
{
    ver[++tot]=v;
    edge[tot]=w;
    nxt[tot]=head[u];
    head[u]=tot;
}
void dfs(int u,int fa)
{
    if(sum[u]<=val[u])
        ans++;
    else
        return;
    for(int i=head[u]; i; i=nxt[i])
    {
        int v=ver[i];
        if(v==fa) continue;
        ll w=edge[i];
        if(sum[u]+w>0)
            sum[v]=sum[u]+w;
        else
            sum[v]=0;
        dfs(v,u);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
        scanf("%d",&val[i]);
    for(int i=2; i<=n; i++)
    {
        int v;
        ll w;
        scanf("%d%lld",&v,&w);
        add(i,v,w);
        add(v,i,w);
    }
    dfs(1,0);
    printf("%d",n-ans);
}
View Code

I

J

K

L

#include<bits/stdc++.h>
using namespace std;
//int e[5005][5005];
vector<int> e[5005];
int check(int x)
{
    int y=e[x][0];
    int z=e[y][0];
    if(e[z][0]==x)
        return 1;
    else
        return 0;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        int a;
        scanf("%d",&a);
        e[i].push_back(a);
    }
    int flag=0;
    for(int i=1; i<=n; i++)
    {
        if(check(i))
        {
            flag=1;
            break;
        }
    }
    if(flag)
        printf("YES");
    else
        printf("NO");
}
View Code

M

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1e5+10;
int f[maxn];
int head[2*maxn],ver[2*maxn],edge[2*maxn],nxt[2*maxn];
int tot;

int getf(int x)
{
    if(f[x]==x) return x;
    return f[x]=getf(f[x]);
}
void add(int u,int v,int w)
{
    ver[++tot]=v;
    edge[tot]=w;
    nxt[tot]=head[u];
    head[u]=tot;
}

int kd[maxn];
int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1; i<=m; i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
    for(int i=1; i<=k; i++)
    {
        int t;
        scanf("%d",&t);
        kd[t]=1;
    }
    int minn=INF;
    for(int i=1; i<=n; i++)
    {
        if(kd[i]==1)
        {
            for(int j=head[i]; j; j=nxt[j])
            {
                int v=ver[j];
                int w=edge[j];
                if(kd[v]==0)
                    minn=min(minn,w);
            }
        }
    }
    if(minn!=INF)
        printf("%d",minn);
    else
        printf("-1"); 
}
View Code

N

#include<bits/stdc++.h>
using namespace std;

const int maxn=5e5+10;
int f[maxn];
int size[maxn];

int getf(int x)
{
    if(f[x]==x)
        return x;
    else
        return f[x]=getf(f[x]);
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
    {
        f[i]=i;
        size[i]=1;
    }
    while(m--)
    {
        int t;
        scanf("%d",&t);
        int a,b;
        if(t>0)
        {
            scanf("%d",&a);
            t--;
        }
        else
            continue;
        int    t1=getf(a);
        for(int i=1; i<=t; i++)
        {
            scanf("%d",&b);
            int t2;
            t2=getf(b);
            if(t1==t2) continue;
            f[t2]=t1;
            size[t1]+=size[t2];
        }
    }
    for(int i=1; i<=n; i++)
    {
        int t=getf(f[i]);
        printf("%d ",size[t]);
//        printf("%d %d\n",getf(f[i]),size[i]);
    }
}
View Code

O

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
vector<int> v[maxn];
int book[maxn];
vector<int> v1,v2;
int flag=1;
void dfs(int x,int fa)
{
    for(int i=0; i<v[x].size(); i++)
    {
        int y=v[x][i];
        if(y==fa) continue;
        if(book[x]==1)
        {
            if(book[y]==1)
            {
                flag=0;
                return;
            }
            if(book[y]==0)
            {
                book[y]=2;
                dfs(y,x);
            }

        }
        if(book[x]==2)
        {
            if(book[y]==2)
            {
                flag=0;
                return;
            }
            if(book[y]==0)
            {
                book[y]=1;
                dfs(y,x);
            }
        }
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        v[a].push_back(b);
        v[b].push_back(a);
    }

    for(int i=1; i<=n; i++)
    {
        if(book[i]==0&&v[i].size())
        {
            book[i]=1;
            dfs(i,0);
        }
    }
    if(flag)
    {
        for(int i=1; i<=n; i++)
        {
            if(book[i]==1)
                v1.push_back(i);
            if(book[i]==2)
                v2.push_back(i);
        }
        printf("%d\n",v1.size());
        for(auto i:v1)
            printf("%d ",i);
        printf("\n");
        printf("%d\n",v2.size());
        for(auto i:v2)
            printf("%d ",i);
    }
    else
        printf("-1");
}
View Code

 

Guess you like

Origin www.cnblogs.com/dongdong25800/p/11224286.html