2017-2018 ACM-ICPC, Asia Daejeon Regional Contest 题解(GYM 101667)

12道题,还是按通过人数从高到低做.

韩文题解 http://blog.myungwoo.kr/121(有代码)
这个比赛的榜,170分钟就有队ak了….

D Happy Number

水题,先操作一次即可.

C Game Map

在无向连通图上找一点序列,要求序列中的点依次有边相连且度数递增.

仅保留小度数点到大度数点的边,这张图就成为了一个DAG,题目就转变成了DAG上的最长路,dp可解.
可以直接按度数排出拓扑序,然后依次访问度数较小的邻接点的答案,最后取最大的答案即可.

WA点:访问邻接点时没有判断度数较小.
WA点:每个点的答案没有初始化为1.

const int M = 100016;
vector<int> save[M];
vector<int> id;
int ans[M];
    int n=read(),m=read();
    for(int i=0;iint a=read(),b=read();
        save[a].push_back(b),save[b].push_back(a);
    }
    for(int i=0;iconst int & a,const int &b){
        return save[a].size()int ret=0;
    for(int i:id)
    {
        ans[i]=1;
        for(int j:save[i])
            if(save[j].size()1);
        ret=max(ret,ans[i]);
    }
    printf("%d\n",ret );

F Philosopher’s Walk 分治

哲♂学之路
给定n(2->32768,2的幂次),m(小于等于n^2),问一个长宽为n的哲学图里第m个位置的坐标.
长宽为2的哲学图F2:左下,左上,右上,右下
长宽为4的哲学图F4:左下F2右旋,左上F2,右上F2,右下F2左旋
长款为8的哲学图:依次类推.

分治可解
设F(x,y)为长宽为x的哲学图里第y个位置的坐标
边界F(1,1)=(1,1)
F(x,y):当y<=x^2/4时,F(x,y)=左旋(F(x/2,y))
当y<=x^2/2时,F(x,y)=F(x/2,y-x^2/4)+(0,x/2)
当y<=3*x^2/4时,F(x,y)=F(x/2,y-x^2/2)+(x/2,x/2)
否则,F(x,y)=右旋(F(x/2,y-3*x^2/4))+(x/2,0)

一个显然的问题是,怎么表示坐标.
可以以32769为底去运算(坐标范围是1到32768).编码和解码不多说,加就是直接加.
左右旋:
左旋:x=n+1-y,y=n+1-x
右旋:x=y,y=x

本地错误点1:边界返回(1,1)时没有编码直接返回1
本地错误点2:错误理解左右旋的概念,应该是按路径坐标对应而非直接旋转.

const int B = 32769;
int B1(int x,int y)
{
    return x*B+y;
}
pair<int,int> B2(int p)
{
    return make_pair(p/B,p%B);
}
int zig(int p,int n)
{
    pair<int,int> pii=B2(p);
    int x=pii.second,y=pii.first;
    return B1(x,y);
}
int zag(int p,int n)
{
    pair<int,int> pii=B2(p);
    int x=n+1-pii.second,y=n+1-pii.first;
    return B1(x,y);
}
int cal(int n,int m)
{
    if(n==1) return B1(1,1);
    int x=n*n/4;
    if(m<=x) return zig(cal(n/2,m),n/2);
    if(m<=x*2) return cal(n/2,m-x)+B1(0,n/2);
    if(m<=x*3) return cal(n/2,m-x*2)+B1(n/2,n/2);
    return zag(cal(n/2,m-x*3),n/2)+B1(n/2,0);
}
int main(void)
{
    int n=read(),m=read();
    pair<int,int> pii = B2(cal(n,m));
    printf("%d %d\n",pii.first,pii.second );
    return 0;
}

H - Rock Paper Scissors 卷积

石头剪刀布三种情况是完全独立的,可以求出每一个位置每一种情况的答案,然后求和再取最大值.

列出答案的表示方式,给短序列取反,然后用fft求卷积.

详见学习笔记之 [卷积] 与 [FFT],有这道题的详细解释与代码.

你可能感兴趣的:(题解)