转载请注明出处:http://blog.csdn.net/u012860063

题目链接:

id=3067">http://poj.org/problem?

id=3067

Description

Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coast and M cities on the West coast (M <= 1000, N <= 1000). K superhighways will be build. Cities on each coast
are numbered 1, 2, ... from North to South. Each superhighway is straight line and connects city on the East coast with city of the West coast. The funding for the construction is guaranteed by ACM. A major portion of the sum is determined by the number of
crossings between superhighways. At most two superhighways cross at one location. Write a program that calculates the number of the crossings between superhighways.

Input

The input file starts with T - the number of test cases. Each test case starts with three numbers – N, M, K. Each of the next K lines contains two numbers – the numbers of cities connected by the superhighway. The first one is the number of the city on the
East coast and second one is the number of the city of the West coast.

Output

For each test case write one line on the standard output: 

Test case (case number): (number of crossings)

Sample Input

1
3 4 4
1 4
2 3
3 2
3 1

Sample Output

Test case 1: 5

Source

题意:日本岛东海岸与西海岸分别有N和M个城市,如今修快速公路连接东西海岸的城市,求交点个数。

做法:(做法的解释来自:http://blog.csdn.net/weiguang_123/article/details/7895848)记每条告诉公路为(x,y),
即东岸的第x个城市与西岸的第y个城市修一条路。当两条路有交点时,满足(x1-x2)*(y1-y2) < 0。所以,将每条路按x从小到达排序,若x同样,按y从小到大排序。 然后按排序后的公路用树状数组在线更新。求y的逆序数之 和 即为交点个数。

上面说的可能有点难理解,具体说明例如以下。

记第i条边的端点分别为xi,yi。

由于x是从小到大排序的,如果当前我们在处理第k条边,那么第1~k-1条边的x必定是小于(等于时候暂且不讨论)第k条边的 x 的。那么前k-1条边中,与第k条边相交的边的y值必定大于yk的,所以此时我们仅仅须要求出在前k-1条边中有多少条边的y值在区间[yk, M]就可以,也就是求yk的逆序数,M为西岸城市个数,即y的最大值。

所以就将问题转化成区间求和的问题,树状数组解决。当两条边的x同样时,我们记这两条边的y值分别为ya,yb(ya<yb),我们先处理(x,ya),再处理(x,yb),原因非常明显,由于当x同样时。这两条边是觉得没有交点的,若先处理(x,yb)。那么下次处理(x。ya)时,(x,ya)就会给(x,yb)添加一个逆序,也就是将这两条边做相交处理了。

代码例如以下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k;
#define MAX 2047
struct node
{
int l,r;//分别为左端点和右端点
}line[MAX*MAX];//快速公路的结构
int c[MAX];//树状数组
bool cmp( node a, node b)
{
if(a.l==b.l)
{
return a.r<b.r;
}
return a.l<b.l;
}
int Lowbit(int x) // 2^k
{
return x&(-x);
}
void update(int i, int x) //i点增量为x
{
while(i <= m)
{
c[i] += x;
i += Lowbit(i);
}
}
__int64 sum(int x)
{
__int64 sum=0;
while(x > 0)
{
sum += c[x];
x -= Lowbit(x);
}
return sum;
}
int main()
{
int t, i;
scanf("%d",&t);
int tt=1;
while(t--)
{
scanf("%d %d %d",&n,&m,&k);
for(i = 1; i <= k; i++) //i须从1開始
{
scanf("%d%d",&line[i].l,&line[i].r);//输入
}
sort(line+1,line+k+1,cmp);//依照l的从小到大排序,l同样时按r的从小到大排序,
//这样就形成了r的一维树状数组
memset(c,0,sizeof(c));
__int64 ret=0;//最后结果
for(i = 1; i <= k; i++) //i须从1開始
{
update(line[i].r,1);//插入树状数组中
ret+=i-sum(line[i].r);//i为当前已插入的元素的个数。sum返回了小于等于当前r值的元素个数,
//相减即为满足条件的元素个数
}
printf("Test case %d: %lld\n",tt++,ret);
}
return 0;
}

poj3067 Japan(树状数组)的更多相关文章

  1. poj3067 Japan 树状数组求逆序对

    题目链接:http://poj.org/problem?id=3067 题目就是让我们求连线后交点的个数 很容易想到将左端点从小到大排序,如果左端点相同则右端点从小到大排序 那么答案即为逆序对的个数 ...

  2. poj 3067 - Japan(树状数组)

    先按第一个数从大到小排序,相等的情况下,第二个数按照从大到小排序..... 预处理后,照着树状数组写就行了... 注意:k的最大值应取1000*1000 代码如下: include <cstdi ...

  3. cdoj 383 japan 树状数组

    Japan Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/383 Descrip ...

  4. poj-3067(树状数组)

    题目链接:传送门 题意:日本有东城m个城市,西城m个城市,东城与西城相互连线架桥,判断这些桥相交的次数. 思路:两个直线相交就是(x1-x2)*(y1-y2)<0,所以,对x,y进行排序,按照x ...

  5. POJ 3067 Japan 树状数组求逆序对

    题目大意:有两排城市,这两排城市之间有一些路相互连接着,求有多少条路相互交叉. 思路:把全部的路先依照x值从小到大排序,x值同样的依照y值从小到大排序,然后插入边的时候,先找有多少比自己y值小的,这些 ...

  6. POJ 3067 Japan (树状数组 && 控制变量)

    题意: 西海岸和东海岸有分别有n (1~n)个和m (1~m)个城市, 两个海岸的城市之间有k条公路连通, 公路会相交, 现在给出城市和公路的信息问你由这些公路组成的复杂交通有多少个交点 (如果两个条 ...

  7. POJ 3067 Japan (树状数组求逆序对)

    POJ - 3067 题意:有(1-n)个城市自上到下在左边, 另有(1-m)个城市自上到下在右边,共有m条高速公路,现求这m条直线的交点个数,交点不包括在城市处相交. 题解:先将高速公路读入,然后按 ...

  8. POJ 3067 Japan(树状数组)

                                                                                  Japan   Time Limit: 10 ...

  9. POJ 3067 - Japan - [归并排序/树状数组(BIT)求逆序对]

    Time Limit: 1000MS Memory Limit: 65536K Description Japan plans to welcome the ACM ICPC World Finals ...

随机推荐

  1. git/github运用

    了解git和svn很久了,但是一直没有拿来做过版本控制管理,虽然svn有用到过,但是觉得还是运用git的比较多吧,尤其github. Git术语                             ...

  2. SqlServer 删除重复记录

    在给一个客户上线的系统里发现有一张表里出现了重复的数据,结果通过排查代码发现确实业务逻辑有问题,在修改了代码后需要将为数据库里的重复数据删除 在CSDN上找到解决方案,对线上的数据库尽量不要执行删除操 ...

  3. 表结构设计器(EZDML)1.98版公布

    表结构设计器(EZDML)是一个免费的数据库建表的小软件,可高速的进行数据库表结构设计.建立数据模型,能迅速生成代码模板.简单界面和字典文档,支持脚本编程. 新版本号大概有下面改进: 1.修复了部 ...

  4. Linux下双物理网卡设置成虚拟网卡

    为了提供网络的高可用我们须要将多块网卡绑定设置成一块虚拟的网卡对外提供服务,这样能够防止一块网卡损坏或者防止网线连接故障造成的连接中断. 以下我们使用eth0与eth1来虚拟成为bond0为例:--- ...

  5. C#基础视频教程3.3 常见控件类型和使用方法

    前面介绍了微软的控件,也介绍了几个第三方控件,那么这些控件是如何做出来的?即便我们自己不做控件,也至少要理解控件的原理. 如果要创建一个自定义控件,首先新建一个C#下面的Windows窗体控件库   ...

  6. 从零开始编写自己的C#框架(25)——网站部署 【转】

    服务器安全部署文档 目录1.     前言.. 3 2.     部署环境.. 3 2.1         服务器环境信息.. 3 3.     磁盘阵列配置.. 4 4.     安装操作系统.. ...

  7. UNIX网络编程学习笔记:值-结果(value-result)参数

    前言 当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针.结构的长度也作为参数来传递,其传递的方式取决于结构的传递方向:从进程到内核,还是从内核到进程. 1.从进 ...

  8. Adobe Audition3.0 找不到所支持的音频设备 请检查您的音频设置

      Adobe Audition 找不到所支持的音频设备 请检查您的音频设置   解决方案:   运行regedit,打开注册表编辑器,定位到 HKEY_CLASSES_ROOT\CLSID\{AB7 ...

  9. Ubuntu14.04怎样使用root登录

    1.打开终端 2.sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 3.在弹出的编辑框里输入:greeter-show-manua ...

  10. 使用 Tmux 强化终端功能

    来自 tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需 ...