problem

Description

因为对polo忍无可忍, dzf使用圣剑在地上划出了许多纵横交错的沟壑来泄愤。这些沟壑都严格与X轴平行或垂直。

polo嘲笑了dzf无聊的行为,然后做了一件更加无聊的事。他蹲下来数这些沟壑的条数。数着数着,polo意识到一个问题,那就是因为圣剑的威力太大,划出的沟壑太多,地面就会塌陷。而如果两条水平的沟壑和两条垂直的沟壑相交组成了一个矩形,那么塌陷的危险就会进一步增加。现在polo已经数了n条沟壑,他想知道这些沟壑组成了多少个矩形。

Input

第一行一个数n,接下来每行4个数x1,y1,x2,y2,表示沟壑的两个端点(x1,y1),(x2,y2)

Output

一个数,组成的矩形个数。

Sample Input

输入1:

4

0 0 1 0

0 0 0 1

1 1 1 -1

1 1 0 1

输入2:

8

1 0 4 0

2 1 2 0

0 0 0 3

2 2 2 3

3 3 3 -1

0 3 4 3

4 1 -1 1

3 2 -1 2

Sample Output

输出1:

1

输出2:

6

Data Constraint

对于30%的数据,1<=n<=100

对于60%的数据,1<=n<=600

对于100%的数据,1<=n<=2000,坐标绝对值小于10^9,任意两条与X轴水平的沟壑之间没有交点,任意两条与X轴垂直的沟壑没有交点。


analysis

  • 很经典的一道求平面内矩形数量的题目

  • 但是我要插入一点东西


奇怪的东西:水法?

  • 40%的数据, O(n4) O(n^4)枚举两条水平和两条垂直线段,傻子都会

  • 60%的数据,也很好想:枚举两条垂直的线段,枚举一条水平的线段

  • 设都与两条垂直线段相交的水平线段的数量为 k k,那么明显能构成C(k,2)=k(k−1)2C(k,2)={k(k-1)\over 2}个矩形

  • 结果一堆人用 O(n3) O(n^3)的水法切掉了……切掉了……

  • 下面来看看这奇妙的水法代码

水法code

#include<cstdio>struct rec{int u,v,x,y;
}a[2001],b[2001];bool pd[2001][2001];
int n,u,v,x,y,o,p,f,w[2001][2001],c[2001];__attribute__((optimize("-O3")))
bool in(int l,int x,int r){return l<=x&&x<=r;}__attribute__((optimize("-O3")))
main(){scanf("%d",&n);int i;for(i=1;i<=n;i++){scanf("%d%d%d%d",&u,&v,&x,&y);if(y==v){//V == Y  YZif(u>x)f=u,u=x,x=f;a[++o]=rec{u,v,x,y};}else{if(v>y)f=v,v=y,y=f;b[++p]=rec{u,v,x,y};//U == X  XZ}}int j,k,s=0,cnt,t0,t1;for(i=1;i<=o;i++)for(k=1;k<=p;k++)if(in(a[i].u,b[k].u,a[i].x)&&in(b[k].v,a[i].v,b[k].y)){pd[i][k]=1;w[i][++c[i]]=k;}for(i=1;i<o;i++)for(j=i+1;j<=o;j++){cnt=0;t0=i,t1=j;if(c[i]>c[j])t1=i,t0=j;for(k=1;k<=c[t0];k++)if(pd[t1][w[t0][k]])cnt++;s+=cnt*(cnt-1)/2;}printf("%d",s);
}

哪位大爷看懂了,记得在评论区和我说一声啊


来点正常的吧

  • 正解乃线段树

  • 首先枚举一条垂直线段,把所有和这条线段相交的水平线段加进线段树

  • 怎么加进线段树呢?把水平线段的 y y坐标离散化,从小到大排个序

  • 把第ii号打上一个标记,表示第 i i条水平线段与当前垂直线段相交

  • 然后我们本来要用一个O(n)O(n)循环来找 k k的,现在用线段树的区间求和,O(log2n)O(log_2n)求解 k k

  • 时间复杂度O(n2log2n)O(n^2log_2n)

  • 虽说 n≤2000 n≤2000,但分开枚举水平垂直线段,时间达不到那么高

  • 所以线段树能在时间范围内跑出解


线段树code

#include<bits/stdc++.h>
#define MAXN 2001using namespace std;int f[5*MAXN],li[5*MAXN],tree[5*MAXN];
int n,x,n1,n2,len,tot;
long long ans;struct information
{int x1,y1,x2,y2;
}a[MAXN],b[MAXN],c[MAXN];bool cmp(information a,information b)
{return a.x1<b.x1;
}bool cmp1(information a,information b)
{return a.x2<b.x2;
}int query(int t,int l,int r,int x,int y)
{if(x<=l && r<=y) {return tree[t];}int mid=(l+r)/2;if(y<=mid) {return query(2*t,l,mid,x,y);}else if(x>mid) {return query(2*t+1,mid+1,r,x,y);}else {return query(2*t,l,mid,x,mid)+query(2*t+1,mid+1,r,mid+1,y);}
}void change(int t,int l,int r,int x,int y)
{if(l==r) {tree[t]+=y; return;}int mid=(l+r)/2;if(x<=mid) {change(2*t,l,mid,x,y);  }else {change(2*t+1,mid+1,r,x,y);}tree[t]=tree[2*t]+tree[2*t+1];
}int search(int t,int l,int r)
{int mid=(l+r)/2;if(f[mid]==t) {return li[mid];}if(t>f[mid]) {return search(t,mid+1,r); }else {search(t,l,mid-1);}
}void init()
{for(int i=1;i<=n1;i++) {f[++tot]=a[i].y1;f[++tot]=a[i].y2;}for(int i=1;i<=n2;i++) {f[++tot]=b[i].y1;f[++tot]=b[i].y2;}sort(f+1,f+tot+1);x=li[1]=1;for(int i=2;i<=tot;i++) {if(f[i]!=f[i-1])x++;li[i]=x;}for(int i=1;i<=n1;i++){a[i].y1=search(a[i].y1,1,tot);a[i].y2=search(a[i].y2,1,tot);}for(int i=1;i<=n2;i++) {b[i].y1=search(b[i].y1,1,tot);b[i].y2=search(b[i].y2,1,tot);}
}int find(int t,int l,int r)
{if(l>r)return l;int mid=(l+r)/2;if(t>c[mid].x2) {return find(t,mid+1,r);}else {return find(t,l,mid-1);}
}long long clam(long long x)
{return x*(x-1)/2;
}int main()
{//freopen("readin.txt","r",stdin);scanf("%d",&n);for(int i=1;i<=n;i++) {int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);if(x1==x2){a[++n1]={x1,y1,x2,y2};if(a[n1].y1>a[n1].y2)swap(a[n1].y1,a[n1].y2);}else{b[++n2]={x1,y1,x2,y2};if(b[n2].x1>b[n2].x2)swap(b[n2].x1,b[n2].x2);}}sort(a+1,a+n1+1,cmp);init(); for(int i=1;i<=n1;i++) {len=0; memset(tree,0,sizeof(tree));for(int j=1;j<=n2;j++) if(a[i].y1<=b[j].y1 && b[j].y1<=a[i].y2 && b[j].x1<=a[i].x1 && a[i].x1<=b[j].x2)  {c[++len]={b[j].x1,b[j].y1,b[j].x2,b[j].y2};change(1,1,x,c[len].y1,1); }sort(c+1,c+len+1,cmp1); int last=1; for(int j=i+1;j<=n1;j++) if(a[j].x1>a[i].x1) {int t=find(a[j].x1,last,len); for(int k=last;k<t;k++){change(1,1,x,c[k].y1,-1); }last=t;long long s=0;int up=min(a[i].y2,a[j].y2),down=max(a[i].y1,a[j].y1);if(down<=up){s=query(1,1,x,down,up); }ans+=clam(s); }}printf("%lld\n",ans);return 0;
}

JZOJsenior3488.【NOIP2013模拟联考11】矩形(rect)相关推荐

  1. JZOJsenior3487.【NOIP2013模拟联考11】剑与魔法(dragons)

    problem Description 万老师听说某大国很流行穿越,于是他就想写一个关于穿越的剧本. 闲话休提.话说老师穿越到了某一个剑与魔法的大陆.因为如此这般,所以老师从维娜艾那里得到了预言.老师 ...

  2. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)

    3461. [NOIP2013模拟联考5]小麦亩产一千八(kela) (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Det ...

  3. jzoj 3461. 【NOIP2013模拟联考5】小麦亩产一千八(math)

    3461. [NOIP2013模拟联考5]小麦亩产一千八 Description "有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾--",话说HYSBZ(Hen ...

  4. JZOJ 3457. 【NOIP2013模拟联考3】沙耶的玩偶(doll)

    题目 Description 在美鱼和理树后援团拯救世界的同时,外表柔弱的理树也开始坚强起来,思考着离开这个世界的办法.误打误撞地,她遇上了正在教室破坏课桌打开迷宫入口的沙耶.沙耶告诉理树,这个世界的 ...

  5. JZOJ 3456. 【NOIP2013模拟联考3】恭介的法则(rule)

    题目 Description 终于,在众亲们的奋斗下,最终boss 恭介被关进了库特设计的密室.正当她们松了一口气时,这个世界却发生了天翻覆地的变化:地面开始下沉,天空开始变成血红色,海水沸腾--一幅 ...

  6. JZOJ 3455. 【NOIP2013模拟联考3】库特的向量(code)

    题目 Description 从前在一个美好的校园里,有一只(棵)可爱的弯枝理树.她内敛而羞涩,一副弱气的样子让人一看就想好好疼爱她.仅仅在她身边,就有许多女孩子想和她BH,比如铃,库特,等等.不过, ...

  7. 【NOIP2013模拟联考5】小麦亩产一千八(kela) (Standard IO)

    Description "有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾--",话说HYSBZ(Hengyang School for Boys & Z ...

  8. JZOJ 3468. 【NOIP2013模拟联考7】OSU!(osu)

    Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为一个长 ...

  9. 【NOIP2013模拟联考5】军训(training)

    Description HYSBZ 开学了!今年HYSBZ 有n 个男生来上学,学号为1-n,每个学生都必须参加军训.在这种比较堕落的学校里,每个男生都会有Gi 个女朋友,而且每个人都会有一个欠扁值H ...

最新文章

  1. seaborn官方API
  2. 基于HT for Web 快速搭建3D机房设备面板
  3. OpenStack collectd的从零安装服务端
  4. Python 中的Pyc文件
  5. Android之提示订阅配置订阅需要传新的包 添加结算权限。
  6. 冷热复位_冷热rx-java可观察
  7. python float精度问题_Python之☞float浮点数精度问题
  8. restTemplate请求,报 : No instances avaliable for ip地址
  9. 点击次数(thinkphp)
  10. [daily][device] linux挂载iphone
  11. 【Python爬虫实战】 图片爬虫-淘宝图片爬虫--千图网图片爬虫
  12. matlab心理学函数包,心理学研究方法:基于MATLAB和PSYCHTOOLBOX
  13. ismart软件英语期末测试,iSmart APP
  14. 网易云信 UI 开发
  15. Android 存储相册,Android 相册图片存储
  16. GridView 控制默认分页页码间距 及字体大小
  17. 【笑小枫的按步照搬系列】Git从安装到入门操作,一文搞定
  18. 传输层的重要协议——TCP
  19. (CCF202109-4)收集卡牌(概率DP)
  20. 蓝牙AOA到达角算法(二)

热门文章

  1. 二相漏电断路器接线图_三相四线制漏电保护开关下面的接法接少了二相火线会跳闸吗...
  2. c语言程序设计基础课后习题答案,2011级C语言程序设计基础教程课后习题答案
  3. 计算机考试网络管理员课程,软考网络管理员教程精讲之计算机的基本结构
  4. 【UE4_蓝图】用鼠标平滑稳定的在世界(三维空间)中移动物体
  5. 字节跳动和腾讯北京测开面经
  6. 计算机视觉领域的大牛主页
  7. tensorflow学习笔记——AlexNet
  8. 【区块链技术工坊46期】PPIO蒋鑫:椭圆曲线密码学简介
  9. [激光原理与应用-15]:《激光原理与技术》-1- 什么是激光,激光概述
  10. MSP430平台下实现Si4432的收发数据