div 2 c Binary String Copying

#include
using namespace std ;
using ll = long long;
using PII = pair;
string s;
void solve(){
    int n,m;
    cin >> n >> m;
    //vectors(n+1);
    vectorne1(n+2,n+1);
    vectorpre0(n+2,0);
    cin>>s;
    s = " " + s;
    for(int i=1;i<=n;i++){
        pre0[i] = pre0[i-1];
        if(s[i] == '0'){
            pre0[i] = i;
        }
    }
    for(int i=n;i>=1;i--){
        ne1[i] = ne1[i+1];
        if(s[i] == '1'){
            ne1[i] = i;
        }
    }
    set s;
    while(m--){
        int l,r;
        cin>>l>>r;
        //cout< pre0[r]){
            s.emplace(-1,-1);
        }else{
            s.emplace(ne1[l],pre0[r]);
        }
    }
    cout<>t;
    while(t--){
        solve();
        puts("");
    }
}

用最小的变换区间代表整个大区间

找到L右边最近的1   R左边最近的0   变换区间就在这两个之间

你可能感兴趣的:(思维构造,算法,c++,数据结构)