Codeforces Round 984 (Div. 3)(A-E)

补题链接:Dashboard - Codeforces Round 984 (Div. 3) - Codeforces

A. Quintomania

思路

模拟题,每相邻两个数差的绝对值都是5或7则暑促yes,否则输出no

代码

void solve(){
    int n; cin>>n;
    vector<int>a(n+10);
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<n;i++){
        int t=abs(a[i+1]-a[i]);
        if(t==5||t==7){
            continue;
        }else{
            cout<<"NO\n";return;
        }
    }
    cout<<"YES\n";
}

B. Startup

思路

把相同品牌的加在一起后排序,输出前min(k,n)个最大的之和

代码

#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
typedef pair<int,int> pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;

int n,k;
struct node{
    int b,c;
}p[N];

void solve(){
    cin>>n>>k;
    vector<int>b(k+10,0);
    for(int i=1;i<=k;i++){
        cin>>p[i].b>>p[i].c;
        b[p[i].b]+=p[i].c;
    }
    sort(b.begin()+1,b.begin()+1+k);
    int sum=0;
    for(int i=k;i>=1;i--){
        n--;
        sum+=b[i];
        if(n<=0) break;
    }
    cout<<sum<<"\n";
    
}
signed main() {
    vcoistnt
    int _=1;
    cin>>_;
    while(_--) {
        solve();
    }
    return 0;
}

C. Anya and 1100

思路

由于要是每次改变一次就重新统计1100子串的数量肯定会T的,所以仔细想一下发现每次要改变一个位置的数只与这个位置附近7个字符有关,只需要判断一下改变此位置的数是否能形成新的1100字串或者破坏掉原来的1100子串即可

代码

#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
typedef pair<int,int> pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;


void solve(){
    string s;
    cin>>s;
    int n=s.size();
    s=" "+s;
    int cnt=0;
    for(int i=1;i<=n-3;i++){
        if(s[i]=='1'&&s[i+1]=='1'&&s[i+2]=='0'&&s[i+3]=='0'){
            cnt++;
        }
    }
    int q;
    cin>>q;
    while(q--){
        int x,t;
        cin>>x>>t;
        if((s[x]-'0')==t){
            if(cnt){
                cout<<"YES\n";
            }else{
                cout<<"NO\n";
            }
        }else{
            if(s[x]=='1'){
                if((s[x+1]=='1'&&s[x+2]=='0'&&s[x+3]=='0')||(x>=2&&s[x-1]=='1'&&s[x+1]=='0'&&s[x+2]=='0')){
                    cnt--;
                }
                s[x]='0';
                if((x>=3&&s[x-1]=='1'&&s[x-2]=='1'&&s[x+1]=='0')||(x>=4&&s[x-1]=='0'&&s[x-2]=='1'&&s[x-3]=='1')){
                    cnt++;
                }
                if(cnt){
                    cout<<"YES\n";
                }else{
                    cout<<"NO\n";
                }
            }else{
                if((x>=3&&s[x-1]=='1'&&s[x-2]=='1'&&s[x+1]=='0')||(x>=4&&s[x-1]=='0'&&s[x-2]=='1'&&s[x-3]=='1')){
                    cnt--;
                }
                s[x]='1';
                if((s[x+1]=='1'&&s[x+2]=='0'&&s[x+3]=='0')||(x>=2&&s[x-1]=='1'&&s[x+1]=='0'&&s[x+2]=='0')){
                    cnt++;
                }
                if(cnt){
                    cout<<"YES\n";
                }else{
                    cout<<"NO\n";
                }
            }
        }
    }

}
signed main() {
    vcoistnt
    int _=1;
    cin>>_;
    while(_--) {
        solve();
    }
    return 0;
}

D. I Love 1543

思路

赛时的时候调了挺久的,其实只要把每一层放在一个vector数组里面,然后把每个数遍历至于循环的部分%v.size()即可

代码

#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
typedef pair<int,int> pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;

void solve(){
    int n,m;
    cin>>n>>m;
    string s[n+10];
    for(int i=1;i<=n;i++){
        cin>>s[i];
        s[i]=" "+s[i];
    }
    int t=1,x=n,y=m;
    int ans=0;
    while(t<=x&&t<=y){
        vector<char>v;
        for(int i=t;i<=y;i++){
            v.push_back(s[t][i]);
        }
        for(int i=t+1;i<=x;i++){
            v.push_back(s[i][y]);
        }
        for(int i=y-1;i>=t;i--){
            v.push_back(s[x][i]);
        }
        for(int i=x-1;i>=t+1;i--){
            v.push_back(s[i][t]);
        }

        int len=v.size();
        for(int i=0;i<len;i++){
            if(v[i]=='1'&&v[(i+1)%len]=='5'&&v[(i+2)%len]=='4'&&v[(i+3)%len]=='3'){
                ans++;
            }
        }
        t++,x--,y--;
    }
    cout<<ans<<"\n";
}
signed main() {
    vcoistnt
    int _=1;
    cin>>_;
    while(_--) {
        solve();
    }
    return 0;
}

E. Reverse the Rivers

思路

太菜了调了半天哈哈可以看出来我当时有多难受

先根据题意处理一下数组,然后再用二分卡一下范围,范围不合法输出-1,合法输出最小

代码

#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;


void solve(){
    int n,k,q;cin>>n>>k>>q;
    
    vector<vector<int>> mp(k+10,vector<int>(n+10,0));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            cin>>mp[j][i];
            mp[j][i]|=mp[j][i-1];
        }
    }
    while(q--){
        int m;
        cin>>m;
        int L=1,R=n;
        while(m--){
            int r,c;
            char o;
            cin>>r>>o>>c;
            if(o=='>'){
                int t=upper_bound(mp[r].begin()+1,mp[r].begin()+1+n,c)-mp[r].begin();
                L=max(L,t);
            }else{
                int t=lower_bound(mp[r].begin()+1,mp[r].begin()+1+n,c)-mp[r].begin()-1;
                //对就是这个-1卡的我(泪目了)
                R=min(R,t);
            }
        }
        if(L>R){
            cout<<"-1\n";
        }else{
            cout<<L<<"\n";
        }
    }
}
signed main() {
    vcoistnt
    int _=1;
    // cin>>_;
    while(_--) {
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值