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;
}
posted @ 2025-08-10 12:17  arin876  阅读(24)  评论(0)    收藏  举报