poj 3067 Japan 【树状数组】
2024-08-27 03:59:59
<题目链接>
题目大意:
有两个点集,这两个点集从上至下分别从1~n,1~m编号,现在给出n组数据,(x,y),表示左边点集编号为x的点与右边点集编号为y的点相连,现在要求计算这些线段的交点个数。
解题分析:
先将这些线段的x变量从小到大排序,若x相同,再将y从小到大排序。然后就可以直接遍历这些线段了,同时对y变量建一维树状数组,利用sum(m)-sum(node[i].y)可以很容易求出之前插入的所有线段的y值中,有多少线段的y值大于当前插入的y值,这一步相当于对排好序的线段的y值进行逆序数的求解,因为之前插入线段的x必然小于等于当前线段的x值,所以这些y值还大于node[i].y的线段必然会与当前线段产生一个交点。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
const int M =1e6+;
int n,m,k;
int tr[M];
struct NODE{
int x,y;
bool operator <(const NODE &tmp)const{
if(x==tmp.x)return y<tmp.y;
else return x<tmp.x;
}
}node[M];
inline int lowbit(int x){return x&(-x);}
void add(int i,int val){
while(i<=m){
tr[i]+=val;
i+=lowbit(i);
}
}
int sum(int i){
ll ans=;
while(i>){
ans+=tr[i];
i-=lowbit(i);
}
return ans;
}
int main(){
int T,ncase=;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++){
scanf("%d%d",&node[i].x,&node[i].y);
}
sort(node+,node++k);
memset(tr,,sizeof(tr));
ll ans=;
for(int i=;i<=k;i++){
ans+=sum(m)-sum(node[i].y); //sum(m)表示之前插入所有线段的个数,sum(node[i],y)表示之前插入的所有y值小于等于node[i].y的线段个数,因此sum(m)-sum(node[i].y)求得的是之前插入的y值中,比当前node[i].y大的线段的个数
//因为在该数之前插入树状数组的x值都小于等于当前线段的x值,所以这样可以求出所有线段相交的个数。
add(node[i].y,);
}
printf("Test case %d: %lld\n",++ncase,ans);
}
return ;
}
2018-10-17
最新文章
- java开发中JDBC连接数据库代码和步骤
- 浅谈C语言中结构体的初始化
- yii2输出sql语句
- Codeforces 722D. Generating Sets
- 计算div里面li个数
- ActionScript 3.0 for the Lunder Algorithm
- Linux File、File Directory IO Operation Summary(undone)
- 超级有用的9个PHP代码片段
- SQLite(快速上手版)笔记
- Android开发环境中的概念和工具介绍
- Windows server 2008下开启telnet功能
- pyqt 图片(label上显示
- Codeforces 482 - Diverse Permutation 构造题
- Linq to SQL 简单的增删改操作
- UESTC 1591 An easy problem A【线段树点更新裸题】
- objective-c随机数+日期格式显示一例
- Oracle SQL性能优化的40条军规
- Window上,启动Tomcat服务之后,关闭启动窗口,服务器也随之关闭
- (转)Lua的table库函数insert、remove、concat、sort详细介绍
- 按esc键 关闭模态框
热门文章
- Weblogic12c 单节点安装
- |";|&;|<;|>;等html字符转义
- Confluence 6 任务的类型
- Confluence 6 关于嵌入的 H2 数据库
- 为什么在移动端用rem圆角不圆
- select下拉框可以直接取list里的内容 不用非得转map (不得不承认我是个ZZ,这么简单的问题才反应过来,--^--)
- Android Studio 删除多余的虚拟设备(Virtual Device)
- C++设计模式——观察者模式(转)
- JSON数据写入和解析
- 在 Windows服务器中启用/禁用SMBv1、SMBv2和SMBv3的方法