ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022HDU多校第七场

2022-08-15 01:01:20  阅读:147  来源: 互联网

标签:tmp 2022HDU ll 第七场 多校 int ans sum mod


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有