BZOJ2773 : ispiti
首先询问i相当于询问a[j]>=a[i],b[j]>=b[i]的j
如果b[j]==b[i],那么a[j]>a[i],这种情况先用set处理掉
如果b[j]>b[i],那么a[j]>=a[i],离散化后CDQ分治,用树状数组记录前缀最大值即可
时间复杂度O(nlog2n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include<cstdio> #include<set> #include<algorithm> #define N 200010 using namespace std; typedef pair< int , int > PI; int n,q,cnt,i,j,x,y,t1,t2,bit[N],pos[N],T,ans[N],L[N]; char op; set<PI>Set[N]; set<PI>::iterator it; struct P{ int x,y,id;P(){}P( int _x, int _y, int _id){x=_x,y=_y,id=_id;}}a[N],b[N],c[N],stu[N]; inline void read( int &a){ char c; while (!(((c= getchar ())>= '0' )&&(c<= '9' )));a=c- '0' ; while (((c= getchar ())>= '0' )&&(c<= '9' ))(a*=10)+=c- '0' ;} inline int lower( int x){ int l=1,r=cnt,t,mid; while (l<=r) if (L[mid=(l+r)>>1]<=x)l=(t=mid)+1; else r=mid-1; return t; } inline bool cmp(P a,P b){ return a.x>b.x;} inline int merge( int x, int y){ if (!x) return y; if (!y) return x; if (stu[x].y==stu[y].y) return stu[x].x<stu[y].x?x:y; return stu[x].y<stu[y].y?x:y; } inline void add( int x, int y){ for (;x<=n;x+=x&-x) if (pos[x]<T)pos[x]=T,bit[x]=y; else bit[x]=merge(bit[x],y);} inline int ask( int x){ int t=0; for (;x;x-=x&-x) if (pos[x]==T)t=merge(t,bit[x]); return t;} void solve( int l, int r){ if (l==r) return ; int mid=(l+r)>>1; solve(l,mid),solve(mid+1,r); for (t1=0,i=l;i<=mid;i++) if (a[i].id<0)b[t1++]=a[i]; for (t2=0,i=r;i>mid;i--) if (a[i].id>0)c[t2++]=a[i]; if (!t2) return ; sort(b,b+t1,cmp),sort(c,c+t2,cmp); for (T++,i=j=0;i<t2;i++){ while (j<t1&&b[j].x>=c[i].x)add(b[j].y,-b[j].id),j++; ans[c[i].id]=merge(ans[c[i].id],ask(c[i].y-1)); } } int main(){ read(n); for (i=1;i<=n;i++){ while (!(((op= getchar ())== 'D' )||(op== 'P' ))); read(x); if (op== 'D' )read(y),L[++cnt]=y,stu[cnt]=a[i]=P(x,y,-cnt); else a[i]=stu[x],a[i].id=++q; } sort(L+1,L+cnt+1); for (i=1;i<=n;i++){ a[i].y=cnt-lower(a[i].y)+1; if (a[i].id<0)Set[a[i].y].insert(PI(a[i].x,-a[i].id)); else { it=Set[a[i].y].lower_bound(PI(a[i].x+1,0)); if (it!=Set[a[i].y].end())ans[a[i].id]=it->second; } } solve(1,n); for (i=1;i<=q;i++) if (!ans[i]) puts ( "NE" ); else printf ( "%d\n" ,ans[i]); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术