Description

大选要到了,受候选人X的要求,你调查了n个人,并记录了每个人的3个信息:
ai--他们能记忆π的多少位
bi--他们的头发数量
ci--他们是否会给候选人X投票
你需要找到某个公式使这些结果看起来有意义。你要选择2个实数S和T,将所有调查结果按ai*S+bi*T排序。如果ci
为true的人聚集在了一起,你会觉得这个排序看起来不错。更准确地说,如果j和k分别是第一个和最后一个ci为tr
ue的人的下标,你想要最小化k-j+1。注意有些S和T会让排序时出现相等的情况,这时你应该假设最坏情况发生,
即排序使得k-j+1最大。

Input

第一行一个数n(1 ≤ n ≤ 250000)为被调查的人数。
接下来每行描述一个人的ai(0 ≤ ai ≤ 2000000)、bi(0 ≤ bi ≤ 2000000)、ci
ci是一个0/1变量。保证至少有一个人投了X的票(即至少有一个ci为true)

Output

对于所有可能的实数对(S,T),输出最小的k-j+1。

求出c=1的点的凸包,选出的S,T会使答案为一对包含了凸包的平行线间(含线上)的最小点数

当凸包只有一点时,若这个点不和其余c=1的点重合则答案为1,否则最坏情况下所有与凸包重合的点都被记入答案

当凸包上只有两点时,凸包为一条线段,线段上点数为所求

否则让平行线绕凸包类似旋转卡壳地扫描180度,对每个c=0的点,二分求出这个点进入和离开平行线时平行线对应的角度,得到每个点的出现区间,可以排序计算答案

#include<cstdio>
#include<algorithm>
#include<cmath>
char buf[],*ptr=buf-;
typedef long double ld;
typedef long long i64;
int _(){
int x=,f=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x*f;
}
int abs(int x){return x>?x:-x;}
struct pos{
int x,y;
int abs(){return (x>?x:-x)+(y>?y:-y);}
void fix(){if(y<||y==&&x<)x=-x,y=-y;}
}ps1[],ps2[],ps[];
bool operator<(pos a,pos b){return a.y!=b.y?a.y<b.y:a.x<b.x;}
bool operator==(pos a,pos b){return a.x==b.x&&a.y==b.y;}
pos operator+(pos a,pos b){return (pos){a.x+b.x,a.y+b.y};}
pos operator-(pos a,pos b){return (pos){a.x-b.x,a.y-b.y};}
i64 operator*(pos a,pos b){return i64(a.x)*b.y-i64(a.y)*b.x;}
i64 dot(pos a,pos b){return i64(a.x)*b.x+i64(a.y)*b.y;}
bool cmp(pos a,pos b){
i64 x=a*b;
return x?x>:a.abs()<b.abs();
}
int p1=,p2=,pp=,n,ans=;
ld as[];
const ld pi=.1415926535897932384626433832795l,_2pi=pi*;
void fix(ld&x,ld m){
while(x>=m)x-=m;
while(x<)x+=m;
}
struct ev{
pos a;
int t;
}es[];
bool operator<(ev a,ev b){
return a.a*b.a>;
}
int s0=,ep=;
int main(){
fread(buf,,sizeof(buf),stdin);
n=_();
for(int i=,x,y,c;i<n;++i){
x=_();y=_();c=_();
if(c)ps1[p1++]=(pos){x,y};
else ps2[p2++]=(pos){x,y};
}
int _p1=p1;
ans=p1;
std::sort(ps1,ps1+p1);
p1=std::unique(ps1,ps1+p1)-ps1;
std::sort(ps2,ps2+p2);
pos p0=ps1[];
for(int i=;i<p1;++i)ps1[i]=ps1[i]-p0;
std::sort(ps1+,ps1+p1,cmp);
ps[pp++]=(pos){,};
for(int i=;i<p1;++i){
while(pp>=&&(ps[pp-]-ps[pp-])*(ps1[i]-ps[pp-])>=)--pp;
ps[pp++]=ps1[i];
}
for(int i=;i<pp;++i)ps[i]=ps[i]+p0;
if(pp==){
if(_p1>)for(int i=;i<p2;++i)if(ps2[i]==ps[])++ans;
return printf("%d",ans),;
}
if(pp==){
for(int i=;i<p2;++i)if((ps2[i]-ps[])*(ps2[i]-ps[])==&&dot(ps2[i]-ps[],ps2[i]-ps[])<=)++ans;
return printf("%d",ans),;
}
ld xs=,ys=,a0;
for(int i=;i<pp;++i)xs+=ps[i].x,ys+=ps[i].y,ps[pp+i]=ps[i];
xs/=pp,ys/=pp;
ps[pp*]=ps[];
ps[pp*+]=ps[];
for(int i=;i<pp;++i)as[i]=std::atan2(ps[i].y-ys,ps[i].x-xs);
a0=as[];
for(int i=;i<pp;++i)fix(as[i]-=a0,_2pi);
for(int i=;i<p2;++i){
pos w=ps2[i];
ld a=std::atan2(w.y-ys,w.x-xs);
fix(a-=a0,_2pi);
int p=std::upper_bound(as,as+pp,a)-as;
if((ps[p-]-w)*(ps[p]-w)>=){
++ans;
continue;
}
ld b=a+pi;
fix(b,_2pi);
int p2=std::upper_bound(as,as+pp,b)-as;
int L=p,R=p2-,M;
if(L>R)R+=pp;
while(L<R){
M=L+R>>;
if((ps[M+]-w)*(ps[M]-w)>)L=M+;
else R=M;
}
pos _l=ps[L]-w;
_l.fix();
L=p2;R=p-;
if(L>R)R+=pp;
while(L<R){
M=L+R>>;
if((ps[M+]-w)*(ps[M]-w)<)L=M+;
else R=M;
}
pos _r=ps[L]-w;
_r.fix();
es[ep++]=(ev){_l,},es[ep++]=(ev){_r,-};
if(_l*_r<)++s0;
}
std::sort(es,es+ep);
int s1=s0;
for(int i=,j=;i<ep;){
for(;j<ep&&es[i].a*es[j].a==;++j);
for(;i<j;++i)s0+=es[i].t;
if(s0<s1)s1=s0;
}
printf("%d",ans+s1);
return ;
}

bzoj4617: [Wf2016]Spin Doctor的更多相关文章

  1. bzoj AC倒序

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

  2. TAE words all

    // vol 1   could do with sth   rhinoplasty   angst   the wee small hours   familial   Munich   gladi ...

  3. spin.js

    $ajax提交,菊花加载的方式和位置: $.ajax({ type: "get", url: "http://www.xxx.com/test.html", b ...

  4. ros::spin() 和 ros::spinOnce() 区别及详解

    版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5925381.html 博主提示:本文基于ROS Kinetic Kame,如有更(g ...

  5. 为大家分享一个 Ajax Loading —— spin.js

    我们在做Ajax 异步请求的时候,一般都会利用一个动态的 Gif 小图片来制作一个Ajax Loading ,以便增加用户体验. 今天在网上发现了一个 Spin.js ,该 js 脚本压缩后5k,可以 ...

  6. CF 84D Doctor(二分)

    题目链接: 传送门 Doctor time limit per test:1 second     memory limit per test:256 megabytes Description Th ...

  7. [杂谈] There is a Doctor in My Computer.

    (p.s. 附带手写翻译,有错轻喷) Admin: Hi.             (嗨) Doctor: How do you do?  What brings you to see me?     ...

  8. InnoDB Spin rounds per wait在>32位机器上可能为负

    今天发现一个系统innodb的spin rounds per wait为负,感觉很奇怪,原来是个bug: For example (output from PS but we have no patc ...

  9. InnoDB Status Output – Buffer Pool and Spin Rounds

    InnoDB has a good source of information about its status which can be requested every time you need ...

随机推荐

  1. 【nginx】利用yum源安装nginx

    先安装nginx的yum源 http://nginx.org/en/linux_packages.html#stable 找到链接,安装: rpm -ivh http://nginx.org/pack ...

  2. D:Balanced Lineup

    总时间限制: 5000ms 内存限制: 65536kB描述For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always lin ...

  3. MVC——入门+简单的小实例

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controler)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法. ...

  4. easyui表单多重验证,动态设置easyui控件

    要实现的功能:在做添加学生信息的时候,利用easyui的验证功能判断 学号是否重复和学号只能为数字 最终效果如下图: 但在做这个的过程中,遇到了一系列的问题: 扩展validatebox的验证方法,最 ...

  5. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  6. PHP批量过滤MYSQL数据库内站外链接和图片

    因发现站内很多引用站外文章的链接失效,产生大量的死链接,对于搜索引擎来说是极不友好的,很不利于网站优化,所以站内添加了站外链接过滤功能,对于新加的文章,在添加入库时就自动增加rel="nof ...

  7. Node.js 常用工具 util

    util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...

  8. 制造业如何基于BPM做供应链管理?

    公司介绍深圳市吉祥腾达科技有限公司是中国网络产业的开航者,是中国无线网络领域的首批开拓者之一.历经10年的开拓创新,已经形成了拥有自主研发的全面产品线. 为了使公司物流.资金流和信息流实现优化整合,腾 ...

  9. 数据库对象映射为java对象,不使用框架

    方法: public static <T> List<T> processResultSetToList(ResultSet rs, Class<T> clazz) ...

  10. 命令参数解析库JCommonder

    1.JCommander 是一个非常小的Java 类库,用来解析命令行参数. 2.参数类型:可以是任意类型,但我使用的只有 List,String. @Parameter(name="-s& ...