社区讨论

求助玄学MLE

P3293[SCOI2016] 美味参与者 5已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo8puggs
此快照首次捕获于
2023/10/27 22:36
2 年前
此快照最后确认于
2023/10/27 22:36
2 年前
查看原帖
在规定主席树上最大值域的时候,题目给出的是 ai,xi,bi<105a_i,x_i,b_i \lt 10^5 ,所以我开了 lim=100000 ,并且由于 log2105\log_2{10^5} 约为 16.616.6 ,所以我从二进制位的第 1616 位往下扫。
然后这样就MLE 20 pts。。。
lim=200000 然后从 1717 位向下扫就过了。。。
所以这是为什么啊?
马蜂比较诡异(? :
CPP
#define ri register int
#define N 200003
int n,m,a[N];
const int lim=200000; //!!!!!
struct __tree{
    struct seg{
        int lc,rc,val;
    }tr[N*80]; int tot;
    #define lef(u) tr[u].lc
    #define rig(u) tr[u].rc
    #define Val(u) tr[u].val
    inline void insert(int &u,int lst,int l,int r,int pos){
        tr[u=++tot]=tr[lst],++Val(u);
        if(l==r) return; ri mid=l+r>>1;
        if(pos<=mid) insert(lef(u),lef(lst),l,mid,pos);
        else insert(rig(u),rig(lst),mid+1,r,pos);
    }
    inline int query(int u,int lst,int l,int r,int L,int R){
        if(l>=L&&r<=R) return Val(u)-Val(lst);
        ri mid=l+r>>1,ret=0;
        if(L<=mid) ret=query(lef(u),lef(lst),l,mid,L,R);
        if(R>mid) ret+=query(rig(u),rig(lst),mid+1,r,L,R);
        return ret;
    }
}tr; int root[N];
inline int solve(int b,int x,int l,int r){
    ri res=0; for(ri i=17;i>=0;--i){ //!!!!!
        ri t=(b>>i)&1; //不断用(使这一位异或值为1的值域)里有没有值判断即可
        if(t){ if(!tr.query(root[r],root[l-1],0,lim,res-x,res-x+(1<<i)-1)) res|=(1<<i); }
        else { if(tr.query(root[r],root[l-1],0,lim,res-x+(1<<i),res-x+(1<<i+1)-1)) res|=(1<<i); }
    } return res^b;
}

int main()
{
    rd(n),rd(m);
    for(ri i=1;i<=n;++i)
        rd(a[i]),tr.insert(root[i],root[i-1],0,lim,a[i]);
    while(m--){
        int b,x,l,r; rd(b),rd(x),rd(l),rd(r);
        writeln(solve(b,x,l,r));
    } return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...