萌新刚学玉米田 WA86pts 求助
查看原帖
萌新刚学玉米田 WA86pts 求助
197493
unputdownable楼主2021/4/30 21:06

WA On test #1 and #3, 求助

另外, 整个序列貌似都没有 0, 数据是真的 [数据删除]

#include<bits/stdc++.h>
// #define int long long
using namespace std;
inline int read(void) {
	register int x=0,sgn=1,ch;
	while(ch<48||57<ch) {if(ch==45)sgn=0;ch=getchar();}
	while(47<ch&&ch<58) {x=x*10+ch-48;   ch=getchar();}
	return sgn? x:-x;
}
int n,m,blk,l1,r1,opt,x1,mx,mxa,cntq;
int cnt[100005],srl[100005],ans[100005],lst[100005],res[100005];
struct Qry {
    int l,r,x,typ,bel,dfn;
    inline bool operator < (Qry x) {
        return bel^x.bel ? bel<x.bel : (r<x.r) xor (bel&1);
    }
    Qry(int _typ=0,int _l=0,int _r=0,int _x=0,int _bel=0,int _dfn=0) :typ(_typ), l(_l), r(_r), x(_x), bel(_bel), dfn(_dfn){}
} qry[100005];
struct query_ {
    int l,r,dfn;
    query_(int _l=0,int _r=0,int _dfn=0) :l(_l), r(_r), dfn(_dfn){}
};
std::vector <query_> query[350];
std::bitset <100010> ext,mis;
inline void add(const int &x) {
    if(!cnt[x]) {
        ext[x]=true;
        if(x<=mx) mis[mx-x]=true;
    }
    ++cnt[x];
}
inline void del(const int &x) {
    --cnt[x];
    if(!cnt[x]) {
        ext[x]=false;
        if(x<=mx) mis[mx-x]=false;
    }
}
signed main() {
	n=read(),m=read();
    blk=n/sqrt(m)/0.95;
    for(register int i=1; i<=n; ++i) srl[i]=read(),mxa=std::max(mxa,srl[i]);
    int sqt=sqrt(mxa);
    for(register int i=1; i<=m; ++i) {
        opt=read(),l1=read(),r1=read(),x1=read();
        if(opt==2) mx=std::max(mx,x1);
        if(opt==4&&x1<=sqt) {
            query[x1].push_back(query_(l1,r1,i));
            continue;
        }
        qry[++cntq]=Qry(opt,l1,r1,x1,l1/blk+1,i);
    }
    if(!query[0].empty()) assert(0);
    if(!query[0].empty()) {
        for(register int i=1; i<=n; ++i) {
            if(srl[i]) lst[i]=i,res[i]=res[i-1];
            else       res[i]=i,lst[i]=lst[i-1];
        }
        int sss=query[0].size();
        // for(register int i=0; i<sss; ++i) ans[query[0][i].dfn]=(res[query[0][i].r]>=query[0][i].l&&lst[query[0][i].r]>=query[0][i].l);
    }
    // int sss=query[0].size();
    // for(register int i=0; i<sss; ++i) ans[query[0][i].dfn]=1;
    for(register int x=1; x<=sqt; ++x) {
        if(query[x].empty()) continue;
        memset(res,0,sizeof res);
        memset(lst,0,sizeof lst);
        for(register int i=1; i<=n; ++i) {
            lst[srl[i]]=i,res[i]=res[i-1];
            if(srl[i]*x<=mxa) res[i]=max(res[i],lst[srl[i]*x]);
            if(srl[i]%x== 0 ) res[i]=max(res[i],lst[srl[i]/x]);
        }
        int sss=query[x].size();
        for(register int i=0; i<sss; ++i) ans[query[x][i].dfn]=(res[query[x][i].r]>=query[x][i].l);
    }
    sort(qry+1,qry+cntq+1);
    register int l=1,r=0;
    for(register int i=1; i<=cntq; ++i) {
        while(r<qry[i].r) add(srl[++r]);
        while(l>qry[i].l) add(srl[--l]);
        while(r>qry[i].r) del(srl[r--]);
        while(l<qry[i].l) del(srl[l++]);
        if(qry[i].typ==1) ans[qry[i].dfn]=(ext&(ext>>qry[i].x)).any();
        if(qry[i].typ==2) ans[qry[i].dfn]=(ext&(mis>>(mx-qry[i].x))).any();
        if(qry[i].typ==3) {
            int s=sqrt(qry[i].x);
            if(qry[i].x) ans[qry[i].dfn]=ext[0];
            else for(register int k=1; k<=s; ++k) {
                if(qry[i].x%k) continue;
                if(ext[qry[i].x/k]&&ext[k]) {
                    ans[qry[i].dfn]=1;
                    break;
                }
            }
        }
        if(qry[i].typ==4) {
            if(qry[i].x<sqt) continue;
            int s=mxa/qry[i].x;
            for(register int k=1; k<=s; ++k) {
                if(ext[k]&&ext[k*qry[i].x]) {
                    ans[qry[i].dfn]=1;
                    break;
                }
            }
        }
    }
    for(register int i=1; i<=m; ++i) puts(ans[i] ? "yuno" : "yumi");
	return 0;
}
2021/4/30 21:06
加载中...