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(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的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- ruby : Exception Notification
https://github.com/smartinez87/exception_notification#sections Add the following line to your applic ...
- Stanford机器学习---第六讲. 怎样选择机器学习方法、系统
原文:http://blog.csdn.net/abcjennifer/article/details/7797502 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- Linux Apache和Nginx的比较
1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx ...
- PHP中通过加号合并数组
通常,我们合并多个数组用的是array_merge()函数,其实,PHP手册中关于数组操作符的介绍给了我们更简单的方法,那就是"+"号,看看下面的例子就明白了(详细了解) 代码: ...
- mysql将int 时间类型格式化
摘要 DATE_FORMAT(date,format) 根据format字符串安排date值的格式. DATE_FORMAT(date,format) 根据format字符串安排date值的格式. ...
- 一个很不错的适合PHPER们书单,推荐给大家【转】
来我博客的访客们中,有一些是PHP的初学者,是不是很迷茫PHP应该怎么学?应该买什么样的书?到处问人,到处求助?这下好了. 正好看到黑夜路人在博客上推荐了一个书单,看上去都非常不错,很多我也没有读过, ...
- Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point t ...
- 42.旋转数组的最小元素[Get min value of rotated array]
[题目] 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5 ...
- 25.在从1到n的正数中1出现的次数[NumberOf1Between1_N]
[题目] 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. [分析] 这是一道广为流传的goo ...
- Java for LeetCode 023 Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解 ...