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

  其实了解差分思想的一眼就能看出来是差分了.但是如果对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. hive中groupby和distinct区别以及性能比较

    Hive去重统计 先说核心: 都会在map阶段count,但reduce阶段,distinct只有一个, group by 可以有多个进行并行聚合,所以group by会快. 经常在公司还能看到.很多 ...

  2. Eigen 矩阵库学习笔记

    最近为了在C++中使用矩阵运算,简单学习了一下Eigen矩阵库.Eigen比Armadillo相对底层一点,但是只需要添加头文库即可使用,不使用额外的编译和安装过程. 基本定义 Matrix3f是3* ...

  3. Python条件控制与循环

    条件控制语句:if 循环语句:while.for 其他语句:continue.break.pass 1.if语句 # ================================ a = 1 if ...

  4. win2008 ad域控搭建

    一.前言 1.1 AD 域服务 什么是目录(directory)呢? 日常生活中使用的电话薄内记录着亲朋好友的姓名.电话与地址等数据,它就是 telephone directory(电话目录):计算机 ...

  5. Nmap使用及常见的参数选项

    概要 当Nmap不带选项运行时,该选项概要会被输出,最新的版本在这里http://www.insecure.org/nmap/data/nmap.usage.txt.它有助于人们记住最常用的选项,但不 ...

  6. js 获取 URL的参数 session

    <script type="text/javascript"> window.onload = function () { //var content = getPar ...

  7. 视图:setContentView()

    1.setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来. 2.setContentV ...

  8. [NOIP2017]注意点

    1.数据大却没开long long 导致的gg.2.文件读入时stdin打成stdout...3.桶维护数值,有负值要平移,且数值最好稍大(否则可能RE).4.很智障地打错变量.5.DP或其他涉及到转 ...

  9. android UI设计及开发

    一.viewPager实现左右滑动及导引功能 1,如果每个屏幕只是一个简单的布局,如果简单的话,定义一个arraryIist<View>,利用addview将所有的布局加载, 然后为vie ...

  10. 配置Nginx和Apache允许指定域名CORS跨域访问

    前后端分离开发,导致前端项目需要跨域请求后端接口,解决方法有很多,本文只介绍两个: 1. 修改后端程序代码实现允许跨域请求 2. 修改服务器配置文件实现允许跨域请求 正文: 方法1:修改后端程序代码实 ...