The Preliminary Contest for ICPC Asia Shanghai 2019

时间:2019-09-15
本文章向大家介绍The Preliminary Contest for ICPC Asia Shanghai 2019,主要包括The Preliminary Contest for ICPC Asia Shanghai 2019使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

传送门

B.Light bulbs(思维)

•题意

  有 n 个灯泡,初始全部为关闭状态;

  有 m 个操作,每次操作给出 [l,r],让你将区间 [l,r] 的灯泡反转。

  问最终有多少灯泡是亮着的;

  其中有 T 组数据,T ≤ 1000 , n ≤ 106 , m ≤ 1000;

•题解

  刚开始想着差分,这样的话,O(n) 就可以解出这道题;

  但是,题干中并没有说 $\sum_{1}^{T} n \le 10^8$,所以,很有可能有 1000 组数据,每组数据的 n = 106 的情况;

  这样的话,O(n) 的做法就凉凉;

  T 了几发后,换思路;

  想到了扫描线,对于输入的 m 个 [l,r],离线处理,存到如下数据结构中:

1 struct Data
2 {
3     int x;///l or r
4     int f;///f=1:x为l , f=-1:x为r
5     bool operator < (const Data &obj) const
6     {
7         return x < obj.x;
8     }
9 }a[4*maxn];

  $a[++k]=\{l,1\}\ ,\ a[++k]=\{r,-1\}$

  并额外存储如下信息:

  $a[++k]=\{l-1,0\}\ ,\ a[++k]=\{r+1,0\}$

  即用 f = 0 代表存入的是额外加入的信息;

  首先按照 x 升序排列;

  然后,求出所有不同的 x 对应的反转次数,最后统计一下答案即可;

原文地址:https://www.cnblogs.com/violet-acmer/p/11523777.html