斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)
二维平面上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 (树状数组+离散化)相关推荐
- 树状数组 + 离散化 求逆序对数量
AcWing 788. 逆序对的数量 #include <bits/stdc++.h> using namespace std;typedef long long ll; const in ...
- ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- NOI.AC#2139-选择【斜率优化dp,树状数组】
正题 题目链接:http://noi.ac/problem/2139 题目大意 给出nnn个数字的序列aia_iai.然后选出一个不降子序列最大化子序列的aia_iai和减去没有任何一个数被选中的 ...
- leetcode315. 计算右侧小于当前元素的个数(树状数组解法)
leetcode315. 计算右侧小于当前元素的个数(树状数组解法) 题目:给定一个整数数组 nums,按要求返回一个新数组 counts.数组 counts 有该性质: counts[i] 的值是 ...
- 线。段。树--树状数组-主席树
简单了解一下线段树 以前写过的内容,搬运过来 线段树的应用场景:满足区间加法性质且多次查询,什么是区间加法性质,比如最大值,求和,树状数组.线段树.主席树依次. 线段树框架:建树--查询--更新... ...
- 51nod P3121 小陶与杠铃片【树状数组】
题目 思路 这道题其实是求逆序对个数 为什么呢? 因为只能选相邻两片杠铃,那么这就是一个逆序对不断减少的过程,逆序对数量为零那么就排好序了. 而求逆序对个数显然可以用树状数组解决 代码 #includ ...
- 51nod 1213 二维曼哈顿距离最小生成树 树状数组+最小生成树
Description 二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间的距离为:横纵坐标的差的绝对值之和,即:Abs(x1 - x2) + Abs(y1 - y2)(也称曼哈顿距离). ...
- 【 HDU 1166】 敌兵布阵 树状数组从0到1
如果给你一个数组,让你求某个区间的和,你很自然会想到遍历一遍数组,复杂度是O(n),但是如果有多次询问呢,你也许会想到用前缀数组,通过O(n)的预处理,达到O(1)的查询,但是如果要更新某个元素的值呢 ...
- nyoj116 士兵杀敌(二)树状数组 插点问线
士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...
最新文章
- opengl 鼠标拾取
- go 清空文件内容_玩转Go单元测试,你只需要掌握这5点
- java 实现动画_java编程加载窗口,实现动画
- dll注入工具_UnmanagedPowerShell工具分析
- 数据库和Webapp安全
- linux下nand flash驱动工作原理,Linux驱动之Nand Flash四问,原理、工作方式都包含了...
- [转载] Java 方法(方法重载)与数组
- Linux 中安装软件报缺少共享库文件的错误
- 计算机字体库位置,win7电脑的字体库在哪里?
- gb和gib的区别_高端存储手册里面的KiB,MiB,GiB是啥意思?
- cocos2dx fnt字体、自定义字体制作(转载、记录、待验证)
- Android系统权限和root权限
- 【日常训练赛】C - Prove Him Wrong
- Jquery(一)选择器
- 吴裕雄--天生自然 诗经:声声慢·寻寻觅觅
- ROS项目开发实战(三)——使用QT进行ROS的GUI界面设计(详细教程附代码!!!)
- AI全自动原创视频生成器-震撼来袭
- 售后返修管理软件流程设计图
- 山东科技大学OJ题库 1013-多少张钞票
- Python —— 字典攻击
热门文章
- 【Android】Service几个重要的方法运行在哪个线程
- eclipese web前端开发教学_Web前端零基础好学吗?新手该怎么学?
- 高职高考难度大吗_成人高考与普通高考区别成人高考和高考的难度一样吗
- iOS架构-C/C++lame库在Mac下编译通用静态库.a库(13)
- swift_024(Swift 的构造过程)
- leetcode 287. 寻找重复数(Find the Duplicate Number)
- java中正则表达式要进行转义的字符。
- Filter及FilterChain的使用具体解释
- 使用MySQL自带工具mysqlhotcopy快速备份mysql数据库
- 为什么远程桌面不能复制?解决方法