2022HDU多校第七场
作者:互联网
2022HDU多校第七场
过程
本场队友上场秒了08,是昨天刚出现的nim博弈,随后04模拟分类讨论,我巨大演员wa了2发过了,随后03一眼树形dp,想了想计数方法,随后忘情况演了一发,然后就过了。随后便开始坐牢,队友做06,我看09,09打了个\(n*m\)的暴力,发现了一点整除分块的性质,然而对于做题并没有什么卵用,这里应该要靠到积性函数去,然后看了一眼10,发现是期望推式子题,应该还需要多项式,随后看02过的人有点多便去想02,发现了图的特殊性质一遍过,最后队友06寄了,最后1h狂调06,赛后发现是队友在输入时把k=0特判了,以为所有数的0次方都为0,但实际只有\(0^0\)为0,而我看他代码时只看了一看快速幂里面的判断和dp转移,没看输入,然后对拍造的数据也是恰好的把k=0的情况忽略了,然后拍的速度飞起,但却查不出错,这下难受了。赛后听说07也是树形dp,09min25,10多项式,07事实必09,10好做,只能说卡06时间太长了,没时间看了。
题解
08
三条边各减一异或,为0输,否则赢。为nim游戏。
04
模拟,找最少合并和最多合并的情况。最少合并是L放左,R放右,中间E,B交叉放,多的B只能合并。最多合并即L,R相互合并,同时有一个L,R合并时,中间可以放所有的B,因此只要\(min(L,R)\)不为0,最多合并为\(min(L,R)+B\),否则如果有一个不为0,那么B可以全部合并,如果两个都为0,那么剩下的B只能合并B-1个,注意B为0时的情况。
int E,L,R,B;
int sum;
void Min(){
//L放左,R放右
//中间BE交替
int ans = max(B-E-1,0);
printf("%d\n",sum-ans);
}
void Max(){
int ans=min(R,L);
if(ans>0) ans+=B;
else{
int tmp=max(R,L);
if(tmp!=0){
ans=B;
}
else {
ans=max(0,B-1);
}
}
printf("%d ",sum-ans);
}
void solve(){
scanf("%d %d %d %d",&E,&L,&R,&B);
sum=E+L+R+B;
Max();
Min();
}
03
数人的个数,可以发现当腿和胳膊与儿子的度数大小有关,度数大小可以分为3类:大于等于2的,为1的,为0的,大于等于2的可以做腿和胳膊,为1只能做胳膊,为0只能做头,那么我们要做的便是选一个腿,然后剩下的可以做胳膊的中选出两个,而这两个可以有度数大小相乘种选法,对于头剩下的所有儿子都可以做头。因此对于每一个节点,求出其儿子度数的总和及儿子度数两两乘积,最后枚举哪个儿子做腿,去除该儿子做腿时做胳膊的贡献,统计答案即可。
int n;
vector<int>G[maxn];
int sze[maxn];
ll ans=0;
void dfs(int now,int fa){
ll sum=0;ll pre=0;
for(auto x:G[now]){
if(sze[x]!=1){
int tmp=sze[x]-1;
sum=(sum+1LL*tmp*pre%mod)%mod;
pre+=tmp;
}
if(x==fa) continue;
dfs(x,now);
}
ll num=G[now].size();
if(num<3) return;
for(auto x:G[now]){
if(sze[x]>=3){
int tt=sze[x]-1;
ll tep = (1LL*tt*(tt-1))/2;
ll tmp = sum - 1LL*(pre-tt)*tt%mod;
tmp=(tmp+mod)%mod;
tmp=tep*tmp%mod*(num-3)%mod;
ans=(ans+tmp)%mod;
}
}
}
void solve(){
ans=0;
cin>>n;
rep(i,1,n-1){
int u,v;scanf("%d %d",&u,&v);
G[u].pb(v);G[v].pb(u);
sze[u]++;sze[v]++;
}
dfs(1,0);
rep(i,1,n) {
G[i].clear();
sze[i]=0;
}
printf("%lld\n",(ans+mod)%mod);
}
02
求一个特殊图的最大权值独立集,在普通无向图中为NP问题,在二分图中因为相邻两点必然有一个选一个不选,可以用网络流解决,而在本题中可以发现满足类似三分图的性质,即三个点中只能选一个,因此可以将所有点分为三类,每次直接选一类点,此时选择权值最大的那一类。
int n;
ll ans;
ll num[4];
int a[maxn],val[maxn];
void solve(){
cin>>n;
rep(i,1,n) scanf("%d",&a[i]);
rep(i,1,3) val[i]=i,num[i]=a[i];
rep(i,4,n){
int u,v;
scanf("%d %d",&u,&v);
int now=6-val[u]-val[v];
val[i]=now;
num[now]+=a[i];
}
rep(i,1,3) ans=max(ans,num[i]);
cout<<ans<<endl;
rep(i,1,n){val[i]=0;}
ans=0;rep(i,1,3) num[i]=0;
}
06
数位dp,待补
07
树形dp,待补
09,10
min_25.多项式,希望有生之年能补到
标签:tmp,2022HDU,ll,第七场,多校,int,ans,sum,mod 来源: https://www.cnblogs.com/Mr-leng/p/16586837.html