poj_3067 树状数组
题目大意
左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M。现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个数(左右竖排上的点不算做交点)。
给出N,M,K,以及K条线的起点和终点。
题目分析
求两两交点的问题最好固定顺序,如i和i之前的交点,这样便于统计而不重复不遗漏。在将K条线按照左边点从小到大的顺序进行排序,左边点相同按照右边点从小到大排序之后,按照顺序分析当前线和它之前的线的交点个数:
当前线k的左边点序号为 xa, 右边点序号为 ya, 则对于当前线k之前的那些线1--k-1,他们左边点的序号肯定小于等于xa, 这些线(1--k-1)中右边点序号大于 ya的那些线会和当前线k有一个交点。因此对于当前线k,统计之前1---k-1线的右边点在 [ya + 1--M]中的个数,形成了一个区间统计问题。
考虑右边点1,2....M 各对应一个统计变量 count[i], 每次分析线k,都将线k的右边点ya 对应的count[ya] ++。 这样,每次都统计 [t, M]区间内 count[i]的和。 使用树状数组来实现。
实现(c++)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define MAX_CITY_NUM 1002 struct Highway{
int east_city;
int west_city;
Highway(int e, int w):
east_city(e), west_city(w){
}
};
vector<Highway> gHws;
int gC[MAX_CITY_NUM];
int gLowbit[MAX_CITY_NUM]; bool Cmp(const Highway& h1, const Highway& h2){
if (h1.east_city == h2.east_city)
return h1.west_city < h2.west_city;
return h1.east_city < h2.east_city;
} void InitLowbit(int n){
for (int i = 1; i <= n; i++){
gLowbit[i] = i&(-i);
}
}
void InitSequence(int n){
memset(gC, 0, sizeof(gC));
} void Update(int k, int n, int add){
while (k <= n){
gC[k] += add;
k += gLowbit[k];
}
} int Query(int k){
int result = 0;
while (k > 0){
result += gC[k];
k -= gLowbit[k];
}
return result;
} int main(){
int cas, N, M, K, e_city, w_city;
scanf("%d", &cas);
InitLowbit(1001);
for (int c = 1; c <= cas; c++){
scanf("%d %d %d", &N, &M, &K);
gHws.clear();
InitSequence(M);
for (int i = 1; i <= K; i++){
scanf("%d %d", &e_city, &w_city);
gHws.push_back(Highway(e_city, w_city));
}
sort(gHws.begin(), gHws.end(), Cmp);
long long int crossing = 0;
for (int i = 0; i < K; i++){
crossing += (Query(M) - Query(gHws[i].west_city));
Update(gHws[i].west_city, M, 1);
}
printf("Test case %d: %lld\n", c, crossing);
}
return 0;
}
poj_3067 树状数组的更多相关文章
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
- 【Codeforces163E】e-Government AC自动机fail树 + DFS序 + 树状数组
E. e-Government time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...
- 【BZOJ-3881】Divljak AC自动机fail树 + 树链剖分+ 树状数组 + DFS序
3881: [Coci2015]Divljak Time Limit: 20 Sec Memory Limit: 768 MBSubmit: 508 Solved: 158[Submit][Sta ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
随机推荐
- 3dMax常见问题
误关掉了命令面板顶部菜单栏[自定义]->[显示UI]->勾选上命令面板 调整右侧命令面板的位置鼠标放在命令面单顶部,当显示两个长方形时,可以鼠标左键拖动. 命令面板拖动后可以停 ...
- 一站式学习Wireshark(六):狙击网络高延时点
在某些情况下,丢包可能并不是造成延时的原因.你可能会发现尽管两台主机之间通讯速度很慢,但这种慢速并没有伴随着TCP重传或是重复ACK的征兆.在这种情况下,需要使用另一种方式来定位高延时点. 查找高延时 ...
- linux访问ftp服务器命令
在linux访问时输入 用户名 anonymous 密码直接回车可以匿名登录 如果传输非文本,先输入bianry,然后再get就可以了 比如 ftp> get 5-4.tif 227 Enter ...
- KBEngine 服务器端-loginapp-协议构建、解析执行详细介绍
宏宏宏 由于 C++ 是静态语言,不能像 js 一样通过函数名字符串来直接执行函数,所以将 messageId 映射到可执行函数的复杂性大大提升:KBEngine 使用了一系列精巧的「宏」来解决这个问 ...
- 可供前端工程师选择的精彩CSS框架
在这里你有一个很酷的框架,收集创建的CSS布局. 如果你不喜欢框架,宁愿使用自己的手写代码以促进自己的发展,请跳过本篇文章. 我想有一个建设性的意见,那就是有选择的使用其优点避开其缺点. 就个人而言, ...
- 关于C++输出中文乱码的解决方案
把页面编码转换为UTP-8的编码 1.打开G:\vs2013way\VC\vcprojectitems目录 在 file.h newc++file.cpp 中写两句话 #pragma once#pra ...
- 中国餐馆过程(Chinese restaurant process)
也就是说假设空桌子有a0个人,然后顾客选择桌子的概率和桌子上人数成正比. 性质: 改变用户的排列方式,桌子的排列方式,概率不变换.
- C的内存四大区
前提 看视频得来的内容,只知道不止4个区,但主要是这4个区. 四区 静态区 用于存放所有的全局变量和静态变量. ; //静态区 int main(){ ; //静态区 ; } 代码区 就是存放程序的执 ...
- Building a Non-blocking TCP server using OTP principles
转自:https://erlangcentral.org/wiki/index.php/Building_a_Non-blocking_TCP_server_using_OTP_principles ...
- ini 文件操作记要(2): 使用 TMemIniFile
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...