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线段树直接从叶子结点开始 ...
随机推荐
- .NET 调整图片尺寸(Resize)各种方法
本文中如无特别说明 .NET 指 .NET 5或者更高版本,代码同样可用于 .NET Core 前言 调整图片尺寸最常用的场景就是生成缩略图,一般为保持纵横比缩小,如果图片放大会使图片变得模糊,如果确 ...
- 解决ROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'creat table study_record( id int(11) not null
之前一直用的好好的,突然就出现了这个错误: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual tha ...
- 对于Update Function Modules的一点说明
To be able to call a function module in an update work process, you must flag it in the Function Bui ...
- USB限流IC,输入5V,输出5V,最大3A限流
USB限流芯片,5V输入,输出5V电压,限流值可以通过外围电阻进行调节,PWCHIP产品中可在限流范围0.4A-4.8A,并具有过压关闭保护功能. 过压关闭保护: 如芯片:PW1555,USB我们一半 ...
- 【pytest】(十)fixture参数化-巧用params和ids优雅的创建测试数据
我们都知道参数化. 比如我要测试一个查询接口/test/get_goods_list,这个接口可以查询到商品的信息. 在请求中,我可以根据请参数goods_status的不同传值,可以查询到对应状态的 ...
- proxmox ve系统绑定上联外网出口bond双网卡
背景描述:一个客户搭建proxmox ve系统,要求上联出口双网卡绑定bond, proxmox ve下载地址:超链接 记录日期:2020/5/9 前期准备:服务器接好2个网卡 交换机:H3C 1.p ...
- Spark底层原理详细解析(深度好文,建议收藏)
Spark简介 Apache Spark是用于大规模数据处理的统一分析引擎,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上, ...
- fastjson的deserializer的主要优化算法 漏洞
JSON最佳实践 | kimmking's blog http://kimmking.github.io/2017/06/06/json-best-practice/ Fastjson内幕 Java综 ...
- DDD领域驱动设计:领域事件
1 前置阅读 在阅读本文章之前,你可以先阅读: DDD领域驱动设计是什么 DDD领域驱动设计:实体.值对象.聚合根 DDD领域驱动设计:仓储 MediatR一个优秀的.NET中介者框架 2 什么是领域 ...
- Java面试,面试题
Java面试,面试题 HashMap,HashTable,ConcurrentHash的共同点和区别 HashMap HashTable ConcurrentHashMap ArrayList和Lin ...