8.16-----japan
来源:互联网 发布:全球雾霾数据统计 编辑:程序博客网 时间:2024/06/15 04:33
Description
Input
Output
Test case (case number): (number of crossings)
Sample Input
13 4 41 42 33 23 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 2047struct 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;}
出处:http://blog.csdn.net/u012860063
- 8.16-----japan
- japan
- Japan
- Japan
- Japan
- Japan
- japan
- fuck japan
- H - Japan
- poj3067 Japan
- POJ3067 Japan
- poj_3067 Japan
- F,Japan
- POJ3067 Japan
- poj3067 Japan
- 2 Japan
- poj3067 Japan
- poj3067 Japan
- Windows下安装python
- imageloader
- Eclipse创建Mavenx项目抛错--maven-archetype-quickstart:1.1
- 常用数学符号的 LaTeX 表示方法 (以下内容主要摘自“一份不太简短的 LATEX2e 介绍”) 1、指数和下标可以用^和_后加相应字符来实现。比如: 2、平方根(square root)
- 使用hibernate框架制作学生信息查询(多表查询)
- 8.16-----japan
- poj-2376--Cleaning Shifts--(贪心)
- 网络安全之概述
- JS中的prototype
- hdoj 1515 Anagrams by Stack(dfs)
- 使用w3c生成xml文件
- 电脑通过wifi连接树莓派3
- animation.css的使用
- 剑指offer——24.二叉树中和为某一值的路径