热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU3465LifeisaLine(逆序数+数状数组)

LifeisaLineTimeLimit:20001000MS(JavaOthers)MemoryLimit:13107265536K(JavaOthers)Total
Life is a Line
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 217 Accepted Submission(s): 81
 
Problem DescriptionThere is a saying: Life is like a line, some people are your parallel lines, while others are destined to meet you.
Maybe have met, maybe just a matter of time, two unparallel lines will always meet in some places, and now a lot of life (i.e. line) are in the same coordinate system, in a given open interval, how many pairs can meet each other?

 
InputThere are several test cases in the input.

Each test case begin with one integer N (1 ≤ N ≤ 50000), indicating the number of different lines.
Then two floating numbers L, R follow (-10000.00 ≤ L Then N lines follow, each line contains four floating numbers x1, y1, x2, y2 (-10000.00 ≤ x1, y1, x2, y2 ≤ 10000.00), indicating two different points on the line. You can assume no two lines are the same one.

The input terminates by end of file marker.
 
OutputFor each test case, output one integer, indicating pairs of intersected lines in the open interval, i.e. their intersection point’s x-axis is in (l, r).

 
Sample Input
3
0.0 1.0
0.0 0.0 1.0 1.0
0.0 2.0 1.0 2.0
0.0 2.5 2.5 0.0
 
Sample Output
1
问题:求在 (l, r)范围内有多少个交点,看起来好像是个几何题。。。时间上是一个求逆序数的问题。

      只要直线不平行于y轴就一定会 跟 x = l, x = r这两条直线相交。对于任意两条直线x=l,和x=r的交点分别为xl,xr,两直线在(L,R)相交,必然有 xl1>xl2&&xr1xr2,(A.L-B.L)*(A.R-B.R)<0 所以可以用逆序数来求解。
  1. 如果将与L的交点从小到大排,那么当相应的R的交点出现一个逆序数对就表示有两直线有交点. 
  2.  先将所有直线根据l递增排序,之后编号1~n,再根据r递减排序,得到一个编号序列。 
  3.  例如3412,递减,其中r3>r4>r1>r2, 又编号:l1所以12 34 所以3和4有交点,1和2有交点。 
  4.  这符合逆序数的关系:一个数的逆序数是在它之前比他大的数的个数,  
  5. 当然这里是小的数,原因是为了方便树状数组处理。所以只要根据上述方法排序再求逆序数即可。  
  6. 1.与y轴平行得线,只要这样的线在(l,r)范围内,则必定跟别的不平行线相交。 
  7.     所以计算下个数在乘积  
  8. 2.l和r相同的情况。当l相同时,r递增排序;当r相同时,l递减排序。 
  9.     就能使在l和r上的交点不计算在内。  (这一段转的别人的)
#include 
#include
#include
#include
using namespace std;
const int maxn = 50000;
struct Line{
double a, b;
int num;
}line[50050];
int tree[50500];
int lowbit(int x) {
return x & (-x);
}
void add(int pos) {
for (int i = pos; i <= maxn; i += lowbit(i)) {
tree[i]++;
}
}
int sum(int pos) {
int ans = 0;
for (int i = pos; i >= 1; i -= lowbit(i)) {
ans += tree[i];
}
return ans;
}
int main() {

int n;
double left, right;
double x1, x2, y1, y2;
while (cin >> n) {
int parallel_y = 0;
int unparallel = 0;
scanf("%lf%lf", &left, &right);
for (int i = 0; i scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
if (x1 == x2) {
if (x1 > left && x1 parallel_y++;
}
} else {
double k = (y1 - y2) / (x1 - x2);
double b = y1 - k * x1;
line[unparallel].a = left * k + b;
line[unparallel++].b = right * k + b;
}
}
sort(line, line + unparallel, [](Line l1, Line l2)->bool{return l1.a == l2.a ? l1.b for (int i = 0; i line[i].num = i + 1;
}
sort(line, line + unparallel, [](Line l1, Line l2)->bool{return l1.b == l2.b ? l1.a > l2.a : l1.b > l2.b;});
memset(tree, 0, sizeof(tree));
int ans = 0;
for (int i = 0; i add(line[i].num);
ans += sum(line[i].num - 1);
}
cout < }
}





推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
author-avatar
空城
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有