首页 > 其他分享 >Educational Codeforces Round 155 (Rated for Div. 2)

Educational Codeforces Round 155 (Rated for Div. 2)

时间:2023-10-04 11:55:20浏览次数:38  
标签:Educational Rated 155 int void dep read ans 节点

\(A. Rigged!\)

直接取第一个人能举起的最大重量看他是否是冠军即可。

void solve(){
    int n=read();
    int fx=read(),ft=read();
    int ans=fx;
    for(int i=1;i<n;i++){
        int x=read(),t=read();
        if(x>=fx&&t>=ft)ans=-1;
    }
    cout<<ans<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(B. Chips on the Board\)

那么要么是每行都有一个,要么是每列都有一个(每列每行都有包括在里面)。
那么显然的取铺满的方向和,和另一方向的最小值,看看哪个方向更小即可。

void solve(){
    int n=read();
    vector<int>a(n),b(n);
    int minna=inf,minnb=inf;
    for(int i=1;i<=n;i++){
        a[i-1]=read();
        minna=min(minna,a[i-1]);
    }
    for(int i=1;i<=n;i++){
        b[i-1]=read();
        minnb=min(minnb,b[i-1]);
    }
    int ans1=0,ans2=0;
    for(int i=0;i<n;i++){
        ans1+=minna+b[i];
        ans2+=minnb+a[i];
    }
    cout<<min(ans1,ans2)<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(C. Make it Alternating\)

对每个区间的删掉的元素数量统计,首先统计可选择的方案数,然后选择顺序。方案数显然是乘法原理,顺序就是删除的个数的 \(A\) 。

vector<mint>fac(N);
void init(){
    fac[0]=1;
    for(int i=1;i<=200000;i++){
        fac[i]=(mint)i*fac[i-1];
    }
}
void solve(){
    string s;
    cin>>s;
    vector<int>vec;
    for(int i=0,tmp=0;i<s.size();i++){
        if(s[i-1]==s[i]||i==0)tmp++;
        else{
            vec.push_back(tmp);
            tmp=1;
        }
        if(i==s.size()-1)
            vec.push_back(tmp);
    }
    mint ans=1;
    int sum=0;
    for(auto x:vec){
        if(x-1>0){
            sum+=(x-1);
            ans*=x;
        }
    }
    cout<<sum<<" "<<(mint)fac[sum]*ans<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(D. Sum of XOR Functions\)

这道题的做法也比较有意思。异或有个性质是出现奇数次有贡献,偶数次无贡献。那么对于求所有区间的区间异或和乘上区间长度的和,分别统计二进制位上的出现次数为奇数的区间长度和即可,不过这个统计没有那么显然。若当前和的位置上有 \(1\) ,那么他可以与前面所有位置上为 \(0\) 的位置组成贡献区间,反之相同,详情看代码即可。

void solve(){
    int n=read();
    vector<int>sum(n+1);
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]^read();
    }
    mint ans=0;
    mint s1[30][2],s2[30][2];
    for(int i=0;i<30;i++){
        for(int j=0;j<=n;j++){
            int x=(sum[j]>>i)&1;
            ans+=(s1[i][!x]*(mint)j-s2[i][!x])*(mint)(1<<i);
            s1[i][x]+=1;
            s2[i][x]+=j;
        }
    }
    cout<<ans<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(E. Interactive Game with Coloring\)

首先对于一个节点,如果有多个子节点,可以将通向子节点的边全部赋为一种颜色,通向父节点的边赋为另一种颜色。这样整个树只需要两种颜色。但是若出现节点只有一个子节点,那么若所有这样的节点都是深度都是相同的奇偶形,那么可以统一记录哪个颜色是向上的,否则我们需要引入第三种颜色,构建一个循环寻找父节点,比如出现 \(1,2\) 两种颜色,那么 \(2\) 是通向父节点,出现 \(1,3\) 两种颜色,那么 \(1\) 是通向父节点,出现 \(3,2\) 两种颜色,那么 \(3\) 是通向父节点。同时需要注意到,如果这样的奇偶性不同的特殊节点不在同一颗子树上,我们可以通过改变 \(root\) 节点的边的颜色,转换其子树的边的奇偶性,这样所有节点的奇偶性不同造成的影响将被反转为相同,因为 \(root\) 节点不需要子节点的颜色相同。

int fa[N],dep[N],d[N],maxdep=0,cnt[3];
vector<int>G[N],col(N);
void dfs_dep(int u){
    for(auto v:G[u]){
        dep[v]=dep[u]+1;
        maxdep=max(maxdep,dep[v]);
        dfs_dep(v);
    }
}
void check(int u){
    if(G[u].size()==1) cnt[dep[u]%2]++;
    for(auto v:G[u]){
        check(v);
    }
}
void dfs_col(int u){
    for(auto v:G[u]){
        col[v]=col[u]^1;
        dfs_col(v);
    }
}
void solve(){
    int n=read();
    for(int i=1;i<n;i++){
        fa[i]=read()-1;
        G[fa[i]].push_back(i);
    }
    dfs_dep(0);
    if(maxdep==1){
        cout<<1<<endl;
        for(int i=1;i<n;i++){
            cout<<1<<' ';
        }
        cout<<endl;
        int op=read(),x=read();
        cout<<1<<'\n';
        return ;
    }
    int ok=1;
    for(auto i:G[0]){
        cnt[0]=cnt[1]=0;
        check(i);
        if(cnt[1]&&cnt[0]){
            ok=0;
            break;
        }
        col[i]=cnt[0]?1:0;
        dfs_col(i);
    }
    int k=0;
    if(!ok){
        k=3;
        cout<<3<<endl;
        for(int i=1;i<n;i++){
            cout<<dep[i]%3+1<<" ";
        }
        cout<<endl;
    }else{
        k=2;
        cout<<2<<endl;
        for(int i=1;i<n;i++){
            cout<<col[i]+1<<" ";
        }
        cout<<endl;
    }
    while(true){
        int op=read();
        if(op==1||op==-1)break;
        vector<int>u;
        for(int i=0;i<k;i++){
            int x=read();
            if(x==1)u.push_back(i);
        }
        int res;
        if(u.size()>1){
            if(k==2){
                res=1;
            }else{
                if((u[0]+1)%3!=u[1]){
                    res=u[1]+1;
                }else{
                    res=u[0]+1;
                }
            }
        }else{
            res=u[0]+1;
        }
        cout<<res<<endl;
    }
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

标签:Educational,Rated,155,int,void,dep,read,ans,节点
From: https://www.cnblogs.com/edgrass/p/17742084.html

相关文章

  • 155. 最小栈
    设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val推入堆栈。voidpop()删除堆栈顶部的元素。inttop()获取堆栈顶部的元素。intgetMin()获取堆栈中的最小元素。输入:["......
  • Educational Codeforces Round 112 (Rated for Div. 2) A. PizzaForces
    有三种披萨:\(6\)、\(8\)、\(10\)块披萨。制作时间分别需要:\(15\)、\(20\)、\(25\)分钟。现在有\(n\)个人,每人需要一块披萨。询问使所有人能获得披萨的最快时间。观察:发现三种披萨的性价比都一样。(否则按最优性价比贪心)需要让得到的披萨数量\(m\geqn\)。不妨让\(n\)对......
  • Go每日一库之155:go-spew(输出 Go 数据结构)
    对于应用的调试,我们经常会使用fmt.Println来输出关键变量的数据。或者使用log库,将数据以log的形式输出。对于基础数据类型,上面两种方法都可以比较方便地满足需求。对于一些结构体类型数据,通常我们可以先将其序列化后再输出。如果结构体中包含不可序列化的字段,比如func类型......
  • Educational Codeforces Round 155 (Rated for Div
    B.ChipsontheBoard题解:贪心显然我们可以把题意转化为:对于任意一个\((i,j)\),我们可以花费\(a_{i,j}\)的代价占据第\(i\)行和第\(j\)列,求占据所有格子的最小代价考虑两种情况:在每一行选一个格子在每一列选一个格子贪心选即可intn,a[N],b[N];voidsolve......
  • Educational Codeforces Round 122 (Rated for Div. 2)
    A.Div.7#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,a,b,c;cin>>n;c=n%10,n/=10;b=n%10,n/=10;a=n%10,n/=10;intres,val=100;for(inti=0;i<=9......
  • 解题报告 洛谷P2155 [SDOI2008] 沙拉公主的困惑
    P2155[SDOI2008]沙拉公主的困惑题目题面非常的简洁,求\(\sum\limits_{i=1}^{n!}[i\perpm!]\)直接颓式子,\[\begin{aligned}ans&=\dfrac{n!}{m!}\cdot\varphi(m!)\\\\&=\dfrac{n!}{m!}*m!\prod\limits_{p\midm!}[\dfrac{p-1}{p}]\\&=n!\cdot\dfrac{\......
  • Educational Codeforces Round 155 (Rated for Div. 2)
    Preface这天晚上这场因为不明原因(玩CCLCC中)就没有打,只能赛后补一下这场的EF都不算难初看都有做法,但好家伙E写挂两发,F写个根号做法直接T到天上去了A.Rigged!签到题,对于所有的\(e_i\gee_1\)的\(i\),求出\(S=\maxs_i\),根据\(S+1\)和\(s_1\)的大小关系判断即可#include<cstdio......
  • 加训日记 Day4——挑战edu155,铭记巅峰的一集
    Day4,9.24edu155  ·打满六场新手保护赛之后的第一场(早知道暑假就不打那几场浪费保护了)  ·这场不出意外就是出意外了,库函数用的不熟练,奇奇怪怪的地方爆LL  ·C题赛后10分钟内看了看别人思路补出来了,进入思维误区了属于是  ·打完这场掉了25分捏,我觉得罚时得背大锅,越w......
  • CF957 Codeforces Round 472 (rated, Div. 2, based on VK Cup 2018 Round 2)
    CF957ATritonicIridescence如果原序列中有两个相同的字符,显然不合法。如果开头或者结尾为?,或者有两个连续的?,或者一个?两边的字符不同显然合法。否则一定不合法。#include<iostream>#include<cstdio>usingnamespacestd;constintN=105;intn;chars[N];intma......
  • CF1036 Educational Codeforces Round 50 (Rated for Div. 2)
    CF1036AFunctionHeight答案为\(\lceil\frac{k}{n}\rceil\)。#include<iostream>#include<cstdio>usingnamespacestd;longlongn,k;intmain(){ scanf("%lld%lld",&n,&k); printf("%lld",(k+n-1)/n); return0;}......