BZOJ1769 : [Ceoi2009]tri
将所有点极角排序,建立线段树,线段树每个节点维护该区间内所有点组成的上下凸壳。
对于一个查询,二分查找出相应区间的左右端点,在线段树上得到$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的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Tri Tiling[HDU1143]
Tri Tiling Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- TRI 解题报告
题目大意: 在一个平面上有N(N <= 1000)个点,其中任意三点不共线,求这些点组成的三角形的面积和每和三角形内部含的点数的个数和. 数据范围: 20%的数据 N <= 50, 30% ...
- bzoj1767[Ceoi2009]harbingers 斜率优化dp
1767: [Ceoi2009]harbingers Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 421 Solved: 112[Submit][S ...
- Tri Tiling(hdu1143)
Tri Tiling Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU2072 tri树/map/set/字符串hash
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题 水题 就是用来试试字符串算法的 tri树 ...
- POJ 2663 Tri Tiling
Tri Tiling Time Li ...
- uva 10918 - Tri Tiling(规律)
题目链接:uva 10918 - Tri Tiling 题目大意:给出n,计算用1*2的瓷砖有多少种方法铺满3*n的地方. 解题思路:和uva 10359 - Tiling有点相似,不过难度会比较大, ...
- memory prefix twi,tri,trans ,tetra out 4
1● twi 二 2● tri 三 3● trans 超过,超载 4● tetra 立体
随机推荐
- 使用 systemd timer 备份数据库
导读 主要的Linux发行版都改用systemd 来替代 System V启动方式,其中 systemd timer 能替代 crontab 计划任务的大部分功能.本文介绍了用systemd time ...
- 快速诊断Linux性能
导读 当你为了解决一个性能问题登录到一台 Linux 服务器:在第一分钟你应该检查些什么? 通过运行下面十个命令,你就能在六十秒内粗略地了解系统正在运行的进程及资源使用情况.通过查看这些命令输出的错误 ...
- iOS团队开发者测试
那么你需要在你下载证书的那个电脑上从钥匙串-->选择证书-->右键到处证书,保存为.p12的证书,以后这个证书拷贝到任何电脑上去都是可以使用的! 本来只有一台电脑可以测试, 现在要团队开发 ...
- Git SSH Key 生成步骤
it是分布式的代码管理工具,远程的代码管理是基于ssh的,所以要使用远程的git则需要ssh的配置. github的ssh配置如下: 一 . 设置git的user name和email: $ git ...
- 2.7 编程之美--最大公约数的3种解法[efficient method to solve gcd problem]
[本文链接] http://www.cnblogs.com/hellogiser/p/efficient-method-to-solve-gcd-problem.html [题目] 求两个正整数的最大 ...
- iOS 和 Android 中的后台运行问题
后台机制的不同,算是iOS 和 Android的一大区别了,最近发布的iOS7又对后台处理做了一定的更改,找时间总结一下编码上的区别,先做个记录. 先看看iOS的把,首先需要仔细阅读一下Apple的官 ...
- codeforces B. Fixed Points 解题报告
题目链接:http://codeforces.com/problemset/problem/347/B 题目意思:给出一个包含n个数的排列a,在排列a中最多只能作一次交换,使得ai = i 这样的匹配 ...
- Codeforces 390A( 模拟题)
Inna and Alarm Clock Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64 ...
- stm32——Flash读写
stm32——Flash读写 一.Flash简介 通过对stm32内部的flash的读写可以实现对stm32的编程操作. stm32的内置可编程Flash在许多场合具有十分重要的意义.如其支持ICP( ...
- php 的函数参数值类型限定
如例: function test(array $a,test $b){ /*...*/ } class test{ /*...*/ } test(array(),new test); 表示test函 ...