2020 CCPC 威海

vp地址

A - Golden Spirit

int T,n,x,t;
signed main()
{
    T=rd;
    while(T--)
    {
        n=rd,x=rd,t=rd;
        int ans=2*n*t*2;
        if(x>=2*(n-1)*t) 
        {
            int q=x-2*(n-1)*t;
            if(q<=t) ans+=q;
            else ans+=max(q-t,t);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

\(\\\)
\(\\\)
\(\\\)
\(\\\)

C - Rencontre

c题想了个假做法呜呜,调了好久
思路:对每一个人,统计其余两人距他的边权和,全部统计后res/=4
问题:当其余两人可选择重复酒店时,会有一条重复边不参与统计,导致 res/4出错
下面是假代码 [呜呜.jpg]

void dfs(int u,int fa,int d)
{
    dep[u]=dep[fa]+d;
    siz[u]=f[u];
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to,w=e[i].l;
        if(v==fa)continue;
        dfs(v,u,w);
        siz[u]+=siz[v];
    }
}
void dfs1(int u,int fa)
{
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to;
        if(fa==v)continue;
        ans[v]=ans[u]+((siz[1]-siz[v])-siz[v])*e[i].l;
        dfs1(v,u);
    }
}

db solve(int x,int y,int z)
{
    db res=0;
    pos(i,0,n) f[i]=0,ans[i]=0,siz[i]=0,dep[i]=0;
    pos(i,1,m[x]) f[b[x][i]]=1;
    pos(i,1,m[y]) f[b[y][i]]=1;
    dfs(1,0,0);
    pos(i,1,m[x]) ans[1]+=dep[b[x][i]];
    pos(i,1,m[y]) ans[1]+=dep[b[y][i]];
    dfs1(1,0);
    pos(i,1,m[z]) res+=ans[b[z][i]];
    return res/(m[x]*m[y]*1.0);
}

signed main()
{
    n=rd;
    pos(i,1,n-1)
    {
        int x=rd,y=rd,z=rd;
        add(x,y,z);
        add(y,x,z);
    }
    pos(k,1,3)
    {
        m[k]=rd;
        pos(i,1,m[k]) b[k][i]=rd;
    }
    db res=0;
    res+=solve(1,2,3);
    res+=solve(1,3,2);
    res+=solve(2,3,1);
    printf("%.9lf\n",res/4.0);
    return 0;
}

第二天早上其实是中午
想了一下,稍改动一点即可

/*
不变
*/
db solve(int x,int y)
{
    db res=0;
    pos(i,0,n) f[i]=0,ans[i]=0,siz[i]=0,dep[i]=0;
    pos(i,1,m[x]) f[b[x][i]]=1;
    dfs(1,0,0);
    pos(i,1,m[x]) ans[1]+=dep[b[x][i]];
    dfs1(1,0);
    pos(i,1,m[y]) res+=ans[b[y][i]];
    return res/(m[x]*m[y]*1.0);
}

signed main()
{
    /*
    不变
    */
    db res=0;
    res+=solve(1,2);
    res+=solve(1,3);
    res+=solve(2,3);
    printf("%.9lf\n",res/2.0);
    return 0;
}

\(\\\)
\(\\\)
\(\\\)
\(\\\)

D - ABC Conjecture

int n,t;
signed main()
{
    t=rd;
    while(t--)
    {
        n=rd;
        int len=(int)pow(n,(double)1/3);
        int tr=0;
        pos(i,2,len)
        {
            if(n%(i*i)==0) 
            {
                tr=1;
                break;
            }
            while(n%i==0) n/=i; 
        } 
        if(tr){puts("yes");continue;}
        if(n>1)
        {
            int x=sqrt(n); 
            if(x*x==n)tr=1;
        }
        if(tr) puts("yes");
        else puts("no");
    }
    return 0;
}

\(\\\)
\(\\\)
\(\\\)
\(\\\)

H - Message Bomb

int n,m,s;
set<int>ss[Max];
int a[Max],b[Max];
signed main()
{
    n=rd,m=rd,s=rd;
    pos(i,1,s)
    {
        int x=rd,y=rd,z=rd;
        if(x==1)
        {
            ss[y].insert(z);
            a[y]-=b[z];
        }
        if(x==2)
        {
            ss[y].erase(z);
            a[y]+=b[z];
        }
        if(x==3)
        {
            a[y]--;
            b[z]++;
        }
    }
    pos(i,1,m)
    {
        for(auto j:ss[i]) a[i]+=b[j];
        printf("%lld\n",a[i]);
    }
    return 0;
}

\(\\\)
\(\\\)
\(\\\)
\(\\\)

L - Clock Master

int n,t;
int P[Max];
db logg[Max],f[Max];
bool vis[Max];
signed main()
{
    t=rd;
    int cnt=0;
    mst(vis,1);
    vis[1]=0;
    pos(i,2,Max)
    {
        if(vis[i]) P[++cnt]=i;
        for(int j=1;j<=cnt && i*P[j]<=Max;j++)
        {
            vis[i*P[j]]=0;
            if(i%P[j]==0) break;
        }
    }
    pos(i,0,Max) logg[i]=log(i);
    mst(f,0);
    pos(i,1,cnt)neg(j,Max-99,P[i])
    {
        for(int k=P[i];k<=Max-99;k*=P[i])
        {
            if(j-k<0) continue;
            f[j]=max(f[j],f[j-k]+logg[k]);
        }
    }
    while(t--)
    {
        n=rd;
        printf("%.9lf\n",f[n]);
    }
    return 0;
}
posted @ 2021-11-03 00:56  juuich  阅读(26)  评论(0编辑  收藏  举报