• Codeforces Round #551题解


    A题

    枚举记录

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e6+10;
    const int mod=1e9+7;
    const int inf=0x3f3f3f3f;
    int s[N],d[N];
    int cnt[N];
    int main(){
        ios::sync_with_stdio(false);
        int n,t;
        cin>>n>>t;
        int i;
        for(i=1;i<=n;i++){
            cin>>s[i]>>d[i];
            for(int j=s[i];j<=200000;j+=d[i]){
                cnt[j]=i;
            }
        }
        for(i=t;;i++){
            if(cnt[i]){
                cout<<cnt[i]<<endl;
                return 0;
            }
        }
    }
    View Code

    B题

    由于每个位置都受行列影响

    因此当为1的时候,就取行列最小值,这样一定能够做出答案

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e6+10;
    const int mod=1e9+7;
    const int inf=0x3f3f3f3f;
    int s[220][220];
    int a[220];
    int b[220];
    int sign[220];
    int main(){
        ios::sync_with_stdio(false);
        int n,m,h;
        cin>>n>>m>>h;
        int i,j;
        for(i=1;i<=m;i++){
            cin>>b[i];
        }
        for(i=1;i<=n;i++){
            cin>>a[i];
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                cin>>s[i][j];
            }
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                if(s[i][j]){
                    s[i][j]=max(s[i][j],min(a[i],b[j]));
                }
            }
        }
        for(i=1;i<=n;i++){
            for(j=1;j<=m;j++){
                cout<<s[i][j]<<" ";
            }
            cout<<endl;
        }
    }
    View Code

    C题

    构造题,因为要求的是前面都不一样但是最后一样

    因此我们用贪心的思想,前面都填(,直到我们可以满足条件,就都填右括号

    之后判一下非法条件

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e6+10;
    const int mod=1e9+7;
    const int inf=0x3f3f3f3f;
    int cnt[N];
    int sufa[N];
    int sufb[N];
    int main(){
        ios::sync_with_stdio(false);
        int n;
        string s;
        cin>>n>>s;
        s=" "+s;
        int i;
        if(s[n]=='?'){
            s[n]=')';
        }
        if(s[1]=='?')
            s[1]='(';
        if(s[1]!='('||s[n]!=')'){
            cout<<":("<<endl;
            return 0;
        }
        for(i=n;i>=1;i--){
            cnt[i]=cnt[i+1];
            sufa[i]=sufa[i+1];
            sufb[i]=sufb[i+1];
            if(s[i]==')')
                sufa[i]++;
            else if(s[i]=='?')
                cnt[i]++;
            else{
                sufb[i]++;
            }
        }
        int res=0;
        int flag=0;
        for(i=1;i<=n;i++){
            if(s[i]=='('){
                res++;
                sufb[i]--;
            }
            else if(s[i]=='?'){
                res++;
                s[i]='(';
                cnt[i]--;
            }
            else{
                res--;
                sufa[i]--;
            }
            if(res+sufb[i]==cnt[i]+sufa[i]){
                flag=1;
                for(int j=i;j<=n;j++){
                    if(s[j]=='?')
                        s[j]=')';
                }
                break;
            }
            if(res==0){
                break;
            }
        }
        if(flag){
            res=0;
            for(i=1;i<n;i++){
                if(s[i]=='(')
                    res++;
                else
                    res--;
                if(res==0){
                    flag=0;
                    break;
                }
            }
        }
        if(!flag){
            cout<<":("<<endl;
        }
        else{
            cout<<s.substr(1)<<endl;
        }
    }
    View Code

    D题

    dp+贪心,设计状态为当前点最高能取到第几大的

    如果是1,那么就子树取min

    否则就把子树全部相加

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e6+10;
    const int mod=998244353;
    const int inf=0x3f3f3f3f;
    int a[N];
    int sz[N],f[N];
    int h[N],ne[N],e[N],idx;
    int n;
    void add(int a,int b){
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    void dfs(int u,int fa){
        int i;
        if(h[u]==-1){
            f[u]=1;
            sz[u]=1;
            return ;
        }
        if(a[u])
            f[u]=n;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
                continue;
            dfs(j,u);
            sz[u]+=sz[j];
            if(a[u]){
                f[u]=min(f[u],f[j]);
            }
            else{
                f[u]+=f[j];
            }
        }
    }
    int main(){
        ios::sync_with_stdio(false);
        memset(h,-1,sizeof h);
        int i;
        cin>>n;
        for(i=1;i<=n;i++){
            cin>>a[i];
        }
        for(i=2;i<=n;i++){
            int x;
            cin>>x;
            add(x,i);
        }
        dfs(1,-1);
        cout<<sz[1]-f[1]+1<<endl;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    20155313 杨瀚 《网络对抗技术》实验九 Web安全基础
    20155313 杨瀚 《网络对抗技术》实验八 Web基础
    20155313 杨瀚 《网络对抗技术》实验七 网络欺诈防范
    20155313 杨瀚 《网络对抗技术》实验六 信息搜集与漏洞扫描
    20155313 杨瀚 《网络对抗技术》实验五 MSF基础应用
    20155313 杨瀚 《网络对抗技术》实验四 恶意代码分析
    20155313 杨瀚 《网络对抗技术》实验三 免杀原理与实践
    20155313 杨瀚 《网络对抗技术》实验二 后门原理与实践
    20155313 杨瀚 《网络对抗技术》实验一 PC平台逆向破解(5)M
    20155313 2017-2018-1 《信息安全系统设计基础》课程总结
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14336471.html
Copyright © 2020-2023  润新知