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/ ...
随机推荐
- HDU 5475:An easy problem 这题也能用线段树做???
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 51nod 1103:N的倍数 抽屉原理
1103 N的倍数 题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个长度为N的数组A,从A中选出若干个数,使得这 ...
- 进度5_家庭记账本App_数据库的添加和查看
今天继续在昨天的基础上完成了家庭记账单的在数据库中的添加和查看功能 在之前的基础上舍弃了Fragment,重新在百度上找到了学习资料,并且自我完成了实践 首先在之前的基础上创建CostListAdap ...
- 用UICollectionView实现上下轮播的案例
// // RecommendNewsCell.swift // XMLYFM // // Created by Domo on 2018/8/2. // Copyright © 2018年 ...
- HZNU-ACM寒假集训Day8小结 最小生成树
最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络 https://www.luogu.com.cn/problem/P1546 #i ...
- i春秋-web-爆破3
首先,是PHP代码审计,看懂就能解出来题. <?php error_reporting(0); session_start(); require('./flag.php'); if(!isset ...
- Python基本数据类型之字符串
Python转义字符 在需要在字符中使用特殊字符时,python用反斜杠(\)转义字符.如下表: 转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a ...
- 《Thinking in Java》中讲到了final,发现自己有部分地方迷糊
1.1当给全局的静态字段加上final时,系统是不会给其赋默认值的,若不手动初始化,会编译时错误——Variable 'xxx' might not have been initialized. 1. ...
- POJ 1844:Sum ”滚动“数组
Sum Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10494 Accepted: 6895 Description ...
- Spring的配置文件说明
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...