Codeforces 1194E. Count The Rectangles
看到 $n<=5000$,直接暴力枚举左右两条竖线
然后考虑怎么计算高度在某个范围内,左端点小于等于某个值,右端点大于等于某个值的横线数量
直接用权值树状数组维护当前高度在某个区间内的横线数量
考虑先固定左边的竖线,然后枚举从左到右枚举右边的竖线,那么随着右边竖线的右移,合法的横线(右端点大于等于某个值的横线)数量只会越来越少
所以枚举右边竖线的时候同时动态维护一个指向当前最左的右端点合法的横线,然后动态维护树状数组就行了
答案也很容易计算,在固定了左右竖线的情况下,设中间有 $p$ 个最小的不可分割的矩形,那么贡献即为 $p(p+1)/2$
(枚举大矩形包含了 $k$ 小矩形,那么就是 $\sum_{k=1}^{p}(p-k+1)$)
然后因为坐标系有负数所以统一加上 $5001$ 即可
复杂度 $n^2 \log 10000$,很稳
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=;
struct Line {//竖线
int x,l,r;
Line (int _x=,int _l=,int _r=) { x=_x,l=_l,r=_r; }
inline bool operator < (const Line &tmp) const {
return x!=tmp.x ? x<tmp.x : l<tmp.l;
}
}D[N];
struct Line2 {//横线
int h,l,r;
Line2 (int _h=,int _l=,int _r=) { h=_h,l=_l,r=_r; }
}H1[N],H2[N];
inline bool cmp1(Line2 &A,Line2 &B) { return A.l!=B.l ? A.l<B.l : A.r<B.r; }//把横线按左端点排序
inline bool cmp2(Line2 &A,Line2 &B) { return A.r!=B.r ? A.r<B.r : A.l<B.l; }//按右端点排序
int n,m,md,mh;
struct BIT {//树状数组
int t[N];
inline void init() { memset(t,,sizeof(t)); }
inline void add(int x,int v) { while(x<=m) t[x]+=v,x+=x&-x; }
inline int ask(int x) { int res=; while(x) res+=t[x],x-=x&-x; return res; }
}T;
ll Ans;
int main()
{
n=read(); int a,b,c,d;
for(int i=;i<=n;i++)
{
a=read()+,b=read()+,c=read()+,d=read()+;
m=max(m,max(b,d));
if(a==c)
{
if(b>d) swap(b,d);
D[++md]=Line(a,b,d);
}
else
{
if(a>c) swap(a,c);
H1[++mh]=Line2(b,a,c); H2[mh]=H1[mh];
}
}
sort(D+,D+md+); sort(H1+,H1+mh+,cmp1); sort(H2+,H2+mh+,cmp2);
for(int i=;i<=md;i++)//枚举左边的竖线
{
int l=,r=;//动态维护指针
while(l<=mh&&H1[l].l<=D[i].x) T.add(H1[l].h,),l++;
while(r<=mh&&H2[r].r<D[i].x) T.add(H2[r].h,-),r++;
for(int j=i+;j<=md;j++)
{
while(r<=mh&&H2[r].r<D[j].x)
{
if(H2[r].l<=D[i].x) T.add(H2[r].h,-);//注意要判断是之前加入过的横线
r++;
}
if(D[i].x==D[j].x) continue;//相等不合法
int L=max(D[i].l,D[j].l),R=min(D[i].r,D[j].r);
if(L>=R) continue;//相等不合法
int p=T.ask(R)-T.ask(L-)-; if(p<=) continue;//构不成矩形
Ans+=1ll*p*(p+)/;//累计贡献
}
while(r<=mh)//记得清空树状数组
{
if(H2[r].l<=D[i].x) T.add(H2[r].h,-);
r++;
}
}
printf("%lld\n",Ans);
return ;
}
Codeforces 1194E. Count The Rectangles的更多相关文章
- Codeforces - 1194E - Count The Rectangles - 扫描线
https://codeforc.es/contest/1194/problem/E 给5000条正常的(同方向不会重叠,也不会退化成点的)线段,他们都是平行坐标轴方向的,求能组成多少个矩形. 先进行 ...
- Codeforces 1197E Count The Rectangles(树状数组+扫描线)
题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保 ...
- Educational Codeforces Round 68 E. Count The Rectangles
Educational Codeforces Round 68 E. Count The Rectangles 传送门 题意: 给出不超过\(n,n\leq 5000\)条直线,问共形成多少个矩形. ...
- Codeforces 372 B. Counting Rectangles is Fun
$ >Codeforces \space 372 B. Counting Rectangles is Fun<$ 题目大意 : 给出一个 \(n \times m\) 的 \(01\) ...
- codeforces 713B B. Searching Rectangles(二分)
题目链接: B. Searching Rectangles time limit per test 1 second memory limit per test 256 megabytes input ...
- codeforces D. Count Good Substrings
http://codeforces.com/contest/451/problem/D 题意:给你一个字符串,然后找出奇数和偶数长度的子串的个数,这些字串符合,通过一些连续相同的字符合并后是回文串. ...
- CodeForces - 1189E Count Pairs(平方差)
Count Pairs You are given a prime number pp, nn integers a1,a2,…,ana1,a2,…,an, and an integer kk. Fi ...
- Codeforces 1188B - Count Pairs(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 虽说是一个 D1B,但还是想了我足足 20min,所以还是写篇题解罢( 首先注意到这个式子里涉及两个参数,如果我们选择固定一个并动态维护另 ...
- codeforces 451D Count Good Substrings
题意:给定一个字符串,求有多少个奇数子串和多少偶数子串为 “回文串” 这边回文串很特殊之含有 ab 两种字母 而且 相邻的字母相同则消去一个 一直到不存在相邻的相同. 思路: 在这种串 ...
随机推荐
- HNOI2012排队
排列组合题(本文A(n,m)表示从n个元素里选m个的排列数). 首先,老师和女生有不能相邻的限制条件,应该用插空法.而且老师人数较少且固定,把老师和男生进行混合,对女生用插空. 我先来一手错误做法,n ...
- VMWare workstation12配置CentOS6.5虚拟机NAT网络以及虚拟机静态IP
1.右键网络连接—>打开网络和共享中心—>更改适配器设置—>找到网络适配器VMware Virtual Ethernet Adapter for VMnet8—>如下图所示修改 ...
- 局域网与internet
凡是由能彼此通信的设备组成的网络就叫互联网,即使仅有两台机器(计算机.手机等),不论用何种技术使其彼此通信,都叫互联网, 所以,互联网有广域网.城域网及局域网之分. 国际标准的互联网写法是intern ...
- beta week 2/2 Scrum立会报告+燃尽图 03
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9956 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名: ...
- wait/notify模拟连接池
连接池中的连接可重复使用,减少每次新建和烧毁连接对资源的消耗,但连接池的容量大小也要设置合理,否则也会占用多余的资源.连接池的基本功能是获取连接和释放连接 连接在java中也是一个类,连接对象是一个普 ...
- java 百度地图判断两点距离2
package baiduApi; public class BaiDuMap { static double DEF_PI = 3.14159265359; // PI static double ...
- a标签的伪类
a 超链接 伪类:给元素添加特殊的效果 :link 未访问过的链接初始颜色 :visited 访问过后的链接颜色 :hover 鼠标移入(悬停)时的颜色 :active 鼠标按下时链接的颜色 书写时的 ...
- WorkStation 虚拟机迁移到 ESXi
将Workstation的vmdk文件导入到Esxi. 提示如题错误提示. 无法打开磁盘 scsi0:0: 磁盘类型 7 不受支持或无效.请确保磁盘已导入. 在VMware Workstation,V ...
- RDD实例
实例一: teacher.log http://bigdata.baidu.cn/zhangsan http://bigdata.baidu.cn/zhangsan http://bigdata.ba ...
- easyui datagrid checkbox复选框取消单击选中事件、初始全选全不选等问题解决
系统业务需要,导入的列表数据默认全部选中,且不可取消选中行.全部店铺优惠券发放过后导入的数据全部清空.如图所示: 一.初始化页面默认全部选中“selectAll”,全部不选中“unselectAll” ...