社区讨论
求助玄学MLE
P3293[SCOI2016] 美味参与者 5已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo8puggs
- 此快照首次捕获于
- 2023/10/27 22:36 2 年前
- 此快照最后确认于
- 2023/10/27 22:36 2 年前
在规定主席树上最大值域的时候,题目给出的是 ,所以我开了
然后这样就MLE 20 pts。。。
把
所以这是为什么啊?
lim=100000 ,并且由于 约为 ,所以我从二进制位的第 位往下扫。然后这样就MLE 20 pts。。。
把
lim=200000 然后从 位向下扫就过了。。。所以这是为什么啊?
马蜂比较诡异(? :
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 条回复,欢迎继续交流。
正在加载回复...