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线段树直接从叶子结点开始 ...
随机推荐
- mmall商城分类模块总结
后台分类model的开发具体功能有:添加分类名称,修改分类名称,查询所有子分类,查询父分类以及它下面的子分类(递归) 需要注意的是,在后台管理进行操作的时候,都需要验证当前用户是否是管理员的角色,不管 ...
- Python基础语法2-数据类型
一,数字. 2. 字符串类型 3.列表 4.元组 5.集合 6.字典 7.数据类型转换: 8.序列操作
- 配置 Docker 镜像加速源地址
docker 安装官方文档 根据实例的操作系统类型,参考相应的文档进行安装. 查看 linux 是 CentOS 还是 Ubuntu uname -a #查看系统信息 lsb_release -a # ...
- kubernets之Deployment资源
一 声明式的升级应用 1.1 回顾一下kubernets集群里面部署一个应用的形态应该是什么样子的,通过一副简单的图来描述一下 通过RC或者RS里面的模板创建了三个pod,之后通过一个servci ...
- 使用sqluldr2进行oracle数据库抽取时执行后无反应,也无日志
使用sqluldr2进行oracle数据库表数据抽取时遇到执行后无反应,也不报错,也无日志输出的情况. 经过排查之后发现时由于oracle账户密码快要过期导致的(这也能出问题,我服,类似的plsql连 ...
- ctfhub技能树—信息泄露—git泄露—Log
什么是git泄露? 当前大量开发人员使用git进行版本控制,对站点自动部署.如果配置不当,可能会将.git文件夹直接部署到线上环境.这就引起了git泄露漏洞. 打开靶机环境 查看网页内容 使用dirs ...
- oracle绑定变量测试及性能对比
1.创建测试数据 2.查看cursor_sharing的值 SQL> show parameter cursor_sharing; NAME TYPE VALUE --------------- ...
- RecyclerView 源码分析(二) —— 缓存机制
在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...
- kafka项目经验之如何进行Kafka压力测试、如何计算Kafka分区数、如何确定Kaftka集群机器数量
@ 目录 Kafka压测 Kafka Producer(生产)压力测试 Kafka Consumer(消费)压力测试 计算Kafka分区数 Kafka机器数量计算 Kafka压测 用Kafka官方自带 ...
- unstable sort
$sort (aggregation) - MongoDB Manual https://docs.mongodb.com/manual/reference/operator/aggregation/ ...