Codeforces LATOKEN Round 1 (Div. 1 + Div. 2)题解

比赛链接

A - Colour the Flag
有一个n*m矩阵
要将空白格子涂成红或者白
使得相邻两个格子颜色不一样
只要有一个涂上颜色则可确定最终的涂色结果
绝了 这题怎么代码量更大

 

int n,m;
char s[55],c[2];
bool ju;
void solve()
{
    sdd(n,m);
    c[0]='A'; 
    ju=0;
    rep(i,1,n)
    {
        sc(s+1);
        if(ju)continue;
        rep(j,1,m)
        {
            if(s[j]=='.')continue;
            int pos=(i+j)&1;
            if(c[0]=='A')//前面没有已涂色的 
            {
                c[1]='R';c[0]='W';
                if(pos&&s[j]=='W'||!pos&&s[j]=='R')
                c[1]='W',c[0]='R';
            }
            else
            {
                if(c[pos]!=s[j])ju=1;
            }
        }
    }
    if(ju)puts("NO");
    else
    {
        puts("YES");
        if(c[0]=='A')c[0]='R',c[1]='W';
        rep(i,1,n)
        {
            rep(j,1,m)
            {
                int pos=(i+j)&1;
                printf("%c",c[pos]);
            }
            puts("");
        }
    } 
}

B. Histogram Ugliness

我可以,陪你去看星星~
将一个直方图的某一列削掉几个
结果为直方图左右边边的数目+操作次数
如果左右的数都比当前数小,就可以将这个值减去h[i]-max(h[i-1],h[i+1])
为什么错了呢
没毛病呀
还好没打。。不然要被气死了哈
!!!!h[n+1]的值没赋0
我是傻子qwq

int n,h[maxn];
ll ans;
void solve()
{
    sd(n);ans=0;
    rep(i,1,n)sd(h[i]),ans+=abs(h[i]-h[i-1]);
    ans+=h[n];
    h[n+1]=0;
    rep(i,1,n)
    {
        if(h[i]>h[i-1]&&h[i]>h[i+1])ans-=h[i]-max(h[i-1],h[i+1]);
    }
    plld(ans);
}

C. Little Alawn's Puzzle

一个2*n的矩阵
每一行都是n的全排列
要同一行同一列的数都不一样
通过交换同一列的两个数实现
问能够得到多少种满足条件的矩阵
那就是这些数构成一个一个的环
答案就是kpow(2,cnt):cnt是环的个数
如果存在环的大小为1的话答案就是0

int n,a[maxn],b[maxn],pos[maxn],cnt;
bool vis[maxn];
int kpow(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1)ans=1ll*ans*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }
    return ans;
}
void solve()
{
    sd(n);cnt=0;
    rep(i,1,n)sd(a[i]),vis[i]=0,pos[a[i]]=i;
    rep(i,1,n)sd(b[i]);
    rep(i,1,n)
    {
        if(vis[i])continue;
        if(a[i]==b[i])
        {
            puts("0");
            return;
        }
        cnt++;
        int las=b[i];
        while(las!=a[i])
        {
            vis[pos[las]]=1;
            las=b[pos[las]];
        }
    }
    pd(kpow(2,cnt));
}

D. Lost Tree

有n个点的树,让你猜哪些是边
选择一个点r,可以得到其它点到r的最短距离
可以询问n/2次!!!向上取整!!!
~~那就是间隔一层询问一次~~
看以1为根结点时,奇数层的个数与偶数层个数的大小

int n,r,x,a[maxn];
int cnt1,cnt2;
bool is[maxn][maxn];
void solve()
{
    sd(n);
    printf("? 1\n");fflush(stdout);
    cnt2=-1;
    rep(i,1,n)
    {
        sd(a[i]);
        if(a[i]&1)cnt1++;
        else cnt2++;
        if(a[i]==1)is[1][i]=is[i][1]=1;
    }
    int ju=(cnt1>=cnt2);
    rep(i,2,n)
    {
        if((a[i]&1)==ju)continue;
        printf("? %d\n",i);fflush(stdout);
        rep(j,1,n)
        {
            sd(x);
            if(x==1)is[i][j]=is[j][i]=1;
        }
    }
    puts("!");
    rep(i,1,n)rep(j,i+1,n)if(is[i][j])pdd(i,j);
}

 

posted @ 2021-06-14 14:01  芥么拉  阅读(135)  评论(0编辑  收藏  举报