2020 CCPC 威海
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;
}