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

    这是我退役前最后一场div2了啊。。。
    所以打算写个题解
    以前那么多cf,,现在就剩这么一两场了,可惜自己瞎做连个黄名都没上过。。
    A:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int t,a,b;
    int main(){
        ios::sync_with_stdio(false);
        cin>>t;
        while (t--){
            cin>>a>>b;
            if(__gcd(a,b)==1){
                cout<<"Finite"<<endl;
            }else{
                cout<<"Infinite"<<endl;
            }
        }
    }
    

    B:
    我tm,看到样例读的字符串长度都是3以为给的是个长度为3的循环节。然后wa了,有点迷

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int t,n,a,b,c;
    string s;
    char ans[555];
    int main(){
        ios::sync_with_stdio(false);
        cin>>t;
        while (t--){
            cin>>n>>a>>b>>c>>s;//rps
            memset(ans,0, sizeof(ans));
            int cnt=0;
            for(int i=0;i<n;i++){
                if(s[i]=='R'){
                    if(b)b--,cnt++,ans[i]='P';
                }else if(s[i]=='P'){
                    if(c)c--,cnt++,ans[i]='S';
                }else{//=s
                    if(a)a--,cnt++,ans[i]='R';
                }
            }
            for(int i=0;i<n;i++){
                if(ans[i]!='P'&&ans[i]!='S'&&ans[i]!='R'){
                    if(a){
                        a--,ans[i]='R';
                    }else if(b){
                        b--,ans[i]='P';
                    }else {
                        c--,ans[i]='S';
                    }
                }
            }
            if(cnt>=(n+1)/2){
                cout<<"YES"<<endl;
                for(int i=0;i<n;i++){
                    cout<<ans[i];
                }
                cout<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }
    }
    

    C:
    dp了好几分钟发现是个斐波那契数列,心态崩了。。。
    想起来某场div1的A题也是个斐波那契然后我无脑三维dp。。。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod = 1e9+7;
    string s;
    vector<int> v;
    ll dp[100005][2];//第i位是不是合并的
    ll ans[100005];
    int main(){
        ios::sync_with_stdio(false);
        cin>>s;
        int n = s.length();
        for(int i=0,j;i<n;i=j+1){
            j=i;
            if(s[i]=='u'){
                int cnt=0;
                while (j<n&&s[j]=='u')j++,cnt++;
                j--;
                if(cnt>1)v.push_back(cnt);
            }
            if(s[i]=='n'){
                int cnt=0;
                while (j<n&&s[j]=='n')j++,cnt++;
                j--;
                if(cnt>1)v.push_back(cnt);
            }
            if(s[i]=='w'||s[i]=='m'){
                cout<<0<<endl;
                exit(0);
            }
        }
        dp[1][0]=1;//不合并
        dp[1][1]=0;//合并
        for(int i=2;i<=100000;i++){
            dp[i][0]=dp[i-1][0]+dp[i-1][1];
            dp[i][1]=dp[i-1][0];
            dp[i][0]%=mod;
            dp[i][1]%=mod;
        }
        for(int i=1;i<=100000;i++)ans[i]=(dp[i][0]+dp[i][1])%mod;
        ll ed=1;
        for(auto x:v){
    //        cout<<x<<endl;
            ed = ed*ans[x]%mod;
        }
        cout<<ed<<endl;
    }
    

    D:
    被治傻逼了。
    重构了两遍代码试了三种贪心wa了四次交了五发没过
    赛后一看,这大家都是冰茶几,怎么我过不了啊?
    然后看到了一个超级源点。我人傻了。属实傻逼。

    #include <bits/stdc++.h>
    #define pii pair<int,int>
    using namespace std;
    typedef long long ll;
    const int N = 2e3+2;
    struct Edge{
        ll u,v,w;
    }edge[N*N];int cnt=0;
    int n,fa[N*N];
    int find(int a){
        if(a==fa[a])
            return a;
        else
            return fa[a]=find(fa[a]);
    }
    ll x[N],y[N],c[N],k[N];
    vector<pii> e;
    set<int> s;
    int main(){
        ios::sync_with_stdio(false);
        ll ans = 0;
        cin>>n;
        for(int i=1;i<=n;i++)cin>>x[i]>>y[i],fa[i]=i;fa[n+1]=n+1;
        for(int i=1;i<=n;i++)cin>>c[i],edge[cnt++]={n+1,i,c[i]};
        for(int i=1;i<=n;i++)cin>>k[i];
        for(int i=1;i<n;i++){
            for(int j=i+1;j<=n;j++){
                edge[cnt++]={i,j,(abs(x[i]-x[j])+abs(y[i]-y[j]))*(k[i]+k[j])};
            }
        }
        sort(edge,edge+cnt,[](Edge a,Edge b){return a.w<b.w;});
        for(int i=0;i<cnt;i++){
            if(edge[i].w<0)break;
            int u = edge[i].u,v=edge[i].v;ll w = edge[i].w;
            int fu=find(u),fv=find(v);
            if(fu==fv)continue;
            fa[fu]=fv;
            if(u==n+1)s.insert(v);
            else e.push_back(pii(u,v));
            ans+=w;
        }
        cout<<ans<<endl;
        cout<<s.size()<<endl;
        for(auto x:s){
            cout<<x<<' ';
        }
        cout<<endl;;
        cout<<e.size()<<endl;
        for(auto p:e){
            cout<<p.first<<' '<<p.second<<endl;
        }
    }
    

    E:
    这,,感觉和F题一样傻逼了,结果我没开,签完F去自闭D了。。
    就直接dp就行,稍微接触过期望dp的应该都会吧

    #include <bits/stdc++.h>
    #define pii pair<int,int>
    using namespace std;
    typedef long long ll;
    typedef double db;
    int h[11][11];
    db dp[11][11];
    pii go(int x,int y,int s){
        if(x&1){
            y+=s;
            if(y>9)return pii(x-1,19-y);
            return pii(x,y);
        }else {
            y-=s;
            if(x==0){
                if(y<0)return pii(x,y+s);
                return pii(x,y);
            }else{
                if(y<0)return pii(x-1,-1-y);
                return pii(x,y);
            }
        }
    }
    db slove(int x,int y){
        if(x==0&&y==0)return 0;
        if(dp[x][y]!=0)return dp[x][y];
        dp[x][y]=1e18;
        db cnt=0,res=0;
        for(int i=1;i<=6;i++){
            pii nxt = go(x,y,i);
            if(nxt.first==x&&nxt.second==y)cnt+=1;
            else{
                if(h[nxt.first][nxt.second]==0)res+=slove(nxt.first,nxt.second);
                else{
                    res+=min(slove(nxt.first,nxt.second),slove(nxt.first-h[nxt.first][nxt.second],nxt.second));
                }
            }
        }
        res/=6;
        dp[x][y]=min(dp[x][y],(res+1)*6/(6.0-cnt));
        return dp[x][y];
    }
    int main(){
        for(int i=0;i<10;i++)for(int j=0;j<10;j++)cin>>h[i][j];
        db ans = slove(9,0);
        printf("%.11f
    ",ans);
    }
    

    F:数位dp傻逼题。说真的我都大半年没写过数位dp了,因为(前任)队友什么都会,结果翻了翻自己blog还蛮熟练地秒掉了。
    牛客多校有个比这个难100倍的吧。。
    直接粘板子就行。
    注意特判l=0的情况。
    容斥一下很好想吧
    不知道为什么我直接coutslove函数程序就直接结束了,,所以先存了下来

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll dp[40][2][2][2][2];
    int abit[33],bbit[33];
    ll dfs(int len,int lim1,int lim2,int z1,int z2){
        if(len==-1)return 1;
        if(dp[len][lim1][lim2][z1][z2]!=-1)return dp[len][lim1][lim2][z1][z2];
        ll ans=0;
        int up1=lim1?abit[len]:1;
        int up2=lim2?bbit[len]:1;
        for(int i=0;i<=up1;i++){
            for(int j=0;j<=up2;j++){
                if((i+j)==(i^j)){
                    ans+=dfs(len-1,lim1&&i==up1,lim2&&j==up2,z1||i!=0,z2||j!=0);
                }
            }
        }
        dp[len][lim1][lim2][z1][z2]=ans;
        return ans;
    }
    ll slove(ll a,ll b){
        memset(dp,-1, sizeof(dp));
        for(int i=30;i>=0;i--){
            abit[i]=a>>i&1;
            bbit[i]=b>>i&1;
        }
        dfs(30,1,1,0,0);
    }
    ll t,l,r;
    int main(){
        ios::sync_with_stdio(false);
        cin>>t;
        ll a,b,c;
        while (t--){
            cin>>l>>r;
            if(l==0){
                a=slove(r,r);
                cout<<a<<endl;
                continue;
            }
    //        cout<<(a=slove(r,r))<<' ';
    //        cout<<(b=slove(l-1,l-1))<<' ';
    //        cout<<(c=slove(l-1,r))<<' ';
    //        cout<<endl;
            a=slove(r,r);
            b=slove(l-1,l-1);
            c=slove(l-1,r);
            cout<<a+b-c-c<<endl;
        }
    }
    
  • 相关阅读:
    SOCKET 3次握手
    NativeXml帮助(四) http://gaoyanan.blog.sohu.com/162725319.html
    DELPHI下的SOCK编程(转)
    socket 编程入门教程(三)TCP原理:5、TCP的三次握手(threeway handshake)
    计算机术语的英文缩写
    提高查询速度方法总结
    复制表结构的通用存储过程
    QQ盗号工具代码(破解键盘锁)
    使用VB将SQL SERVER 的脚本导出
    2007第四周 关于逛街
  • 原文地址:https://www.cnblogs.com/MXang/p/11780418.html
Copyright © 2011-2022 走看看