首页 > 其他分享 > 运用离散化缩小不必要的范围+差分:只通过对两个区间的端点进行加减操作即可使这段区间上的元素得到加减

运用离散化缩小不必要的范围+差分:只通过对两个区间的端点进行加减操作即可使这段区间上的元素得到加减

时间:2022-10-15 15:11:22浏览次数:74  
标签:int mid 加减 差分 times 端点 区间

原题链接:https://codeforces.com/gym/403650/problem/C

 

 

 题目的原意是:给定n个区间,求1-1e9这个数轴上,对于每一个数点,在给定区间上出现过的最大值

一个最朴素的想法是:每给出一段区间,我们就让这个区间上代表的数num,count[num]++

然后排个序,找到最大的count[x];

但是会超时,而且num为1—1e9,没有那个数组能开这么大

 

 

 差分:https://www.cnblogs.com/cilinmengye/p/16325069.html

于是我们离散化区间端点,使其被另一个数代替,但有对其使用差分有着相同的效果

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 typedef pair<int, int> PII;
 6 const int N = 2e5 + 5;
 7 int n;
 8 int pre[N], times[N];
 9 int index1 = 0, pos = 0;
10 bool rule(int a, int b)
11 {
12     return a < b;
13 }
14 PII rounds[N];
15 int chafen[N];
16 int he[N];
17 void dre()
18 {
19     int lastNum = pre[1];
20     for (int i = 2; i <= index1; i++)
21     {
22         if (lastNum != pre[i])
23         {
24             times[++pos] = lastNum;
25             lastNum = pre[i];
26         }
27     }
28     times[++pos] = lastNum;
29 }
30 int find(int x)
31 {
32     int l = 1, r = pos, ans;
33     while (l <= r)
34     {
35         int mid = (l + r) >> 1;
36         if (times[mid] < x)
37             l = mid + 1;
38         else if (times[mid] > x)
39             r = mid - 1;
40         else if (times[mid] == x)
41         {
42             ans = mid;
43             break;
44         }
45     }
46     return ans;
47 }
48 main()
49 {
50     cin >> n;
51     for (int i = 1; i <= n; i++)
52     {
53         int a, b;
54         scanf("%d%d", &a, &b);
55         rounds[i] = {a, b};
56         pre[++index1] = a;
57         pre[++index1] = b;
58     }
59     sort(pre + 1, pre + index1 + 1, rule);
60     /*  for (int i = 1; i <= index1; i++)
61          cout << pre[i] << " ";
62      cout << endl; */
63     dre();
64     /*  for (int i = 1; i <= pos; i++)
65          cout << times[i] << " ";
66      cout << endl; */
67     for (int i = 1; i <= n; i++)
68     {
69         int posl = rounds[i].first;
70         int posr = rounds[i].second;
71         int lisuanl = find(posl);
72         int lisuanr = find(posr);
73         chafen[lisuanl]++;
74         chafen[lisuanr]--;
75     }
76     for (int i = 1; i <= pos; i++)
77         he[i] = he[i - 1] + chafen[i];
78     sort(he + 1, he + pos + 1, [](int a, int b)
79          { return a > b; });
80     cout << he[1];
81     return 0;
82 }

 

标签:int,mid,加减,差分,times,端点,区间
From: https://www.cnblogs.com/cilinmengye/p/16794245.html

相关文章

  • 【前端】【JavaScript】简单的加减乘除计算器
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><inputtype="text"id="number1"><selectid="s......
  • 线段树模板(区间修改,区间查询)
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,m;intw[N];structnode{intl,r;LLsum,add;}tr[N*4];voidpush......
  • 直播电商平台开发,BigDecimal 加减乘除顺序验证
    直播电商平台开发,BigDecimal加减乘除顺序验证publicstaticvoidmain(String[]args){    BigDecimaltwo=newBigDecimal("2");    BigDecimalone......
  • 困难-632. 最小区间
    设置n个哨兵,n为数组nums的长度,每个哨兵初始指向为0不停的计算最小和最大,最小的哨兵指针加1,一直到结束你有 k 个非递减排列的整数列表。找到一个最小区间,使得 k 个......
  • YACS 2022年9月月赛 甲组 T2 区间交集(三) 题解
    所以说,我又来贴标程了。这题有很多做法,线段树,优先队列$and$删除等等,这里分享一种码量极少的二分做法,主要思路:二分+动归#include<bits/stdc++.h>usingnamespacestd;......
  • Python 日期 的 加减 等 操作
     datetime—Basicdateandtimetypes:​​https://docs.python.org/3.8/library/datetime.html​​dateutil---powerfulextensionstodatetime:​​https://dateutil......
  • 163. 缺失的区间 仅ac代码+注释
     classSolution{publicList<String>findMissingRanges(int[]nums,intlower,intupper){List<String>ans=newArrayList<String>();......
  • 区间dp学习笔记
    区间DP惯用手段区间dp中比较明显的阶段一般就是要合并的字段的长度;先枚举要处理的长度,之后用短的序列求出长的即可;P3146248这题长得和P3147长得一模一样给定......
  • C语言:随机出0-9加减法试题
    #include<stdio.h>//为小学一年级学生随机出10道题,加法或减法随机出现,保证涉及到的数在0-9之间,结果不能出现负数//程序运行输入结果后提示对或错,最后并统计做对了几道......
  • 1210. 连号区间数
    https://www.acwing.com/problem/content/1212/简答模拟水题一道要注意的是题目给的条件是1~N的排列,不会有重复数字,那么稍加思考即可有,若排列排序后递增,则有排列中的Ma......