离散什么的
来源:互联网 发布:那个北斗导航软件 编辑:程序博客网 时间:2024/04/26 20:53
线段覆盖
时间限制: 1 Sec 内存限制:128 MB题目描述
X轴上方有若干条平行于X轴的线段,求这些线段能覆盖到的X轴的总长度?
输入
第一行一个数n(n<=1000),表示线段的个数;
接下来n行,每行两个整数ai,bi
(-10^8<=ai,bi<=10^8),代表一个线段的两个端点。
输出
输出覆盖x轴的长度。
样例输入
210 122 4
样例输出
4
这道题以前貌似做过,但这里很不一样的就是数组范围到了10^8。这个很重要啊,代表之前的简单方法不能用了,然而有个很神奇的叫离散的东西可以解决。针对数据个数不多,而数据规模大的题目,就可以用到离散。离散的思路就是重新建立一个映射,使得每个数据唯一映射到另外一个值,使得数据规模变小,那么就没问题了。对于这道题,首先立下flag,因为要记录点的情况,然后一个数组a记录起点,一个数组b记录终点,在输入时还需要一个总数组记录占的点情况,下标单数为起点偶数为终点,起初没想到后来看了老师的发现这里还可以用位运算,位运算是效率是要比加减乘除高的。
x[((i-1)<<1)+1]=a[i];x[i<<1]=b[i];
然后对x数组进行排序sort就好但要注意后面那个加的是2倍的n。接下来将x[0]与xn赋好初值进行搜索
for(int i=1;i<=(n<<1);i++) if(x[i]!=x[xn]) x[++xn]=x[i];
然后二分
int fin(int c){ int m,s=1,e=xn; while(s<=e){ m=(s+e)>>1; if(x[m]==c) return m; if(x[m]<c) s=m+1; if(x[m]>c) e=m-1; } return -1; }
然后标记
void cover(int s,int e){ for(int i=s;i<e;i++) flag[i]=1;}
ans为long long,从1循环到xn,如果flag标记上了,就加上x[i+1]-x[i]
最后输出
0 0
- 离散什么的
- 离散
- 离散
- 离散
- 离散
- 做什么的
- 什么什么的
- FFT什么的
- 自然语言研究什么的引子
- 关于学什么的问题
- 麦当劳是做什么的?
- 什么的ERP系统?
- petshop是做什么的
- 猫,老鼠什么的
- csdn是做什么的?
- 这叫什么的一天?
- 求日期什么的
- Serializable是做什么的?
- 排序算法(OC实现)
- 我对PID的理解
- 单链表中重复元素的删除
- C++ builder消息的运用
- 顺序表应用6:有序顺序表查询
- 离散什么的
- 二值化图像的颜色翻转
- 整理:CString类的完美总结&&CString 成员函数用法大全&&string 与 CString 转化&&<string><string.h> 和<cstring>的区别
- 链表拆分
- 解决MAVEN加载不了的问题
- 链表归并
- POJ 1961(KMP, 最短循环节)
- linux下文件的压缩和解压
- HTML5的小技巧(一)