首页 > 其他分享 >CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)

CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)

时间:2023-04-14 14:57:54浏览次数:40  
标签:Rated int void read Prizes ans Div dp

CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)

A. Two 0-1 Sequences

void solve(){
    int n=read(),m=read(),ans=1;
    string s,t;
    cin>>s>>t;
    // cout<<s<<t<<endl;
    for(int i=t.size()-1,j=s.size()-1;i>=1&&j>=1;i--,j--){
        if(s[j]!=t[i]){
            ans=0;
            // cout<<j<<" "<<i<<endl;
            break;
        }
    }
    int fl=0;
    for(int i=0;i<=s.size()-t.size();i++){
        if(s[i]==t[0])fl=1;
    }
    if(!fl)ans=0;
    puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

B. Luke is a Foodie

int a[N];
void solve(){
    int n=read(),x=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    int maxx=a[1],minn=a[1],ans=0;
    for(int i=2;i<=n;i++){
        maxx=max(a[i],maxx);
        minn=min(a[i],minn);
        if(maxx-minn>2*x){
            ans++;
            maxx=a[i];
            minn=a[i];
        }
    }
    cout<<ans<<endl;
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

C. Virus

#define int long long
map<int,int>mp;
int a[N];
void solve(){
    int n=read(),m=read();
    mp.clear();
    for(int i=1;i<=m;i++){
        int x=read();
        mp[x]=1;
    }
    int last=0,cnt=0;
    for(auto [x,y]:mp){
        cnt++;
        a[cnt]=x-last-1;
        last=x;
    }
    if(last!=n){
        a[1]+=n+1-last-1;
    }
    sort(a+1,a+1+cnt);
    int day=0,live=0;
    for(int i=cnt;i>=1;i--){
        a[i]-=day*2;
        if(a[i]<=0)break;
        if(a[i]>2){
            live+=a[i]-1;
            day+=2;
        }else {
            live++;
            day++;
        }
    }
    cout<<n-live<<endl;
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

D. Magical Array

计算每个数组a[i]*i的和

对于进行任意次operation1的数组 和不变

对于进行k次operation2的数组 和增加k

#define int long long
void solve(){
    int m=read(),n=read();
    vector<int>a(n),sum(m);
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            a[j]=read();
            sum[i]+=a[j]*j;
        }
    }
    int ans=-1;
    int maxx=*max_element(sum.begin(),sum.end()),minn=*min_element(sum.begin(),sum.end());
    for(int i=0;i<m;i++){
        if(sum[i]==maxx)ans=i;
    }
    cout<<ans+1<<" "<<(maxx-minn)<<"\n";
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

E. Count Seconds

首先这是一个DAG 想到拓扑排序

计算每一点对答案的贡献 各点贡献*点数的和就是答案 此处贡献就是汇点到这个的点的路径数

但是 对于有点权为0的点 上述结论不适用 因为若该点祖先有值 则该点会在几秒之后工作 也就是说 上面的结论只适用于与汇点已经相连的不含0点权的路径

如何排除0点权的麻烦呢 DAG的最长路径一定小于等于n 模拟n轮的情况后 该图上所有点权不为0的点与汇点相连的路径都是不为0的点

所以先模拟 后拓扑序dp求贡献和

#define int long long
int h[N], e[N], ne[N], idx, d[N], dp[N], bk[N], q[N], w[N];
int n,m;
void add(int a, int b){
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void topsort(){
    int hh = 0, tt = -1;
    for (int i = 1; i <= n; i ++ )
        if (!d[i])
            q[ ++ tt] = i;
    while (hh <= tt){
        int t = q[hh ++ ];
        for (int i = h[t]; i != -1; i = ne[i]){
            int j = e[i];
            if (-- d[j] == 0)
                q[ ++ tt] = j;
        }
    }
    bool az=1;
    for(int i=1;i<=n;i++){
        if(w[i]){
            az=0;
            break;
        }
    }
    if(az){ 
        cout<<"0\n";
        return ;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)bk[j]=w[j];
        for(int j=1;j<=n;j++){
            if(w[j]){
                bk[j]--;
                for(int k=h[j];k!=-1;k=ne[k]){
                    int t=e[k];
                    bk[t]++;
                }
            }
        }
        az=1;
        for(int j=1;j<=n;j++){
            w[j]=bk[j];
            if(w[j]){
                az=0;
            }
        }
        if(az){
            cout<<i<<"\n";
            return ;
        }
    }
    int ans=n;
    for(int i=n-1;i>=0;i--){
        int x=q[i];
        if(i==n-1)dp[x]=1;
        else dp[x]=0;
        for(int j=h[x];j!=-1;j=ne[j]){
            int k=e[j];
            dp[x]=(dp[x]+dp[k])%mod;
        }
        ans+=w[x]*dp[x];
        ans%=mod;
    }
    cout<<ans<<endl;
}


void solve(){
    n=read(),m=read();
    idx = 0;
    memset(h, -1, sizeof h);
    for(int i=1;i<=n;i++){
        w[i]=read();
        d[i]=0;
    }
    for(int i=1;i<=m;i++){
        int x=read(),y=read();
        add(x,y);
        d[y]++;
    }
    topsort();
    //puts(ans>0?"YES":"NO");
    //puts(ans>0?"Yes":"No");
}

 

标签:Rated,int,void,read,Prizes,ans,Div,dp
From: https://www.cnblogs.com/edgrass/p/17318265.html

相关文章

  • Codefroces Round #863(div.3)---E
    题目:Problem-E-Codeforces题意:有一个序列a,a中的每个元素的每一位都不为4,问序列中第k个数字是多少。分析:可以用数位dp查询出1-r中有多少个满足条件的数字,通过二分r找到结果。代码:#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineendl'\n'u......
  • Codeforces Round #289 Div. 2 解题报告 A.B.C.E
    A-MaximuminTable纯递推。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>#include<set>#include<stdio.h>usingn......
  • Codeforces Round #290 (Div. 2) 解题报告 A.B.C.D.
    A-FoxAndSnake模拟。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>#include<set>#include<stdio.h>usingnames......
  • Codeforces Round #287 (Div. 2) 解题报告 A.B.C.D.E
    这次的CF挺水的,当时B题犯了一个很SB的错误,浪费了好多时间,所以D和E也没来得及看。sad,。。A-AmrandMusic水题,从小的开始选。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>......
  • Codeforces Round #286 (Div. 2) C题 Mr. Kitayuta, the Treasure Hunter (DFS+记忆化D
    题目地址:http://codeforces.com/contest/505/problem/C从d点开始,每个点都有三个方向,形成了一棵树,那么就从跟结点开始进行dfs查找,dp数组记录当前的点和长度,当这两个条件相同的时候,显然,后面的子树是完全相同的,于是用记忆化来优化。代码如下:#include<iostream>#include<string.h>#......
  • Codeforces Round #286 (Div. 1) B. Mr. Kitayuta's Technology (强连通分量)
    题目地址:http://codeforces.com/contest/506/problem/B先用强连通判环,然后转化成无向图,找无向图连通块,若一个有n个点的块内有强连通环,那么需要n条边,即正好首尾相连形成一条环,那么有了这个环之后,在这个块内的所有要求都能实现。如果没有强连通环,那么就是一棵树,那么只需要n-1条边即......
  • Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana (分块)
    题目地址:http://codeforces.com/contest/551/problem/E将n平均分成sqrt(n)块,对每一块从小到大排序,并设置一个整体偏移量。修改操作:l~r区间内,对两端的块进行暴力处理,对中间的整体的块用整体偏移量标记增加了多少。时间复杂度:O(2*sqrt(n)+n/sqrt(n)).查询操作:对每一块二分,查找......
  • Codeforces Round #303 (Div. 2) E. Paths and Trees (最短路+变形最小生成树)
    题目地址:E.PathsandTrees模拟了一场CF,这场实在太水了。。边玩边做的。。最后半分钟交了一发E题。。不幸AK绝杀失败。。。。首先的思路肯定是先求最短路,把可能为最短路的边挑出来,然后第二步我本来写的是直接用无向图的最小生成树,于是绝杀失败。。。后来才发现这样是不行的。......
  • Codeforces Round #316 (Div. 2) D. Tree Requests (DFS序)
    题目地址:http://codeforces.com/contest/570/problem/D比赛的时候实在没想到DFS序,。。想到DFS序后,分别存起每个深度的所有节点的DFS序,处理出前缀异或和,然后二分找到两个端点,再异或一下,就求出了所求区间的异或和,由于偶数次的都被异或掉了,所以判断下奇数次数是否大于1即可。代码......
  • Codeforces Round #284 (Div. 1) C. Array and Operations (最大流)
    题目地址:http://codeforces.com/contest/498/problem/C分别分解出每个数字的质因子,然后第奇数个数字的质因子在左边集合,偶数个数字的质因子在右边集合,建立源点和汇点,然后根据每个数字含有的质因子的个数建边,跑一遍最大流即可。代码如下:#include<iostream>#include<string.h>......