description


analysis

  • 二分一个角度,首先假设该弧度角\(\theta \in[{\pi \over 2},\pi]\),要找的直线斜率\(k\in(-∞,\tan\theta]\)

  • 要找这种直线,两个点\((x_i,y_i),(x_j,y_j)\)构成一条直线,先钦定\(x_i≤x_j\)

  • 直线斜率\({{y_j-y_i}\over{x_j-x_i}}≤\tan\theta\),转化后变成\(y_j-x_j\tan\theta≤y_i-x_i\tan\theta\)

  • 因为两边分别只和\(i,j\)有关,可以把\(y_k-x_k\tan\theta\)记做\(yy_k\),\((x_i,y_i)\)映射到\((x_i,yy_i)\)

  • 此时就是要求有多少对点\(x_i≤x_j,yy_i≥yy_j\),二维偏序,用树状数组解决

  • 这种情况少计算了斜率为正的直线条数,需要把算少的这部分加起来

  • 那么对于\(\theta\in[0,{\pi \over 2})\),计算斜率小于\(\tan\theta\)的直线条数过程是完全一样的

  • 这种情况又多计算了斜率为负的直线条数,需要把算多的这部分减掉

  • 经过一个点有多少条直线斜率为正,就是一个点右上角的点个数;斜率为负就是左上角的点个数

  • 这个可以一开始用两次树状数组求出\(\sum\)右上角点个数和\(\sum\)左上角点个数

  • 由于二分区间不同,这里左上角右上角求的范围有一点点差别,左上角必须严格高于该点,右上角则否

  • 二分的时候判断当前在直线右手边的直线条数是否大于等于比较数,是则\(r\)右移,否则\(l\)左移

  • 注意取开闭区间和计算的小细节


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define eps 1e-10
#define MAXN 100005
#define db double
#define ll long long
#define reg register ll
#define lowbit(x) ((x)&(-x))
#define pi 3.1415926535897932384626
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll tr[MAXN],sum[MAXN];
ll n,m,tot,summ1,summ2; struct node
{
ll x,y;
}a[MAXN];
struct node1
{
db x;ll y,val;
}b[MAXN];
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline bool cmp(node a,node b){return a.x<b.x || (a.x==b.x && a.y>b.y);}
inline bool cmp1(node1 a,node1 b){return a.x<b.x;}
inline bool cmp2(node1 a,node1 b){return a.y<b.y;}
inline void insert(ll x){while (x<=n)++tr[x],x+=lowbit(x);}
inline ll query(ll x){ll y=0;while (x)y+=tr[x],x-=lowbit(x);return y;}
inline ll get(ll x,ll y){return query(y)-query(x-1);}
inline db binary(db m)
{
db l=0,r=pi,mid,tann;
while (r-l>eps)
{
mid=(l+r)/2.0,tann=tan(mid);
memset(tr,0,sizeof(tr)),memset(sum,0,sizeof(sum));
fo(i,1,n)b[i].x=1.0*(a[i].y-a[i].x*tann),b[i].y=i;
sort(b+1,b+n+1,cmp1),tot=0;
fo(i,1,n)
{
b[i].val=++tot;
while (i<n && fabs(b[i].x-b[i+1].x)<eps)b[++i].val=tot;
}
sort(b+1,b+n+1,cmp2);ll total=0;
fd(i,n,1)total+=(sum[i]=get(1,b[i].val)),insert(b[i].val);
total+=(mid*2>pi?summ1:-summ2);
if (total>=m)r=mid;else l=mid;
}
return r;
}
int main()
{
//freopen("T2.in","r",stdin);
freopen("line.in","r",stdin);
freopen("line.out","w",stdout);
n=read(),m=n*(n-1)/2;
fo(i,1,n)a[i].x=read(),a[i].y=read();
sort(a+1,a+n+1,cmp);
fo(i,1,n)b[i].x=a[i].y,b[i].y=i;
sort(b+1,b+n+1,cmp1),tot=0;
fo(i,1,n)
{
b[i].val=++tot;
while (i<n && b[i].x==b[i+1].x)b[++i].val=tot;
}
sort(b+1,b+n+1,cmp2);
fd(i,n,1)summ1+=get(b[i].val,tot),insert(b[i].val);
memset(tr,0,sizeof(tr));
sort(a+1,a+n+1,cmp);
fo(i,1,n)b[i].x=a[i].y,b[i].y=i;
sort(b+1,b+n+1,cmp1),tot=0;
fo(i,1,n)
{
b[i].val=++tot;
while (i<n && b[i].x==b[i+1].x)b[++i].val=tot;
}
sort(b+1,b+n+1,cmp2);
fo(i,1,n)summ2+=get(b[i].val+1,tot),insert(b[i].val);
printf("%.13lf\n",m&1?binary((m+1)/2):(binary(m/2)+binary(m/2+1))/2);
return 0;
}

【JZOJ6388】小w的作业的更多相关文章

  1. XidianOJ 1076 小W喜欢的数字

    题目描述 大家都知道,小W是一名大帅哥,当然比起Light还是有点儿差距的!帅气的小W认为0-9这些数字,只有1,3,5是完美的. 欲问小W为什么,小W总是说"帅哥,是不需要解释的" ...

  2. 武汉科技大学ACM :1008: 小t和小w

    Problem Description 小t最近学了C语言,他想要在女朋友小w面前展示一下自己的能力,小w喜欢如样例所示的图形, 想让小t写一个程序来输出这样的图形,小t拿到后感觉有点困难,小t不想在 ...

  3. bzoj4665小w的喜糖 dp+容斥

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 72[Submit][Status][Discuss] ...

  4. bzoj4665 小w的喜糖(dp+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 130[Submit][Status][Discuss ...

  5. bzoj2441【中山市选】小W的问题

    题目描述 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个“W”出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), ( ...

  6. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  7. 【BZOJ4665】小w的喜糖 容斥+组合数

    [BZOJ4665]小w的喜糖 Description 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那 ...

  8. bzoj2441 [中山市选2011]小W的问题(debug中)

    2441: [中山市选2011]小W的问题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 487  Solved: 186[Submit][Statu ...

  9. 小w的喜糖(candy)

    小w的喜糖(candy) 题目描述 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那会有多少种方案使得每 ...

随机推荐

  1. python+tushare获取股票每日停复牌信息

    接口:suspend 更新时间:不定期 描述:获取股票每日停复牌信息 注:tushare模块下载和安装教程,请查阅我之前的文章 输入参数 名称      |      类型      |      必 ...

  2. 矢量切片应用中geoserver与geowebcache分布式部署方案

    在进行GIS项目开发中,常使用Geoserver作为开源的地图服务器,Geoserver是一个JavaEE项目,常通过Tomcat进行部署.而GeoWebCache是一个采用Java实现用于缓存WMS ...

  3. Hexo next主题添加站内搜索功能

    根据关键字搜索博文,站内搜索的功能很实用.hexo开启站内搜索很方便,已经有现成的插件可以使用,也是为了方便自己 安装插件 npm install hexo-generator-search --sa ...

  4. leetcode-第11场双周赛-5089-安排会议日程

    题目描述: 自己的提交: class Solution: def minAvailableDuration(self, slots1: List[List[int]], slots2: List[Li ...

  5. 【JZOJ6409】困难的图论

    description 给定由 n 个点 m 条边组成的无向连通图,保证没有重边和自环. 你需要找出所有边,满足这些边恰好存在于一个简单环中.一个环被称为简单环,当且仅当它包含的所有点都只在这个环中被 ...

  6. wordpress非弹窗表单多文件上传插件

    插件名:Drag and Drop Multiple File Upload - Contact Form 7 (ps:如果是弹窗表单,不要使用这个插件Drag and Drop Multiple F ...

  7. 【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)

    Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那 ...

  8. Python-爬虫之股转系统下载文件自动翻页

    上次代码只能抓取一个网页上的链接,本次可以自主设定抓取的页面个数. 代码如下: from selenium import webdriver import os, time class Downloa ...

  9. 数据结构C++版-队列

    一.概念 分类: 二.补充说明 1.<面向对象的队列设计>课程问答: 首先要明确数据结构和数据存储结构的概念. 数据结构是指数据对象之间的逻辑关系,例如二叉树,队列,栈等,而数据存储结构是 ...

  10. Area--->AreaRegistrationContext.MapRoute

    文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 Area--->AreaRegi ...