前言


最近有很多算不上事的事,搞得有点心烦,补题难免就很水,没怎么搞,自我检讨一番~~

说实话网络赛题目的质量还是挺高的,题目都设计的挺好的,很值得学习。这场比赛那会只有我们大二的在做,其他人去参加$CCF$认证去了,赛后这题搞出来了,跟$lsq$一顿解释,说这个其实也不难,她就说但是你看就这个地方卡了多少人,那会才两百多人过了。的确,有的题目还是很考思维的。(个人感觉很久没写博客,写这篇还是有点混乱的,有些博主把这题加上离散化的标签,想起来好像是有那么点道理)

题意


有 $n $个灯泡,初始全部为关闭状态,有$ m $个操作,每次操作给出 $[l,r]$,让你将区间 $[l,r] $的灯泡反转,问最终有多少灯泡是亮着的。$[ link ]$

其中有 $T $组数据,$T \leq 1000, n \leq  10^{6}, m \leq 1000$

分析


当时刚开始做的时候,那会因为刚好看了两天的差分,就觉得这题很对我胃口,肯定能搞出来,然而事实给了我一巴掌,$TLE$

我当时就想不通了明明是$O(n)$的做法,后来仔细一看,复杂度$T*n$,$10^{9}$多半是不行了,毕竟每次都还要把差分数组初始化为0。开始用到$for$循环初始化,也超时了,就换成了$memset$。后来$zym$提醒说$memset$很花时间,我就想多拿几个数组记录一下,把原来的状态的还原回去,结果开了四个数组,空间超了$\cdots $,可能出题人也想到了有人会像我这样做(网上有博主好像用这种方法做出来了,具体的还没有看)这我就没有办法了,才不得不放弃。

$0(n)$的做法是利用差分每次只需要修改两个端点,最后求前缀和,是奇数就代表是灯是亮着的。(自认为是差分的精髓所在)这题需要强调的是对于每个端点修改的是一整个区间(以这个端点为最左边直到最右边的边界),每组$l,r$,$l$和$r+1$所对应的区间都会加1,两者操作是一样的,所以对于所有要修改的区间的修改顺序是无所谓的,因此我把这些代表区间的端点进行排序,$a_{1}$ $to$ $a_{2}$, $a_{3}  $ $to$ $ a_{4} ,\cdots , a_{k-1}$ $to$ $a_{k}$两两相减加起来就能得到答案,在草稿纸上画一画想一想应该就知道了,并不需要把前缀和都求一遍。

Code

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int n, m;
int a[maxn]; int main()
{
int t;
scanf("%d", &t);
for (int kase = 1; kase <= t; kase++) {
scanf("%d%d", &n, &m);
int k = 0;
for (int i = 1; i <= m; i++) {
int l, r;
scanf("%d%d", &l, &r);
a[++k] = l;
a[++k] = r+1;
}
sort(a+1, a+1+k); int ans = 0;
for (int i = 1; i <= k; i+=2) ans += a[i+1]-a[i];
printf("Case #%d: %d\n", kase, ans);
}
}

参考文章:

https://www.cnblogs.com/violet-acmer/p/11523777.html

[The Preliminary Contest for ICPC Asia Shanghai 2019] B-Light bulbs(差分+思维)的更多相关文章

  1. The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs

    题目:https://nanti.jisuanke.com/t/41399 思路:差分数组 区间内操作次数为奇数次则灯为打开状态 #include<bits/stdc++.h> using ...

  2. The Preliminary Contest for ICPC Asia Shanghai 2019 B Light bulbs (离散的差分)

    复杂度分析,询问一千次,区间长1e6,O(1e9)超时. 那么我们知道对于差分来说,没必要一个一个求,只需要知道区间长就可以了,所以我们定义结构体差分节点,一个头结点,一个尾节点. 这样tail.lo ...

  3. The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力)

    The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力) 传送门:https://nanti.jisuanke.com/ ...

  4. The Preliminary Contest for ICPC Asia Shanghai 2019

    传送门 B. Light bulbs 题意: 起初\(n\)个位置状态为\(0\),\(m\)次操作,每次操作更换区间状态:\(0\)到\(1\),\(1\)到\(0\). 共有\(T,T\leq 1 ...

  5. The Preliminary Contest for ICPC Asia Shanghai 2019 C. Triple

    [传送门] FFT第三题! 其实就是要求有多少三元组满足两短边之和大于等于第三边. 考虑容斥,就是枚举最长边,另外两个数组里有多少对边之和比它小,然后就是 $n^3$ 减去这个答案. 当 $n \le ...

  6. 01背包方案数(变种题)Stone game--The Preliminary Contest for ICPC Asia Shanghai 2019

    题意:https://nanti.jisuanke.com/t/41420 给你n个石子的重量,要求满足(Sum<=2*sum<=Sum+min)的方案数,min是你手里的最小值. 思路: ...

  7. 给定进制下1-n每一位数的共享(Digit sum)The Preliminary Contest for ICPC Asia Shanghai 2019

    题意:https://nanti.jisuanke.com/t/41422 对每一位进行找循环节规律就行了. #define IOS ios_base::sync_with_stdio(0); cin ...

  8. The Preliminary Contest for ICPC Asia Shanghai 2019 A. Lightning Routing I

    传送门 因为某些原因,所以我就去学了 $LCT$ 维护直径, $LCT$ 维护直径我上一个博客讲得很详细了:传送门 这里维护虚儿子用的是 $multiset$ ,没写可删堆 #include<i ...

  9. The Preliminary Contest for ICPC Asia Shanghai 2019 L. Digit sum

    题目:https://nanti.jisuanke.com/t/41422 思路:预处理 #include<bits/stdc++.h> using namespace std; ][]= ...

  10. The Preliminary Contest for ICPC Asia Shanghai 2019 J. Stone game

    题目:https://nanti.jisuanke.com/t/41420 思路:当a(a∈S′)为最小值 如果Sum(S′)−a≤Sum(S−S′)成立 那么(∀t∈S′,Sum(S′)−t≤Sum ...

随机推荐

  1. oracle 11.2.0.1.0 升级 11.2.0.4.0 并 patch 到11.2.0.4.7

    升级步骤: (1)    备份数据库 (2)    运行patchset,升级oracle 软件 (3)    准备新的ORACLE_HOME (4)    运行dbua 或者脚本升级实例 (5)   ...

  2. C语言指针的大小

    C语言指针的大小 今天看到一道题目是这样的,写出以下变量在32位设备上的大小(占多少个字节) 然后其中就有一些指针类型的数据,那么我们知道在C语言中指针的大小都是一样的,不管是有数据类型的还是void ...

  3. mongodb表索引备份,索引的导出导入

    背景 发现有两个mongodb环境的数据库表索引不一致,另一个数据库有索引缺失,需要将一个数据库里的所有表索引导入到另一个数据库 也可用于单独备份数据库所有表的索引 写mongo shell的js脚本 ...

  4. ASP.NET Core错误处理中间件[2]: 开发者异常页面

    <呈现错误信息>通过几个简单的实例演示了如何呈现一个错误页面,该过程由3个对应的中间件来完成.下面先介绍用来呈现开发者异常页面的DeveloperExceptionPageMiddlewa ...

  5. dd命令的详细介绍

    1.命令简介  dd 的主要选项: 指定数字的地方若以下列字符结尾乘以相应的数字: b=512, c=1, k=1024, w=2, xm=number m if=file #输入文件名,缺省为标准输 ...

  6. 与数论的厮守05:gcd(a,b)=gcd(b,a mod b)的证明

    \[设c=gcd(a,b),那么a可以表示为mc,b可以表示为nc的形式.然后令a=kb+r,那么我们就\\ 只需要证明gcd(b,r)=c即可.{\because}r=a-kb=mc-knc,{\t ...

  7. kettle数据质量统计

    1.利用Kettle的"分组","JavaScript代码","字段选择"组件,实现数据质量统计.2.熟练掌握"JavaScrip ...

  8. websocket的应用---Django

    websocket的应用---Django 1.长轮询 轮询:在前端通过写js实现.缺点:有延迟.服务器压力大. 就是客户端通过一定的时间间隔以频繁请求的方式向服务器发送请求,来保持客户端和服务器端的 ...

  9. 如何将python中pip源设置为国内源

    1.Windows Python的学习过程中,往往会学习到很多库,而安装各类库的时候,往往不尽人意,下载速度从几KB到十几KB.甚至下载到一半还超时报错.这都是因为pip源是访问国外的官方源,如果需要 ...

  10. git的使用学习笔记---合并分支

    一.使用场景 不同的分支需要合并 二.操作 1.首先要创建一个分支 git checkout -b mergedemo 创建文本 vim text.txt 添加文本 git add text.txt ...