<题目链接>

题目大意:

有两个点集,这两个点集从上至下分别从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

最新文章

  1. java开发中JDBC连接数据库代码和步骤
  2. 浅谈C语言中结构体的初始化
  3. yii2输出sql语句
  4. Codeforces 722D. Generating Sets
  5. 计算div里面li个数
  6. ActionScript 3.0 for the Lunder Algorithm
  7. Linux File、File Directory IO Operation Summary(undone)
  8. 超级有用的9个PHP代码片段
  9. SQLite(快速上手版)笔记
  10. Android开发环境中的概念和工具介绍
  11. Windows server 2008下开启telnet功能
  12. pyqt 图片(label上显示
  13. Codeforces 482 - Diverse Permutation 构造题
  14. Linq to SQL 简单的增删改操作
  15. UESTC 1591 An easy problem A【线段树点更新裸题】
  16. objective-c随机数+日期格式显示一例
  17. Oracle SQL性能优化的40条军规
  18. Window上,启动Tomcat服务之后,关闭启动窗口,服务器也随之关闭
  19. (转)Lua的table库函数insert、remove、concat、sort详细介绍
  20. 按esc键 关闭模态框

热门文章

  1. Weblogic12c 单节点安装
  2. |&quot;|&amp;|&lt;|&gt;等html字符转义
  3. Confluence 6 任务的类型
  4. Confluence 6 关于嵌入的 H2 数据库
  5. 为什么在移动端用rem圆角不圆
  6. select下拉框可以直接取list里的内容 不用非得转map (不得不承认我是个ZZ,这么简单的问题才反应过来,--^--)
  7. Android Studio 删除多余的虚拟设备(Virtual Device)
  8. C++设计模式——观察者模式(转)
  9. JSON数据写入和解析
  10. 在 Windows服务器中启用/禁用SMBv1、SMBv2和SMBv3的方法