求助神秘RE
  • 板块学术版
  • 楼主Remarks
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/1/24 20:11
  • 上次更新2024/1/24 20:55:42
查看原帖
求助神秘RE
321529
Remarks楼主2024/1/24 20:11

RECORD : LINK

RE 信息显示Aborted / IOT trap.。是 set 越界?还是什么其他原因?求助/kk

code :

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
using namespace std;
struct stu{
    int f,t;
     long long v;
    stu(int a,int b=0,int c=0){f=a,t=b,v=c;}
    bool operator <(const stu &a)const{
        return f<a.f;
    }
};
#define IT set<stu>::iterator    
#define check for(auto it=s.begin();it!=s.end();it++){cout<<it->f<<"->"<<it->t<<'='<<it->v<<"\n";}
set<stu>s;
void mdf(int f,int t,int c){
    IT itl=s.lower_bound(stu(f));if(itl==s.end()||itl->f>f)itl--;
    
    if(itl->v==c){
        f=itl->f;
    }else{
        int x=itl->f,ccc=itl->v;
        if(itl->f!=f){
            s.erase(itl);
            itl=s.insert(stu(x,f-1,ccc)).first;itl++;
        }
    }
    IT itr=s.lower_bound(stu(t));if(itr==s.end()||itr->f>t)itr--;
    if(itr->v==c){
        //末端合并
        t=itr->t;
    }else{
        int x=itr->t,ccc=itr->v;
        if(itr->t!=t){
            s.erase(itr);
            itr=s.insert(stu(t+1,x,ccc)).first;itr--;
        }
    }
    IT del=itr;
    do{
        itr--;
        s.erase(del);
        del=itr;

    }while(itr->f>=f);

    IT it=s.insert(stu(f,t,c)).first;
    if(it!=s.end()){
        IT nxt=it;nxt++;
        if(nxt->v==it->v){
            int t=nxt->t,f=it->f,c=it->v;
            s.erase(nxt);s.erase(it);
            it=s.insert(stu(f,t,c)).first;
        }
    }
    if(it!=s.begin()){
        IT lst=it;lst--;
        if(lst->v==it->v){
            int f=lst->f,t=it->t,c=it->v;
            s.erase(it);s.erase(lst);
            it=s.insert(stu(f,t,c)).first;
        }
    }
}
int qus(int l,int r){
    auto itl=s.lower_bound(stu(l)),itr=s.lower_bound(stu(r));
    if(itl==s.end()||itl->f>l)itl--;
    if(itr==s.end()||itr->f>r)itr--;
    if(itl->f!=itr->f)return -1;
    if(itl->f<l&&itl->t>r)return -2;
    if(itl->f<l||itl->t>r)return 1;
    if(itl->v==-1||(++itr)->v==-1)return 2;
    return (--itl)->v!=itr->v?3:-3;
}
int main(){
    int n;cin>>n;
    char ch=getchar();while(ch<'A'||ch>'C')ch=getchar();
    int lst=ch,cnt=1;
    for(int i=1;i<n;i++){
        ch=getchar();
        if(ch==lst)cnt++;
        else {
            s.insert(stu(i-cnt+1,i,lst-'A'+1));
            cnt=1;
        }
        lst=ch;
    }
    s.insert(stu(n-cnt+1,n,lst-'A'+1));
    s.insert(stu(-114514,-3,-1));
    s.insert(stu(-2,-2,-1));s.insert(stu(-1,-1,-1));s.insert(stu(0,0,-1));
    s.insert(stu(n+1,n+1,-1));s.insert(stu(n+2,n+2,-1));s.insert(stu(n+2,n+2,-1));
    s.insert(stu(n*5,n*10,-1));
    int m;cin>>m;
    // check
    while(m--){
        char ch;cin>>ch;int l,r;cin>>l>>r;
        if(ch=='A'){
            char x;cin>>x;x=x-'A'+1;
            mdf(l,r,x);
        }else{
            cout<<(qus(l,r)<0?"No":"Yes")<<endl;
        }
        // check
    }
    return 0;
}
2024/1/24 20:11
加载中...