题意:给出N个矩形,M次询问

每次询问给出R个,问这R个矩形围成的面积

解题思路:对于每次询问,做一次线段树求面积的并操作。

每个节点保存的信息有l,r,cover,len分别表示该节点表示的区间[l,r],该区间被线段完全覆盖的次数以及被线段覆盖的长度。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;const int maxn = 25;
int n,m,edge[maxn],tmp[maxn];
int tmpsize,size;   //size表示线段树叶子节点个数struct Segment
{int l,r,cover,len;
}tree[maxn<<2];
struct Rectangle
{int x1,x2,y1,y2;
}rec[maxn];
struct Line
{int x,y1,y2;int val;Line(){}Line(int _x,int _y1,int _y2,int _val){x = _x;y1 = _y1;y2 = _y2;val = _val;}
};
vector<Line> vec;void build(int rt,int l,int r)
{tree[rt].l = l, tree[rt].r = r;tree[rt].cover = tree[rt].len = 0;if(l + 1 == r || l == r) return;int mid = (l + r) >> 1;build(rt<<1,l,mid);build(rt<<1|1,mid,r);
}void insert(int rt,int l,int r,int val)
{if(l <= tree[rt].l && tree[rt].r <= r){tree[rt].cover += val;if(tree[rt].cover == 0)tree[rt].len = tree[rt<<1].len + tree[rt<<1|1].len;else tree[rt].len = edge[tree[rt].r] - edge[tree[rt].l];return;}int mid = (tree[rt].l + tree[rt].r) >> 1;if(l < mid) insert(rt<<1,l,r,val);if(mid < r) insert(rt<<1|1,l,r,val);if(tree[rt].cover == 0)tree[rt].len = tree[rt<<1].len + tree[rt<<1|1].len;else tree[rt].len = edge[tree[rt].r] - edge[tree[rt].l];
}bool cmp(Line a,Line b)
{return a.x < b.x;
}void DiscretData()
{sort(tmp,tmp+tmpsize);size = 0;edge[++size] = tmp[0];for(int i = 1; i < tmpsize; i++)if(tmp[i] != tmp[i-1])edge[++size] = tmp[i];
}int bisearch(int val)
{int l = 1, r = size, mid;while(l <= r){mid = (l + r) >> 1;if(edge[mid] == val) return mid;else if(edge[mid] < val)l = mid + 1;else r = mid - 1;}
}int main()
{int cas = 1;while(scanf("%d%d",&n,&m),n+m){for(int i = 1; i <= n; i++)scanf("%d%d%d%d",&rec[i].x1,&rec[i].y1,&rec[i].x2,&rec[i].y2);printf("Case %d:\n",cas++);while(m--){int r,q = 1;scanf("%d",&r);vec.clear();tmpsize = 0;for(int i = 1; i <= r; i++){int k;scanf("%d",&k);vec.push_back(Line(rec[k].x1,rec[k].y1,rec[k].y2,1));vec.push_back(Line(rec[k].x2,rec[k].y1,rec[k].y2,-1));tmp[tmpsize++] = rec[k].y1;tmp[tmpsize++] = rec[k].y2;}DiscretData();sort(vec.begin(),vec.end(),cmp);build(1,1,size);int ans = 0;for(int i = 0; i < vec.size(); i++){if(i > 0)ans += tree[1].len * (vec[i].x - vec[i-1].x);int l = bisearch(vec[i].y1);int r = bisearch(vec[i].y2);insert(1,l,r,vec[i].val);}printf("Query %d: %d\n",q++,ans);}}return 0;
}

hdu 2461(线段树求面积并)相关推荐

  1. poj 1151(线段树求面积并)

    解题思路:线段树求面积并,水题 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  2. HDU 3308 线段树求区间最长连续上升子序列长度

    题意:两种操作,Q L R查询L - R 的最长连续上升子序列长度,U pos val 单点修改值 #include <bits/stdc++.h> #define N 100005 us ...

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

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

  4. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  5. 线段树求逆序对(hdu1394Minimum Inversion Number)

    说实话,线段树求逆序对我理解了半天诶,不知是否有人像我一样. 对于每个数来说,只有和已经出现过的.比它大的数才能形成逆序对,那么在给定的数列中,每给一个数就向前找比它大的数. 样例:10 1 3 6 ...

  6. 吉首大学2019年程序设计竞赛(重现赛) 干物妹小埋(线段树求最长上升子序列)

    链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  7. hdu 1255(线段树求重叠面积)

    扫描线求矩形重叠面积:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html http://www.tuicool.co ...

  8. HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***

    题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...

  9. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

最新文章

  1. jquery checkbox勾选/取消勾选的诡异问题
  2. Django中提供的6种缓存方式
  3. MongoDB Modifiers(原子操作)
  4. 数据结构最短路径例题_编程小白暑期进阶笔记45-C语言数据结构与算法最短路径和dijkstra算法...
  5. maven依赖decoder_引入依赖maven打包报错
  6. 算法:模式匹配之KMP算法
  7. 地图定位的坐标和mapview中显示的当前位置信息不一致
  8. Netty入门教程——初识Netty
  9. 某银行软件中心产品开发流程
  10. 移动数据库 Realm 在 React-Native 的使用详解
  11. Linux 命令(78)—— rmdir 命令
  12. React Native图片缓存解决方案
  13. vscode 使用技巧(持续更新)
  14. STP实验(指定特定交换机为根桥)
  15. Python基础教程,Python入门教程(非常详细)
  16. 怎样从altera下载软件与器件库
  17. python与abaqus的关系_python和abaqus交互
  18. DSP与FPGA的SRIO通信实现
  19. C++类的构造函数及操作符()重载
  20. 豆瓣fm android,豆瓣FM for Android

热门文章

  1. Vue全家桶 + webpack 构建单页应用初体验
  2. springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置...
  3. [转]Open Data Protocol (OData) Basic Tutorial
  4. UImageview加边框 加阴影
  5. DCF模型里面的括号计算方法
  6. t test table
  7. tab in English
  8. 剑桥大学国际学生事务部网站
  9. LUA中相同签名函数覆盖
  10. 刷前端面经笔记(十二)