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

  其实了解差分思想的一眼就能看出来是差分了.但是如果对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. 常见状态码StatusCode

    当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求. ...

  2. C# 之 数组倒叙排列

    //倒叙排列 string temp=""; ; i < strlist.Length / ; i++) { temp = strlist[i]; strlist[i] = ...

  3. webpack-第一个demo

    1.webpack概念 webpack是前端的一个项目构建工具,它是基于node.js开发出来的一个前端工具:借助webpack这个前端自动化构建工具,可以完美实现资源的合并.打包.压缩.混淆等诸多功 ...

  4. luogu 4059 [Code+#1]找爸爸 动态规划

    Description 小A最近一直在找自己的爸爸,用什么办法呢,就是DNA比对.小A有一套自己的DNA序列比较方法,其最终目标是最 大化两个DNA序列的相似程度,具体步骤如下:1.给出两个DNA序列 ...

  5. BZOJ 4883: [Lydsy1705月赛]棋盘上的守卫 最小生成树 + 建模

    Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置 ...

  6. 箭头函数详解()=>{}

    摘要:箭头函数有几个使用注意点. (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象,箭头函数继承而来的this指向永远不变. (2)不可以当作构造函数,也就是说,不可以使用n ...

  7. 读取hibernate.cfg.xml文件

    new Configuration().configure().buildSessionFactory() new Configuration()默认是读取hibernate.properties 所 ...

  8. SQL Server 2016升级迁移过程中性能问题诊断案例

    日常运行的批量更新作业,平日是5分钟之内结束,今天出现超过30分钟没结束的情况,实际运行3个小时以上,应用程序超时报错. 数据库版本:SQL Server 2016企业版 问题SQL: declare ...

  9. 微信小程序 API 路由

    路由:由于页面的跳转: wx.switchTab() 跳转到 tabBar 页面,并关闭掉其他所有非 tabBar 页面: 参数:为对象, 对象的属性: url:需要跳转的 tabBar 的页面路径( ...

  10. WINDOWS API 大全(二)

    9. API之设备场景函数 CombineRgn 将两个区域组合为一个新区域CombineTransform 驱动世界转换.它相当于依顺序进行两次转换CreateCompatibleDC 创建一个与特 ...