CF # 题意 总共有5000条线段,这些线段要么水平,要么垂直,问这些线段组成了多少矩形. # 思路 这是一个n*n*(log)的思路 自己一开始想着枚举两条垂直边,想着怎么把水平的边插入,再进行冗斥等数出与两边都相交的数量.但是做不出来. 后来学习了如图的思路. 我们枚举垂直边,对于i 来说,因为三条红线与i 有交点,我们就标记三条红线.然后枚举剩下垂直边j ,k.如果这些垂直边与红线相交,就把对答案的贡献算进去. 具体实现可以用树状数组优化:算垂直边与红线交点个数. #include <b…
The E-pang Palace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)Total Submission(s): 4547    Accepted Submission(s): 2403 Problem Description E-pang Palace was built in Qin dynasty by Emperor Qin Shihuang in Xia…
Educational Codeforces Round 68 E. Count The Rectangles 传送门 题意: 给出不超过\(n,n\leq 5000\)条直线,问共形成多少个矩形. 思路: 考虑到\(n\)的范围不大,所以可以暴力枚举两条平行的直线,接下来处理的就是与其垂直的直线的数量. 满足相交成矩形有两个条件,假如我们枚举的直线是垂直于\(x\)轴的,那么两个条件即为\(low\leq y_i\leq high,x_{i,0}\leq left,right\leq x_{i…
这篇文章着力来讨论线段相交这一个问题. 给出两条线段,如何判断这两条线段相交? 如果这两条线段相交,如何求其交点? 线段相交问题通常由于其繁杂的情况种类而让人避而远之,在这里希望通过笔者的简化讨论希望帮读者的思路进行一下梳理. 首先我们尝试画几个几何图像来找一下线段相交的一些不同的情况,这里需要注意,可能有读者会好奇,这些直观上来看没什么差别的相交情况,我们为什么为认为他们是不同的呢?答案是,这里我们需要将几何特征用代数表达是进行判断,因此不同的几何特征虽然都表示线段相交,但是对应的代数表达式不…
题意 有\(n\)(\(n\leq 5000\))个平行于x轴或平行于y轴的线段.求这些线段围成了多少个长方形.由多个长方形拼成的也算. 题解 考虑暴力的做法:先分别计算每条横着的线与哪些竖着的线有交点,再枚举两条横着的线,求与它们都有交点的线的个数,在这些线中选两条和这两条横着的线拼成长方形. 发现与同一条竖着的线有交点的横线一定是把所有横线按纵坐标排序后连续的一段. 感谢伟大的YSF!!! 代码 #include<algorithm> #include<cmath> #incl…
题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保证上端至少多出1 并用树状数组维护它们 然后从y+1网上扫描纵坐标为yy的水平的线,查询y到yy中同时与他们相交的竖直的线的条数算贡献即可 每查询完一个yy后,要在树状数组内删除上端点为yy的竖直的线,因为以后的yy与它不会再相交了 代码: 几乎是照着官方题解来的.. #include<iostre…
计算几何水题.暴力搞 注意力全部都在02那里,完全没想这道题! /*--------------------------------------------------------------------------------------*/ #include <algorithm> #include <iostream> #include <cstring> #include <ctype.h> #include <cstdlib> #inc…
Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28539    Accepted Submission(s): 7469 Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat…
题意:给你一些点,求这些点组成的三角形面积最大,而且三角形内不能包含其他点 #include <iostream> #include <math.h> #include<stdio.h> using namespace std; struct Node { char c; int x; int y; }; void sort(Node nodes[3], int length) { for (int i = 0; i < length; i++) { for (i…
传送门 看到 $n<=5000$,直接暴力枚举左右两条竖线 然后考虑怎么计算高度在某个范围内,左端点小于等于某个值,右端点大于等于某个值的横线数量 直接用权值树状数组维护当前高度在某个区间内的横线数量 考虑先固定左边的竖线,然后枚举从左到右枚举右边的竖线,那么随着右边竖线的右移,合法的横线(右端点大于等于某个值的横线)数量只会越来越少 所以枚举右边竖线的时候同时动态维护一个指向当前最左的右端点合法的横线,然后动态维护树状数组就行了 答案也很容易计算,在固定了左右竖线的情况下,设中间有 $p$ 个…