2019年icpc上海网络赛 B Light bulbs (分块、差分)
https://nanti.jisuanke.com/t/41399
题目大意:
有n个灯,m次操作,每次修改[l,r]内的灯,(off - on ,on - off),问最后有几盏灯亮着.
换种说法:n个点m个区间,每次区间内的数+1,最后n个点中计数为奇数的点的个数就是答案。
刚开始没注意,直接用线段树写,超内存了。。。。
这题因为外层有个T,并且n太大,还要卡内存,太过分了。
卡数据卡内存,每组样例一重循环都会超时。所以可以分块和对m处理来做。
对m处理的话,仔细想一想,只有区间次数被操作奇数次的话,这个区间操作才有效,所以我们只要把左右端点从小到大排序然后区间求和就行了。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const int maxn=1e7+;
using namespace std;
int a[]; int main()
{
int T;
scanf("%d",&T);
for(int k=;k<=T;k++)
{
int n,m;
int l,r;
scanf("%d %d",&n,&m);
for(int i=;i<*m;i++)
{
scanf("%d %d",&l,&r);
a[i++]=l;
a[i]=++r;
}
m*=;
int ans=;
sort(a,a+m);
// for(int i=0;i<m;i++)
// {
// printf("%d ",a[i]);
// }
for(int i=;i<m;i+=)
{
ans+=a[i]-a[i-];
}
printf("Case #%d: %d\n",k,ans);
}
return ;
}
对m下手,注意到:
把每一个端点存起来之后(并且排序),毎两个点之间的区间的 亮与否至于左边有关,不包括右边.
所以利用差分的思想,修改 L,R相当于a(L)+1,a(R+1)-1
我们把端点 排好序之后,就直接跑一遍m
如果当前为左端点 则 覆盖层数++(意思就是 之后的每个数都多了一个区间覆盖)
如果当前为右端点 则覆盖层数--(意思就是 之后每个数都少了一个覆盖区间)
因为区间左闭右开,只要为奇数(灯亮),就加上左边右开区间 R-L的值
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <math.h>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
const int maxn=1e7+;
using namespace std; struct node
{
int f;
int id;
bool friend operator < (node a,node b)
{
if(a.id==b.id)
return a.f<b.f;
return a.id<b.id;
}
}pos[]; int main()
{
int T;
scanf("%d",&T);
for(int k=;k<=T;k++)
{
int n,m;
int l,r;
int cnt=;
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d %d",&l,&r);
pos[++cnt].id=l;
pos[cnt].f=;
pos[++cnt].id=r+;
pos[cnt].f=;
}
int cot=;
int ans=;
sort(pos+,pos++cnt);
for(int i=;i<=cnt-;i++)
{
if(pos[i].f)
cot--;
else
cot++;
if(cot%)
ans+=pos[i+].id-pos[i].id; }
printf("Case #%d: %d\n",k,ans);
}
return ;
}
2019年icpc上海网络赛 B Light bulbs (分块、差分)的更多相关文章
- 2019 ACM-ICPC 上海网络赛 B. Light bulbs (差分)
题目链接:Light bulbs 比赛链接:The Preliminary Contest for ICPC Asia Shanghai 2019 题意 给定 \(N\) 个灯泡 (编号从 \(0\) ...
- 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...
- 2019年ICPC南昌网络赛 J. Distance on the tree 树链剖分+主席树
边权转点权,每次遍历到下一个点,把走个这条边的权值加入主席树中即可. #include<iostream> #include<algorithm> #include<st ...
- 2019 ICPC 南昌网络赛
2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ...
- 2018 ICPC 沈阳网络赛
2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...
- 2018 ICPC 徐州网络赛
2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...
- 2019 ICPC 上海区域赛总结
2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...
- 2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
题意:四个操作,区间加,区间每个数乘,区间的数变成 2^64-1-x,求区间和. 题解:2^64-1-x=(2^64-1)-x 因为模数为2^64,-x%2^64=-1*x%2^64 由负数取模的性质 ...
- 2018 ICPC上海大都会赛重现赛 D Thinking-Bear magic (几何)
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 D Thinking-Bear magic (几何) 链接:https://ac.nowcoder.com/acm/contest/163/ ...
随机推荐
- Python操作APP -- Appium-Python-Client
Appium连接模拟器 pip install Appium-Python-Client 使用Appium定位或者使用辅助定位工具 SDK安装目录/tools/bin,双击此辅助定位工具 from a ...
- Oracle学习笔记(2)
2.Oracle用户管理 (1)创建用户:create user 用户名 identified by 密码(需要dba权限); sql>create user yzw identified by ...
- Python风格规范分享
今天给大家分享Python 风格规范,以下代码中 Yes 表示推荐,No 表示不推荐. 分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 以下情况除外: 长的 ...
- SQL常用短语小记-持续更新
创建链接服务器语句 --//创建链接服务器[在本地服务器创建] exec sp_addlinkedserver '链接服务器名称','','SQLOLEDB','远程服务器地址' -- exec sp ...
- LIS是什么?【通讯】
Ⅲ最后一点,通讯. 从字面意义来看,通讯是一种沟通形式,信息交互的媒介.在LIS中,通讯主要指的是仪器通讯,也就是仪器与电脑-LIS系统的信息交互方式,也可以称为仪器接口. 在LIS中,通讯是最基础也 ...
- 201771010123汪慧和《面向对象程序设计Java》第十五周实验总结
一.理论部分 1.JAR文件 (1)Java程序的打包:程序编译完成后,程序员将.class文件压缩打包为.jar文件后,GUI界面 程序就可以直接双击图标运行. (2).jar文件(Java归档)既 ...
- Python csv文件操作
一.open文件打开和with open as 文件打开的区别 file= open("test.txt","r") try: for line in file ...
- For循环的几个练习
1.括号里面只能放加或减,如果要使等式成立,括号里面应该放什么运算符12()34()56()78()9 = 59 2.蓝球弹起的高度篮球从10米高的地方落下,每次弹起的高度是原来的0.3倍,问弹跳10 ...
- React编写组件的局部样式
我们都知道,在Vue的单文件组件中,style标签中编写的样式默认为全局样式,如果我们想编写局部样式, 使用一个scoped关键字就可以. 那么在React中怎么实现呢? (注: 这种方法必须使用类选 ...
- python基础2--进制、字符编码和文件处理
一.进制 1.二进制 定义 二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一" 转换方式 二进制转换为十进制: 把二进制数按权展开.相加即得十进制数. ...