p2629 好消息,坏消息 (线段树)

---恢复内容开始---

z

你没有发现两个字里的blog都不一样嘛 qwq

题目描述-->p2629 好消息,坏消息

历程

刚开始看到这个题,发现是需要维护区间和,满心欢喜敲了一通线段树,简单debug之后交上去 \(45pts\)?

改代码的时候开始考虑这样做的正确性.

维护区间和,前后两个的区间和加起来一定等于整个区间的区间和,那我和直接求和有什么区别?

再次读题

发现必须要求每一个时刻老板的怒气值都\(\geq 0\)才行.

xjb分析

既然维护区间和行不通,考虑改变线段树所维护的东西.

考虑维护些什么?

我们需要维护一个区间的最小值,才能判断是否满足\(\geq 0\)

而某一个位置的值,受前面位置的值的影响.

因此我们想到了前缀和.

即我们可以维护前缀和的最小值.

解决85%

既然想到了维护前缀和,那这样就很简单了.

根据题目所叙述的,我们需要从 \(k,k_1,k_2 \dots n,1,2 \dots k-1\)累加

所以我们要先判断后缀的最小值是否\(\leq 0\)

显然,我们的前缀和的计算为\(sum_i=\sum_{j=1}^{i}a_i\)

后缀部分\(\sum_{i=k}^{n}a_i\)的计算要减去\(sum_{k-1}\)

又因为题目要求的计算顺序,我们需要考虑后缀和与前缀最小值的和是否\(\geq 0\)

所以很容易写出这部分的代码

    for(R int i=2;i<=n;i++)
    {
        if(query(1,1,n,i,n)-sum[i-1]<0)continue;
        if(sum[n]-sum[i-1]+query(1,1,n,1,i-1)>=0)
            ans++;
    }   

看到上面的\(85\)%了没?

如果只单纯判断这些情况的话只能get到\(85pts\)

考虑被遗忘的情况

检查一番,我们发现题目中这一句话

uim必须按照时间的发生顺序逐条将消息告知给老板

突然醒悟

我们还可以从\(1\)到\(n\)告诉老板!

再加上判断是否整个区间的前缀最小值\(\leq 0\)即可.

综上,我们的问题就得以解决了!

---------------------代码---------------------
cpp #include<bits/stdc++.h> #define R register #define N 1000008 #define ls o<<1 #define rs o<<1|1 using namespace std; int tr[N<<2],ans,n,sum[N]; inline void up(int o){tr[o]=min(tr[ls],tr[rs]);return;}; void build(int o,int l,int r) { if(l==r) { tr[o]=sum[l]; return; } int mid=(l+r)>>1; build(ls,l,mid); build(rs,mid+1,r); up(o); } int query(int o,int l,int r,int x,int y) { if(x<=l and y>=r)return tr[o]; int mid=(l+r)>>1,res=2147483647; if(x<=mid)res=min(res,query(ls,l,mid,x,y)); if(y>mid)res=min(res,query(rs,mid+1,r,x,y)); return res; } int main() { scanf("%d",&n); for(R int i=1,x;i<=n;i++)scanf("%d",&x),sum[i]=sum[i-1]+x; build(1,1,n); for(R int i=2;i<=n;i++) { if(query(1,1,n,i,n)-sum[i-1]<0)continue; if(sum[n]-sum[i-1]+query(1,1,n,1,i-1)>=0) ans++; } printf("%d",ans+(tr[1]>=0)); }

---恢复内容结束---

原文地址:https://www.cnblogs.com/-guz/p/9708829.html

时间: 2024-10-13 19:06:14

p2629 好消息,坏消息 (线段树)的相关文章

经济--力哥说理财(二)--降息对股市是好消息还是坏消息?

降息对股市是好消息还是坏消息? 这个问题的正确答案是:在牛市中好消息是好消息,坏消息也是好消息,没有消息还是好消息.而在熊市中,坏消息是坏消息,好消息也是坏消息,没有消息还是坏消息. 利多出尽 思路决定出路,性格决定命运. 吴晓波老师,在他的自媒体上发表的了一篇文章<我为什么不炒股> 中国股市就是个怪胎,证监会的不作为(足协一样),努力让国有企业融资做大. 中国股市里的企业从来没有把股价视为公司价值的晴雨表,巴菲特的价值,中国股市是个赌场 股市和经济没什么关系,政策市. 经典港剧<大时代

洛谷 P2253 好一个一中腰鼓 --线段树

P2253 好一个一中腰鼓 --线段树 题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:“忽一人大呼:‘好一个安塞腰鼓!’满座寂然,无敢哗者,遂与外人间隔.” 题目描述 设想一下,腰鼓有两面,一面是红色的,一面是白色的.初二的苏大学神想给你这个oier出一道题.假设一共有N(1<=N<=20,000)个同学表演,表演刚开始每一个鼓都是红色面朝向观众,舞蹈老师会发出M(1<=M<=

【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define uint unsigned int 4 #define ull unsigned long long 5 #define inf 4294967295 6 #define N 100005 7 #define M 100005 8 #

bzoj 3772 :精神污染 线段树+打标记 or 主席树

3772: 精神污染 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 315  Solved: 87[Submit][Status][Discuss] Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海陆空交通设施发达.濑户内海沿岸气候温暖,多晴天,有日本少见的贸易良港神户港所在的神户

线段树 入门详解

概念(copy度娘): 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩. 通俗地讲: 线段树就是把一个线段转变为一个二叉树,如下所示: 一个线段长度为4,则把它变成线段树,就是这个样子 这样如果你想改变一个区间的值,只用O(logn).比一般算法快了许多. 但是空间复杂度就会高一些,比如本来

BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )

O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) -------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespa

线段树 BZOJ3888 [Usaco2015 Jan]Stampede

3888: [Usaco2015 Jan]Stampede Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 253  Solved: 81[Submit][Status][Discuss] Description Farmer John's N cows (1 <= N <= 50,000) appear to be stampeding along the road at the front of FJ's farm, but they are

B. Factory Repairs---cf627B(线段树)

题目链接:http://codeforces.com/problemset/problem/627/B 题意:有一个工厂生产零件,但是机器是不正常的,需要维修,维修时间是 k 天,在维修期间不能生产,如果是正常情况下每天可生产A个零件,不正常情况下也可以生产,但是只能生产B(B<A)件, 现有2个操作,1和2 1 x y 表示第x天分配的工作量是y: 2 x 表示假如在第x天进行维修机器,那么这n天共能生产多少个零件: 现在有q个这样的操作,问当2操作时当前的结果是多少: 由于数据范围比较大,所

【CF725G】Messages on a Tree 树链剖分+线段树

[CF725G]Messages on a Tree 题意:给你一棵n+1个节点的树,0号节点是树根,在编号为1到n的节点上各有一只跳蚤,0号节点是跳蚤国王.现在一些跳蚤要给跳蚤国王发信息.具体的信息传输过程如下: 1.信息的发起者把信息上传给他父亲节点处的跳蚤,然后自身进入等待状态.3.跳蚤国王在收到信息时会将信息立刻下传到发来信息的那个儿子,跳蚤国王可以在同一时刻下传多份信息.4.上传:a把信息传给b.如果b正处于等待状态,则b会立刻将a发来的信息下传回去.如果同时有好多个信息传给b,则b会