2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)
这题.....队里都没怎么训练差分,导致败北...写了一堆线段树嘤嘤嘤,到最后也是超时,比赛结束后看到了差分的思想于是就去学了一手.
其实了解差分思想的一眼就能看出来是差分了.但是如果对n差分的话很明显会T呢,所以我们考虑从m组询问入手.
要不我先讲一下我目前了解的差分吧.
直白说的话,差分就是用一个差分数组mark保存val[i] - val[i - 1]的值,然后利用差分的性质就可以很方便的解决一类问题.
先说一个差分的性质.差分数组的前 i 项和就是原数组元素val[i],这个想一下想不出来的话可以自己手写差分数组,就知道为什么了.
那么很明显了呀,我们如果给差分数组中第i项的值加a,就相当于给原数组i及其之后的值都加了这个值,就可以很容易实现对一个区间加同一个值.
如何在区间末端截止呢,我们把闭区间后面的元素所对应的差分减a,后面的数就不会因为前面的数的改变而改变了.
so
下面说这个题很明显一个灯泡如果是亮着的,那么他一定是被按了奇数次,所以我们区间更新求和然后对每个数判断是否它上面的值是否是奇数即可.
复杂度O(Tn),妥妥的超时啦,我们发现是因为n过大才超时的,又因为询问只有1000次,所以我们考虑对m下手,稍加分析我们可以发现,如果将所有的询问
都读入,接着按照大小排序,依次访问所有值,如果发现此时出现左端点和右端点的次数之和为奇数时说明这个点之后的点一定是开着的,但是我们不知道开到哪,
所以我们只能让他开到下一个数的区间,再循环访问所有区间,我们就可以逐个统计出所有开着的灯了,这么一想是不是感觉巨简单.
参考代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
struct node {
int id, k;
} q[maxn << ]; bool cmp(node a, node b) {
return a.id < b.id;
} int main() {
int t, n, m, l, r, tot, ans, sum, _case = ;
scanf("%d", &t);
while(t --) {
tot = sum = ans = ;
scanf("%d %d", &n, &m);
while(m --) {
scanf("%d %d", &l, &r);
q[++ tot].id = l; q[tot].k = ;
q[++ tot].id = r + ; q[tot].k = -;
}
sort(q + , q + tot + , cmp);
for(int i = ; i <= tot - ; i ++) {
sum += q[i].k;
if(sum & ) ans += q[i + ].id - q[i].id;
}
printf("Case #%d: %d\n", ++ _case, ans);
}
return ;
}
放上我多此一举离散化实现的代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
int mark[maxn << ];
struct node {
int l, r;
} q[maxn]; int ls[maxn << ]; int main() {
int t, n, m, tot, _case = ;
scanf("%d", &t);
while(t --) {
memset(mark, ,sizeof mark);
tot = ;
scanf("%d %d", &n, &m);
for(int i = ; i <= m; i ++) {
scanf("%d %d", &q[i].l, &q[i].r);
q[i].r ++;
ls[++ tot] = q[i].l;
ls[++ tot] = q[i].r;
}
sort(ls + , ls + + tot);
int num = unique(ls + , ls + + tot) - ls - ;
for(int i = ; i <= m; i ++) {
q[i].l = lower_bound(ls + , ls + + num, q[i].l) - ls;
q[i].r = lower_bound(ls + , ls + + num, q[i].r) - ls;
mark[q[i].l] ++;
mark[q[i].r] --;
}
int ans = , sum = ;
for(int i = ; i <= num; i ++) {
sum += mark[i];
if(sum & ) ans += ls[i + ] - ls[i];
}
printf("Case #%d: %d\n", ++_case, ans);
}
return ;
}
2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)的更多相关文章
- [2019上海网络赛F题]Rhyme scheme
题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...
- [2019上海网络赛J题]Stone game
题目链接 CSLnb! 题意是求出给定集合中有多少个合法子集,合法子集的定义为,子集和>=总和-子集和$\& \&$子集和-(子集的子集和)<=总和-子集和. 其实就是很简 ...
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- Peekaboo(2019年上海网络赛K题+圆上整点)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 你的位置在\(O(0,0)\),\(A\)的位置为\((x_1,y_1)\),\(B\)的位置为\((x_2,y_2)\),现在已知\(a=O ...
- 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...
- 2019上海网络赛 F. Rhyme scheme 普通dp
Rhyme scheme Problem Describe A rhyme scheme is the pattern of rhymes at the end of each line of a p ...
- [2019沈阳网络赛D题]Dawn-K's water(点分治)
题目链接 题意为求出树上任意点对的距离对3取余的和. 比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了.修修改改结果队友写了发dp直接就过了Orz. 赛后想了想维护的东 ...
- [2019南京网络赛D题]Robots
题目链接 2019.9.2更新 第二天睡醒想了想发现好像搜一遍就可以过,赛时写的花里胡哨的还错了,太菜了QAQ #include<bits/stdc++.h> using namespac ...
随机推荐
- thinkphp之cookie操作
cookie设置 命名空间 代码
- Tomcat网站上的core和deployer的区别
8.5.13 Please see the README file for packaging information. It explains what every distribution(分布) ...
- C++ 没有合适的默认构造函数(无参数构造函数)
本来今天吧,想写一个proxy class的范例,写着写着出了个问题,见如下代码 ; Array1D* _elemArray = new Array1D[_cap]; 同时我为Array1D这个类写了 ...
- SQL limit(分页)
1.limit使用 limit参数,第一个参数:从哪儿开始查:第二个参数:查几条 i : 为查询结果的索引值(默认从0开始): n : 为查询结果返回的数量 -- 从3开始 取 3 条 SELECT ...
- Devexpress MVC DateEdit 设置默认的Time
当用户没有选择日期的时候, 默认显示当前的时间给TimeEdit. 只有当用户选了日期后, 才会把时间带进去. 效果图: 实现 C# Helper Code public static Action& ...
- Sublime Text3的Package Control安装教程,及报错解决There Are No Packages Available For Installation
一.Package Control的安装 Sublime 有很多插件,这些插件为我们写python代码提供了非常强大的功能,这些插件需要单独安装.而安装这些插件最方便的方法就是通过Package Co ...
- Selenium 控制浏览器
webdriver提供了操作浏览器的一些基本方法,例如:打开,前进,后退,刷新,设置窗口大小,截屏,退出等 一.打开网页 代码: # coding = utf-8 from time import s ...
- lombok效率神奇使用
Lombok效率神器 标签(空格分隔): Java Lombok简介及使用 Lombok 是一种 Java实用工具,可用来帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO), 它 ...
- sqli-labs(32)
0x1查看源代码 (1)代码关键点 很明显,代码中利用正则匹配将 [ /,'," ]这些三个符号都过滤掉了 preg_replace 0x2 宽字符注入 (1)前言 在mysql中,用于转义 ...
- Redis大key的发现与删除方法全解析
个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...