首页 > 其他 > 详细

洛谷P1496 火烧赤壁

时间:2019-07-14 23:08:16      阅读:116      评论:0      收藏:0      [点我收藏+]
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<cmath>
 5 using namespace std;
 6 const int N=20005;
 7 int n,num[N<<1],cnt;
 8 int diff[N<<1],ans,begin=-1;
 9 struct node{int l,r;}f[N];
10 int main()
11 {
12     ios::sync_with_stdio(false);
13     cin>>n;
14     for(int i=1;i<=n;++i)
15     {
16         cin>>f[i].l>>f[i].r;
17         num[++cnt]=f[i].l,num[++cnt]=f[i].r;
18     }
19     sort(num+1,num+1+cnt);
20     int siz=unique(num+1,num+1+cnt)-num;
21     for(int i=1;i<=n;++i)
22     {
23         int nl=lower_bound(num+1,num+siz,f[i].l)-num,
24         nr=lower_bound(num+1,num+siz,f[i].r)-num;
25         //这里一定能找到相等的数
26         ++diff[nl],--diff[nr];
27         //避免端点计算故不使用--diff[nr+1]
28     }
29     for(int i=1;i<=cnt;++i)
30     {
31         diff[i]+=diff[i-1];
32         if(diff[i]&&begin==-1)begin=i;
33         if(!diff[i]&&begin!=-1)ans+=num[i]-num[begin],begin=-1;
34         //统计部分跟随上一注释处有所变动
35     }   cout << ans;
36     return 0;
37 }

基本思路(也是离散化的基本操作):

  1. 把所有数据都放入一个大数组
  2. 排序(sort)并去重(unique),得到返回的长度siz,此时num数组在 [1,siz) 内不重复
  3. 对每个大数在num数组内寻找它,对应下标为离散化后的数(lower_bound找第一个 大于等于 它的数且此处一定有等于)
  4. 后续对应操作

洛谷P1496 火烧赤壁

原文:https://www.cnblogs.com/lsy263/p/11186314.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!