[XSY3382] 专家系统(二分+线段树)
XSY3382
二分ccc,问题变成能否用一个长ccc宽ccc的矩形框住至少kkk个点。
二维数点问题考虑用扫描线解决。将所有点按照xxx从小到大排序。
枚举一段xxx坐标相差不超过ccc的点(双指针推进),初始想法是根据这些点的yyy值建一棵权值线段树,维护yyy值在某段区间内的点的个数,然后判断能否找到一段长度为ccc的区间,包含了至少kkk个点。
但发现很难进行下去,所以换一个想法,定义aia_iai为yyy值在区间[i,i+c][i,i+c][i,i+c]内的点的个数,根据yyy值建权值线段树,维护aaa的最大值,判断max{a}max\{a\}max{a}是否大于等于kkk。
题外话:我是大傻逼,想到正解结果算错复杂度又否掉了。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
struct Point{ll x,y;friend bool operator < (Point a,Point b){return a.x<b.x;}
}p[N];
ll y[N];int tot;
int n,k;
ll l,r,ans,mid;
int tag[N<<2],mx[N<<2];
int lft[N];
void add(int u,int l,int r,int ql,int qr,int v){if(ql<=l&&r<=qr){mx[u]+=v;tag[u]+=v;return;}int mid=(l+r)>>1;if(ql<=mid) add(u<<1,l,mid,ql,qr,v);if(qr>mid) add(u<<1|1,mid+1,r,ql,qr,v);mx[u]=max(mx[u<<1],mx[u<<1|1])+tag[u];
}
bool check(ll c){memset(tag,0,sizeof(tag));memset(mx,0,sizeof(mx));for(int i=1,l=1;i<=tot;i++){while(y[i]-y[l]>c) l++;lft[i]=l;}for(int i=1,l=1,r=0;i<=n;i++){while(r<n&&p[r+1].x-p[i].x<=c){r++;add(1,1,tot,lft[p[r].y],p[r].y,1);} while(l<r&&p[l].x<p[i].x){add(1,1,tot,lft[p[l].y],p[l].y,-1);l++;} if(mx[1]>=k) return 1;if(r==n) return 0;}return 0;
}
int main(){scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%lld%lld",&p[i].x,&p[i].y);y[++tot]=p[i].y;}sort(p+1,p+n+1);sort(y+1,y+n+1);tot=unique(y+1,y+n+1)-y-1;for(int i=1;i<=n;i++){p[i].y=lower_bound(y+1,y+tot+1,p[i].y)-y;}l=0;r=4e9;while(l<=r){mid=(l+r)>>1;if(check(mid)){ans=mid;r=mid-1;}else l=mid+1;}printf("%lld\n",ans);return 0;
}
[XSY3382] 专家系统(二分+线段树)相关推荐
- 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]
题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...
- Codeforces Round #686 (Div. 3) F. Array Partition(二分+线段树)
题意:一段区间,让你分割成三段,第一段取max,第二段取min,第三段取max.问你怎么分割这个区间. 题解: 三个区间我们可以用两个点将一段区间分成三段区间. 二分:我们首先找这个题有关的单调性,我 ...
- BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)
题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...
- E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)
E. Sign on Fence 给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai≤109,有mmm次询问,每次给定l,r,kl, r, kl, ...
- Codeforces Round #686 (Div. 3) F. Array Partition 二分 + 线段树
传送门 文章目录 题意: 思路: 题意: 化简一下题意就是求满足max(1,x)=min(x+1,y)=max(y+1,n)max(1,x)=min(x+1,y)=max(y+1,n)max(1,x) ...
- [HEOI2016TJOI2016]排序(二分+线段树)
problem 洛谷链接 solution 在一个丝毫没有单调性的问题中很难想到将其转化为二分. 二分最后在第 ppp 位置上的值 xxx. 然后将所有 ≥x\ge x≥x 的赋为 111,所有 &l ...
- P5163-WD与地图【tarjan,整体二分,线段树合并】
正题 题目链接:https://www.luogu.com.cn/problem/P5163 题目大意 给出nnn个点mmm条有向边,点有权值,要求支持操作 删除一条边 修改一个点的权值 求一个点所在 ...
- 【bzoj1146】 [CTSC2008]网络管理Network【树链剖分+树套树+二分 线段树套Treap】
1146: [CTSC2008]网络管理Network Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公 ...
- HDU - 6070 Dirt Ratio (二分 + 线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题目大意:给定一个序列a,对于任何一个区间 [l,r],它的"Dirt Ratio&q ...
最新文章
- javascript读取XML文档
- “不给钱就删库”的勒索病毒, 程序员该如何防护?
- DiscuzX2.5视频教程
- python web开发第三方库_Python Web开发中常用的第三方库
- 微软发布 Windows 10 预览版 Build 21343:此电脑和回收站等启用全新图标
- PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)
- Java面试——微服务
- [转]Mysql explain用法和性能分析
- Lesson 1 A puma at large
- ​rsync守护进程模式实践排错08
- Java开发遇到的问题及解决方案
- Retrofit结合RxJava使用指南
- 《Flash MX从入门到精通》内容简介
- 性能测试流程及数据分析
- redis 雪崩、击穿、穿透
- android serviceconnection 作用,Android Service服务的相关介绍
- Zabbix 5.0 配置短信报警
- 解决 M1 MAC安装软件提示来自身份不明开发者
- sql取每组最新数据
- oracle监控pga,oracle pga使用情况常用脚本:
热门文章
- 初二物理模型有哪些_初二是成绩下滑的高危期,做好这5点成绩涨涨涨!(附全学科提升技巧,家长转给孩子!)...
- python http协议获取对方的ip地址_http协议(一)基础知识
- c++ 读文件_第十六节:读文件,文件的创建,写文件,文件的读写以及鼠标键盘事件和图形绘制...
- Hadoop 中zoo_0基础如何入门HADOOP
- 北航计算机学院有河南的,北航计划在豫招生165人 河南多所高职公布预录名单...
- java分桃子_猴子分桃子.java
- c++的文件输入/输出
- MVC三层架构(详解)
- [蓝桥杯][算法提高VIP]夺宝奇兵-dp
- 蓝桥杯2015初赛-牌型种数-dfs