zoukankan      html  css  js  c++  java
  • Codeforces Round #641 (Div. 2)

    A

    迭代成偶数以后,每次 (+2)

    #include <bits/stdc++.h>
    using namespace std;
    
    
    #define int long long
    const int N = 1000005;
    
    int t,n,k;
    
    int f(int x) {
        for(int i=2;i<=x;i++) if(x%i==0) return i;
        return 0;
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>t;
        while(t--) {
            cin>>n>>k;
            while(k>0 && n%2) {
                k--;
                n+=f(n);
            }
            n+=k*2;
            cout<<n<<endl;
        }
    }
    

    B

    考虑 DP,设 (f[i]) 表示第 (i) 的位置的数往后延伸,能形成的目标子序列的最大长度,暴力转移即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 100005;
    
    int f[N],a[N],t,n;
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>t;
        while(t--) {
            cin>>n;
            memset(f,0,sizeof f);
            for(int i=1;i<=n;i++) cin>>a[i];
            for(int i=n;i>=1;--i) {
                f[i]=1;
                for(int j=i+i;j<=n;j+=i) {
                    if(a[j]>a[i]) f[i]=max(f[i],f[j]+1);
                }
            }
            cout<<*max_element(f+1,f+n+1)<<endl;
        }
    }
    

    C

    统计每种因子个数的次小值即可

    #include <bits/stdc++.h>
    using namespace std;
     
    #define int long long
    const int N = 200005;
     
    int n,a[N],mx[N],mn[N],c[N];
     
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        memset(mx,0x3f,sizeof mx);
        memset(mn,0x3f,sizeof mn);
        for(int i=1;i<=n;i++) {
            int p=a[i];
            for(int j=2;j<=500;j++) {
                int cnt=0;
                while(p%j==0) {
                    ++cnt;
                    p/=j;
                }
                if(cnt<=mx[j]) mn[j]=mx[j],mx[j]=cnt;
                else if(cnt<mn[j]) mn[j]=cnt;
            }
            if(p) c[p]++;
        }
        int ans=1;
        for(int i=2;i<=500;i++) {
            while(mn[i]) {
                mn[i]--;
                ans*=i;
            }
        }
        for(int i=501;i<=200000;i++) if(c[i]>=n-1) ans*=i;
        cout<<ans;
    }
    

    D

    先特判掉 (n=1) 或者目标数不存在的情况

    将大于等于 (k) 的数视做 (1),小于的视作 (0)

    YES 的充要条件为能找到一个长度不大于 (3) 的区间中有 (2)(1)

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 100005;
    
    int t,n,k,a[N],b[N];
    
    bool solve() {
        for(int i=1;i<=n;i++) b[i]=a[i];
        for(int i=1;i<=10;i++) {
            int l=rand()%n+1,r=rand()%n+1;
            if(l>r) swap(l,r);
            vector<int> vec;
            for(int j=l;j<=r;j++) vec.push_back(b[j]);
            sort(vec.begin(),vec.end());
            int len=r-l+1;
            int mid=vec[(len-1)/2];
            for(int j=l;j<=r;j++) b[j]=mid;
        }
        for(int i=1;i<=n;i++) if(b[i]!=k) return 0;
        return 1;
    }
    
    void check() {
        int flag=0;
        for(int i=1;i<=100000;i++) flag|=solve();
        cout<<flag<<" ";
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>t;
        while(t--) {
            cin>>n>>k;
            for(int i=1;i<=n;i++) cin>>a[i];
            //check();
            if(n==1) {
                if(k==a[1]) cout<<"yes"<<endl;
                else cout<<"no"<<endl;
                continue;
            }
            int fg=0;
            for(int i=1;i<=n;i++) if(a[i]==k) fg=1;
            if(fg==0) {
                cout<<"no"<<endl;
                continue;
            }
            //int m=*max_element(a+1,a+n+1);
            int l=-1e9;
            //if(k==m) {
                int flag=0;
                for(int i=1;i<=n;i++) {
                    if(a[i]>=k) {
                        if(i-l<=2) flag=1;
                        l=i;
                    }
                }
                cout<<(flag?"yes":"no")<<endl;
            //}
            //else cout<<"yes"<<endl;
        }
    }
    

    E

    如果相邻的两个点有一样的颜色,就会在下一次操作中保持同样的颜色并开始变色

    考虑求出 (f[i][j]) 表示第 ((i,j)) 个点在多少次迭代后开始变色

    如果一个格子一开始就能变色,设 (f[i][j]=0),否则设 (f[i][j] = infty)

    从开始就能变色的格子开始 BFS,当做边权为 (1) 的最短路问题 BFS 即可

    处理询问时,如果一个格子的 (f[i][j]=infty),则取其原始颜色;如果 (time<f[i][j]),也取其原始颜色;如果 (time ge f[i][j]),则考虑 (time-f[i][j]) 的奇偶性,如果是奇数则与原始颜色相反,偶数则相同

    #include <bits/stdc++.h>
    using namespace std;
    
    
    #define int long long
    const int N = 1005;
    const int inf = 2e18;
    
    struct point {int x,y;};
    
    int n,m,q,x,y,z,f[N][N],a[N][N];
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>m>>q;
        memset(f,0x3f,sizeof f);
        memset(a,0xff,sizeof a);
        for(int i=1;i<=n;i++) {
            string s;
            cin>>s;
            for(int j=1;j<=m;j++) a[i][j]=s[j-1]=='1';
        }
        queue <point> qu;
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=m;j++) {
                if(a[i][j]==a[i-1][j] || a[i][j]==a[i+1][j] || a[i][j]==a[i][j-1] || a[i][j]==a[i][j+1]) {
                    f[i][j]=0;
                    qu.push({i,j});
                }
            }
        }
        while(qu.size()) {
            int i=qu.front().x,j=qu.front().y;
            qu.pop();
            int ni,nj;
            ni=i+1,nj=j;
            if(ni>=1 && nj>=1 && ni<=n && nj<=m) {
                if(f[ni][nj]>f[i][j]+1) {
                    f[ni][nj]=f[i][j]+1;
                    qu.push({ni,nj});
                }
            }
            ni=i-1,nj=j;
            if(ni>=1 && nj>=1 && ni<=n && nj<=m) {
                if(f[ni][nj]>f[i][j]+1) {
                    f[ni][nj]=f[i][j]+1;
                    qu.push({ni,nj});
                }
            }
            ni=i,nj=j-1;
            if(ni>=1 && nj>=1 && ni<=n && nj<=m) {
                if(f[ni][nj]>f[i][j]+1) {
                    f[ni][nj]=f[i][j]+1;
                    qu.push({ni,nj});
                }
            }
            ni=i,nj=j+1;
            if(ni>=1 && nj>=1 && ni<=n && nj<=m) {
                if(f[ni][nj]>f[i][j]+1) {
                    f[ni][nj]=f[i][j]+1;
                    qu.push({ni,nj});
                }
            }
        }
        for(int i=1;i<=q;i++) {
            cin>>x>>y>>z;
            if(z<f[x][y]) {
                cout<<a[x][y]<<endl;
            }
            else {
                cout<<(a[x][y]^((f[x][y]-z)&1))<<endl;
            }
        }
    }
    
  • 相关阅读:
    npm 一些常用的命令
    Angular Encapsulation
    隐藏scrollbar
    Vue生命周期详解(1)- 单个组件
    如何自己制作iconfont
    day07-2018-10--25 深浅拷贝
    day06-2018-10--24 小数据池和编码
    day05-2018-10--23 字典
    day04-2018-10--22python基础
    day03-2018-10-19-python基础
  • 原文地址:https://www.cnblogs.com/mollnn/p/12880447.html
Copyright © 2011-2022 走看看