HDU 5862 Counting Intersections(离散化 + 树状数组)
Counting Intersections
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1138 Accepted Submission(s): 347
The input data guarantee that no two segments share the same endpoint, no covered segments, and no segments with length 0.
The first line of each test case contains a number n(1<=n<=100000), the number of segments. Next n lines, each with for integers, x1, y1, x2, y2, means the two endpoints of a segment. The absolute value of the coordinate is no larger than 1e9.
4
1 0 1 3
2 0 2 3
0 1 3 1
0 2 3 2
4
0 0 2 0
3 0 3 2
3 3 1 3
0 3 0 2
0
【分析】给你一些与坐标轴平行的线段,问有多少对线段相交。
对于这种N*N可以办到但是超时的统计问题,一般都树状数组来统计。先将坐标离散化,然后横向线段存两个端点的横坐标,纵向的存一个横 坐标,然后排序,统计。若遇到一条横向线段的左端点,则纵坐标向上lowbit加一,若遇到纵向线段,统计这条线段的累加值,若遇到横向线 段的右端点,纵坐标向上lowbit减一,即删除,因为它已经没有贡献了。
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define met(a,b) memset(a,b,sizeof a)
#define inf 10000000
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int N = 4e5+;
const double eps = 1e-;
int n,sum[N],m,cnt;
ll ans;
int lazy[N],a[N],mi[N],ma[N];
struct Line{
int u,y,z;
Line(int u=,int y=,int z=):u(u),y(y),z(z){}
bool operator <(const Line f)const{
return u<f.u||u==f.u&&z<f.z;
}
};
vector<Line>r,c,q;
void init(){
cnt=ans=;
met(a,);
r.clear();c.clear();q.clear();
}
void add(int x,int num){
for(int i=x;i<N;i+=i&(-i)){
a[i]+=num;
}
}
int query(int x){
int ret=;
for(int i=x;i>=;i-=i&(-i)){
ret+=a[i];
}
return ret;
}
int main() {
int T,x,y,xx,yy;
scanf("%d",&T);
while(T--){
init();
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d%d",&x,&y,&xx,&yy);
mi[++cnt]=x;mi[++cnt]=xx;
mi[++cnt]=y;mi[++cnt]=yy;
if(x==xx){
if(y>yy)swap(y,yy);
c.pb(Line(x,y,yy));
}
if(y==yy){
if(x>xx)swap(x,xx);
r.pb(Line(y,x,xx));
}
}
sort(mi+,mi++cnt);
cnt=unique(mi+,mi++cnt)-mi-;
for(int i=;i<c.size();i++){
c[i].u=lower_bound(mi+,mi++cnt,c[i].u)-mi;
c[i].y=lower_bound(mi+,mi++cnt,c[i].y)-mi;
c[i].z=lower_bound(mi+,mi++cnt,c[i].z)-mi;
q.pb(Line(c[i].u,i,));
}
for(int i=;i<r.size();i++){
r[i].u=lower_bound(mi+,mi++cnt,r[i].u)-mi;
r[i].y=lower_bound(mi+,mi++cnt,r[i].y)-mi;
r[i].z=lower_bound(mi+,mi++cnt,r[i].z)-mi;
q.pb(Line(r[i].y,i,));
q.pb(Line(r[i].z,i,));
}
sort(q.begin(),q.end());
for(Line s:q){
if(s.z==)add(r[s.y].u,);
else if(s.z==)ans+=query(c[s.y].z)-query(c[s.y].y-);
else add(r[s.y].u,-);
}
printf("%lld\n",ans);
}
return ;
}
HDU 5862 Counting Intersections(离散化 + 树状数组)的更多相关文章
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- HDU 5862 Counting Intersections (树状数组)
Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...
- HDU 5862 Counting Intersections 扫描线+树状数组
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...
- hdu 3015 Disharmony Trees (离散化+树状数组)
Disharmony Trees Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 5862 Counting Intersections (离散化+扫描线+树状数组)
题意:给你若干个平行于坐标轴的,长度大于0的线段,且任意两个线段没有公共点,不会重合覆盖.问有多少个交点. 析:题意很明确,可是并不好做,可以先把平行与x轴和y轴的分开,然后把平行y轴的按y坐标从小到 ...
- Hdu 5862 Counting Intersections(有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点+树状数组区间求和单点跟新)
传送门:Hdu 5862 Counting Intersections 题意:有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点 分析: 基本的操作流程是:先将所有的线段按照横树坐标x按小的 ...
- HDU 6318.Swaps and Inversions-求逆序对-线段树 or 归并排序 or 离散化+树状数组 (2018 Multi-University Training Contest 2 1010)
6318.Swaps and Inversions 这个题就是找逆序对,然后逆序对数*min(x,y)就可以了. 官方题解:注意到逆序对=交换相邻需要交换的次数,那么输出 逆序对个数 即可. 求逆序对 ...
- 【bzoj4756】[Usaco2017 Jan]Promotion Counting 离散化+树状数组
原文地址:http://www.cnblogs.com/GXZlegend/p/6832263.html 题目描述 The cows have once again tried to form a s ...
- hdu 5862 Counting Intersections
传送门:hdu 5862 Counting Intersections 题意:对于平行于坐标轴的n条线段,求两两相交的线段对有多少个,包括十,T型 官方题解:由于数据限制,只有竖向与横向的线段才会产生 ...
- CodeForces 540E - Infinite Inversions(离散化+树状数组)
花了近5个小时,改的乱七八糟,终于A了. 一个无限数列,1,2,3,4,...,n....,给n个数对<i,j>把数列的i,j两个元素做交换.求交换后数列的逆序对数. 很容易想到离散化+树 ...
随机推荐
- uoj308 【UNR #2】UOJ拯救计划
传送门:http://uoj.ac/problem/308 [题解] 考虑枚举用了$i$所学校,那么贡献为${k \choose i} * cnt * i!$ 意思是从$k$所选$i$所出来染色,$c ...
- Html5学习3(拖放、Video(视频)、Input类型(color、datetime、email、month 、number 、range 、search、Tel、time、url、week ))
1.Html拖放 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> < ...
- centos6.5下安装svn并且实现多项目管理配置方案
#安装SVN服务器 yum install subversion #在home下创建svn根目录 mkdir /home/svn #在 /home/svn下创建pro1 , pro2, pro3 三个 ...
- C# IEqualityComparer 使用方法 Linq Distinct使用方法
创建 IEqualityComparer的接口类必须实现Equals和GetHashCode方法 public class TipComparer : IEqualityComparer<Tip ...
- mssql手工注入2
--+ 先说一些函数的说明: substring(str,start,len) 截取字符串的作用,第一个参数为要截取的字符串,第二个参数为从哪里开始截取,第三个参数为截取的长度 ascii(char) ...
- Django-【views】decorators.csrf
views下导入方法 from django.views.decorators.csrf import csrf_exempt,csrf_protect csrf_exempt是全局需要,唯独这个 ...
- 网络知识===wireshark抓包出现“TCP segment of a reassembled PDU”的解释(载)
网上胡说八道,众说风云,感觉这篇还算靠谱点. 原文链接:http://blog.csdn.net/dog250/article/details/51809566 为什么大家看到这个以后总是会往MSS, ...
- 关于c++的string的operator =
在 c++ primer 5 中在说到string的章节里面有这样一句话: string s5 = "hiya"; // copy initialization 也就是说,这里说上 ...
- swiper 滑动插件,小屏单个显示滑动,大屏全部显示
var currSwiperIndex=0; function widthHandle(){ var level = widthLevel(); if(level==1){ //单个显示,滑动 if( ...
- App推广
一行业常见名词解释 开发商:也叫CP,即Content Provider内容提供商的英文首字母缩写. 发行商(运营商):即代理CP开发出来的产品. 渠道:拥有用户,能够进行流量分发的公司,即可成为渠道 ...