uva11983扫描线k次覆盖
自己做的是从下往上扫描的,一直wa,不知道坑在哪里。。但是作为模板。我还是找了份不错的ac代码
/*
被覆盖不低于k次的点
每个点对应了一个单位面积,本题把点转面积即是被覆盖不低于k次的面积
可以当做求k次面积覆盖模板的题目!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
#define maxn 60005
#define lson l,m,rt<<1
#define rson m,r,rt<<1|1
#define ll long long
int n,k;
struct Seg{
int l,r,h,c;
Seg(){}
Seg(int l,int r,int h,int c):l(l),r(r),h(h),c(c){}
bool operator<(const Seg& a)const {
return h<a.h;
}
}segs[maxn];
int tot,totx,x[maxn];//线段树建立在x轴上
int len[maxn<<][],flag[maxn<<];
map<int,int>mp; inline void pushup(int rt,int l,int r){
if(flag[rt]>=k){
for(int i=;i<=k;i++) len[rt][i]=;
len[rt][k]=x[r]-x[l]; }
else if(flag[rt]>){
int cur=flag[rt];//当前区间覆盖次数
for(int i=;i<=k;i++) len[rt][i]=;//先把当前区间所有覆盖情况置零
len[rt][cur]=x[r]-x[l];
if(l+==r) return; for(int i=;i<=k;i++){
if(i+cur>=k) len[rt][k]+=len[rt<<][i]+len[rt<<|][i];
else len[rt][i+cur]+=len[rt<<][i]+len[rt<<|][i];
}
for(int i=cur+;i<=k;i++)
len[rt][cur]-=len[rt][i];
}
else {
for(int i=;i<=k;i++) len[rt][i]=;
if(l+==r) return;
for(int i=;i<=k;i++)
len[rt][i]=len[rt<<][i]+len[rt<<|][i];
}
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l && R>=r){
flag[rt]+=c;;
pushup(rt,l,r);
return;
}
int m=l+r>>;
if(L<m) update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
pushup(rt,l,r);
} void init(){
tot=totx=;
mp.clear();
memset(len,,sizeof len);
memset(flag,,sizeof flag);
}
int main(){
int T,a,b,c,d;
cin >> T;
for(int tt=;tt<=T;tt++){
init();
scanf("%d%d",&n,&k);
for(int i=;i<n;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
c++;d++;
segs[tot++]=Seg(a,c,b,);
segs[tot++]=Seg(a,c,d,-);
x[totx++]=a;x[totx++]=c;
}
sort(x,x+totx);
sort(segs,segs+tot);
totx=unique(x,x+totx)-x;
for(int i=;i<totx;i++) mp[x[i]]=i; ll res=;
for(int i=;i<tot;i++){
if(i!=)
res+=(segs[i].h-segs[i-].h)*len[][k];
// cout<<segs[i].h-segs[i-1].h<< " "<<len[1][k]<<'\n';
update(mp[segs[i].l],mp[segs[i].r],segs[i].c,,totx-,); }
printf("Case %d: %lld\n",tt,res);
}
return ;
}
uva11983扫描线k次覆盖的更多相关文章
- HDU 4862 Jump(最小K路径覆盖)
输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...
- 网络费用流-最小k路径覆盖
多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...
- Comet OJ 茶颜悦色 线段树+扫描线(矩形覆盖最多点+优化)
题目:https://www.cometoj.com/contest/59/problem/D?problem_id=2713 题意:给你一个正方形,然后给你n个点,这个正方形能随意放哪,要求那个正方 ...
- POJ 2482 扫描线(面积覆盖最大次数)
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10806 Accepted: ...
- hdu 4862 KM算法 最小K路径覆盖的模型
http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...
- [LeetCode] 632. Smallest Range Covering Elements from K Lists 覆盖K个列表元素的最小区间
You have k lists of sorted integers in ascending order. Find the smallest range that includes at lea ...
- POJ 3261 字符串上的k次覆盖问题
题目大意: 给定一个数组,求一个最大的长度的子串至少出现过k次 一个子串出现多次,也就是说必然存在2个子串间的前缀长度为所求的值 通过二分答案,通过线性扫一遍,去判断出现次数,也就是说每次遇见一个he ...
- poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙
/** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...
随机推荐
- 决策树--信息增益,信息增益比,Geni指数的理解
决策树 是表示基于特征对实例进行分类的树形结构 从给定的训练数据集中,依据特征选择的准则,递归的选择最优划分特征,并根据此特征将训练数据进行分割,使得各子数据集有一个最好的分类的过程. ...
- marshaller unmarshaller解析xml和读取xml
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...
- printf()格式化输出详解
% - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少. ②-:有-表示左对齐输出,如省略表示右对齐输出. ③0:有0表示指定空位填0,如省略 ...
- 初探VBScript
初探VBScript 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VBScript简介 VBScript ,Visual Basic Script的简称,是微软公司出品的脚本 ...
- Xenserver 如何设置VM boot options
#1. SSH到xen物理机 #2. 查看VM的 uuid xe vm-list #3. 设置VM的BIOS xe vm-param-set uuid={vm uuid} HVM-boot-polic ...
- Linux命令之cd
cd命令 用处:跳转目录 用法:输入cd加上你想跳转的目录,这里分几种情况 示例: 一.进入当前目录的子目录 我现在的目录是 /home/jim,如图 这个目录下面有好多文件夹是吧,现在我想进入到其中 ...
- idea常用快捷键及自定义快捷键汇总
以下都是挨个进行验证过的 生成get和set方法为:alt+insert 自动补全返回值,自动补全变量名称和属性名称:ctrl+alt+v 输入System.out.println()的快捷方法是:输 ...
- 转--python 编码规范
编程规范 1.1. 命名规范 1.1.1. [强制] 命名不能以下划线或美元符号开始和结尾 反例: name / __name / $Object / name / name$ / Object$ 1 ...
- Python基础-day03
写在前面 上课第三天,打卡: 不要让干净的灵魂染上尘埃,永远年轻.永远热泪盈眶 一.再谈编码 - 文件的概念 '文件' 是一个抽象的概念,是操作系统提供的外部存储设备的抽象,对应底层的硬盘:它是程序 ...
- 一、linux IO 编程---内存管理
1.1 进程在虚拟空间中的布局 32位的操作系统虚拟空间的大小为 4GB,即每个进程在系统中分配的虚拟空间大小为4GB.这4GB的大小被分为了两个部分: 内核空间:1GB,内核起的进程 用户空间:3G ...