题目链接: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;
}

最新文章

  1. 定向爬虫 - Python模拟新浪微博登录
  2. 值得使用的Spring Boot
  3. SSD固态硬盘的闪存芯片颗粒介绍
  4. JVM内存配置详解
  5. Swagger 使用方法
  6. 2014 Super Training #6 A Alice and Bob --SG函数
  7. SVN安装及常见问题解决
  8. 设置Safari浏览器在标签栏上打开新窗口,而不是弹出一个新窗口
  9. Linux Java 环境变量设置
  10. Systemd 入门教程:实战篇
  11. http中的KeepAlive
  12. 【组合数学:第一类斯特林数】【HDU3625】Examining the Rooms
  13. AndroidUI的组成部分ProgressBar
  14. bash脚本退出代码解释
  15. JavaScript设计模式_02_策略模式
  16. Ubuntu14.04+Nginx+MySql+PHP环境配置
  17. php 常用的自定义函数
  18. noip 2018.10.14 模拟赛 砍树
  19. vue分页控件
  20. 10.14 预订会议室的小Demo

热门文章

  1. 使用函数指针模拟C++多态
  2. HTTP超详细总结
  3. Oracle 用户概念与基本操作
  4. 阻抗匹配 及 SI9000 使用
  5. libvirt虚拟机管理常用指令
  6. PAT(A) 1042. Shuffling Machine (20)
  7. 28-python基础-python3-列表多重赋值
  8. vue做一个上移和下移,删除的li 功能
  9. docker报错: x509: certificate has expired or is not yet valid
  10. python--知识小结和集合