日常补题——ICPC网络赛上海站第二题B Light bulbs

题目链接:

https://nanti.jisuanke.com/t/41399

博客借鉴:

https://blog.csdn.net/weixin_43701790/article/details/100867368

题目大意:

每次操作使 L,R区间内的等的状态改变,最后一共有多少开着的灯

题解:

这道题的时间限制是1000ms,内存限制是8192K

可以说是很不常见的卡内存的题

一开始我们用的是线段树,直接超内存

然后想着用short int 代替int,也还是不行

然后想着如果不用lazy的方法的线段树,这样虽然内存过了,但是会超时

在这之后,又借鉴了网上一些其它类似的题,想着离散化去解决这道题

离散化的好处就是内存真的很小,因为是和M相关的大小,所以内存不用考虑

但是这样时间复杂度就达到了N^3,就会超时

后来想着离散化 + 线段树,但是没能够实现,也不知道可不可以

来自大神博客的正确思路:

其实这个题目可以换一个思路

首先如果有两个操作区间分别是[1, 3][5, 7]那么最后的值应该是3 - 1 + 7 - 5 + 2 = 4;

因此如果一个区间被操作偶数次实际上相当于没有操作,只有操作奇数次的区间的灯的状态改变了,可以通过m次操作的左右端点判断有哪些区间被操作了奇数次

如果操作区间是[1, 5] [2, 7]实际被操作的区间是[1, 2] [5 7],观察发现就是将操作的区间的左右端点排序得到的序列,只需要遍历一次m个操作,求一个前缀和即可

以下是在正确思路下的代码,果然简单了好多:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn = 1e3 + 50;
 5 int op[maxn<<2];
 6
 7
 8 int main()
 9 {
10     int t,n,m,k,p,a,b;
11     LL res;
12     k=0;
13     scanf("%d",&t);
14     while(t--)
15     {
16         p=1;
17         res=0;
18         scanf("%d%d",&n,&m);
19         for(int i=0;i<m;++i)
20         {
21             scanf("%d%d",&a,&b);
22             op[p++]=a;
23             op[p++]=++b;    //注意这里要将后面一个加一位,才是正确的个数
24         }
25         sort(op+1,op+p);
26         for(int i=2;i<=2*m;i=i+2)
27         {
28             res+=op[i]-op[i-1];
29         }
30         printf("Case #%d: %lld\n",++k,res);
31     }
32     return 0;
33 }

下次看到这种题,也就不会太过纠结了!

继续加油!

原文地址:https://www.cnblogs.com/bethebestone/p/11529006.html

时间: 2024-11-10 00:32:42

日常补题——ICPC网络赛上海站第二题B Light bulbs的相关文章

Ryuji doesn&#39;t want to study 2018徐州icpc网络赛 树状数组

Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, each book has its knowledge a[i]a[i]. Unfortunately, the longer he learns, the fewer he gets. That means, if he reads books from ll to rr, he will get a

最后一周第二天训练赛之第二题

试题: B - B Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SPOJ ICODER Description Mathews uses a brand new 16-bit instruction processor. (Yeah i am being sarcastic!). It has one register (say R) and it su

UVALive 7146 (贪心+少许数据结构基础)2014acm/icpc区域赛上海站

这是2014年上海区域赛的一道水题.请原谅我现在才发出来,因为我是在太懒了.当然,主要原因是我刚刚做出来. 其实去年我就已经看到这道题了,因为我参加的就是那一场.但是当时我们爆零,伤心的我就再也没有看过那一场的题了.昨天我的队友的高中同学建议我们一起来打一打这场比赛吧,然后我才再次回顾这场比赛.结果一堆琐事,我一共也没有做多久的题,我的队友扎扎实实看了5个小时的题,把另一道水题给过了.全场我们也只过了那么一道题.学姐说,做重现赛和现场赛比较,需要去掉一题,那么我们又爆零了. 题意: 我方有n个人

(未完结)“文远知行杯”GDET第十四届竞赛(网络赛共10题,仅整理出6题)

刚开学没多久就打了一个网络赛,通过这次网络赛我是发现我是真的菜... 放假前校赛的排名让我有些自满,寒假丝毫没有接触ACM,一直沉迷于Steam,这个真的值得好好反省. 虽然现在大一课有点多,在学校也有些事务,但是这些都不是我松懈的理由, 在此写下这篇博客就是为了提醒自己:Why(为什么别人进科协,我要打 ACM ),How,What 这次比赛的反思: 数论的学习实在是太过于薄弱,要加强,对数字的规律不够敏感,要锻炼, 数据结构最常用的树,不会,要学, 这次题目总体不算特别难,题目的灵活度不大,

2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

1 import java.util.Scanner; 2 3 4 public class Number { 5 6 private static Object i; 7 8 /* 9 *第一题 mingrikejijavabu中字符“i” 出现了几次,并将结果输出*/ 10 public static void main(String[] args) { 11 12 String r ="imingrikejijavabi"; 13 14 15 //第一种 截取 16 int a=

2019南昌icpc网络赛 I题 分块套BIT

https://nanti.jisuanke.com/t/41356 对于带修的二维数点,可以bit套主席树,也可CDQ三维偏序 但是最后我选择分块套BIT暴力... 复杂度为$m(blocksize*logn+blocknum)$ 显然,如果按照$\sqrt{n}$分块,并不是最优的 我们可以适当的增加块的大小,减少块的数量,让$blocksize*logn=blocknum$ 在这个题中,大概就是$\sqrt{1e6}$到$\sqrt{2e6}$之间吧 #include<bits/stdc+

Trace 2018徐州icpc网络赛 思维+二分

There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy) means the wave is a rectangle whose vertexes are ( 00 , 00 ), ( xx , 00 ), ( 00 , yy ), ( xx , yy ). Every time the wave will wash out the trace of f

2019上海icpc网络赛B. Light bulbs(思维+差分)

题目传送门 题意 T组案例,每组案例:n个灯泡(from 0 to n-1),m次操作,每次操作把区间[L,R]内的灯泡翻转(开变关,关变开),问m次操作之后有多少灯泡是亮着的.(时间限制:1000ms  内存限制:8192K) 题解 这道题不仅卡时间,更是卡内存,所以用线段树会爆内存 正解: 该题可以转换为经典的差分问题:每次操作对[L,R]的所有数进行+1操作,求最后有多少个奇数.(设该数组为a[n],每次操作a[L]+1,a[R+1]-1,求前缀和sum[i]=sum[i-1]+a[i]即

2019 CCPC 网络赛第三题 K-th occurrence 后缀数组+划分树+ST表+二分

题意:给你一个长度为n的字符串,每次询问给出三个数:L , R , K,表示原串 L 到 R 的子串在原串第K次出现的首字母的位置 解题思路:对子串的大量操作,不难想到后缀数组(后缀树/后缀自动机不会,所以没想到),注意到子串s[L.....R]必然是某一个后缀的前缀,所以所有前缀是该子串的后缀的排名(即rank数组的值)必定连续,也就是说在后缀数组(sa数组)中,下标是连续的,那么就是求区间第K大了(因为sa数组的值代表的是在字符串中的位置)(这里区间第K大我用划分树求),至于这一段区间的起点