【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;
}