在八月来临前补完了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. C#位运算实际作用之操作整型某一位

    1.前言 前几天写了两篇关于c#位运算的文章 c#位运算基本概念与计算过程 C#位运算实际运用 在文中也提到了位运算的实际作用之一就是合并整型,当时引用了一个问题: C# 用两个short,一个int ...

  2. 【STM32H7教程】第26章 STM32H7的TCM,SRAM等五块内存的超方便使用方式

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980  第26章       STM32H7的TCM,SRAM等五块 ...

  3. spring cloud 2.x版本 Gateway路由网关教程

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...

  4. 【shell脚本】nginx启动脚本

    [root@localhost init.d]# cat nginx #!/bin/bash #nx Startup script for the Nginx HTTP Server # it ver ...

  5. Java Arrays类方法

    1:概述 主要谈一谈 Java使用fork/koin类 实现的并发排序 以及对于Stream流的支持的splitetor mismatch()   ->  寻找两个数组 第一次出现数据不一致的下 ...

  6. vue 渐变 进度条 progress

    废话 不多少说 ,直接上代码 新建文件 gradual-progress.vue <!-- * @Author: gfc * @Date: 2019-11-07 14:00:11 * @Last ...

  7. 动软生成Model(dapper.common)

    <#@ template language="c#" HostSpecific="True" #><#@ output extension= ...

  8. python基础(10):文件操作

    1. 初识文件操作 使⽤python来读写⽂件是非常简单的操作.我们使⽤open()函数来打开⼀个⽂件,获取到⽂ 件句柄,然后通过⽂件句柄就可以进⾏各种各样的操作了,根据打开⽅式的不同能够执⾏的操 作 ...

  9. LooseVersion()使用及.__version__版本号的获取

    我简单看了distutils库,但发现目前还用不到,感觉有些复杂.因此我简单复制了别人的介绍,如下: Distutils可以用来在Python环境中构建和安装额外的模块.新的模块可以是纯Python的 ...

  10. flex布局开发

    flex布局开发 布局原理 flex时flexible Box的缩写,意为"弹性布局",用来为盒子模型提供最大的灵活性,任何一个容器都可以定位flex布局 [注意] 当我们为父盒子 ...