其他分享
首页 > 其他分享> > 2022HDU多校第七场

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