hdu 5862 Counting Intersections
传送门:hdu 5862 Counting Intersections
题意:对于平行于坐标轴的n条线段,求两两相交的线段对有多少个,包括十,T型
官方题解:由于数据限制,只有竖向与横向的线段才会产生交点,所以先对横向线段按x端点排序,每次加入一个线段,将其对应的y坐标位置+1,当出现一个竖向线段时,查询它的两个y端点之间的和即为交点个数.
注意点:对x坐标排序是对所有线段端点排序;因为可能出现 “ 1-1 “ 这样的情况,所以对于横着的线段,需要进行首尾x坐标处理;我的方法是对于x坐标,先按大小排序,如果大小相同,按先横后竖的方式排序,那么对于 “ 1- ”这样的情况,是能够正确计算的,对于“ -1” 这样的情况,就得对横着的线段的右端点+1处理
总结:这类题型非常常见,处理方法也很巧妙,有必要熟练运用。2016百度之星复赛的1003 拍照 也是同类型的题
/**************************************************************
Problem:hdu 5862 Counting Intersections
User: youmi
Language: C++
Result: Accepted
Time:2199MS
Memory:9124K
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%I64d\n",a)
#define rep(i,from,to) for(int i=from;i<=to;i++)
#define irep(i,to,from) for(int i=to;i>=from;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl
const double pi=*atan(1.0); using namespace std;
typedef long long ll;
template <class T> inline void read(T &n)
{
char c; int flag = ;
for (c = getchar(); !(c >= '' && c <= '' || c == '-'); c = getchar()); if (c == '-') flag = -, n = ; else n = c - '';
for (c = getchar(); c >= '' && c <= ''; c = getchar()) n = n * + c - ''; n *= flag;
}
ll Pow(ll base, ll n, ll mo)
{
if (n == ) return ;
if (n == ) return base % mo;
ll tmp = Pow(base, n >> , mo);
tmp = (ll)tmp * tmp % mo;
if (n & ) tmp = (ll)tmp * base % mo;
return tmp;
}
//*************************** int n;
const int maxn=+;
const ll mod=; typedef struct Point
{
int x,y;
int id;
Point(){};
Point(int _x,int _y,int _id)
{
x=_x,y=_y,id=_id;
}
}point;
typedef struct Line
{
point s,e;
int dir;
Line(){};
Line(point _s,point _e,int _dir)
{
s=_s,e=_e,dir=_dir;
}
}line;
line ln[maxn];
point p[maxn<<];
int y[maxn<<];
bool vis[maxn];
bool cmp(point a,point b)
{
return a.x==b.x?ln[a.id].dir<ln[b.id].dir:a.x<b.x;
}
ll c[maxn<<];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int val)
{
while(x<=*n)
{
c[x]+=val;
x+=lowbit(x);
}
}
ll query(int x)
{
ll res=;
while(x)
{
res+=c[x];
x-=lowbit(x);
}
return res;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int T_T;
scanf("%d",&T_T);
for(int kase=;kase<=T_T;kase++)
{
sc(n);
int x1,y1,x2,y2;
rep(i,,n)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(y1>y2||x1>x2)
{
swap(y1,y2);
swap(x1,x2);
}
p[i*-]=Point(x1,y1,i);
p[i*]=Point(x2,y2,i);
y[i*-]=y1,y[i*]=y2;
if(y1==y2)
ln[i]=Line(Point(x1,y1,i),Point(x2,y2,i),),p[i*].x++;//横线的右端点+1
else if(x1==x2)
ln[i]=Line(Point(x1,y1,i),Point(x2,y2,i),);
}
sort(p+,p++*n,cmp);
sort(y+,y++*n);
int k=unique(y+,y++*n)-(y+);
rep(i,,*n)
p[i].y=lower_bound(y+,y++k,p[i].y)-(y);
rep(i,,n)
ln[i].s.y=lower_bound(y+,y++k,ln[i].s.y)-(y),ln[i].e.y=lower_bound(y+,y++k,ln[i].e.y)-(y);
ll ans=;
zeros(c);
zeros(vis);
rep(i,,*n)
{
int dir=ln[p[i].id].dir;
if(dir==)
{
if(vis[p[i].id])
update(p[i].y,-);
else
{
vis[p[i].id]=;
update(p[i].y,);
}
}
else
{
if(vis[p[i].id])
continue;
vis[p[i].id]=;
ll temp=query(ln[p[i].id].e.y);
temp-=query(ln[p[i].id].s.y-);
ans+=temp;
}
}
ptlld(ans);
}
}
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(有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点+树状数组区间求和单点跟新)
传送门:Hdu 5862 Counting Intersections 题意:有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点 分析: 基本的操作流程是:先将所有的线段按照横树坐标x按小的 ...
- 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 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...
- HDU 5862 Counting Intersections(离散化 + 树状数组)
Counting Intersections Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- HDU 5862 Counting Intersections (离散化+扫描线+树状数组)
题意:给你若干个平行于坐标轴的,长度大于0的线段,且任意两个线段没有公共点,不会重合覆盖.问有多少个交点. 析:题意很明确,可是并不好做,可以先把平行与x轴和y轴的分开,然后把平行y轴的按y坐标从小到 ...
- HDU 5862(离散化+树状数组)
Problem Counting Intersections 题目大意 给定n条水平或竖直的线段,统计所有线段的交点个数. (n<=100000) 解题分析 首先将线段离散化. 然后将所有线段按 ...
- Counting Intersections
Counting Intersections Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- [hdu 6184 Counting Stars(三元环计数)
hdu 6184 Counting Stars(三元环计数) 题意: 给一张n个点m条边的无向图,问有多少个\(A-structure\) 其中\(A-structure\)满足\(V=(A,B,C, ...
随机推荐
- Discuz DB层跨库映射关系表名前缀BUG修复后产生的新bug
新的逻辑引入了新的bug,会导致在跨多库连接时,产生表名前缀映射混乱,需要再做逻辑上的修复. function table_name($tablename) { if(!empty($this-> ...
- [PHP] 自动加载的实现
基于psr的规范,使用命名空间和spl_autoload_register()来实现自动加载 文件结构: |--Api |--Account.php |--User.php|--Service |-- ...
- web安全——防火墙
简介 用于实现服务器(Linux)的访问控制的功能的. 分硬件和软件防火墙. 主要是控制访问的流入和服务器的流出. 通过黑名单和白名单的思想来实现更细粒度的控制,这个一般结合其他的应用来定义策略实现. ...
- js和html5实现画板
html5新添了一个重要又强大的标签元素<canvas>,该标签真有彻底替换掉flash的尽头,现在很多网页游戏就是用<canvas>完成的,下面代码就是用该标签制作的一个画板 ...
- CSS选择器特殊性与重要性
特殊性 在编写CSS代码的时候,我们会出现多个样式规则作用于同一个元素的情况,例如 <!-- HTML --> <header> <nav class="nav ...
- QT5中全屏显示子窗口和取消全屏的方法
问题描述:用QT5做了个MDI多窗体应用程序,想把子窗体全屏显示,用网上的方法,但总是遇到问题. 网上的解决方法原文在这:http://www.cnblogs.com/Rick-w/archive/2 ...
- UniversalApp启动页面设置
在新建的一个UniversalApp中,我在Shared项目下添加了一个页面,新建的页面名称为InitPage.xaml,现在我想把InitPage.xaml作为起始页,但是在配置文件中未找到设置启动 ...
- 再议使用Python批量裁切栅格
曾经写过<使用Python脚本批量裁切栅格>,但今天又遇到这个情况则发现了问题.我们遇到的实际问题往往是有一个需要裁剪的影像(大块的),另外有一个矢量面,现在需要按矢量面每一个要素进行裁剪 ...
- 自定义控件--CircleImageView(类似于QQ、微信圆形头像自定义控件)
现在基本上所有的需要用户注册的APP都有一个需要用户上传头像的需求,上传的头像基本都是类似于QQ.微信等社交应用圆形头像.最近,正在做的一个社交应用多处需要用到这种圆形头像的处理,总不能每次都对图片做 ...
- Struts2(十三)国际化-internationalization
一.国际化是什么--I18N 即internationalization 首字母i-结束字母n之间有18个字母 特征:在程序不做修改的情况下,可以根据不同的语言环境显示相应内容 二.Java内置国际化 ...