2024百度之星程序设计大赛初赛第二场
叠砖块
差分
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int b[N];int a[N];
int n,k;
int main(){
std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>k;
// int mx=0;int L=1;int R=n;
for(int i=1;i<=k;i++){
int x,y;cin>>x>>y;
b[x]++;b[y+1]--;
}
for(int i=1;i<=n;i++){
a[i]=a[i-1]+b[i];
}
sort(a+1,a+n+1);
cout<<a[(n+1)/2];
}
括号
数据比较弱
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n;
int sum[N];int pre[N];int suf[N];
bool isok(string str){
stack<char> stk;
for(auto c:str){
if(c=='('){
stk.push('(');
}
else if(c==')'){
if(stk.empty())return 0;
stk.pop();
}
}
return stk.empty();
}
int main( )
{
std::ios::sync_with_stdio(false);
string str="a";string _;cin>>_;str+=_;n=_.size();
for(int i=1;i<=n;i++){
if(str[i]=='(')sum[i]=sum[i-1]-1;
else sum[i]=sum[i-1]+1;
}
if(isok(_)){
cout<<0;
}else if(sum[n]>0){
int ans=0;
for(int i=1;i<=n;i++){
if(i==1){pre[i]=sum[1];continue;}
pre[i]=max(pre[i-1],sum[i]);
}
for(int i=1;i<=n;i++){
if(i==1){
if(str[i]==')'){
ans++;
}
continue;
}
if(str[i]==')'){
if(pre[i-1]>=1)continue;
else ans++;
}
}
cout<<ans;
}else if(sum[n]<0){//左括号多
int ans=0;
for(int i=n;i>=1;i--){
if(i==n){suf[i]=sum[n];continue;}
suf[i]=max(suf[i+1],sum[i]);
}
for(int i=1;i<=n;i++){
if(str[i]=='('){
// cout<<suf[i]<<" ";
if(suf[i]>=-1)continue;
else {
ans++;
}
}
}//cout<<endl;
cout<<ans;
}
return 0;
}
小度的01串
线段树板子,v0表示把该区间变成010101这种以0开头的交替字符串的操作数,v1表示把区间变成1开头的交替字符串的操作数
vl表示区间当前的左端点值,vr表示区间当前的右端点值
#include<bits/stdc++.h>
using namespace std;
const int N=300010;
string str;
struct Tree{
int l,r;
int v0,v1;int vl,vr;
int m;
}tr[4*N];
void pushup(Tree & u,Tree& l,Tree& r){
//cout<<"pushup"<<u.l<<" "<<u.r<<"by"<<l.l<<" "<<l.r<<" "<<r.l<<" "<<r.r<<endl;
//cout<<"lr"<<l.v0<<" "<<r.v1<<endl;
u.l=l.l;u.r=r.r;
u.vl=l.vl;u.vr=r.vr;
int t0=((l.r-l.l+1)&1)?r.v1:r.v0;int t1=((l.r-l.l+1)&1)?r.v0:r.v1;
u.v0=l.v0+t0;
u.v1=l.v1+t1;
}void pushup(int u){
pushup(tr[u],tr[u<<1],tr[u<<1|1]);
}
void pushdown(Tree& u,Tree& l,Tree& r){
if(u.m&1){
int t=l.v0;l.v0=l.v1;
l.v1=t;
l.vl=l.vl^1;l.vr=l.vr^1;
t=r.v0;r.v0=r.v1;
r.v1=t;
r.vl=r.vl^1;r.vr=r.vr^1;
}
l.m+=u.m;
r.m+=u.m;
u.m=0;
}
void pushdown(int u){
pushdown(tr[u],tr[u<<1],tr[u<<1|1]);
}
void bui(int u,int l,int r){
tr[u]={l,r,0,0,0,0,0};
if(l==r){
if(str[l]=='0'){
tr[u].v0=0;tr[u].v1=1;
tr[u].vl=0;tr[u].vr=0;
}else {
tr[u].v0=1;tr[u].v1=0;
tr[u].vl=1;tr[u].vr=1;
}
return;
}
int mid=(l+r)>>1;
bui(u*2,l,mid);
bui(u*2+1,mid+1,r);
pushup(u);
}
void modify(int u,int x,int y){
// cout<<"mo"<<tr[u].l<<" "<<tr[u].r<<endl;
if(x<=tr[u].l&&tr[u].r<=y){
int t=tr[u].v0;tr[u].v0=tr[u].v1;tr[u].v1=t;
tr[u].vl=tr[u].vl^1;tr[u].vr=tr[u].vr^1;
tr[u].m++;
return ;
}
int mid=(tr[u].l+tr[u].r)>>1;
pushdown(u);
if(x<=mid)modify(u*2,x,y);
if(y>=mid+1)modify(u*2+1,x,y);
pushup(u);
}
Tree query(int u,int x,int y){
// cout<<"q"<<tr[u].l<<" "<<tr[u].r<<endl;
if(x<=tr[u].l&&tr[u].r<=y){
return tr[u];
}
int mid=(tr[u].l+tr[u].r)>>1;
pushdown(u);
if(y<=mid)return query(u*2,x,y);
else if(x>=mid+1)return query(u*2+1,x,y);
else {
Tree res;
Tree leftt=query(u*2,x,y);
Tree rightt=query(u*2+1,x,y);
pushup(res,leftt,rightt);
return res;
}
}
void dfs(int u){
cout<<tr[u].l<<" "<<tr[u].r<<" "<<tr[u].v0<<" "<<tr[u].v1<<" "<<tr[u].vl<<" "<<tr[u].vr<<endl;
if(tr[u].l==tr[u].r)return ;
pushdown(u);
dfs(u<<1);
dfs(u<<1|1);
}
int main( )
{
std::ios::sync_with_stdio(false);//cin.tie(0);cout.tie(0);
int n,q;
cin>>n>>q;
str="a";string _;cin>>_;str+=_;
bui(1,1,n);
while(q--){
int op,x,y;cin>>op>>x>>y;
if(op==1){
modify(1,x,y);
// dfs(1);
}else {
auto tem=query(1,x,y);
cout<<min(tem.v0,tem.v1)<<'\n';
}
}
return 0;
}

浙公网安备 33010602011771号