zoj 3574 求给定区间内n条线段能将区间内的区域划分成几个区域
2012-03-01 14:50
309 查看
答案是:n+1+逆序数的数量
因为如果n条线段都不相交,一定可以划分成n+1个区域,然后就画图YY一下
View Code
因为如果n条线段都不相交,一定可以划分成n+1个区域,然后就画图YY一下
View Code
#include <cstdio> #include <algorithm> using namespace std; int left[50003], right[50003]; int cnt; struct node { int y1,y2; }p[30010]; int cmp(node a,node b){ return a.y1<b.y1; } void merge(int a[], int l, int m, int r) { int i, j, k, n1, n2; n1 = m - l + 1; n2 = r - m; for (i = 0; i < n1; i++) left[i] = a[l+i]; for (i = 0; i < n2; i++) right[i] = a[m+i+1]; left[n1] = right[n2] = 0x7fffffff; i = j = 0; for (k = l; k <= r; k++) { if (left[i] <= right[j]) a[k] = left[i++]; else { a[k] = right[j++]; cnt += n1 - i; } } } void mergeSort(int a[], int l, int r) { if (l < r) { int m = (l + r) / 2; mergeSort(a, l, m); mergeSort(a, m+1, r); merge(a, l, m, r); } } int a[50011]; int main() { int n; int l,r; while (scanf("%d%d",&l,&r)!=EOF) { scanf("%d",&n); int k,b; for(int i=0;i<n;i++){ scanf("%d%d",&k,&b); p[i].y1=k*l+b; p[i].y2=k*r+b; } sort(p,p+n,cmp); for(int i=0;i<n;i++) a[i]=p[i].y2; cnt=0;mergeSort(a, 0, n-1); printf("%d\n", n+cnt+1); } }
相关文章推荐
- 成都预赛 Polar intersecting line segments 已知N个线段,判断是否相交 排序+划分区间
- HDU献给杭电五十周年校庆的礼物 (切蛋糕,线段划分区域)
- 【直线划分+逆序数】ZOJ 3574
- 划分树(基本用法是求给定区间的第k大的值)
- ZOJ 3324 Machine 线段数 区间合并
- poj 2284(欧拉公式的推广:线段分平面成几个区域:n+m-r==2)
- 分治法对最大连续和以及归并排序,分治与递归实质把问题区间区域分割成几个小区间或者小分区,一直下钻到一个元素小区解决问题
- JVM的内存区域划分
- zoj 3469 Food Delivery 区间dp + 提前计算费用
- ZOJ 3632 Watermelon Full of Water(单点更新,区间查询)
- 用Matlab实现随机区间的划分
- ZOJ 1463 POJ 1141 Brackets Sequence (区间DP) #by Plato
- HDU 3473 Minimum Sum (划分树求区间第k大带求和)(转)
- 通过Unicode编码区间的划分获取字符串中中文、英文、数字
- 【叶子函数分享二十一】检查给定串是否存在于由区间及点集的结合内
- ZOJ 3469 Food Delivery (区间DP,经典)
- BZOJ-3226 校门外的区间 线段数+拆点(类似的思想)
- UVA 11796 || Dog Distance ( 折线划分线段更新
- C/C++内存区域划分
- POJ 3061:Subsequence 查找连续的几个数,使得这几个数的和大于给定的S