在八月来临前补完了zjoi2019

本来是想在八月前做完暑假作业的?

传送门

Description

给\(n\)条斜率为正的直线,询问每条直线是否在某处高度为前\(m\)名,如果是,询问最小排名

Solution 

依次求可以为第\(i\)名的直线

对确定不能为前\(i-1\)名的直线,求一次第一象限内的半平面交,要求每个线段都能覆盖至少一个整数

对可以为前\(i-1\)名的直线二分求出覆盖的区间

通过扫描得到凸壳上可以为第\(i\)名的线段

点的横坐标可能很大,维护一个分数类,支持floor()ceil()

复杂度\(O(mn\log n)\)

Code 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define reg register
#define P(x) a[p[x]]
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=1e5+5;
const ll inf=1e18;
int n,m,ans[MN];
struct line{
ll b;int k,id;
void Read(int i){k=read();b=read();id=i;}
bool operator<(const line&o)const{return k<o.k||(k==o.k&&b>o.b);}
}a[MN];int top,p[MN];
struct Frac{
ll a,b,c;//c+(a/b)
Frac(ll x,ll y){if(y<0)x=-x,y=-y;c=x/y,b=y,a=x%y;if(a<0)--c,a+=b;}
bool operator <(const Frac&o)const{return c^o.c?c<o.c:a*o.b<b*o.a;}
bool operator ==(const Frac&o)const{return c==o.c&&a*o.b==b*o.a;}
bool operator <=(const Frac&o)const{return *this<o||*this==o;}
ll floor(){return c;}
ll ceil(){return c+(a>0);}
};
Frac _(line x,line y){return Frac(y.b-x.b,x.k-y.k);} void Calc()
{
top=0;reg int i;
for(i=1;i<=n;++i)if(!~ans[a[i].id])
{
if(top&&P(top).k==a[i].k) continue;
while(top>1&&_(a[i],P(top)).floor()<_(P(top),P(top-1)).ceil()) --top;
if(top==1&&a[i].b>P(1).b) --top;
p[++top]=i;
}
a[0].b=P(1).b;
}
pair<ll,int> key[MN<<1];int ktp;
void call(int i)
{
int l=1,r=top,mid,pos=0;
for(;l<=r;)
{
mid=(l+r)>>1;
if(P(mid).k>=a[i].k||mid==top?1:_(P(mid),a[i])<=_(P(mid),P(mid+1))) pos=mid,r=mid-1;
else l=mid+1;
}
key[++ktp]=make_pair(P(pos).k>=a[i].k?0:_(P(pos),a[i]).floor()+1,1);
}
void calr(int i)
{
if(a[i].k>P(top).k) return;
int l=1,r=top,mid,pos=0;
for(;l<=r;)
{
mid=(l+r)>>1;
if(P(mid).k<=a[i].k||_(P(mid-1),P(mid))<=_(P(mid),a[i])) pos=mid,l=mid+1;
else r=mid-1;
}
if(P(pos).k>a[i].k)key[++ktp]=make_pair(_(P(pos),a[i]).ceil(),-1);
}
void GetKey()
{
reg int i;
for(ktp=0,i=1;i<=n;++i)if(~ans[a[i].id]){call(i);calr(i);}
std::sort(key+1,key+ktp+1);
}
int main()
{
n=read(),m=read();
reg int i,j,k,o;
for(i=1;i<=n;++i) a[i].Read(i),ans[i]=-1;
std::sort(a+1,a+n+1);
for(o=1;o<=m;++o)
{
Calc();GetKey();
for(i=j=1,k=0;i<=top;++i)
{
ll l=_(P(i),P(i-1)).ceil(),r=i==top?inf:_(P(i),P(i+1)).floor();
while(j<=ktp&&key[j].first<=l)k+=key[j++].second;
if(k==o-1) ans[P(i).id]=o;
while(j<=ktp&&key[j].first<=r)
{
reg int jj=j;
while(jj<=ktp&&key[jj].first==key[j].first) k+=key[jj++].second;
if(k==o-1) ans[P(i).id]=o;
j=jj;
}
}
}
for(i=1;i<=n;++i) printf("%d ",ans[i]);
return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

「ZJOI2019」浙江省选的更多相关文章

  1. Loj #3044. 「ZJOI2019」Minimax 搜索

    Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关 ...

  2. 【LOJ】#3044. 「ZJOI2019」Minimax 搜索

    LOJ#3044. 「ZJOI2019」Minimax 搜索 一个菜鸡的50pts暴力 设\(dp[u][j]\)表示\(u\)用\(j\)次操作能使得\(u\)的大小改变的方案数 设每个点的初始答案 ...

  3. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  4. LOJ3044. 「ZJOI2019」Minimax 搜索

    LOJ3044. 「ZJOI2019」Minimax 搜索 https://loj.ac/problem/3044 分析: 假设\(w(1)=W\),那么使得这个值变化只会有两三种可能,比\(W\)小 ...

  5. Loj #3045. 「ZJOI2019」开关

    Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...

  6. Loj #3042. 「ZJOI2019」麻将

    Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...

  7. 【LOJ】#3046. 「ZJOI2019」语言

    LOJ#3046. 「ZJOI2019」语言 先orz zsy吧 有一个\(n\log^3n\)的做法是把树链剖分后,形成logn个区间,这些区间两两搭配可以获得一个矩形,求矩形面积并 然后就是对于一 ...

  8. 【LOJ】#3042. 「ZJOI2019」麻将

    LOJ#3042. 「ZJOI2019」麻将 如何判定一个集合牌有没有胡的子集是不是胡的 就用一个\(dp[j][k][0/1]\)表示有j个连续两个的串,有k个连续1个串,有没有对子,再记一下这个集 ...

  9. 【LOJ】#3043. 「ZJOI2019」线段树

    LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...

随机推荐

  1. IT兄弟连 HTML5教程 HTML5的曲折发展过程 HTML5的诞生

    十年磨一剑,正如我们所看到的一样,HTML5大潮正来势汹汹.但也正如我们所知道的一样,HTML5是一种技术标准,它的语义之美.人性之美.简单之美.实用之美……如同一场革命,它的主要应用场景是浏览器,不 ...

  2. 【shell脚本】自动磁盘分区,格式化,挂载===autoMount.sh

    #!/bin/bash # 自动对磁盘分区.格式化.挂载 # 对虚拟机的 vdb 磁盘进行分区格式化,使用<<将需要的分区指令导入给程序 fdisk # n(新建分区),p(创建主分区), ...

  3. 拎壶学python3-----(1)输出与字符转换

    一.输入自己的名字打印 二.数字和字符串是不能相加的如下 怎么解决上边的问题呢? 如果是相加我们要把字符串转成数字类型如下 如果不想让他相加可以写成这样如下: ok,关于转换就先讲到这里

  4. Mysql 5.7:更改密码时出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'

    1.环境 在新服务器上重新安装了环境,原来是5.6的,就升级到了5.7版本. 2.问题 新安装的MySQL5.7,登录时提示密码错误,安装的时候并没有更改密码,后来通过免密码登录的方式更改密码. 输入 ...

  5. PHP TP框架自定义打印函数P

    效果如下,有个灰色背景,也不一定是灰色可以改 代码: //传递数据以易于阅读的样式格式化后输出function p($data){ // 定义样式 $str='<pre style=" ...

  6. 从零开始学 ASP.NET Core 与 EntityFramework Core 目录

    从零开始学 ASP.NET Core 与 EntityFramework Core 介绍 我是一个目录,它旨在帮助开发者循序渐进的了解 ASP.NET Core 和 Entity Framework ...

  7. Python爬虫实践~BeautifulSoup+urllib+Flask实现静态网页的爬取

    爬取的网站类型: 论坛类网站类型 涉及主要的第三方模块: BeautifulSoup:解析.遍历页面 urllib:处理URL请求 Flask:简易的WEB框架 介绍: 本次主要使用urllib获取网 ...

  8. RadioButtonList

    RadioButtonList <asp:Label ID="txt_Gender" runat="server" Text="性别" ...

  9. oracle学习笔记(十二) 查询练习(二) 高级查询

    高级查询练习 /*--------------------------------------------- 分组查询 -------------------------------------*/ ...

  10. PlayJava Day007

    今日所学: /* 2019.08.19开始学习,此为补档. */ 1.String类 实例化:①String name1 = "张三" ; ②String name2 = new ...