首先询问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(n\log^2n)$

#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;
}

  

BZOJ2773 : ispiti的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. 他们在军训,我在搞 OI(一)

    Day 1 理论上,我现在不应该坐在电脑前打字,因为早在今天上午 6:20 全体新高一同学就坐车前往军(无)训(尽)基(炼)地(狱)了,而今天上午 6:20 我还在被窝里呢…… 没错,我旷掉了军训,然 ...

  2. notepad正则表达式

    文件名称匹配 文件名称: boost_chrono-vc100-mt-1_49.dll 对应的notepad正则表达式: \w*_\w*-\w*-\w*-\w*-\w*.dll 移除空行 查找目标: ...

  3. Linux rpm安装问题解决

    1.安装时提示:warning: *.rpm: Header V3 RSA/SHA256 Signature, keykey ID c105b9de: NOKEY 解决的方法就是在rpm 语句后面加上 ...

  4. HDOJ 2066 floyed优化算法

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. i686和x86_64的区别

    找回TCL隐藏分区(转载) 用Wubi安装 Ubuntu 出现(Initranfs)问题的解决方案 i686和x86_64的区别 2009-04-11 08:19:31|  分类: 电脑问题 |  标 ...

  6. Ubuntu 更改文件夹权限及chmod详细用法

    转自: http://blog.chinaunix.net/uid-21880738-id-1813031.html 对Document/目录下的所有子文件与子目录执行相同的权限变更: Documen ...

  7. IOC原理解释

    spring ioc它其实是一种降低对象耦合关系的设计思想,通常来说,我们在一个类调用另一个类的方法的时候,需要不断的new新的对象来调用该方法,类与类之间耦合度比较高,有了ioc容器以后,ico容器 ...

  8. 推荐一篇java抽象类和接口区别的文章

    写的不错,http://dev.yesky.com/436/7581936.shtml

  9. iOS 中使用类别简化代码开发

    最近需要一个函数,把CLLocation对象转化为NSDictionary,按照我以前的想法,我会写一个工具类,之后添加一个函数,类似这样 - (NSDictionary *)turnLocation ...

  10. Js数组里删除指定的元素(不是指定的位置)

    转载自:http://my.oschina.net/zh119893/blog/265964 之前一直是做后端的,从来也没有写过js,但是却一直想学学,也只是基于兴趣而已!现在到了这个公司,确实大量的 ...