http://acm.hdu.edu.cn/showproblem.php?pid=5862

将竖线(y1 y2 x)拆为两个点 分别在y1 y2+1高度更新x位置 x轴用线段树维护 对于横线(x1 x2 y)就在y高度查询线段树上x1x2对应的区间 这时对应区间里面维护的就是当前高度的横线相交的竖线数量

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long longstruct node1
{int x1,y1,x2,y2;
};struct node2
{int tp;int x;
};struct node3
{int x1;int x2;
};node1 pre[100010];
vector <node2> point[200010];
vector <node3> seg[200010];
ll sum[800010];
int tmpx[200010],tmpy[200010];
int n,lenx,leny;void update(int tar,ll val,int l,int r,int cur)
{int m;sum[cur]+=val;if(l==r) return;m=(l+r)/2;if(tar<=m) update(tar,val,l,m,2*cur);else update(tar,val,m+1,r,2*cur+1);
}ll query(int pl,int pr,int l,int r,int cur)
{ll res;int m;if(pl<=l&&r<=pr) return sum[cur];res=0,m=(l+r)/2;if(pl<=m) res+=query(pl,pr,l,m,2*cur);if(pr>m) res+=query(pl,pr,m+1,r,2*cur+1);return res;
}int main()
{node2 tmp2;node3 tmp3;ll ans;int t,i,j;scanf("%d",&t);while(t--){scanf("%d",&n);lenx=0,leny=0;for(i=1;i<=n;i++){scanf("%d%d%d%d",&pre[i].x1,&pre[i].y1,&pre[i].x2,&pre[i].y2);tmpx[++lenx]=pre[i].x1,tmpx[++lenx]=pre[i].x2;tmpy[++leny]=pre[i].y1,tmpy[++leny]=pre[i].y2;}sort(tmpx+1,tmpx+lenx+1);sort(tmpy+1,tmpy+leny+1);lenx=unique(tmpx+1,tmpx+lenx+1)-tmpx-1;leny=unique(tmpy+1,tmpy+leny+1)-tmpy-1;for(i=1;i<=n;i++){pre[i].x1=lower_bound(tmpx+1,tmpx+lenx+1,pre[i].x1)-tmpx;pre[i].y1=lower_bound(tmpy+1,tmpy+leny+1,pre[i].y1)-tmpy;pre[i].x2=lower_bound(tmpx+1,tmpx+lenx+1,pre[i].x2)-tmpx;pre[i].y2=lower_bound(tmpy+1,tmpy+leny+1,pre[i].y2)-tmpy;}for(i=0;i<=200000;i++){point[i].clear();seg[i].clear();}for(i=1;i<=n;i++){if(pre[i].x1==pre[i].x2){if(pre[i].y1>pre[i].y2) swap(pre[i].y1,pre[i].y2);tmp2.tp=1,tmp2.x=pre[i].x1;point[pre[i].y1].push_back(tmp2);tmp2.tp=2,tmp2.x=pre[i].x1;point[pre[i].y2+1].push_back(tmp2);}else{if(pre[i].x1>pre[i].x2) swap(pre[i].x1,pre[i].x2);tmp3.x1=pre[i].x1,tmp3.x2=pre[i].x2;seg[pre[i].y1].push_back(tmp3);}}memset(sum,0,sizeof(sum));ans=0;for(i=1;i<=leny;i++){for(j=0;j<point[i].size();j++){if(point[i][j].tp==1) update(point[i][j].x,1,1,lenx,1);else update(point[i][j].x,-1,1,lenx,1);}for(j=0;j<seg[i].size();j++){ans+=query(seg[i][j].x1,seg[i][j].x2,1,lenx,1);}}printf("%lld\n",ans);}return 0;
}

Counting Intersections HDU - 5862相关推荐

  1. D - Counting Stars HDU - 7059

    D - Counting Stars HDU - 7059 题解: 长度为n的序列a,有三个操作: 对某个区间进行询问 对于某个区间内的每个数ai,减去ai&(-ai) 对于某个区间内的每个数 ...

  2. E - Counting Cliques HDU - 5952

    E - Counting Cliques HDU - 5952 题意: 给你n个点,m个边,还有一个s,问这个图中有多少个等于s的点集可以组成一个完全图 题解: 这题..直接暴力搜索就行 分析复杂度的 ...

  3. Counting Divisors HDU - 6069

    设n=p_1^{c_1}p_2^{c_2}...p_m^{c_m}n=p​1​c​1​​​​p​2​c​2​​​​...p​m​c​m​​​​,则d(n^k)=(kc_1+1)(kc_2+1)...( ...

  4. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

  5. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  6. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

  7. 杭电OJ分类题目(2)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(2) HDU Water~~~ HDU 100 ...

  8. 2016 Multi-University Training Contest 10

    solved 7/11 2016 Multi-University Training Contest 10 题解链接 分类讨论 1001 Median(BH) 题意: 有长度为n排好序的序列,给两段子 ...

  9. 2012成都网络赛赛后【缺CHJ】

    A Coder (HDU 4288,与Codeforces 85D相同) 应该用线段树写,我是块状链表水过了 #include<map>#include<cstdio>#inc ...

最新文章

  1. python中pow是什么函数_python中pow什么意思
  2. 跳转到保护模式并显示一个LOGO
  3. ubuntu_常用命令_01
  4. Python字符串笔录
  5. 设计模式:面向对象的设计原则下(ISP、DIP、KISS、YAGNI、DRY、LOD)
  6. net core 3.1 跨域 Cors 找不到 “Access-Control-Allow-Origin”
  7. springboot 多数据源_SpringBoot整合多数据源的巨坑一
  8. Linux内核学习编译流程
  9. Hadoop、Storm和Spark 三者的区别、比较
  10. windows与linux线程,Linux和Windows两种风格的操作系统,创建线程的方式有何不同?...
  11. 制作整人计算机病毒,自己制作简单病毒---三行命令的整人BAT,弹出很多窗口,一直弹到内存耗...
  12. 动态生成鼠标指针--可以利用已有的图片生成鼠标指针--C#代码
  13. 如何用微信建立打卡小程序(做打卡签到小程序方法)
  14. 自然辩证法2018版_(完整word版)2018年《自然辩证法概论》已整理
  15. dubbo服务暴露与注册
  16. 水滴模式能否解惑10亿人口下沉市场?
  17. 蓝牙设备删除失败_十代混动雅阁车载蓝牙连接不上怎么办?
  18. 秦曾昌人工智能课程---7、决策树集成学习Tree Ensembles
  19. 学Python找工作你起码要会这些
  20. Android Studio飘红错误

热门文章

  1. 平面三角形与三角函数(2):三角函数的基本关系和诱导公式、加法共识、和差化积、积化和差公式、倍角公式、半角公式、降幂公式
  2. 启英泰伦推出离在线语音方案,断网、联网都能实现语音交互
  3. Java8新特性学习笔记
  4. 对于减少固态过量写问题的缓解
  5. 计算机科学与技术江苏分数线,南京大学计算机科学与技术专业2016年在江苏理科高考录取最低分数线...
  6. ZWAVE Alarm Report Command
  7. matlab实现一个图像分成两半,1.2 opencv图像处理基本操作
  8. 像麦肯锡咨询师一样做商业分析_课程笔记 模块六: 数据分析
  9. Web性能优化:基本思路和常见工具
  10. 高数_第2章多元函数微分学 概述