B. Light bulbs(2019 ICPC上海站)
There are NN light bulbs indexed from 00 to N-1N−1. Initially, all of them are off.
A FLIP operation switches the state of a contiguous subset of bulbs. FLIP(L, R)FLIP(L,R)means to flip all bulbs xx such that L \leq x \leq RL≤x≤R. So for example, FLIP(3, 5)FLIP(3,5) means to flip bulbs 33 , 44 and 55, and FLIP(5, 5)FLIP(5,5) means to flip bulb 55.
Given the value of NN and a sequence of MMflips, count the number of light bulbs that will be on at the end state.
InputFile
The first line of the input gives the number of test cases, TT. TT test cases follow. Each test case starts with a line containing two integers NN and MM, the number of light bulbs and the number of operations, respectively. Then, there are MMmore lines, the ii-th of which contains the two integers L_iLi and R_iRi, indicating that the ii-th operation would like to flip all the bulbs from L_iLi to R_iRi , inclusive.
1 \leq T \leq 10001≤T≤1000
1 \leq N \leq 10^61≤N≤106
1 \leq M \leq 10001≤M≤1000
0 \leq L_i \leq R_i \leq N-10≤Li≤Ri≤N−1
OutputFile
For each test case, output one line containing Case #x: y, where xx is the test case number (starting from 11) and yy is the number of light bulbs that will be on at the end state, as described above.
样例输入复制
2
10 2
2 6
4 8
6 3
1 1
2 3
3 4
样例输出复制
Case #1: 4
Case #2: 3 题意:
有T组样例,依次输入每组样例,第一行为n,表示有n个灯泡,然后m次操作,最后输出经过m次操作后亮着的灯泡有多少个? 思路:
首先,我们会想就操作区间的进行加1,最后n个数,依次代表n个灯泡操作的次数,次数%2==0,就是关着的,次数%2==1,就是开着的。
就拿第一个样例来说:
第一行:开始状态 第二行:第一次操作后 第三行:第二次操作后
m次操作,每次是将区间的所有值都加一。
这里不是不有点前缀和的味道,给定 n 个数和 m 次询问,每次询问一段区间的和,一个 O(n + m) 的做法。
for(int i = ; i <= n; ++i) sum[i] = sum[i - ] + a[i]; //O(n)
while(m--) //O(m)
{
int L, R; scanf("%d%d", &L, &R);
printf("%d\n", sum[R] - sum[L - ]);
}
我们先简单的引入有关差分的概念。
设a数组表示原始的数组;
设d[i]=a[i]-a[i-1](1<i≤n,d[1]=a[1]);
设f[i]=f[i-1]+d[i](1<i≤n,f[1]=d[1]=a[1]);
设sum[i]=sum[i-1]+f[i](1<i≤n,sum[1]=f[1]=d[1]=a[1])。
这道题我们完全用差分
为了不出现负数的情况,我们可以初始化每个数都为1000(一千次操作),然后对区间操作的时候[l,r],将a[l]+1,a[r+1]-1,
然后我们直接进行求和
for(i = 1;i<=n;i++)
b[i] = b[i-1]+a[i];
b[i]%2==0灯就是关着的,b[i]%2==1灯就是开着的
但是还是不行,为什么呢?我们分析一下,每个样例我们都要对数组进行初始化1e6,然后我们对区间的端点进行操作m,然后最后来个类似于前缀和的操作1e6
所有大约1e3*2e6=2e9,两秒,题目要求一秒,超时,然后我们想到用空间换时间,这也是我之前想过的,不用想,直接爆,我太难了!!!
因此我们要再想一想如何优化,可以满足要求
既然我们是直接对区间的端点进行操作,那么我们想一想能不能把1e6转为1e3,这样1e3*1e3=1e6,不会超
显然是可以的。
这里是%2==1/0进行判断灯是否亮,前面差分我们是+1 ,-1(把对后面的影响抵消掉),但是对这一道题我们可以直接+1,+1,两次加1作用就抵消了,并且操作相同。
经过m次操作就直接输出结果,那么哪个操作在前,哪个操作在后其实就不重要了
我们记录端点(l,r+1),然后所有操作完后进行排序,从小到大,我们两两配对,从前往后,
2 4 7 9,
4-2 2相当于从第二个灯泡影响到最后的灯泡,4就把从第四个灯泡开始的影响给消除了,然后这一对操作其实影响的就只有2个灯泡,7-8类似
4-2+9-7=4. 代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+;
int num[maxn*];
int main(){
int t;
cin>>t;
for(int i=;i<=t;i++){
int n,m;
scanf("%d%d",&n,&m);
int count = ;
for(int j = ; j<m;j++){
int x,y;
scanf("%d%d",&x,&y);
num[count++] = x;
num[count++] = y+;
}
sort(num,num+m*);
int sum = ;
for(int i = ;i <count;i+=){
sum +=num[i+] - num[i];
}
printf("Case #%d: %d\n",i,sum);
}
return ;
}
B. Light bulbs(2019 ICPC上海站)的更多相关文章
- 2019 ACM-ICPC 上海网络赛 B. Light bulbs (差分)
题目链接:Light bulbs 比赛链接:The Preliminary Contest for ICPC Asia Shanghai 2019 题意 给定 \(N\) 个灯泡 (编号从 \(0\) ...
- zoj 2976 Light Bulbs(暴力枚举)
Light Bulbs Time Limit: 2 Seconds Memory Limit: 65536 KB Wildleopard had fallen in love with hi ...
- 哈理工2015 暑假训练赛 zoj 2976 Light Bulbs
MS Memory Limit:65536KB 64bit IO Format:%lld & %llu SubmitStatusid=14946">Practice ...
- 2019 ICPC 南昌网络赛
2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ...
- B. Light bulbs
B. Light bulbs There are NNN light bulbs indexed from 000 to N−1N-1N−1. Initially, all of them are o ...
- 2019 ICPC Asia Nanjing Regional
2019 ICPC Asia Nanjing Regional A - Hard Problem 计蒜客 - 42395 若 n = 10,可以先取:6,7,8,9,10.然后随便从1,2,3,4,5 ...
- The Preliminary Contest for ICPC Asia Shanghai 2019 B. Light bulbs
题目:https://nanti.jisuanke.com/t/41399 思路:差分数组 区间内操作次数为奇数次则灯为打开状态 #include<bits/stdc++.h> using ...
- The Preliminary Contest for ICPC Asia Shanghai 2019 B Light bulbs (离散的差分)
复杂度分析,询问一千次,区间长1e6,O(1e9)超时. 那么我们知道对于差分来说,没必要一个一个求,只需要知道区间长就可以了,所以我们定义结构体差分节点,一个头结点,一个尾节点. 这样tail.lo ...
- 2019年icpc上海网络赛 B Light bulbs (分块、差分)
https://nanti.jisuanke.com/t/41399 题目大意: 有n个灯,m次操作,每次修改[l,r]内的灯,(off - on ,on - off),问最后有几盏灯亮着. 换种说法 ...
随机推荐
- spark sql数据源--hive
使用的是idea编辑器 spark sql从hive中读取数据的步骤:1.引入hive的jar包 2.将hive-site.xml放到resource下 3.spark sql声明对hive的支持 案 ...
- 【转】网站SEO优化中网站的三大标签指的是什么?
对于很多刚刚接触SEO的新手朋友来说,会经常听到别人提及网站的三大标签.那么,具体什么是网站的三大标签呢?其实网站的三大标签指的就是title.keywords.description,通俗一点也可以 ...
- 微信小程序生命周期、页面生命周期、组件生命周期
1. 生命周期 App(全局) 位置:项目根目录app.js文件 App({ onLaunch (options) { // console.log('小程序初始化') }, onShow(optio ...
- 2018-8-9-win-消息
title author date CreateTime categories win 消息 lindexi 2018-8-9 15:35:4 +0800 2018-2-13 17:23:3 +080 ...
- $@、$*和环境变量IFS
- 编译Android源代码
硬盘空间需要在50G以上,最好100g 系统:ubuntu14.04 交叉工具链:arm-linux-gcc-4.5.1-v6-vfp-20120301 安装 Java 开发环境 $ sudo apt ...
- makefile自动编译
1.格式: 目标:依赖 规则 规则前有一个tab键 ,缺少tab键出错,使用空格替代也不可以 (1). 例子: 编写makefile 编译 main.c ,fun.c , fun.h test ...
- 八、结构模式之组合(Composite)模式
组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...
- 笔记65 Spring Boot快速入门(五)
SpringBoot+JPA 一.什么是JPA? JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期 ...
- Android 如何使edittext默认失去焦点
1.在布局文件中给edittext的父控件增加两个属性 android:focusable="true" android:focusableInTouchMode="tr ...