这题.....队里都没怎么训练差分,导致败北...写了一堆线段树嘤嘤嘤,到最后也是超时,比赛结束后看到了差分的思想于是就去学了一手.

  其实了解差分思想的一眼就能看出来是差分了.但是如果对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 差分 + 思维)的更多相关文章

  1. [2019上海网络赛F题]Rhyme scheme

    题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...

  2. [2019上海网络赛J题]Stone game

    题目链接 CSLnb! 题意是求出给定集合中有多少个合法子集,合法子集的定义为,子集和>=总和-子集和$\& \&$子集和-(子集的子集和)<=总和-子集和. 其实就是很简 ...

  3. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  4. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  5. Peekaboo(2019年上海网络赛K题+圆上整点)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 你的位置在\(O(0,0)\),\(A\)的位置为\((x_1,y_1)\),\(B\)的位置为\((x_2,y_2)\),现在已知\(a=O ...

  6. 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...

  7. 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 ...

  8. [2019沈阳网络赛D题]Dawn-K's water(点分治)

    题目链接 题意为求出树上任意点对的距离对3取余的和. 比赛上听到题意就知道是点分治了,但是越写越不对劲,交之前就觉得会T,果不其然T了.修修改改结果队友写了发dp直接就过了Orz. 赛后想了想维护的东 ...

  9. [2019南京网络赛D题]Robots

    题目链接 2019.9.2更新 第二天睡醒想了想发现好像搜一遍就可以过,赛时写的花里胡哨的还错了,太菜了QAQ #include<bits/stdc++.h> using namespac ...

随机推荐

  1. Codeforces Round #569 (Div. 2) C. Valeriy and Deque

    链接: https://codeforces.com/contest/1180/problem/C 题意: Recently, on the course of algorithms and data ...

  2. typing 模块

    目录 typing模块 一.引言 二.typing模块的作用 三.使用typing模块 四.typing常用类型 typing模块 目录 一.引言 二.typing模块的作用 三.使用typing模块 ...

  3. windows补丁服务器

    一.WSUS 安装要求 1.硬件要求: 对于多达 13000 个客户端的服务器,建议使用以下硬件:* 4 Core E5-2609 2.1GHz 的处理器* 8 GB 的 RAM 2.软件要求: 要使 ...

  4. 【ipc-mq】根据mq的key查看使用进程

    使用ipcs -q可以得到key与msqid的对应关系,从而找到msgid webadmin@172.172.179.3:/usr/local/webapps/test_ma[17:17:36]$ i ...

  5. Mybatis mysql 一个搜索框多个字段模糊查询 几种方法

    第一种 or 根据搜索框给定的关键词,模糊搜索用户名和账号都匹配的用户集合 <select id="list" parameterType="com.user.Us ...

  6. 容器内安装nvidia,cuda,cudnn

    /var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录 du -hs /var/lib/docker/ 命令查看磁盘使用 ...

  7. BZOJ 2157: 旅游 (结构体存变量)

    用结构体存变量好像确实能提高运行速度,以后就这么写数据结构了 Code: #include <cstdio> #include <algorithm> #include < ...

  8. windows10 下 gcc/g++ 的安装

    一.gcc的下载 网址:www.mingw.org ,点击右上方的 download installer 二.安装 打开安装程序,默认安装,弹出下列界面 找到mingw32-gcc-g++(注意cla ...

  9. 6.Python缩进规则(包含快捷键)

    和其它程序设计语言(如 Java.C 语言)采用大括号“{}”分隔代码块不同,Python 采用代码缩进和冒号( : )来区分代码块之间的层次. 在 Python 中,对于类定义.函数定义.流程控制语 ...

  10. NBU5240备份系统还原数据库---Windows版

    NBU5240是一个基于系统文件和多种数据库备份的灾备系统,灵活性比较高.下面具体记录如何利用该系统的备份文件进行数据库还原.(基于业务场景) 公司某业务部门突然发现前台系统数据有异常,已经是几天前的 ...