K - Japan(线段树)
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.
输入:
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.
输出:
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
题意:
就是从一个地方到另一个地方要修一些路,每一个地方有一些城市,路就是在这些城市之间修筑的
1 1
2 2
3 3
4 4
A地方 B地方
这像这样在城市之间建路,问最后这些路有多少个交叉点
做法:
对于求逆序对可以用线状数组还可以用线段树,这里我们主要说线段树方法
只有两个地方对应的城市连起来才会交叉口为0(前提是两个地方的城市数目一样),所以我们只需要将他们从原来的乱序,排序到他们的逆序对为0即可
逆序对就是在一个序列a、b、c、d。如果a>b(或他们任意两个数前面的大于后面的)就成为一个逆序对
可以看一下归并排序,他的算法就可以求出来一个序列中的逆序对的数目
但是这个只能求一个序列的逆序数,但是我们这个题目是两个数的连接
所以我们可以把他们转化成求一个序列的逆序对
我们知道两条路
a——b
c——d
当a<c && b>d的时候会出现交叉,当然不止这一种,但是我们可以对A/B两个地方中的一个进行排序(我按的从小到大),然后再求另一个地方的逆序对
线段树操作:
就是如果这个城市在这个区间中那么这个区间就加一
注意:
要先查找再去更新
因为我们是让A地方的城市从小到大,所以只要前面A地方的城市连接B地方的城市的次序大于目前这个,那么他们就会有交点
//思路:这题画个图就一目了然了,我们将获得所有边以y坐标从小到大排序,
//如果y坐标相同,则x坐标小的排在前面。那么我们当前扫描到的xi,yi边有多少个交点?
//只要看xi前面有多少个xj(j<=i-1)是大于xi的就行。这就是xi的逆序数。
//该题就转化为求排序后的x坐标的逆序数之和了。结果要用long long保存。
//只要知道这个思路,那么树状数组和线段树都可以做
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000005;
int sum[maxn<<2];
struct shudui
{
int l,r;
}w[maxn];
bool mmp(shudui x,shudui y)
{
if(x.l==y.l)
return x.r<y.r;
else return x.l<y.l;
}
void update(int L,int l,int r,int rt)
{
if(l>L || L>r) return;
sum[rt]++;
if(l==r) return; //注意加这一句,要不然循环出不来
int mm=(l+r)>>1;
update(L,l,mm,rt<<1);
update(L,mm+1,r,rt<<1|1);
}
int query(int L,int l,int r,int rt)
{
if(L>r) return 0;
if(L<=l) return sum[rt];
int mm=(l+r)>>1;
return query(L,l,mm,rt<<1)+query(L,mm+1,r,rt<<1|1);
}
int main()
{
int t,p=0;
long long ans=0;
scanf("%d",&t);
while(t--)
{
p++;
ans=0;
memset(sum,0,sizeof(sum));
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<k;++i)
{
scanf("%d%d",&w[i].l,&w[i].r);
}
sort(w,w+k,mmp);
int maxx=max(m,n);
for(int i=0;i<k;++i)
{
//printf("%d**\n",w[i].r);
ans+=(long long)query(w[i].r+1,1,maxx,1);
update(w[i].r,1,maxx,1);
}
printf("Test case %d: %lld\n",p,ans);
}
return 0;
}
K - Japan(线段树)的更多相关文章
- POJ3067:Japan(线段树)
Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for th ...
- zoj 2112 Dynamic Rankings 动态第k大 线段树套Treap
Dynamic Rankings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/show ...
- HDU - 6521 Party (SYSU校赛K题)(线段树)
题目链接 题意:n个人排成一列,一开始他们互不认识,每次选[l,r]上的人开party,使他们互相认识,求出每次party之后新互相认识的人的对数. 思路:把“互相认识”变成单向连边,只考虑左边的人对 ...
- UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...
- 主席树(可持久化线段树) 静态第k大
可持久化数据结构介绍 可持久化数据结构是保存数据结构修改的每一个历史版本,新版本与旧版本相比,修改了某个区域,但是大多数的区域是没有改变的, 所以可以将新版本相对于旧版本未修改的区域指向旧版本的该区域 ...
- CodeForces Round #179 (295A) - Greg and Array 一个线段树做两次用
线段树的区间更新与区间求和...一颗这样的线段树用两次... 先扫描1~k...用线段树统计出每个操作执行的次数... 那么每个操作就变成了 op. l , op.r , op.c= times* ...
- HDU 5107 线段树扫描线
给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...
- FZU2176(二维线段树+dfs)
传送门:easy problem 题意:给定一棵n个节点以1为根的树,初始每个节点的值为0,现在我们要在树上进行一些操作,操作有两种类型. 1 x val 表示对以x为根的子树的每个点进行加权操作(我 ...
- hdu 1166 敌兵布阵(线段树详解)
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- zkw线段树学习笔记
zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...
随机推荐
- 【Qt】实现程序重启的两种方法
Qt5/PyQt5 实现程序重启的两种方法 前言 最近在写一个开源项目,需要实现一个程序自动重启的功能.尝试了好几种方式,效果均不太理想. 一开始的实现思路是,记为思路一吧.大概就是写一些 shell ...
- 剑指offer 面试题10.2:青蛙变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下 ...
- 二进制格式 PLY 模型文件的读取与渲染
PLY 文件头部信息: ply format binary_little_endian 1.0 comment VCGLIB generated element vertex 13469 proper ...
- Head First 设计模式 —— 12. 状态 (State) 模式
思考题 public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUARTER = 1; fi ...
- Mac配置jmeter环境变量
#JAVA_HOME#JMETER_HOMEexport JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents ...
- 【Linux】添加硬盘不需要重启服务器
添加硬盘之后,不用重启服务器 执行下面的语句 ls /sys/class/scsi_host 查看下面有多少host 我这里有三个host 分别执行 echo "- - -" &g ...
- 4、python+selenium实现12306模拟登录
简介: 这里是利用了selenium+图片识别验证,来实现12306的模拟登录,中间也参考了好几个项目,实现了这个小demo,中间也遇到了很多的坑,主要难点在于图片识别和滑动验证这两个方面,图片识别是 ...
- Chrome Performance性能分析面板使用
最近做的项目都是内嵌egret游戏,想在移动端监测下它的性能,于是就开始了对Performance的探索: 一.使用 打开控制台,一顿操作: 网络选择Fast 3G,模拟手机普通3G环境,虽然现在大家 ...
- ABAP中SQL语句,指定索引(oracle)
①常用的两种方法: 1.指定使用全表扫描:%_HINTS ORACLE 'FULL(table_name)' 表示扫描整个表 2.指定索引:%_HINTS ORACLE 'INDEX("ta ...
- UVM基础总结——基于《UVM实战》示例
一.前言 工作一直在做SoC验证,更关注模块间的连接性和匹配性,所以相比于擅长随机约束激励的UVM来说,定向测试的概念更容易debug.当然前提是IP已经被充分验证.因此觉得接触UVM的机会较少.到现 ...