题目链接:Light bulbs
比赛链接:The Preliminary Contest for ICPC Asia Shanghai 2019

题意

给定 \(N\) 个灯泡 (编号从 $0$ 到 \(N - 1\)),初始都是关闭的。

给定 \(M\) 个操作,每个操作包含 \(L\) 和 \(R\),对 \([L, R]\) 内的所有灯泡改变状态。

求最后有几个灯泡是亮的。

思路

题目挺简单的,翻转奇数次的灯泡是亮的,所以要求每个灯泡翻转的次数。

容易想到可以用差分。

对所有操作的两个端点排序,求差分数组 \(d[]\)。

然后根据差分数组求前缀和,差分数组相邻两个数 \(d[l]\) 和 \(d[r]\) 所在的区间 \([l, r)\) 内的每个数都加上 \(d[l]\),那么如果 \(d[l]\) 为奇数,\(ans += (r - l)\)。时间复杂度 \(O(MlogM)\)。

于是就有了下面的代码。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10; int pos[2010]; int main() {
int T;
scanf("%d", &T);
int kase = 0;
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
vector<int> d(n + 10);
memset(pos, 0, sizeof(pos));
unordered_map<int, int> mp;
int cnt = 0;
for(int i = 1; i <= m; ++i) {
int l, r;
scanf("%d%d", &l, &r);
++d[l];
--d[r + 1];
if(mp[l] == 0) {
pos[cnt++] = l;
mp[l] = 1;
}
if(mp[r + 1] == 0) {
pos[cnt++] = r + 1;
mp[r + 1] = 1;
}
}
sort(pos, pos + cnt);
ll ans = 0;
for(int i = 1; i < cnt; ++i) {
if(d[pos[i - 1]] & 1) ans += pos[i] - pos[i - 1];
d[pos[i]] = d[pos[i - 1]] + d[pos[i]];
}
if(d[pos[cnt - 1]] & 1) ans += n - pos[cnt - 1];
printf("Case #%d: %lld\n", ++kase, ans);
}
return 0;
}

然后就 TLE 了。这题时间和空间卡的很紧。

AC 代码

用 map 存差分数组,还自动排序了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10; int main() {
int T;
scanf("%d", &T);
int kase = 0;
while(T--) {
int n, m;
scanf("%d%d", &n, &m);
map<int, int> d;
int cnt = 0;
for(int i = 1; i <= m; ++i) {
int l, r;
scanf("%d%d", &l, &r);
++d[l];
--d[r + 1];
}
ll ans = 0;
auto it = d.begin();
int p = it->first;
int v = it->second;
++it;
for(; it != d.end(); ++it) {
if(v & 1) ans += it->first - p;
it->second = v + it->second;
p = it->first;
v = it->second;
}
if(v & 1) ans += n - p;
printf("Case #%d: %lld\n", ++kase, ans);
}
return 0;
}

2019 ACM-ICPC 上海网络赛 B. Light bulbs (差分)的更多相关文章

  1. 2019年icpc上海网络赛 B Light bulbs (分块、差分)

    https://nanti.jisuanke.com/t/41399 题目大意: 有n个灯,m次操作,每次修改[l,r]内的灯,(off - on ,on - off),问最后有几盏灯亮着. 换种说法 ...

  2. 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...

  3. HDU 4731 Minimum palindrome 2013 ACM/ICPC 成都网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4731 题解:规律题,我们可以发现当m大于等于3时,abcabcabc……这个串的回文为1,并且字典数最小 ...

  4. HDU 4734 F(x) 2013 ACM/ICPC 成都网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4734 数位DP. 用dp[i][j][k] 表示第i位用j时f(x)=k的时候的个数,然后需要预处理下小 ...

  5. HDU 4741 Save Labman No.004 2013 ACM/ICPC 杭州网络赛

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给你两条异面直线,然你求着两条直线的最短距离,并求出这条中垂线与两直线的交点. 需要注意的是 ...

  6. 2013 ACM/ICPC 成都网络赛解题报告

    第三题:HDU 4730 We Love MOE Girls 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4730 水题~~~ #include < ...

  7. 2013 ACM/ICPC 长春网络赛E题

    题意:给出一个字符串,要从头.尾和中间找出三个完全相等的子串,这些串覆盖的区间互相不能有重叠部分.头.尾的串即为整个字符串的前缀和后缀.问这个相同的子串的最大长度是多少. 分析:利用KMP算法中的ne ...

  8. 2013 ACM/ICPC 长春网络赛F题

    题意:两个人轮流说数字,第一个人可以说区间[1~k]中的一个,之后每次每人都可以说一个比前一个人所说数字大一点的数字,相邻两次数字只差在区间[1~k].谁先>=N,谁输.问最后是第一个人赢还是第 ...

  9. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

随机推荐

  1. php下载

    生成迅雷下载链接 $url = "http://www.xxx.com/xxx/test.jpg"; echo "thunder://".base64_enco ...

  2. Linux C遇到的常见错误

    此随笔主要记录一些Linux C遇到的常见错误,便于debug问题或自己编程时,避免发生类似的错误或问题,后续会持续更新.... 1.内存泄露问题 内存泄露是由于内存没有释放导致程序耗内存一直增大,引 ...

  3. PHP面试 PHP基础知识 十一(开发环境及相关配置)

    开发环境及相关配置 版本控制软件 集中式和分布式 集中式:集中式版本控制工具,版本库集中存放在中央服务器,团队成员里的每个人工作时从中央服务器下载代码,个人修改后再提交到中央服务器 分布式:分布式版本 ...

  4. 大数据学习之BigData常用算法和数据结构

    大数据学习之BigData常用算法和数据结构 1.Bloom Filter     由一个很长的二进制向量和一系列hash函数组成     优点:可以减少IO操作,省空间     缺点:不支持删除,有 ...

  5. _cdecl 与 _stdcall 区别

    前段时间编程时遇到过这么一个问题,我写了一个DLL,把里面的一个函数导出来,然后再定义一个签名与其匹配的函数指针,动态地把这个DLL加载起来(LoadLibrary),得到函数指针后,一调用,结果报错 ...

  6. 微信公众号开发笔记-验证token

    开发 话不多说我们直接进入主题 我们先去微信公众号申请一个公众号: 申请完成之后我们找到开发下的基本配置 然后找到进行基本配置,我们需要一个url地址来验证,这里的地址必需要是外网,Token是我们任 ...

  7. mongo聚合命令

    db.getCollection('chat').aggregate([ { "$match": { "last": 1, "type": ...

  8. Optional int parameter 'pId' is present but cannot be translated into a null value due to being declared as a primitive type.

    接口测试的时候遇到了一个问题,导致测试阻断了好久,在此记录,谨防忘记. 具体报错如下: Optional int parameter 'pId' is present but cannot be tr ...

  9. 【牛客网-剑指offer】变态跳台阶

    题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 考点: 递归和循环 分析: 台阶数 跳法 1 1 2 2 3 4 4 8 5 1 ...

  10. postgresql like 中的转义

    select * from tb_org where char_length(xdm)>8 and xdm not like '%*_%'  ESCAPE '*' ESCAPE 后面的 * 是转 ...