P4215求助!!

P4215 踩气球

原来忘update了; 但把update(1,x)加上也不行;
by xuanyuan_Niubi @ 2021-02-03 21:50:03


又发现一个问题,build应该是build(l,mid,k<<1) 但是改了还是不行
by xuanyuan_Niubi @ 2021-02-04 15:26:10


又发现一个问题,query递归的时候l,r不变 但是交一发还是0分, 虽然会TLE但是为什么不会A几个点呢。
by xuanyuan_Niubi @ 2021-02-04 15:44:14


最后是这个样子。 算了A不了就算了,至少样例过了。 ```cpp #include<cstdio> using namespace std; const int M=1000005; struct tree{ int l,r,v; }t[M<<2]; struct question{ int l,r; }qu[M]; int n,m,q,last,a[M]; bool vis[M]; inline int read(){ char c=getchar();int x=0; for(;c<'0'||c>'9';c=getchar()); for(;c<='9'&&c>='0';c=getchar())x=(x<<1)+(x<<3)+(c^48); return x; } inline void push_up(int k){ t[k].v=t[k<<1].v+t[k<<1|1].v; } inline void build(int l,int r,int k){ t[k].l=l; t[k].r=r; if(l==r){ t[k].v=a[l]; return ; } int mid=l+r>>1; build(l,mid,k<<1); build(mid+1,r,k<<1|1); push_up(k); } inline void update(int k,int x){ if(t[k].r<x||t[k].l>x)return ; if(t[k].l==t[k].r){ if(t[k].l==x&&t[k].v>0){ t[k].v--; } return ; } int mid=t[k].l+t[k].r>>1; if(x<=mid)update(k<<1,x); else update(k<<1|1,x); push_up(k); } inline void print(int k){ printf("(%d %d %d)\n",t[k].l,t[k].r,t[k].v); if(t[k].l==t[k].r)return ; print(k<<1); print(k<<1|1); } inline bool query(int l,int r,int k){ // printf("(%d %d %d(%d %d))\n",l,r,k,t[k].l,t[k].r); if(l<=t[k].l&&t[k].r<=r){ return t[k].v; } int mid=t[k].l+t[k].r>>1; bool fl=false; if(l<=mid)fl=query(l,r,k<<1); if(r>mid)fl=query(l,r,k<<1|1); return fl; } int main(){ n=read();m=read(); for(int i=1;i<=n;i++){ a[i]=read(); } build(1,n,1); for(int i=1;i<=m;i++){ qu[i].l=read(); qu[i].r=read(); } q=read(); for(int i=1;i<=q;i++){ int x=read(),ans=0; x=(x+last-1)%n+1; update(1,x); // print(1); for(int j=1;j<=m;j++){ if(!vis[j]){ if(!query(qu[j].l,qu[j].r,1)){ ans++; vis[j]=true; } // printf("---------------------\n"); } else{ ans++; } } last=ans; printf("%d\n",ans); } return 0; } ```
by xuanyuan_Niubi @ 2021-02-04 15:45:21


|