2019 ICPC Asia Nanjing Regional(现场赛)

 A. A Hard Problem

找规律即可。

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

int main()
{
    int t; scanf("%d",&t);
    while(t--)
    {
        ll n; scanf("%lld",&n);
        if(n==2) printf("2\n");
        else
        {
            if(n%2==0) printf("%lld\n",(n/2-1)+2);
            else printf("%lld\n",n/2+2);
        }
    }
    return 0;
}

H. Prince and Princess

假设c全为反对者,那么反对者一共有b+c。个人理解是,对于可询问的三个问题,只向对方询问“公主在哪个房间”这个问题。在支持者比反对者多的情况下,得到的正确回答一定比错误回答要多(支持者一定回答的是正确的,可以假设反对者都说出同一个错误的房间),那么只需要询问2*(b+c)+1次问题即可。但是当出现1 0 0这组特例的时候,支持者就是公主本人,所以输出0。

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

int main()
{
    int a,b,c; scanf("%d%d%d",&a,&b,&c);
    if(a>b+c)
    {
        printf("YES\n");
        if(a==1) printf("0\n");
        else printf("%d\n",(b+c)<<1 | 1);
    }
    else printf("NO\n");
    return 0;
}

C. Digital Path

用a,b,c,d分别记录该位置往下还可以走0个点,1个点,2个点,大于等于3个点的数量。将可以往下走0个点的位置的a值赋值位0,并对每一个位置进行dfs,即处理完所有可行的路径,最终递归将该位置的b,c,d值更新取模。在最终计算可行的路径之前,要判断出该位置是否是最大路径的起点,如果该位置可以被上下左右的任意位置走到,则肯定不是最大路径。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
int n,m,k[5][5]={{-1,0},{0,-1},{1,0},{0,1}};

struct node
{
    int num;
    ll a,b,c,d;
    bool flag;
}p[1005][1005];

bool checkpoint(int x,int y)
{
    if(x<=0 || x>n || y<=0 || y>m) return false;
    return true;
}

bool check1(int i,int j)
{
    if(i-1>0 && p[i-1][j].num-p[i][j].num==1) return true;
    if(i+1<=n && p[i+1][j].num-p[i][j].num==1) return true;
    if(j-1>0 && p[i][j-1].num-p[i][j].num==1) return true;
    if(j+1<=m && p[i][j+1].num-p[i][j].num==1) return true;
    return false;
}

bool check2(int i,int j)
{
    if(i-1>0 && p[i][j].num-p[i-1][j].num==1) return false;
    if(i+1<=n && p[i][j].num-p[i+1][j].num==1) return false;
    if(j-1>0 && p[i][j].num-p[i][j-1].num==1) return false;
    if(j+1<=m && p[i][j].num-p[i][j+1].num==1) return false;
    return true;
}

node dfs(int i,int j)
{
    if(p[i][j].flag) return p[i][j];
    p[i][j].flag=true;
    for(int t=0;t<4;t++)
    {
        int nx=i+k[t][0],ny=j+k[t][1];
        if(checkpoint(nx,ny) && p[nx][ny].num-p[i][j].num==1)
        {
            node next=dfs(nx,ny);
            p[i][j].b=(p[i][j].b+next.a)%mod;
            p[i][j].c=(p[i][j].c+next.b)%mod;
            p[i][j].d=(p[i][j].d+next.c+next.d)%mod;
        }
    }
    return p[i][j];
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&p[i][j].num);
            p[i][j].flag=false;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(check1(i,j)) p[i][j].a=0;
            else p[i][j].a=1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dfs(i,j);
        }
    }
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(check2(i,j)) ans=(ans+p[i][j].d)%mod;
        }
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/benzikun/p/12188530.html