首页 > 其他分享 >$Codeforces Round 891 (Div. 3)$

$Codeforces Round 891 (Div. 3)$

时间:2023-09-10 15:22:59浏览次数:46  
标签:891 No int Codeforces find read ans Div Yes

\(A. Array Coloring\)

显然需要奇数个偶数即可满足题目。

void solve(){
    int n=read(),res=0;
    for(int i=1;i<=n;i++){
        int x=read();
        if(x%2)res++;
    }
    puts(res%2==0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(B. Maximum Rounding\)

模拟四舍五入,如果更高位的数字能五入,那么低位跟着变成 \(0\) 。

void solve(){
    string s;
    cin>>s;
    reverse(s.begin(),s.end());
    vector<char>ans;
    int fl=0;
    for(int i=0;i<s.size();i++){
        if(s[i]>='5'){
            s[i]='0';
            if(i+1>=s.size()){
                s=s+'1';
            }else {
                s[i+1]++;
            }
            fl=i;
        }
    }
    for(int i=0;i<fl;i++){
        s[i]='0';
    }
    reverse(s.begin(),s.end());
    cout<<s<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(C. Assembly via Minimums\)

首先第 \(n\) 小的数字出现 \(\frac{(n-1)*n}{2}\) 次。那么排序之后按照这个顺序记录答案就好了。

vector<int>vec[N];
int a[N];
void solve(){
    int n=read(),cnt=1,xunhuan=n;
    for(int i=1;i<=n;i++){
        vec[i].clear();
    }
    for(int i=1;i<=n*(n-1)/2;i++){
        a[i]=read();
    }
    sort(a+1,a+1+n*(n-1)/2);
    for(int i=1;i<=n*(n-1)/2;i++){
        cnt++;
        int x=a[i];
        vec[n-xunhuan+1].push_back(x);
        vec[cnt].push_back(x);
        if(cnt==n){
            xunhuan--;
            cnt=n-xunhuan+1;
        }
    }
    for(int i=1;i<=n;i++){
        int maxx=-inf;
        for(auto x:vec[i]){
            maxx=max(maxx,x);
        }
        cout<<maxx<<" ";
    }
    cout<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(D. Strong Vertices\)

转化式子就发现跟图没一点关系,记录 \(a_i-b_i\) 的最大值出现过几次即可。

struct node{
    int  d;
    int  id;
    friend bool operator<(const node&a,const node&b){
        if(a.d==b.d)return a.id>b.id;
        return a.d<b.d;
    }
}vec[N];
int a[N],b[N],d[N];
void solve(){
    int n=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    for(int i=1;i<=n;i++){
        b[i]=read();
    }
    for(int i=1;i<=n;i++){
        vec[i].d=a[i]-b[i];
        vec[i].id=i;
    }
    sort(vec+1,vec+1+n);
    int maxx=vec[n].d;
    vector<int>ans;
    for(int i=n;i>=1;i--){
        if(maxx==vec[i].d){
            ans.push_back(vec[i].id);
        }
    }
    cout<<ans.size()<<'\n';
    for(auto x:ans){
        cout<<x<<" ";
    }
    cout<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(E. Power of Points\)

太久远了,没什么印象了(所以下次写题解还是要尽早)。
好像就是递推一个式子,把复杂度降下来。

struct node{
    int val;
    int id; 
    friend bool operator<(const node&a,const node&b){
        if(a.val==b.val)a.id<b.id;
        return a.val<b.val;
    }
}a[N];
void solve(){
    int n=read();
    vector<int>ans(n+1);
    for(int i=1;i<=n;i++){
        a[i].val=read();
        a[i].id=i;
    }
    sort(a+1,a+1+n);
    ans[a[1].id]=0;
    for(int i=1;i<=n;i++){
        ans[a[1].id]+=a[i].val-a[1].val+1;
    }
    for(int i=2;i<=n;i++){
        if(a[i].val==a[i-1].val){
            ans[a[i].id]=ans[a[i-1].id];
            continue;
        }
        int p=(i-1)*(a[i].val-a[i-1].val),q=(n-i+1)*(a[i].val-a[i-1].val);
        ans[a[i].id]=ans[a[i-1].id]+p-q;
    }
    for(int i=1;i<=n;i++){
        cout<<ans[i]<<" ";
    }
    cout<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(F. Sum and Product\)

太久远了,不记得考场上我怎么写的了,好像就是把式子转化了一下解一个显然的方程就可以了。

void solve(){
    int n=read();
    // cout<<"-------------------------\n";
    map<int,int>mp;
    for(int i=1;i<=n;i++){
        mp[read()]++;
    }
    int q=read(),ans=0;
    for(int i=1;i<=q;i++){
        map<int,int>vis;
        ans=0;
        int x=read(),y=read();
        if((x*x-4*y)*1.0/2<0){
            cout<<0<<' ';
            continue;
        }
        if((x*x-4*y)*1.0/2==0){
            // cout<<"here:";
            int  j=round((x+sqrt(x*x-4*y))*1.0/2);
            // cout<<" j:"<<j<<"    ";
            if(j*(x-j)==y&&vis[j]==0&&vis[x-j]==0){
                ans+=mp[j]*(mp[x-j]-1)/2;
                vis[j]=1;vis[x-j]=1;
            }
            if((j+1)*(x-(j+1))==y&&vis[j+1]==0&&vis[x-(j+1)]==0){
                ans+=mp[j+1]*(mp[x-(j+1)]-1)/2;
                vis[j+1]=1;vis[x-(j+1)]=1;

            }
            if((j-1)*(x-(j-1))==y&&vis[j-1]==0&&vis[x-(j-1)]==0){
                ans+=mp[j-1]*(mp[x-(j-1)]-1)/2;
                vis[j-1]=1;vis[x-(j-1)]=1;
            }
            cout<<ans<<' ';
            continue;
        }
        int j=round((x+sqrt(x*x-4*y))*1.0/2);
        // cout<<"j:"<<j<<' ';
        if(j*(x-j)==y&&vis[j]==0&&vis[x-j]==0){
            ans+=mp[j]*mp[x-j];
            vis[j]=1;vis[x-j]=1;

        }
        if((j+1)*(x-(j+1))==y&&vis[j+1]==0&&vis[x-(j+1)]==0){
            ans+=mp[j+1]*mp[x-(j+1)];
            vis[j+1]=1;vis[x-(j+1)]=1;

        }
        if((j-1)*(x-(j-1))==y&&vis[j-1]==0&&vis[x-(j-1)]==0){
            ans+=mp[j-1]*mp[x-(j-1)];
            vis[j-1]=1;vis[x-(j-1)]=1;
        }
        j=round((x-sqrt(x*x-4*y))*1.0/2);
        // cout<<"j:"<<j<<' ';
        if(j*(x-j)==y&&vis[j]==0&&vis[x-j]==0){
            ans+=mp[j]*mp[x-j];
            vis[j]=1;vis[x-j]=1;

        }
        if((j+1)*(x-(j+1))==y&&vis[j+1]==0&&vis[x-(j+1)]==0){
            ans+=mp[j+1]*mp[x-(j+1)];
            vis[j+1]=1;vis[x-(j+1)]=1;

        }
        if((j-1)*(x-(j-1))==y&&vis[j-1]==0&&vis[x-(j-1)]==0){
            ans+=mp[j-1]*mp[x-(j-1)];
            vis[j-1]=1;vis[x-(j-1)]=1;
        }
        // cout<<"ans:"<<ans<<' ';
        cout<<ans<<" ";
        // cout<<'\n';
    }
    cout<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

\(G. Counting Graphs\)

使用 \(Kruskal\) 模拟最小树的生成过程,然后每次合并的时候,可以增加连接两个联通块的边,边权为当前值到最大值。

struct node{
    int x,y;
    int  w;
    friend bool operator<(const node&a,const node&b){
        return a.w<b.w;
    }
}ed[N];
int p[N], siz[N];//p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量
int find(int x){ // 返回x的祖宗节点
    if (p[x] != x) p[x] = find(p[x]);
    return p[x]; 
}
int qmi(int m, int k, int p){
    int res = 1 % p, t = m;
    while (k){
        if (k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}
void solve(){
    int n=read(),s=read();
    for (int i = 1; i <= n; i ++ ) { // 初始化,假定节点编号是1~n
        p[i] = i;
        siz[i] = 1;
    }    
    for(int i=1;i<n;i++){
        ed[i].x=read();
        ed[i].y=read();
        ed[i].w=read();
    }
    sort(ed+1,ed+n);
    int ans=1;
    for(int i=1;i<n;i++){
        int x=ed[i].x;
        int y=ed[i].y;
        int w=ed[i].w;
        if(w>s)break;
        ans=(ans*=qmi(s-w+1,(siz[find(x)]*siz[find(y)]-1),mod))%mod;
        siz[find(y)] += siz[find(x)];
        p[find(x)] = find(y);
    }
    cout<<ans<<'\n';
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

标签:891,No,int,Codeforces,find,read,ans,Div,Yes
From: https://www.cnblogs.com/edgrass/p/17691303.html

相关文章

  • Codeforces Round 824 (Div. 2) B. Tea with Tangerines
    有\(n\)块橘子皮,第\(i\)块大小为\(a_i\)。在一部操作中可以把一块橘子皮分成两块,即这块橘子皮为\(x\),让\(x\)变为\(y,z(x=y+z)\)。希望对于任意两块橘子皮,他们相差严格小于两倍。即两块中更小的为\(x\),更大的为\(y\),有\(2x>y\)。最少需要执行多少步操作......
  • 【题解】Educational Codeforces Round 143(CF1795)
    A.TwoTowers题目描述:有\(a,b\)两座由红蓝色方块垒成的塔,其中\(a\)的高度为\(n\);\(b\)的高度为\(m\),用R代表红色;用B代表蓝色。你可以多次把其中一座顶端的方块移到另一座的顶端(可以不移动)。问有没有一种方法可以使两座塔中均没有连续的同颜色方块。题目分析:可以......
  • Codeforces Round 827 (Div. 4) C. Stripes
    在一个\(8\times8\)的网格上,一开始无色。每次一整行或一整列地染色,后染的颜色会覆盖前染的颜色。染色方式有两种,一种是横着染\(R\)色,一种是竖着染\(B\)色。给出最终染色的网格,问最后染的色是哪种。对每行开\(R\)计数器、每列开\(B\)计数器。遍历行、列,如果计数器的......
  • Codeforces Round 832 (Div. 2) B. BAN BAN
    给一个正整数\(n\),定义\(S{n}\)为字符串\(BAN\)复制\(n\)次。比如\(S(3)=BANBANBAN\)。可以对\(S(n)\)执行任意次以下操作:选择\(i,j(1\leqi,j\leq3n,i\neqj)\)。\(swap(s_i,s_j)\)。希望\(BAN\)不作为一个子序列出现在\(S(n)\)中,输出最小交换......
  • [题解] Codeforces Round 895 (Div. 3) F~G
    CodeforcesRound895(Div.3)F~GF.SellingaMenageri考虑如何让卖出的价格翻倍,那么自然是从\(i\toa_i\)。通过这样连边,我们可以发现,边集构成了基环树森林。显而易见的是,如果不考虑环,那么图就是拓扑图,按照拓扑关系跑一遍,就可以使得所有点价值最多。现在考虑环上的问题......
  • SMU Autumn 2023 Round 1(Div.1)
    SMUAutumn2023Round1(Div.1)A.SetorDecrease(枚举)题意就是你可以进行两种操作,将\(a_i-1\)或者令\(a_i\)等于\(a_j\),然后使得\(\sum\limits_{i=1}^{n}a_i\leqk\),求最少的操作步数首先我们让一个大数变成一个最小数的贡献肯定是要比让大数减一产生的贡献更多,所以我......
  • Codeforces Round 895 (Div. 3)
    CodeforcesRound895(Div.3)比赛链接A.TwoVessels题目链接给你三个数a,b,c每次把a,b中较大的数中拿去最多等于c的数给较小的数字,问多少次使得a,b两个数字相等。A思路:可恶,在写的过程中出现了精度丢失的情况,导致出现了好多问题,问多少次使得a和b相等,就是\[abs(a-b)/2/c向上取......
  • CodeForces 960G Bandit Blues
    洛谷传送门CF传送门发现设排列最大值位置为\(i\),那么\([1,i]\)只可能存在前缀最大值,\([i,n]\)只可能存在后缀最大值。由此设\(f_{i,j}\)为长度为\(i\)的排列,前缀最大值有\(j\)个的方案数,有转移:\[f_{i,j}=f_{i-1,j-1}+(i-1)f_{i-1,j}\]意思是每......
  • Codeforces Round 406 (Div. 2) D. Legacy 线段树优化建图
    传送门题目大意:给定n个点,m个操作,和起点s。其中n和q大于等于1小于等于1e5,s大于等于1小于等于n其中m个操作有三种情况:  1.输入1uvval表示从u号点向v号点连一个权值为val的有向边,其中1<=u<=n,1<=v<=n,1<=val<=1e9  2.输入2ulrval表示从u号点......
  • Educational Codeforces Round 154 (Rated for Div. 2)
    EducationalCodeforcesRound154(RatedforDiv.2)比赛链接我都快忘了还有这一场比赛,今天打开cf看见这场比赛正好有时间就补了!!!2023.9.3也许是出去玩了一下午脑子不够用了??怎么现在读题都有一点读不懂了!!!2023.9.4我靠这场我怎么感觉没什么思路呢????A题PrimeDeletion题目链接......