【Codeforces专练-1500】

1400-1500

Codeforces Round #741 (Div. 2) C. Rings

1600-1700

Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum

思路:对s2求前缀和,倒着遍历s1的字符串,当前遍历到i,是1的话,ans就加上i到l2的和(直接用前缀和)再乘以当前位的十进制贡献

Codeforces Round #518 (Div. 1) [Thanks, Mail.Ru!] A. Array Without Local Maximums

思路:
要求小于等于x的最大面积,我们可以用俩前缀和维护出,每个长度的最小值,两个数组相乘,值相加,就是每个面积的最小值。最后枚举长度,找到小于等于x的最大面积

点击查看代码
ll a[N],b[N]; ll mina[N],minb[N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i],a[i]+=a[i-1];
    for(int i=1;i<=m;i++)cin>>b[i],b[i]+=b[i-1];
    int cnta=0,cntb=0;
    memset(mina,INF,sizeof mina);
    memset(minb,INF,sizeof minb);
    for(int i=1;i<=n;i++){
        for(int j=0;j<=i-1;j++){
            mina[i-j] = min(mina[i-j],a[i]-a[j]);
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=0;j<=i-1;j++){
            minb[i-j] = min(minb[i-j],b[i]-b[j]);
        }
    }
    ll ans=0;
    ll x; cin>>x;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(mina[i]*minb[j]<=x) ans = max(ans,(ll)i*j);
        }
    }
    cout<<ans<<endl;
    return 0;
}

Codeforces Round #712 (Div. 1)A

思路:

  • 首位必须是 '(' 末尾必须是 ')' 所以S[0]和S[n-1]必须是'1'
  • 若第一个已经是平衡的,第二需要两次取反来维持平衡,所以0个数必须是偶数个
  • 构造时候让奇数0放置'('偶数放置')'(反过来也行)
  • 让前一半的1全是'(',后一半全是')'是最安全的
点击查看代码
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <stack>
#include <cstdio>
#include <queue>
#include <set>
#include<sstream>
#include <cstring>
#include <cmath>
#include <bitset>
#include <vector>
//#pragma GCC optimize(2);
#define IOS ios::sync_with_stdio(false);
#define mm(a, b) memset(a, b, sizeof(a))
const double PI = acos(-1.0);
typedef long long ll;
const int N = 1e5+5;
const int M = 2e5 + 5;
const double eps =-1e9;
const ll mod =  1e9+7;
const int INF = 0x3f3f3f3f;
const double maxd = -1e9;
const int maxn = 500;
using namespace std;
void solve(){
    int n;string ss;
    cin>>n>>ss;
    int a=0,b=0; bool f=0;
    for(int i=0;i<ss.length();i++){
        if(ss[i]=='1')a++;else b++;
    }
    if(ss[0] == '0'||ss[n-1]=='0'||a%2||b%2){
        cout<<"NO"<<endl;
        return;
    }
    string ans1,ans2;
    int k =a/2; int cnt=0,c;
    for(int i=0;i<ss.length();i++){
        if(ss[i]=='1') {
            cnt++;
            if(cnt<=k) ans1+='(',ans2+='(';
            else ans1+=')',ans2+=')';
        }
        else{
            c++;
            if(c&1) ans1+='(',ans2+=')';
            else  ans1+=')',ans2+='(';
        }
    }
        cout<<"YES"<<endl;
        cout<<ans1<<endl<<ans2<<endl;
}
int main(){
    int T;
    cin>>T;
    while (T--){
        solve();
    }
    
    return 0;
}
posted @ 2021-09-16 09:55  qingyanng  阅读(44)  评论(0编辑  收藏  举报