Counting Intersections
Counting Intersections
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
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
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define vi vector<int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
#define pii pair<int,int>
#define Lson L, mid, rt<<1
#define Rson mid+1, R, rt<<1|1
const int maxn=2e5+;
const int dis[][]={{,},{-,},{,-},{,}};
using namespace std;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p;p=p*p;q>>=;}return f;}
int n,m,k,t,x[maxn],y[maxn],p[maxn],xcnt,ycnt,id,idx;
ll ans;
multiset<int>s;
struct node
{
int x,low,high;
bool operator<(const node&p)const
{
return x<p.x;
}
}a[maxn];
struct node1
{
int x,y,type;
bool operator<(const node1&p)const
{
return x<p.x;
}
}g[maxn];
int get(int x)
{
int sum=;
for(int i=x;i;i-=(i&(-i)))
sum+=p[i];
return sum;
}
void add(int x,int y)
{
for(int i=x;i<=maxn-;i+=(i&(-i)))
p[i]+=y;
}
int main()
{
int i,j;
scanf("%d",&t);
while(t--)
{
xcnt=ycnt=id=idx=;
ans=;
memset(p,,sizeof(p));
scanf("%d",&n);
rep(i,,n)
{
int b,c,d,e;
scanf("%d%d%d%d",&b,&c,&d,&e);
if(c>e)swap(c,e);
if(b>d)swap(b,d);
if(b==d)
{
x[++xcnt]=a[++id].x=b;
y[++ycnt]=a[id].low=c;
y[++ycnt]=a[id].high=e;
}
else
{
x[++xcnt]=b;
x[++xcnt]=d;
y[++ycnt]=c;
g[++idx].x=b;
g[idx].y=c;
g[idx].type=;
g[++idx].x=d;
g[idx].y=e;
g[idx].type=;
}
}
sort(x+,x+xcnt+);
sort(y+,y+ycnt+);
sort(a+,a+id+);
sort(g+,g+idx+);
int num1=unique(x+,x+xcnt+)-x-;
int num2=unique(y+,y+ycnt+)-y-;
rep(i,,id)
{
a[i].x=lower_bound(x+,x+num1+,a[i].x)-x;
a[i].low=lower_bound(y+,y+num2+,a[i].low)-y;
a[i].high=lower_bound(y+,y+num2+,a[i].high)-y;
}
rep(i,,idx)
{
g[i].x=lower_bound(x+,x+num1+,g[i].x)-x;
g[i].y=lower_bound(y+,y+num2+,g[i].y)-y;
}
int now=;
rep(i,,id)
{
while(now<=idx&&g[now].x<=a[i].x)
{
if(g[now].type==)add(g[now].y,);
else {
if(g[now].x!=a[i].x)
add(g[now].y,-);
else s.insert(g[now].y);
}
now++;
}
ans+=get(a[i].high)-get(a[i].low-);
for(int x:s)add(x,-);
s.clear();
}
printf("%lld\n",ans);
}
//system("Pause");
return ;
}
Counting Intersections的更多相关文章
- hdu 5862 Counting Intersections
传送门:hdu 5862 Counting Intersections 题意:对于平行于坐标轴的n条线段,求两两相交的线段对有多少个,包括十,T型 官方题解:由于数据限制,只有竖向与横向的线段才会产生 ...
- HDU 5862 Counting Intersections (树状数组)
Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...
- HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
- HDU 5862 Counting Intersections 扫描线+树状数组
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...
- HDU 5862 Counting Intersections(离散化 + 树状数组)
Counting Intersections Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- Hdu 5862 Counting Intersections(有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点+树状数组区间求和单点跟新)
传送门:Hdu 5862 Counting Intersections 题意:有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点 分析: 基本的操作流程是:先将所有的线段按照横树坐标x按小的 ...
- hdu-5862 Counting Intersections(线段树+扫描线)
题目链接: Counting Intersections Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K ...
- 2016暑假多校联合---Counting Intersections
原题链接 Problem Description Given some segments which are paralleled to the coordinate axis. You need t ...
- 【HDU5862】Counting Intersections
题意 有n条线段,且都平行于坐标轴.对于每条线段,给出两个端点的坐标.问一共有多少个线段的交点. 分析 最最简单的扫描法了.用线段树或者树状数组都可以. 由题目可知,线段只有两种,要么平行于x轴要么平 ...
随机推荐
- find unique values in an array
Problem: given an array that contains duplicates (except one value), find the one value that does no ...
- mysql数据库参数innodb_buffer_pool_size和max_connections
接到报故,查看mysql数据库以下参数 1.innodb_buffer_pool_size 2.max_connections 该参数定义了数据缓冲区buffer pool大小,类似于oracle的d ...
- Docker学习笔记 — Docker私有仓库搭建【转载】
标签: Docker 2015-03-10 21:08 24190人阅读 评论(0) 收藏 举报 分类: Docker(26) 目录(?)[+] 和Mavan的管理一样,Dockers不仅 ...
- bmp文件格式详细解析
先区分几个概念:16色和16位色一样吗? 不一样! 颜色位数,即是用多少位字节表示的值,每一位可以表示0和1两值.通常图片的颜色深度,简称色深,就是用位数来表示的,所以,我通常会看到8位色,16位色, ...
- byte数组与int,long,short,byte转换 (转载)
byte数组和short数组转换 public short bytesToShort(byte[] bytes) { return ByteBuffer.wrap(bytes).order(ByteO ...
- ASP.NET网站限制访问频率
最近做了一个免费发短信的小网站(http://freesms.cloudapp.net/),但发现最近有人破解了我的验证码,以每3秒/条的速度用我的短信服务来发他的广告.更换验证码程序和过滤关键字只是 ...
- iOS View 模糊效果(毛玻璃)
iOS View 模糊效果(毛玻璃) 相关资料 http://stackoverflow.com/questions/18404907/using-gpuimage-to-recreate-ios ...
- 转 vi 技巧和诀窍:令人刮目相看的 10 个超酷命令
for ksh vi 编辑器的许多选项可以控制编辑会话的外观和感觉.使用 :set 命令修改 vi 中的会话设置.按 Escape 键进入命令模式之后,可以使用 :set all 命令显示选项和设置的 ...
- hdu1950 Bridging signals 最长递增子序列
用一个数组记下递增子序列长度为i时最小的len[i],不断更新len数组,最大的i即为最长递增子序列的长度 #include<cstdio> #include<algorithm&g ...
- java基础增强
Eclipse使用: java Compile配置的是java编译环境 java Build path配置的是java运行环境 运行环境的版本必须高于编译环境的版本.否则报错 工程上 右键--prop ...