根据通过人数二分法练题,每日打卡。
struct idx{
int l,r;
};
void solve(){//1427B
int n,k;cin>>n>>k;
string s;cin>>s;
vector<idx>va;
int w=0,wcnt=0,i=0,l=0;
int fg=0;//去除开头的L 因为开头放W没有在后面放加的多
while(i<n){
if(s[i]=='W'){
wcnt++;
while(i<n&&s[i]=='W'){
w++;
i++;
}
fg=1;
}
if(!fg){i++;continue;}
if(s[i]=='L'){
l=i;
while(i<n&&s[i]=='L')i++;
if(i-l>0)va.push_back({l,i});
}
}
// for(auto x:va){
// cout<
// }
if(w+k>=n)return cout<<2*n-1<<endl,void();
sort(va.begin(),va.end(),[&](idx x,idx y){
return (x.r-x.l)<(y.r-y.l);
});
for(auto x:va){
if(k<=0)break;
int cg=x.r-x.l;
if(x.r<n&&k>=cg)wcnt=max(wcnt-1,0ll);
w+=min(k,cg);
k-=cg;
}
if(k>0){
if(w==0)wcnt++;
w+=k;
}
cout<<2*w-wcnt<<endl;
}
水题
void solve(){
int n;
cin>>n;
vector<int>a(n+1);
int sum=0;
forr(i,1,n){
cin>>a[i];
if(a[i]>0)sum+=a[i];
}
if(sum%2)return cout<<sum<<endl,void();
else{
int ans=-1e4-10;
forr(i,1,n){
int ad=(a[i]>0?-a[i]:a[i]);
if((ad+sum)%2){
ans=max(ad+sum,ans);
}
}
cout<<ans<<endl;
}
}
题很短 但愣是没看懂
意思是放长方形 0是竖的 1是横的
放满一行或一列就可以消除 然后空出来继续放
构造水题
void solve(){
string s;cin>>s;
int r=0,c=0;
for(auto i:s){
if(i=='0'){
cout<<"1 "<<(r+1)<<endl;
r=(r+1)%4;
}else {
cout<<"4 "<<c+1<<endl;
c=(c+2)%4;
}
}
}
const int N=4e5+10;
void solve(){
string s,t;
vector<int>ss(27,N),tt(27,N);
cin>>s>>t;
int sl=s.size(),tl=t.size();
forr(i,1,sl-1){
if(ss[s[i]-'a']==N)ss[s[i]-'a']=i+1;
}
reforr(i,0,tl-2){
// cout<
if(tt[t[i]-'a']==N)tt[t[i]-'a']=tl-i;
}
int len=N;
string ans="";
for(int i=0;i<=25;i++){
len=min(ss[i]+tt[i],len);
}
if(len==N)return cout<<-1<<endl,void();
for(int i=0;i<=25;i++){
if(len==ss[i]+tt[i]){
string cp=s.substr(0,ss[i])+t.substr(tl-tt[i]+1);
ans=cp;
}
}
cout<<ans<<endl;
}
水题
void solve(){
string s;
cin>>s;
int len=s.size();
s=" "+s;
vector<int>cnt(len+2,0);
int m;cin>>m;
forr(i,1,m){
int a;cin>>a;
cnt[a]++;
}
int sum=0;
//对称的 处理一半就行
forr(i,1,len/2){
sum+=cnt[i];
// cout<
if(sum%2==1){
char tp=s[i];
s[i]=s[len-i+1];
s[len-i+1]=tp;
// cout<
}
}
cout<<s<<endl;
}