题目大意

左右两个竖排,左边竖排有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 1002struct 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;
}

转载于:https://www.cnblogs.com/gtarcoder/p/4794694.html

poj_3067 树状数组相关推荐

  1. 洛谷 P5057 [CQOI2006]简单题(树状数组)

    嗯... 题目链接:https://www.luogu.org/problem/P5057 首先发现这道题中只有0和1,所以肯定与二进制有关.然后发现这道题需要支持区间更改和单点查询操作,所以首先想到 ...

  2. Color the ball(HDU1556)树状数组

    每次对区间内气球进行一次染色,求n次操作后后所有气球染色次数. 树状数组,上下区间更新都可以,差别不大. 1.对于[x,y]区间,对第x-1位减1,第y位加1,之后向上统计 #include<b ...

  3. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  4. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  5. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  6. Equalizing Two Strings 冒泡排序or树状数组

    首先考虑排序后相等 如果排序后相等的话就只考虑reverse长度为2的,所以a或者b排序后存在相邻两个字母相等的话就puts YES,n>26也直接puts YES 不然的话就假设c为a,b排完 ...

  7. Hdu 6534 Chika and Friendly Pairs 莫队算法+树状数组

    题目链接 题意求给区间[L,R]中有少对(i,j)满足i<j且abs(a[i]-a[j])<=k. 首先来说暴力的方法就是离散化,然后用树状数组来维护,但是m次询问,m很大,所以说一定会t ...

  8. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  9. 【模板】树状数组 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

最新文章

  1. ffmpeg frei0r filter 参数及效果
  2. netstat 命令state值
  3. java做服务器端给客户端传数据包_java 服务器怎样给客户端传输数据
  4. 原创|面试官:线上服务器CPU占用率高如何排查定位问题?
  5. Excel 批量处理行高(图文教程) - Excel篇
  6. [每日一题] 11gOCP 1z0-052 :2013-09-24 temporary tables.........................................C11...
  7. 文件摆渡是什么意思_数据摆渡是什么意思?如何确保安全性?
  8. 9.2. FreeSWITCH
  9. Pylot——跨平台的网站压力测试工具
  10. 迎接蜕变,期待 Internet Exploer 9
  11. 一加会不会适配鸿蒙系统,或将适配高通平台 传闻一些手机厂商正接触华为鸿蒙OS计划适配...
  12. Python爬取中国天气网天气数据
  13. java记事本的代码_Java基础——第一个记事本代码与Java注释
  14. verilog 语法笔记
  15. iOS之UITableView的使用——多分区表格以及分区索引
  16. 神山的方向至诚地祈祷、朝拜
  17. ZOJ - 3939
  18. 计算机网络—URL到显示的过程、Http、Https、长连接短连接
  19. 一款功能强大的开源excel在线表格
  20. 计算机三级信息安全知识点

热门文章

  1. mongo报错:not authorized on bb to execute command { create: \“xxx\“...}
  2. linux启动,重启,停止 jar,.sh脚本
  3. pytorch 与 numpy 的数组广播机制
  4. ImportError: No module named tensorflow.compat.v1 忽略已经安装的某个包版本 忽略已安装版本...
  5. ImportError: DLL load failed: 找不到指定的模块。 TensorFlow 1.13
  6. Python机器学习——DBSCAN聚类
  7. LeetCode简单题之Excel 表中某个范围内的单元格
  8. LeetCode简单题之复写零
  9. OpenCL™(开放计算语言)概述
  10. TensorFlow分布式(多GPU和多服务器)详解