「ZJOI2019」浙江省选
在八月来临前补完了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」浙江省选的更多相关文章
- Loj #3044. 「ZJOI2019」Minimax 搜索
Loj #3044. 「ZJOI2019」Minimax 搜索 题目描述 九条可怜是一个喜欢玩游戏的女孩子.为了增强自己的游戏水平,她想要用理论的武器武装自己.这道题和著名的 Minimax 搜索有关 ...
- 【LOJ】#3044. 「ZJOI2019」Minimax 搜索
LOJ#3044. 「ZJOI2019」Minimax 搜索 一个菜鸡的50pts暴力 设\(dp[u][j]\)表示\(u\)用\(j\)次操作能使得\(u\)的大小改变的方案数 设每个点的初始答案 ...
- 「ZJOI2019」&「十二省联考 2019」题解索引
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
- LOJ3044. 「ZJOI2019」Minimax 搜索
LOJ3044. 「ZJOI2019」Minimax 搜索 https://loj.ac/problem/3044 分析: 假设\(w(1)=W\),那么使得这个值变化只会有两三种可能,比\(W\)小 ...
- Loj #3045. 「ZJOI2019」开关
Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...
- Loj #3042. 「ZJOI2019」麻将
Loj #3042. 「ZJOI2019」麻将 题目描述 九条可怜是一个热爱打麻将的女孩子.因此她出了一道和麻将相关的题目,希望这题不会让你对麻将的热爱消失殆尽. 今天,可怜想要打麻将,但是她的朋友们 ...
- 【LOJ】#3046. 「ZJOI2019」语言
LOJ#3046. 「ZJOI2019」语言 先orz zsy吧 有一个\(n\log^3n\)的做法是把树链剖分后,形成logn个区间,这些区间两两搭配可以获得一个矩形,求矩形面积并 然后就是对于一 ...
- 【LOJ】#3042. 「ZJOI2019」麻将
LOJ#3042. 「ZJOI2019」麻将 如何判定一个集合牌有没有胡的子集是不是胡的 就用一个\(dp[j][k][0/1]\)表示有j个连续两个的串,有k个连续1个串,有没有对子,再记一下这个集 ...
- 【LOJ】#3043. 「ZJOI2019」线段树
LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...
随机推荐
- Paper | Deep Mutual Learning
目录 1. 动机详述和方法简介 2. 相关工作 3. 方法 3.1 Formulation 3.2 实现 3.3 弱监督学习 4. 实验 4.1 基本实验 4.2 深入实验 [算法和公式很simple ...
- Python与用户交互
目录 一.为什么交互? 二.如何交互? 三.Python2的交互 一.为什么交互? 让我们来回顾计算机的发明有何意义,计算机的发明是为了奴役计算机,解放劳动力.假设我们现在写了一个ATM系统取代了 ...
- PHP 7.4.0 发布
近日,PHP 7.4.0 发布了,此版本标志着 PHP 7 系列的第四次特性更新. PHP 7.4.0 进行了许多改进,并带来了一些新特性,包括: Typed Properties 类型属性 类属性 ...
- tensorflow2.0安装
版本: python3.5 Anaconda 4.2.0 tensorflow2.0 cpu版本 1.安装命令 pip3 install tensorflow==2.0.0.0a0 -i https: ...
- windows 安装使用jupyter及 基础配置
jupyter 是什么Jupyter Notebooks 是一个交互式笔记本,支持运行 40 多种编程语言,它的本质是一个 开源的 Web 应用程序,我们可以将其用于创建和共享代码与文档,他可以支持实 ...
- C#上手练习5(GOTO语句)
C# goto 语句用于直接在一个程序中转到程序中的标签指定的位置,标签实际上由标识符加上冒号构成 语法形式如下. goto Labell; 语句块 1;Labell 语句块 2; 如果要 ...
- python验证码识别(2)极验滑动验证码识别
目录 一:极验滑动验证码简介 二:极验滑动验证码识别思路 三:极验验证码识别 一:极验滑动验证码简介 近些年来出现了一些新型验证码,不想旧的验证码对人类不友好,但是这种验证码对于代码来说识别难度上 ...
- 如何访问到静态的文件,如jpg,js,css.
如果你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题. 如果你的DispatcherServlet拦截"/&qu ...
- PHP面试题2019年新浪工程师面试题及答案解析
一.单选题(共28题,每题5分) 1.以下语句输出的结果是什么? A.3$a\$a3336 B.33\$a3336 C.$a$a\$a3336 D.3$a\$a333$a$a 参考答案:A 答案解析: ...
- Oracle 中Number的长度定义
Number可以通过如下格式来指定:Field_NAME Number(precision ,scale),其中precision指Number可以存储的最大数字长度(不包括左右两边的0),scale ...