제출 #690961

#제출 시각아이디문제언어결과실행 시간메모리
690961vjudge1DNA 돌연변이 (IOI21_dna)C++17
0 / 100
1014 ms2097152 KiB
#include <bits/stdc++.h>
#define ll int
#define pb push_back
#define vl vector<ll>
#define endl "\n"
#define INF 0x3F3F3F3F
using namespace std;
const int sz=1e5+5;
ll n,q,zer=0;
ll TreeD[4*sz];
string a,b;
void builD(ll v, ll l, ll r){
    if(l==r){
        if(a[l]!=b[l]){
            TreeD[v]=1;return;
        }
        TreeD[v]=0;return;
    }
    ll m=(l+r)>>1;
    builD(v*2,l,m);
    builD(v*2+1,m+1,r);
    TreeD[v]=TreeD[v*2]+TreeD[v*2+1];
}
int FinD(ll v, ll tl, ll tr, ll l, ll r){
    if(l>r){
        return 0;
    }
    if(tl==l and tr==r){
        return TreeD[v];
    }
    ll tm=(tl+tr)>>1;
    return FinD(v*2,tl,tm,l,min(r,tm))+FinD(v*2+1,tm+1,tr,max(l,tm+1),r);
}
int get_distance(ll left, ll right){
    int z=0;
    int rx=FinD(1,0,n-1,left,right);
    int res=(rx/2)+(rx%2);
    res=max(res,z);
    return res;
}
void init(string a, string b){
    builD(1,0,n-1);
    vl ac,aa,at,bc,ba,bt;
    for(ll i=0;i<n;i++){
        if(a[i]=='C'){
            ac.pb(i);
        }
        else if(a[i]=='A'){
            aa.pb(i);
        }
        else{
            at.pb(i);
        }
        if(b[i]=='C'){
            bc.pb(i);
        }
        else if(b[i]=='A'){
            ba.pb(i);
        }
        else{
            bt.pb(i);
        }
    }
    while(q--){
        ll left, right;
        cin>>left>>right;
        ll lac=lower_bound(ac.begin(),ac.end(),left)-ac.begin();
        ll uac=upper_bound(ac.begin(),ac.end(),right)-ac.begin();//uac=max(zer,uac);
        if(ac[uac-1]>right){uac--;}uac=max(zer,uac);
        ll cntac=uac-lac;
        cntac=max(cntac,zer);

        ll laa=lower_bound(aa.begin(),aa.end(),left)-aa.begin();
        ll uaa=upper_bound(aa.begin(),aa.end(),right)-aa.begin();//uaa=max(zer,uaa);
        if(aa[uaa-1]>right){uaa--;}uaa=max(zer,uaa);
        ll cntaa=uaa-laa;
        cntaa=max(cntaa,zer);

        ll lat=lower_bound(at.begin(),at.end(),left)-at.begin();
        ll uat=upper_bound(at.begin(),at.end(),right)-at.begin();//uat=max(zer,uat);
        if(at[uat-1]>right){uat--;}uat=max(zer,uat);
        ll cntat=uat-lat;
        cntat=max(cntat,zer);
        /*##############################################*/
        ll lbc=lower_bound(bc.begin(),bc.end(),left)-bc.begin();
        ll ubc=upper_bound(bc.begin(),bc.end(),right)-bc.begin();//ubc=max(zer,ubc);
        if(ac[ubc-1]>right){ubc--;}ubc=max(zer,ubc);
        ll cntbc=ubc-lbc;
        cntbc=max(cntbc,zer);

        ll lba=lower_bound(ba.begin(),ba.end(),left)-ba.begin();
        ll uba=upper_bound(ba.begin(),ba.end(),right)-ba.begin();//uba=max(zer,uba);
        if(ba[uba-1]>right){uba--;}uba=max(zer,uba);
        ll cntba=uba-lba;
        cntba=max(cntba,zer);

        ll lbt=lower_bound(bt.begin(),bt.end(),left)-bt.begin();
        ll ubt=upper_bound(bt.begin(),bt.end(),right)-bt.begin();//ubt=max(zer,ubt);
        if(bt[ubt-1]>right){ubt--;}ubt=max(zer,ubt);
        ll cntbt=ubt-lbt;
        cntbt=max(cntbt,zer);

        if(cntac!=cntbc or cntaa!=cntba or cntat!=cntbt){
            cout<<-1<<endl;
        }
        else{
            cout<<get_distance(left,right)<<endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...