Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)

A. Even Subset Sum Problem

Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics)_第1张图片

找一个偶数,或找两个奇数

#include 
using namespace std;
int a[105];
int b,c;
int main(){
    int t;cin>>t;
    while(t--){
        b=0,c=0;
        int n;cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]%2==0)b=i;
            if(b==0)b=i;
            else if(c==0)c=i;
        }
        if(a[b]%2==0)cout<<1<<endl<<b<<endl;
        else if(a[c]%2==1)cout<<2<<endl<<b<<' '<<c<<endl;
        else cout<<-1<<endl;
    }
    return 0;
}

B. Count Subrectangles

找连续的1即可

#include 
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int c[40055];
int d[40055];
int main(){
    int n,m,k;
    cin>>n>>m>>k;
    int x=0,q;
    for(int i=1;i<=n;i++){
        cin>>q;
        if(q==1)x++;
        if(q==0||i==n){
            for(int j=1;j<=x;j++)c[j]+=x-j+1;
            x=0;
        }
    }
    for(int i=1;i<=m;i++){
        cin>>q;
        if(q==1)x++;
        if(q==0||i==m){
            for(int j=1;j<=x;j++)d[j]+=x-j+1;
            x=0;
        }
    }
    ll cnt=0;
    for(int i=1;i<=40005;i++){
        if(k%i==0&&k/i<=40005)cnt+=c[i]*d[k/i];
    }
    cout<<cnt;
}

C. Unusual Competitions

从左往右遍历,当遍历到一个右括号,且此时右括号数量大于左括号时,说明该右括号不合法,将它和它后面的左括号交换

#include 
using namespace std;
int n;
string s;
queue<int>q;
int main(){
    cin>>n>>s;
    int zuo=0;//记录左括号数量
    int you=0;//记录右括号数量
    int sum=0;//记录次数
    for(int i=0;i<s.length();i++){
        if(s[i]=='('){
            zuo++;
            q.push(i);//压入左括号的位置
        }
        else you++;
    }
    if(zuo!=you){//如果左括号和右括号的数量不同,则不合法
        cout<<-1;
    }
    else{
        zuo=0;
        you=0;
        for(int i=0;i<s.length();i++){
            if(s[i]=='('){
                q.pop();//合法的左括号,弹出
                zuo++;//左括号数量+1
            }
            else if(s[i]==')'){
                if(zuo<(you+1)){//如果该后括号不合法
                    int we=q.front();//找到它右边最近的左括号进行交换
                    s[i]='(';
                    s[we]=')';
                    q.pop();//弹出交换的左括号
                    sum+=2;
                    zuo++;//换完后当前是左括号,因此数量+1
                }
                else you++;//右括号数量+1
            }
        }
        cout<<sum;
    }

}

你可能感兴趣的:(Codeforces)