二维平面上N个点之间共有C(n,2)条连线。求这C(n,2)条线中斜率小于0的线的数量。

二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y)。例如:(2,3) (3,4) (1,5) (4,6),其中(1,5)同(2,3)(3,4)的连线斜率 < 0,因此斜率小于0的连线数量为2。

Input

第1行:1个数N,N为点的数量(0 <= N <= 50000) 
第2 - N + 1行:N个点的坐标,坐标为整数。(0 <= Xii, Yii <= 10^9)

Output

输出斜率小于0的连线的数量。(2,3) (2,4)以及(2,3) (3,3)这2种情况不统计在内。

Sample Input

4
2 3
3 4
1 5
4 6

Sample Output

2

题意如上。

思路

对所有的点根据优先y从小到大,y相同时x从小到大排序。对于每个点与前面的点形成的斜率小于0的线的数量即是y小于该点的点的数量减去x比改点小的点的数量,所有的点相加即得出答案。而比点的x小的点可以用树状数组维护,也可以用归并排序直接求逆序对的数量。

值得一提的是。如果数组开小了,51nod会返回超时,所以如果返回了超时,可以先看看是不是因为自己的数组开小了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define endl '\n'
#define lowbit(x) (x&(-x))
#define sc(x) scanf("%lld",&x)
const int size=1e5+5;
typedef long long LL;
struct Point{LL x;LL y;friend bool operator<(Point a,Point b){if(a.y==b.y) return a.x<b.x;return a.y<b.y;}
}p[size];
using namespace std;
LL arr[size];
LL id[size];
LL cnt[size];
LL Cnt=0;
void Update(LL Id)
{while(Id<=Cnt){cnt[Id]++;Id+=lowbit(Id);}
}
LL num(LL Id)
{LL ans=0;while(Id>0){ans+=cnt[Id];Id-=lowbit(Id);}return ans;
}
int main()
{LL n;while(~scanf("%lld",&n)){for(LL i=1;i<=n;i++){sc(p[i].x),sc(p[i].y);arr[i]=p[i].x;}sort(p+1,p+n+1);sort(arr+1,arr+1+n);Cnt=unique(arr+1,arr+1+n)-arr-1;for(LL i=1;i<=n;i++) id[i]=lower_bound(arr+1,arr+1+Cnt,p[i].x)-arr;LL ans=0;int l=1;Update(id[1]);for(LL i=2;i<=n;i++){LL Id=id[i];ans+=i-1-num(Id);Update(id[i]);}printf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/fly-white/p/10092750.html

斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)相关推荐

  1. 树状数组 + 离散化 求逆序对数量

    AcWing 788. 逆序对的数量 #include <bits/stdc++.h> using namespace std;typedef long long ll; const in ...

  2. ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  3. NOI.AC#2139-选择【斜率优化dp,树状数组】

    正题 题目链接:http://noi.ac/problem/2139 题目大意 给出nnn个数字的序列aia_iai​.然后选出一个不降子序列最大化子序列的aia_iai​和减去没有任何一个数被选中的 ...

  4. leetcode315. 计算右侧小于当前元素的个数(树状数组解法)

    leetcode315. 计算右侧小于当前元素的个数(树状数组解法) 题目:给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 ...

  5. 线。段。树--树状数组-主席树

    简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...

  6. 51nod P3121 小陶与杠铃片【树状数组】

    题目 思路 这道题其实是求逆序对个数 为什么呢? 因为只能选相邻两片杠铃,那么这就是一个逆序对不断减少的过程,逆序对数量为零那么就排好序了. 而求逆序对个数显然可以用树状数组解决 代码 #includ ...

  7. 51nod 1213 二维曼哈顿距离最小生成树 树状数组+最小生成树

    Description 二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间的距离为:横纵坐标的差的绝对值之和,即:Abs(x1 - x2) + Abs(y1 - y2)(也称曼哈顿距离). ...

  8. 【 HDU 1166】 敌兵布阵 树状数组从0到1

    如果给你一个数组,让你求某个区间的和,你很自然会想到遍历一遍数组,复杂度是O(n),但是如果有多次询问呢,你也许会想到用前缀数组,通过O(n)的预处理,达到O(1)的查询,但是如果要更新某个元素的值呢 ...

  9. nyoj116 士兵杀敌(二)树状数组 插点问线

    士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...

最新文章

  1. opengl 鼠标拾取
  2. go 清空文件内容_玩转Go单元测试,你只需要掌握这5点
  3. java 实现动画_java编程加载窗口,实现动画
  4. dll注入工具_UnmanagedPowerShell工具分析
  5. 数据库和Webapp安全
  6. linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...
  7. [转载] Java 方法(方法重载)与数组
  8. Linux 中安装软件报缺少共享库文件的错误
  9. 计算机字体库位置,win7电脑的字体库在哪里?
  10. gb和gib的区别_高端存储手册里面的KiB,MiB,GiB是啥意思?
  11. cocos2dx fnt字体、自定义字体制作(转载、记录、待验证)
  12. Android系统权限和root权限
  13. 【日常训练赛】C - Prove Him Wrong
  14. Jquery(一)选择器
  15. 吴裕雄--天生自然 诗经:声声慢·寻寻觅觅
  16. ROS项目开发实战(三)——使用QT进行ROS的GUI界面设计(详细教程附代码!!!)
  17. AI全自动原创视频生成器-震撼来袭
  18. 售后返修管理软件流程设计图
  19. 山东科技大学OJ题库 1013-多少张钞票
  20. Python —— 字典攻击

热门文章

  1. 【Android】Service几个重要的方法运行在哪个线程
  2. eclipese web前端开发教学_Web前端零基础好学吗?新手该怎么学?
  3. 高职高考难度大吗_成人高考与普通高考区别成人高考和高考的难度一样吗
  4. iOS架构-C/C++lame库在Mac下编译通用静态库.a库(13)
  5. swift_024(Swift 的构造过程)
  6. leetcode 287. 寻找重复数(Find the Duplicate Number)
  7. java中正则表达式要进行转义的字符。
  8. Filter及FilterChain的使用具体解释
  9. 使用MySQL自带工具mysqlhotcopy快速备份mysql数据库
  10. 为什么远程桌面不能复制?解决方法