将所有点极角排序,建立线段树,线段树每个节点维护该区间内所有点组成的上下凸壳。

对于一个查询,二分查找出相应区间的左右端点,在线段树上得到$O(\log n)$个节点,在相应凸壳上三分查找出与斜边叉积最大的那个点,看看是否为正即可。

时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010,E=2000000;
int n,m,i,c,d,ans[N],g[262150],v[E],nxt[E],ed,cnt,t0,t1;
struct P{
int x,y;
P(){}
P(int _x,int _y){x=_x,y=_y;}
P operator-(P b){return P(x-b.x,y-b.y);}
ll operator*(P b){return 1LL*x*b.y-1LL*y*b.x;}
}a[N],A,B,C,qA[N],qC[N],b[N],q0[N],q1[N];
inline bool cmp(P a,P b){return a*b>0;}
inline bool cmp0(P a,P b){return a.x==b.x?a.y>b.y:a.x<b.x;}
inline bool cmp1(P a,P b){return a.x==b.x?a.y<b.y:a.x<b.x;}
inline int getl(P x){
int l=1,r=n,mid,t=n+1;
while(l<=r)if(x*a[mid=(l+r)>>1]>0)r=(t=mid)-1;else l=mid+1;
return t;
}
inline int getr(P x){
int l=1,r=n,mid,t=0;
while(l<=r)if(x*a[mid=(l+r)>>1]<0)l=(t=mid)+1;else r=mid-1;
return t;
}
void add(int x,int a,int b){
if(c<=a&&b<=d){v[++ed]=i;nxt[ed]=g[x];g[x]=ed;return;}
int mid=(a+b)>>1;
if(c<=mid)add(x<<1,a,mid);
if(d>mid)add(x<<1|1,mid+1,b);
}
inline bool query(int x,P*q,int r){
A=qA[x],C=qC[x];
for(int l=0;l<=r;){
int len=(r-l)/3,m0=l+len,m1=r-len;
ll s0=C*(q[m0]-A),s1=C*(q[m1]-A);
if(s0>0||s1>0)return 1;
if(s0>s1)r=m1-1;else l=m0+1;
}
return 0;
}
void dfs(int x,int l,int r){
if(g[x]){
int i;
for(cnt=0,i=l;i<=r;i++)b[cnt++]=a[i];
for(sort(b,b+cnt,cmp0),q0[t0=0]=b[0],i=1;i<cnt;i++)if(b[i].x!=b[i-1].x){
while(t0&&1LL*(q0[t0].y-q0[t0-1].y)*(b[i].x-q0[t0].x)<=1LL*(b[i].y-q0[t0].y)*(q0[t0].x-q0[t0-1].x))t0--;
q0[++t0]=b[i];
}
for(sort(b,b+cnt,cmp1),q1[t1=0]=b[0],i=1;i<cnt;i++)if(b[i].x!=b[i-1].x){
while(t1&&1LL*(q1[t1].y-q1[t1-1].y)*(b[i].x-q1[t1].x)>=1LL*(b[i].y-q1[t1].y)*(q1[t1].x-q1[t1-1].x))t1--;
q1[++t1]=b[i];
}
for(i=g[x];i;i=nxt[i]){
int j=v[i];
if(ans[j])continue;
if(query(j,q0,t0)){ans[j]=1;continue;}
if(query(j,q1,t1))ans[j]=1;
}
}
if(l==r)return;
int mid=(l+r)>>1;
dfs(x<<1,l,mid),dfs(x<<1|1,mid+1,r);
}
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';}
int main(){
read(n),read(m);
for(i=1;i<=n;i++)read(a[i].x),read(a[i].y);
sort(a+1,a+n+1,cmp);
for(i=1;i<=m;i++){
read(A.x),read(A.y),read(B.x),read(B.y);
if(A*B<0)swap(A,B);
qA[i]=A,qC[i]=B-A;
c=getl(A),d=getr(B);
if(c<=d)add(1,1,n);
}
dfs(1,1,n);
for(i=1;i<=m;i++)puts(ans[i]?"Y":"N");
return 0;
}

  

BZOJ1769 : [Ceoi2009]tri的更多相关文章

  1. bzoj AC倒序

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

  2. Tri Tiling[HDU1143]

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. TRI 解题报告

    题目大意: 在一个平面上有N(N <= 1000)个点,其中任意三点不共线,求这些点组成的三角形的面积和每和三角形内部含的点数的个数和. 数据范围: 20%的数据 N <= 50, 30% ...

  4. bzoj1767[Ceoi2009]harbingers 斜率优化dp

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 112[Submit][S ...

  5. Tri Tiling(hdu1143)

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. HDU2072 tri树/map/set/字符串hash

    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题 水题 就是用来试试字符串算法的 tri树 ...

  7. POJ 2663 Tri Tiling

                                                                                    Tri Tiling   Time Li ...

  8. uva 10918 - Tri Tiling(规律)

    题目链接:uva 10918 - Tri Tiling 题目大意:给出n,计算用1*2的瓷砖有多少种方法铺满3*n的地方. 解题思路:和uva 10359 - Tiling有点相似,不过难度会比较大, ...

  9. memory prefix twi,tri,trans ,tetra out 4

    1● twi 二   2● tri 三   3● trans 超过,超载   4● tetra 立体  

随机推荐

  1. Centos下samba共享打印机

    先说需求,公司有一台型号为HP LaserJet m1120 mfp的打印机,由于不是网络打印机使用起来十分不便,公司老大要求将这台打印机连在公司的内网linux服务器上(CentOS),然后配置sa ...

  2. linux /etc/rc.d/目录的详解

    rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录. rcx.d/: 各个启动级别的执行程序连接目录.里头的东西都是指向init.d/的一些软连接.具体的后边叙述. 还有三个 ...

  3. android.os.BadParcelableException: ClassNotFoundException when unmarshalling:解决办法

    例如在用AlarmManager的时候 AlarmManager alarmMgr = (AlarmManager) mContext .getSystemService(Context.ALARM_ ...

  4. 《转》常用Petri网模拟软件工具简介

    本文转载自liusj2003,如给您带来不便之处,请联系博主. 首先要介绍的的一个非常有名的Petri 网网站--Petri Nets World: http://www.informatik.uni ...

  5. codeforces 472C.Make It Nondeterministic 解题报告

    题目链接:http://codeforces.com/problemset/problem/472/C 题目意思:给出 n 个 people(从第1行往下数,编号依次为1,2,...,n),每 个 p ...

  6. 学习cocos-js的准备工作

    我学习 cocos2d-js 的方向: 学习 cocos2d-js 的 HTML5 版本:即 canvas 渲染. 下载cocos-js 文件 地址: http://www.cocos2d-x.org ...

  7. google maps js v3 api教程(3) -- 创建infowindow

    原文地址 前面我们学习了地图和标记的创建.那么今天我们来学习怎样在地图上显示一个窗口(infowindow) infowindow构造函数为:InfoWindow(opts?:InfoWindowOp ...

  8. 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?

    static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...

  9. linux_command_撷叏命令: cut, grep

    [root@www ~]# cut -d'分隑字符' -f fields <==用亍有特定分隑字符[root@www ~]# cut -c 字符区间<==用亍排列整齐癿讯息选项不参数:-d ...

  10. 查看nginx版本号

    # ./nginx -v Tengine version: Tengine/ (nginx/)