算是模板题,会了面积交这个应该就会了,正常面积交分为覆盖1次以上,两次以上,这个就分为覆盖1到k次以上就行了。

这个题有点边界问题:是让你求覆盖的点,所以你可以假设一个1*1的正方向表示它的左下角被覆盖,那你读入x2,y2时就让x2++,y2++。这样直接算面积就处理好边界了。

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define ls num*2
#define rs num*2+1
using namespace std; const int maxn = 3e5 + 1010;
int k;
ll loc[maxn*2];
struct seg{
ll l, r, h;
int flag;
bool operator < (const seg &a)const{
return h < a.h;
}
}line[maxn*2]; struct node{
ll l, r, sum;
ll len[12]; }p[maxn*4]; void build(int num, int l, int r){
p[num] = (node){l, r, 0, 0};
if(l == r) return;
int mid = (l+r)/2;
build(ls, l, mid);
build(rs, mid+1, r);
} void pushup(int num){
ll int x = p[num].sum;
ll l = p[num].l, r = p[num].r;
if(p[num].sum){
for(int i = 1; i <= k; i++){
if(p[num].sum >= i) p[num].len[i] = loc[r+1] - loc[l];
else if(l == r) p[num].len[i] = 0;
else p[num].len[i] = p[ls].len[i-x] + p[rs].len[i-x];
}
}
else{
for(int i = 1; i <= k; i++){
if(l == r) p[num].len[i] = 0;
else p[num].len[i] = p[ls].len[i] + p[rs].len[i];
}
}
} void change(int num, ll ul, ll ur, int x){
ll l = p[num].l, r = p[num].r;
if(loc[r+1] <= ul || loc[l] >= ur) return;
if(loc[r+1] <= ur && loc[l] >= ul){
p[num].sum += x;
pushup(num);
return;
}
change(ls, ul, ur, x);
change(rs, ul, ur, x);
pushup(num);
} int main(){
ll x1, x2, y1, y2, n, pos;
int cas = 0;
int t; scanf("%d",&t);
while(t--){
pos = 0;
scanf("%lld %d",&n,&k);
rep(i, 1, n){
scanf("%lld%lld%lld%lld",&x1, &y1, &x2, &y2);
x2++, y2++;
loc[++pos] = x1;
line[pos] = (seg){x1, x2, y1, 1};
loc[++pos] = x2;
line[pos] = (seg){x1, x2, y2, -1};
}
n *= 2;
sort(line+1, line+1+n);
sort(loc+1, loc+1+n);
int num = unique(loc+1, loc+1+n) - loc - 1;
build(1, 1, num-1);
ll ans = 0;
rep(i, 1, n-1){
change(1, line[i].l, line[i].r, line[i].flag);
ans += p[1].len[k] * (line[i+1].h - line[i].h);
}
printf("Case %d: %lld\n",++cas, ans);
}
return 0;
}

矩形面积k次交 UVA - 11983的更多相关文章

  1. UVA 11983 Weird Advertisement(线段树求矩形并的面积)

    UVA 11983 题目大意是说给你N个矩形,让你求被覆盖k次以上的点的总个数(x,y<1e9) 首先这个题有一个转化,吧每个矩形的x2,y2+1这样就转化为了求N个矩形被覆盖k次以上的区域的面 ...

  2. UVA 11983 Weird Advertisement --线段树求矩形问题

    题意:给出n个矩形,求矩形中被覆盖K次以上的面积的和. 解法:整体与求矩形面积并差不多,不过在更新pushup改变len的时候,要有一层循环,来更新tree[rt].len[i],其中tree[rt] ...

  3. UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]

    题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...

  4. hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...

  5. 2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)

    B. 腾讯益智小游戏—矩形面积交(简单) 1000ms 262144K   腾讯游戏开发了一款全新的编程类益智小游戏,最新推出的一个小游戏题目是关于矩形面积交的.聪明的你能解出来吗?看下面的题目接招吧 ...

  6. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  7. Java实现 蓝桥杯VIP基础练习 矩形面积交

    描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入 输入仅包含两行,每行描述一个矩形. 在每行中,给出矩 ...

  8. 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交

    E - 秋实大哥与家 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...

  9. 【hdu1255】线段树求矩形面积交

    题意大概就是上图这个样子.<=100组测试数据,每组<=1000个矩形. 题解: 这个问题怎么解决..做了上一题矩形面积并应该就会了.. 对于每个节点维护3个值: cnt:该节点所代表的这 ...

  10. POJ 1151 Atlantis(线段树-扫描线,矩形面积并)

    题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...

随机推荐

  1. bean实例化三种方式

    实例化bean的方式有三种,如下: 1.无参构造方法实例化 2.工厂静态方法实例化 3.工厂普通方法实例化 此处演示的项目结构如下: 方法一:无参构造方法实例化(注意,该类中不能存在有参构造函数) U ...

  2. flask、element、vue项目实战:搭建一个加密excel数据的网站

    文章目录 一.前端 1.1 上传文件 1.2 数据表格 1.3 加密选项 1.4 加密数据 1.5 下载按钮 二.后端 2.1 .upload 文件上传 2.2 table 数据表格接口 2.3 en ...

  3. 全局 使用 stylus 变量

    首先 安装 啦 npm i stylus stylus-loader -D 之后 使用全局变量 然后在组件中引用改变量  -->没有用! 原因还没有在build/utils.js文件 全局引入 ...

  4. HDK_节点开发:SOP_ComputeVisibility

    Houdini版本:18.5.596 节点概述:剔除模型在某视线方向下所有不可见面. 参数界面: 输入:三角化的模型(左),可选输入遮挡模型(右) 原理:在画布上绘制该方向上的最近深度,作为判定各面可 ...

  5. 【JavaScript】JS写法随笔(二) JS动态生成表格

    主要思路:通过Ajax请求后端接口并拿到结果list之后,然后通过DOM获取tbody并向tbody中添加行.单元格. $("#calculate").click(function ...

  6. c++学习7 指针与数组

    一 二维数组与数组指针的关系 二维数组名,代表的是第0行的行地址,"+1"是跳过一个行.而取" * "的话,则是在当前行地址基础上再取列地址,那么如果我们再取一 ...

  7. 【PTA】1049 Counting Ones

    The task is simple: given any positive integer N, you are supposed to count the total number of 1's ...

  8. 【转载】matlab常用函数

    第一篇:Matlab软件函数 一.软件操作函数 1)命令窗口函数: clc:清空命令窗口,使用向上箭头翻看命令. open:打开文件,文本文件(*.doc),可执行文件(*.exe),图形文件(*.f ...

  9. ArrayList 的toArray的转换数组方法的注意事项

    ArrayList 的toArray的转换数组方法的注意事项 toArray()一共有两个方法 toArray(T[] a) 和toArray() 源码是 进行使用toArray()方法时候,使用 ( ...

  10. 结对作业——考研咨询APP

    结对作业--考研资讯系统   102陈同学105潘同学108苏同学 (排版:Markdown) 一.需求分析(NABCD模型) 1. N(Need 需求): 1)想知道每个专业考研可以考哪个专业2)想 ...