Hdu 5862 Counting Intersections(有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点+树状数组区间求和单点跟新)
传送门:Hdu 5862 Counting Intersections
题意:有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点
分析:
基本的操作流程是:先将所有的线段按照横树坐标x按小的优先排序,注意是所有的线段 ;(这里是将线段都去掉只保留两个端点) 然后从左到右的顺序经行扫描,遇到横的线段,如果是左端点对应的 yi 便++ , 若是右端点对应的y1便--; 遇到竖直的线段,便统计区间[y1,y2] 的数 , 看到这了是不是有点东西了呢?
如果我是按照x排序的话,两线段若想相交,最基本的就是竖线的横坐标必须要大于等于横线的左端点,小于横线的右端点了吧,而且这条横线产生的贡献很明显就是在这横线的y坐标上呢?所有上面的流程都是依此与这个原理;(注意需要离散化哈)
#include<bits/stdc++.h>
using namespace std;
const int maxn=*;
int t[maxn];
struct node{
int x,l,r,flag;
}e[maxn];
int C[maxn],m; bool cmp(node u,node v){
if(u.x==v.x)
return u.flag>v.flag;
return u.x<v.x;
} void add(int x,int v){
while(x<=m) C[x]+=v,x+=(x&-x);
} int sum(int x){
int ret=;
while(x>)
ret+=C[x],x-=(x&-x);
return ret;
} int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int x1,y1,x2,y2,Count=;
m=;
for(int i=;i<=n;i++){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1>x2)
swap(x1,x2);
if(y1>y2)
swap(y1,y2);
t[++m]=y1,t[++m]=y2;
if(x1==x2)//竖直
e[++Count]=(node){x1,y1,y2,};
else{
e[++Count]=(node){x1,y1,y2,};
e[++Count]=(node){x2,y1,y2,-};
}
}
sort(t+,t+m+);
m=unique(t+,t+m+)-t-;
sort(e+,e+Count+,cmp);
for(int i=;i<=m;i++)
C[i]=;
long long ans=;
for(int i=;i<=Count;i++){
if(e[i].flag==){
int l=lower_bound(t+,t+m+,e[i].l)-t-,r=lower_bound(t+,t+m+,e[i].r)-t;
ans+=sum(r)-sum(l);
}
else{
int num=lower_bound(t+,t+m+,e[i].l)-t;
add(num,e[i].flag);
}
}
printf("%lld\n",ans);
}
return ;
}
Hdu 5862 Counting Intersections(有n条线段,每一条线段都是平行于x轴或者y轴,问有多少个交点+树状数组区间求和单点跟新)的更多相关文章
- HDU 3333 Turing Tree 离线 线段树/树状数组 区间求和单点修改
题意: 给一个数列,一些询问,问你$[l,r]$之间不同的数字之和 题解: 11年多校的题,现在属于"人尽皆知傻逼题" 核心思想在于: 对于一个询问$[x,R]$ 无论$x$是什么 ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- NBOJv2 1050 Just Go(线段树/树状数组区间更新单点查询)
Problem 1050: Just Go Time Limits: 3000 MS Memory Limits: 65536 KB 64-bit interger IO format: % ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- 【树状数组区间修改单点查询】HDU 4031 Attack
http://acm.hdu.edu.cn/showproblem.php?pid=4031 [题意] 有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后 ...
- 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers
http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...
- 【Tyvj】1473校门外的树3 线段树/树状数组 <区间修改+单点访问>
描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,读入l,r表示在l ...
- HDU - 3584 Cube (三维树状数组 + 区间改动 + 单点求值)
HDU - 3584 Cube Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Subm ...
- hdu 1116 敌兵布阵(树状数组区间求和)
题意: 给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j). 输入: 首行输入一个t,表示共有t组数据. 接下来每行首行输入一个整数n,表示共有n个数字. ...
随机推荐
- Linux expect命令
一.简介 通过Shell可以实现简单的控制流功能,但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而就使用来实现这种功能的工具.Ex ...
- ZROI2018普转提day6t3
传送门 分析 居然卡哈希数,万恶的出题人...... 感觉我这个方法似乎比较呆,我的代码成功成为了全网最慢的代码qwq 应该是可以直接哈希的 但由于我哈希学的不好又想练练线段树维护哈希,于是就写了个线 ...
- EZOJ #78
传送门 分析 AC自动机板子题qwq 不过似乎可以哈希(因为所有模式串的长度相同,所以哈希乱搞就可以) 代码 #include<iostream> #include<cstdio&g ...
- .net中值类型、引用类型理解的c#代码示例
下面是以前在公司的时候给别人讲解值类型.引用类型时创建的c#代码示例,从实际使用时的角度出发,对于初学者还是很有帮助的.这里并没有深入讲解值类型包含引用类型成员时(如struct)在内存中的存放情况等 ...
- appium自动化安装(二)
第二节 安装Android开发环境 如果你的环境是MAC那么可以直接跳过这一节.就像我们在用Selenium进行web自动化测试的时候一样,我们需要一个浏览器来执行测试脚本.那么移动端自动化测试,我 ...
- java.io.FileNotFoundException: res/drawable/title_bar_shadow.9.png
ERROR/AndroidRuntime(803): Caused by: java.io.FileNotFoundException: res/drawable/title_bar_shadow.9 ...
- Date的转换输出
public static void main(String[] args) { // TODO Auto-generated method stub //20131111怎么格式化成2013年11月 ...
- ComicEnhancerPro 系列教程
这个系列教程实在太长了,图又多,所以我不认为它适合发布在博客上.目前最新版采用CHM格式发布,就放在置顶随笔提供的网盘里,与ComicEnhancerPro在一起.
- winform ComBox绑定数据
初始化数据: List<KeyValuePair<string, string>> list: ComBox1.ValueMember = "Key";Co ...
- c# 字符串填充占位
C# 字符串PadLeft函数的使用 1.Demo: 需求: 将111改变成0000111 使用字符串PadLeft函数可以解决: int num = 111; string s= num.ToSt ...