【EDU68 E】 Count The Rectangles 数据结构算几何
# 题意
总共有5000条线段,这些线段要么水平,要么垂直,问这些线段组成了多少矩形。
# 思路
这是一个n*n*(log)的思路

自己一开始想着枚举两条垂直边,想着怎么把水平的边插入,再进行冗斥等数出与两边都相交的数量。但是做不出来。
后来学习了如图的思路。
我们枚举垂直边,对于i 来说,因为三条红线与i 有交点,我们就标记三条红线。然后枚举剩下垂直边j ,k。如果这些垂直边与红线相交,就把对答案的贡献算进去。
具体实现可以用树状数组优化:算垂直边与红线交点个数。
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
#define FOR(a, b, c) for(int a = b; a <= c; ++ a)
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template<class T> void _R(T &x) { cin >> x; }
void _R(int &x) { scanf("%d", &x); }
void _R(ll &x) { scanf("%lld", &x); }
void _R(double &x) { scanf("%lf", &x); }
void _R(char &x) { scanf(" %c", &x); }
void _R(char *x) { scanf("%s", x); }
void R() {}
template<class T, class... U> void R(T &head, U &... tail) { _R(head); R(tail...); }
template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
}
const int inf = 0x3f3f3f3f;
const int mod = 1e9+;
/**********showtime************/
const int maxm = ;
const int maxn = ;
struct Q{
int le,ri;
int up,down;
} qujian[maxm];
struct VER{ //垂直
int x;
int y1,y2;
}ver[maxn];
struct HOR{ //水平
int y;
int x1,x2;
}hor[maxn];
bool cmpv(VER a, VER b){
return a.x < b.x;
}
bool cmph(HOR a, HOR b){
return a.x2 < b.x2;
}
const int N = * maxn;
ll sum[N];
int lowbit(int x) {
return x & (-x);
}
void update(int x, int val) {
while(x <= N){
sum[x] += val;
x += lowbit(x);
}
}
ll getsum(int x) {
ll res = ;
while(x > ) {
res += sum[x];
x -= lowbit(x);
}
return res;
}
ll C(ll v) {
return (v * (v-)/ );
}
int main(){
int n; scanf("%d", &n);
int totv = , toth = ;
for(int i=; i<=n; i++) {
int x1,x2,y1,y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
x1 += ; y1 += ; x2 += ; y2 += ;
if(x1 == x2) {
ver[++totv].x = x1;
ver[totv].y1 = min(y1, y2);
ver[totv].y2 = max(y1, y2);
}
else {
hor[++toth].y = y1;
hor[toth].x1 = min(x1, x2);
hor[toth].x2 = max(x1, x2);
}
}
sort(ver+, ver++totv, cmpv);
sort(hor+, hor++toth, cmph);
ll ans = ;
for(int i=; i<=totv; i++) {
queue<int>que;
memset(sum, , sizeof(sum));
for(int j=; j<=toth; j++) {
if(hor[j].y <= ver[i].y2 && hor[j].y >= ver[i].y1) {
if(hor[j].x1 <= ver[i].x) {
que.push(j);
update(hor[j].y, );
}
}
}
for(int j=i+; j<=totv; j++) {
while(!que.empty() && hor[que.front()].x2 < ver[j].x) {
update(hor[que.front()].y, -);
que.pop();
}
ans += C(getsum(ver[j].y2) - getsum(ver[j].y1-));
}
}
printf("%lld\n", ans);
return ;
}
(感想:自己对n^2枚举的理解过于简单。这道题中第一层n遍历中 其实套了两个n的遍历。值得学习)
【EDU68 E】 Count The Rectangles 数据结构算几何的更多相关文章
- HDU 5128.The E-pang Palace-计算几何
The E-pang Palace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Othe ...
- Educational Codeforces Round 68 E. Count The Rectangles
Educational Codeforces Round 68 E. Count The Rectangles 传送门 题意: 给出不超过\(n,n\leq 5000\)条直线,问共形成多少个矩形. ...
- 《算法问题实战策略》-chaper15-计算几何-线段相交
这篇文章着力来讨论线段相交这一个问题. 给出两条线段,如何判断这两条线段相交? 如果这两条线段相交,如何求其交点? 线段相交问题通常由于其繁杂的情况种类而让人避而远之,在这里希望通过笔者的简化讨论希望 ...
- 并不对劲的CF1194E:Count The Rectangles
题意 有\(n\)(\(n\leq 5000\))个平行于x轴或平行于y轴的线段.求这些线段围成了多少个长方形.由多个长方形拼成的也算. 题解 考虑暴力的做法:先分别计算每条横着的线与哪些竖着的线有交 ...
- Codeforces 1197E Count The Rectangles(树状数组+扫描线)
题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保 ...
- ccpc-1008-HDU5839Special Tetrahedron-计算几何
计算几何水题.暴力搞 注意力全部都在02那里,完全没想这道题! /*------------------------------------------------------------------ ...
- ACM-计算几何之Quoit Design——hdu1007 zoj2107
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- uva-10112-计算几何
题意:给你一些点,求这些点组成的三角形面积最大,而且三角形内不能包含其他点 #include <iostream> #include <math.h> #include< ...
- Codeforces 1194E. Count The Rectangles
传送门 看到 $n<=5000$,直接暴力枚举左右两条竖线 然后考虑怎么计算高度在某个范围内,左端点小于等于某个值,右端点大于等于某个值的横线数量 直接用权值树状数组维护当前高度在某个区间内的横 ...
随机推荐
- tp3 的前端内置标签
Volist 标签 volist标签通常用于查询数据集(select 方法),对于查询出来的结果数组进行遍历输出. 首先赋值: $User = M("User"); $list = ...
- vue更改了数据但是视图却没有更新
今日总结:让钩子函数背锅的一上午,跪求原谅 需求:页面刷新时,保留当前页面的选中状态 解决思路:在data里设置一下初始值,保证首次进入有默认选中状态,其次再操作时,把选中的状态存sessionSto ...
- Python实现批量处理扫描特定目录
## 简述在渗透测试中遇到相同CMS站点时,搞定一个站点,相当于拿了一个站群的通用漏洞,所以我们首先需要标注站点的CMS类型,根据要求编写如下脚本 ## 要求1.访问特定目录,如:站点特定 /cmsa ...
- 【Java例题】3.6 计算arcsin(x)的值
6.使用泰勒展开式计算arcsin(x)的值. arcsin(x)=x+x^3/(2*3)+1*3*x^5/(2*4*5)+...+ (2n)!*x^(2n+1)/(2^2n)*(n!)^2*(2n+ ...
- eclipse Maven配置以及使用方法
简述: 现需要在Eclipse中配置Maven插件,同时安装maven应用,配置Maven环境变量,建立Maven管理的工程,并用Maven导入Gson包, 编写简易Json输出程序 步骤: 1. 首 ...
- String关键字
关于String和new String()见我写的前一篇博客 String和new String()的区别 1.String的"+"运算 a.String str = " ...
- golang学习(1)---快速hello world
很多著名的计算机语言都是一两个人在业余时间捣鼓出来的,但是Go语言是由Google的团队打造的.可能一些基础的知识点我不会细讲,因为这个时代你真的得快速学习,才能适应发展. 来看看go的hello, ...
- 洛谷 P2152 [SDOI2009]SuperGCD
题意简述 求两个整数a,b的最大公约数0 < a , b ≤ 10 ^ 10000. 题解思路 如果 a % 2 == 0 && b % 2 == 0 gcd(a,b) = gc ...
- 小白学Python(4)——用Python创建PPT
python-pptx是一个用于创建和更新PowerPoint(.pptx)文件的Python库. 典型的用途是从数据库内容生成自定义的PowerPoint演示文稿,可通过单击Web应用程序中的链接进 ...
- 教你用原生CSS写炫酷页面切换效果,跟第三方组件说拜拜
因为项目需要,别人想让我给他写一个个人博客,并且给了我一个其他人的网页,可以点此查看.有的同学可能说了,第三方博客框架这么多,为什么还要去手写的,你说这个有可能是没有看到打开这个博客. 样式介绍 给大 ...