Codeforces Round #713 (Div. 3) 题解

A. Spy Detected!

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;

int dp[N];

int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>dp[i];
        int pos;
        for(int i=1;i<=n;i++){
            if(i==1){
                if(dp[1]!=dp[2]&&dp[2]==dp[3]){
                    pos=1;
                    break;
                }
            }
            else if(i==n){
                if(dp[n]!=dp[n-1]&&dp[n-1]==dp[n-2]){
                    pos=n;
                    break;
                }
            }
            else{
                if(dp[i]!=dp[i-1]&&dp[i]!=dp[i+1]){
                    pos=i;
                    break;
                }
            }
        }
        cout<<pos<<endl;
    }
    return 0;
}

B. Almost Rectangle

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;

char s[444][444];
set<int>rp;
set<int>cp;

int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        rp.clear();
        cp.clear();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin>>s[i][j];
                if(s[i][j]=='*'){
                    rp.insert(i);
                    cp.insert(j);
                }
            }
        }
        if(rp.size()>1&&cp.size()>1){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(rp.count(i)==1&&cp.count(j)==1) cout<<"*";
                    else cout<<".";
                }
                cout<<endl;
            }
        }
        else if(rp.size()==1&&cp.size()>1){
            int pos=*rp.begin();
//            cout<<pos<<endl;
            if(pos!=n) {
                for(int j=1;j<=n;j++){
                    if(cp.count(j)==1){
                        s[pos+1][j]='*';
                    }
                }
            }
            else if(pos==n){
                for(int j=1;j<=n;j++){
                    if(cp.count(j)==1){
                        s[pos-1][j]='*';
                    }
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    cout<<s[i][j];
                }
                cout<<endl;
            }
        }
        else if(cp.size()==1&&rp.size()>1){
            int pos=*cp.begin();
//            cout<<pos<<endl;
            if(pos!=n) {
                for(int i=1;i<=n;i++){
                    if(rp.count(i)==1){
                        s[i][pos+1]='*';
                    }
                }
            }
            else if(pos==n){
                for(int i=1;i<=n;i++){
                    if(rp.count(i)==1){
                        s[i][pos-1]='*';
                    }
                }
            }
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    cout<<s[i][j];
                }
                cout<<endl;
            }
        }
    }
    return 0;
}

C - A-B Palindrome

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 1e5 + 10;
using namespace std;

string s;

int main(){
    int t;
    cin>>t;
    int n,m;
    while(t--){
        cin>>n>>m;
        cin>>s;
        int l=0;
        int r=n+m-1;
        while(l<r){
            if(s[l]!=s[r]&&(s[l]=='?'||s[r]=='?')){
                if(s[l]=='?') s[l]=s[r];
                if(s[r]=='?') s[r]=s[l];
            }
            l++,r--;
        }
        int sum0=n;
        int sum1=m;
        for(int i=0;i<n+m;i++){
            if(s[i]=='0') sum0--;
            else if(s[i]=='1') sum1--;
        }
        l=0;
        r=n+m-1;
        while(l<r){
            if(s[l]==s[r]&&s[l]=='?'){
                if(sum0>=sum1){
                    s[l]=s[r]='0';
                    sum0-=2;
                }
                else{
                    s[l]=s[r]='1';
                    sum1-=2;
                }
            }
            l++,r--;
        }
        l=0;
        r=n+m-1;
        bool flag=0;
        while(l<r){
            if(s[l]!=s[r]){
                flag=1;
                break;
            }
            l++,r--;
        }
        if((n+m)%2){
            if(sum0==1) s[(n+m)>>1]='0' ,sum0--;
            else if(sum1==1) s[(n+m)>>1]='1' ,sum1--;
        }
        if(sum0||sum1||flag) cout<<"-1"<<endl;
        else cout<<s<<endl;
    }
    return 0;
}

D - Corrupted Array

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
const int N = 2e5 + 10;
using namespace std;

string s;
map<ll,int>num;
ll dp[N];

int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        n+=2;
        ll sum=0;
        num.clear();
        for(auto i=0;i<n;i++){
            cin>>dp[i];
            sum+=dp[i];
            num[dp[i]]++;
        }
        for(auto i=0;i<n;i++){
            sum-=dp[i];
            num[dp[i]]--;
            if(sum%2==0&&num[sum/2]){
                bool flag=0;
                for(auto j=0;j<n;j++){
                    if(i==j) continue;
                    else if(!flag&&dp[j]==sum/2) flag=1;//,cout<<dp[j]<<"**"<<endl;
                    else cout<<dp[j]<<" ";
                }
                cout<<endl;
                goto place;
            }
            sum+=dp[i];
            num[dp[i]]++;
        }
        cout<<"-1"<<endl;
        place:;
    }
    return 0;
}

E - Permutation by Sum

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 2e5 + 10;
using namespace std;

string s;
map<ll,ll>mp;
ll dp[N];

int main(){
    int t;
    cin>>t;
    while(t--){
        mp.clear();
        mem(dp,0);
        ll n,l,r,pos;
        cin>>n>>l>>r>>pos;
        ll tot=r-l+1;
        ll cnt=1;
        for(int i=l;i<=r;i++) dp[i]=cnt++;
        ll suml=tot*(tot+1)>>1;
        ll sumr=tot*(2*n-tot+1)>>1;
        if(pos>=suml&&pos<=sumr){
            ll dis=pos-suml;
            ll w=dis/tot;
            ll res=dis%tot;
            for(int i=l;i<=r;i++){
                dp[i]+=w;
                mp[dp[i]]++;
            }
            if(res){
                for(int i=l;i<=r;i++){
                    if(!mp[dp[i]+res]&&dp[i]+res<=n){
                        mp[dp[i]]=0;
                        dp[i]+=res;
                        mp[dp[i]]++;
                        break;
                    }
                }
            }
            cnt=0;
            for(int i=1;i<=n&&cnt<l-1;i++){
                if(!mp[i]){
                    cnt++;
                    cout<<i<<" ";
                    mp[i]++;
                }
            }
            for(int i=l;i<=r;i++) cout<<dp[i]<<" ";
            for(int i=1;i<=n;i++){
                if(!mp[i])
                    cout<<i<<" ";
            }
            cout<<endl;
        }
        else puts("-1");
    }
    return 0;
}

F - Education

题目链接

答案

#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
const int N = 2e5 + 10;
using namespace std;

ll dp[N];
ll mp[N];
ll dp1[N];
ll dp2[N];

void solve(){
    int t;
    cin>>t;
    while(t--){
        ll n,c;
        cin>>n>>c;
        for(int i=0;i<n;i++) cin>>dp[i];
        for(int i=0;i<n-1;i++) cin>>mp[i];
        dp1[0]=dp2[0]=0;
        ll minn=INF;
        for(int i=0;i<n;i++){
            minn=min(minn,dp1[i]+max((c-dp2[i]+dp[i]-1)/dp[i],0ll));
            if(i==n-1) break;
            ll res=max((mp[i]-dp2[i]+dp[i]-1)/dp[i],0ll);
            dp1[i+1]=dp1[i]+res+1;
            dp2[i+1]=dp2[i]+res*dp[i]-mp[i];
        }
        cout<<minn<<endl;
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值