BZOJ链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4293

Chika的烦恼

【题目描述】

Chika 家经营着一家旅馆,她经常要帮家里的忙,有时候,她需要去清理长
满杂草的后院。具体地,后院里面的每棵草都有其生长速率(每天所能生长的高
度),在某些给定的日期,她需要把高度大于某个值b 的杂草割掉一截,使其高
度剩余b。(b 在每次给定的日期时不一定相同。)
她想请你帮她统计一下,每次她所割掉的草的总量是多少。
假设最开始每棵草的高度是零。
【输入格式】
第一行为两个整数n, m,代表后院里草总共有n 棵,以及发生的事件的总
数m。
第二行包含n 个整数a1, a2, …, an。ai (1≤i≤n)代表第i 棵草的生长速
度为每天ai 个单位。
接下来m 行,第i 行包含两个整数di, bi,代表在第di 天结束时,Chika 把
所有高度大于bi 的草的高度变成了bi。(保证输入的di 是递增的)
【输出格式】
包含m 行,每行一个整数,代表割掉的草的总量共有多少个单位。
【样例输入】
4 4
1 2 4 3
1 1
2 2
3 0
4 4
【样例输出】
6
6
18
0
【数据范围】
1≤n,m≤400000,
1≤ai≤10610610^6,
1≤di≤1012101210^{12},
6
0≤bi≤1012101210^{12},
d1

样例解释

第1天,草的高度分别为1,2,4,3,收割后变为1,1,1,1。

第2天,草的高度分别为2,3,5,4,收割后变为2,2,2,2。

第3天,草的高度分别为3,4,6,5,收割后变为0,0,0,0。

第4天,草的高度分别为1,2,4,3,收割后变为1,2,4,3。

题解

电子科大居然出BZOJ原题。。。然而我之前并不知道,打暴力还没开long long,爆零。。。

我们可以发现,生长速度快的草的高度不可能低于长得慢的草的高度,所以如果我们将所有草按生长速度排一次序,我们可以发现每次剪掉的草都是在一个区间内的。

因此我们可以建立一棵线段树来维护整片草坪,线段树维护区间加编号,区间赋值编号,区间最大值(即这个区间的右边界),还有区间和。

区间加操作我们加的是时间,在更新区间和的时候我们只需用这个时间加上这个区间的总生长速度,区间的生长速度可以求一波前缀和来做到O(1)O(1)O(1)调用。

剪草的过程就是区间赋值的过程,我们在赋值的时候就可以顺便记录下来剪掉了多少草。

在维护标记的时候,要先push赋值标记,再push区间加标记,当有新的赋值标记从上面传下来的时候,就把区间加标记清空。

其实都是线段树的基本操作。。。只是博主线段树写得少所以调了一上午而已。。。

另外,因为每次区间加都是针对整个区间的,所以不需要专门写个区间加。

LPA大佬维护了时间戳的线段树,蒟蒻膜拜。

代码
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int M=5e5+5;
ll n,m,date,s[M];
struct node{ll rb,add,sum,cut;node(){cut=-1ll;}
};
node tree[M<<2];
void in()
{scanf("%lld%lld",&n,&m);for(int i=1;i<=n;++i)scanf("%lld",&s[i]);
}
void up(int v)
{tree[v].sum=tree[v<<1].sum+tree[v<<1|1].sum;tree[v].rb=tree[v<<1|1].rb;
}
void pushadd(int v,int le,int ri)
{int v1=v<<1,v2=v<<1|1;tree[v1].add+=tree[v].add;tree[v2].add+=tree[v].add;int mid=(le+ri)>>1;tree[v1].sum+=(s[mid]-s[le-1])*tree[v].add;tree[v2].sum+=(s[ri]-s[mid])*tree[v].add;tree[v1].rb+=(s[mid]-s[mid-1])*tree[v].add;tree[v2].rb+=(s[ri]-s[ri-1])*tree[v].add;tree[v].add=0;
}
void pushcut(int v,int le,int ri)
{int v1=v<<1,v2=v<<1|1;tree[v1].cut=tree[v2].cut=tree[v].cut;int mid=(le+ri)>>1;tree[v1].sum=(mid-le+1)*tree[v].cut;tree[v2].sum=(ri-mid)*tree[v].cut;tree[v1].rb=tree[v2].rb=tree[v].cut;tree[v].cut=-1;tree[v<<1].add=tree[v<<1|1].add=0;
}
void push(int v,int le,int ri)
{if(~tree[v].cut)pushcut(v,le,ri);if(tree[v].add)pushadd(v,le,ri);
}
void add(ll ad)
{tree[1].add+=ad;tree[1].sum+=s[n]*ad;tree[1].rb+=(s[n]-s[n-1])*ad;
}
ll cut(int v,int le,int ri,int lb,int rb,ll cu)
{if(lb<=le&&ri<=rb){tree[v].cut=cu;tree[v].add=0;ll k=tree[v].sum;tree[v].sum=(ri-le+1)*cu;tree[v].rb=cu;return k-tree[v].sum;}push(v,le,ri);int mid=(le+ri)>>1;ll ans=0;if(lb<=mid)ans=cut(v<<1,le,mid,lb,rb,cu);if(mid<rb)ans+=cut(v<<1|1,mid+1,ri,lb,rb,cu);up(v);return ans;
}
int get(int v,int le,int ri,ll b)
{if(le==ri)return tree[v].sum<b?0:le;push(v,le,ri);int mid=(le+ri)>>1;if(tree[v<<1].rb>=b)return get(v<<1,le,mid,b);else return get(v<<1|1,mid+1,ri,b);
}
ll work(ll a,ll b)
{add(a-date);int pos=get(1,1,n,b);if(!pos)return 0;return cut(1,1,n,pos,n,b);
}
void ac()
{sort(s+1,s+1+n);for(int i=2;i<=n;++i)s[i]+=s[i-1];ll a,b;for(int i=1;i<=m;++i){scanf("%lld%lld",&a,&b);printf("%lld\n",work(a,b));date=a;}
}
int main()
{in();ac();return 0;
}

[UESTC SC T4] Chika 的烦恼相关推荐

  1. SQL(之一)-SQL经典题目

    说明:以下SQL练习题(主要针对DBMS为ORACLE),题目来自网络,本人整理编辑完成,难度分为1-5星. 涉及的4个表的表间关系: --0-查询每个学生.最高学科的成绩.及最高成绩的所在学科在班级 ...

  2. sql练习一(学生,课程,教师,成绩)

    学生,课程,教师,成绩各种查询 初始化建表语句 create table Student(SID varchar(10),Sname nvarchar(10),Sage datetime,Ssex n ...

  3. Hack The Box-Timelapse

    Timelapse 打开网站发现打不开,扫描一下端口 nmap -A -sV -sC -T4 -p "*" 10.10.11.152 看到了开了445端口,smb服务,尝试使用匿名 ...

  4. Linux Privilege Escalation Kernel Exploits | Linux本地内核提权漏洞复现 CVE-2015-1328

    Linux Privilege Escalation Kernel Exploits | Linux本地内核提权漏洞复现 CVE-2015-1328 文章目录 Linux Privilege Esca ...

  5. 黄聪:VS2010开发T4模版引擎之基础入门

    原文:http://www.cnblogs.com/lzrabbit/archive/2012/07/15/2591085.html 额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知,却又 ...

  6. [转]T4模版引擎之基础入门

    本文转自:http://www.cnblogs.com/lzrabbit/archive/2012/07/15/2591085.html 额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知, ...

  7. java 蓝桥杯算法训练 未名湖边的烦恼

    试题 算法训练 未名湖边的烦恼 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一 ...

  8. hihoCoder 1513: 小Hi的烦恼(五维偏序+bitset)

    #1513 : 小Hi的烦恼 时间限制:5000ms 单点时限:1000ms 内存限制:1024MB 描述 小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好. 小Hi在 ...

  9. MVC中使用T4模板

    一.原文地址 大佬的链接:http://www.cnblogs.com/heyuquan/archive/2012/07/26/2610959.html 二.图片释义 1.简单示例,对基本的模块标记 ...

  10. 拼多多2021校招2020.9.1笔试题 T2 and T4

    T1简单没套路,T3 a不完..所以只有T2和T4 import java.util.HashSet; import java.util.LinkedList; import java.util.Qu ...

最新文章

  1. 平衡查找树C语言程序,树4. Root of AVL Tree-平衡查找树AVL树的实现
  2. 开课吧python学费-安利一个特别棒的工具给大家
  3. 10月15日云栖精选夜读 | 阿里巴巴 Apache Dubbo 布道师谈 Service Mesh
  4. mysql冷热数据LRU_浅析MySQL的lru链表
  5. sqlparameter多个赋值一行完成_HashMap源码从面试题说起:请一行一行代码描述hashmap put方法...
  6. MySQL课设小问题_MySQL必会的50个常见面试练习题
  7. static_cast与dynamic_cast类型转换
  8. Android开发里的自定义View的实现
  9. jQ UI 后台管理系统基础UI
  10. PostgreSQL数据库统计信息——analyze命令
  11. 关于Gstreamer出现“Could not send sticky events”的机制探究
  12. 微软的一道前端面试题
  13. 1822 - Failed to add the foreign key constraint. Missing index for constraint ‘fk_tno_course‘ in the
  14. 恋情四阶段:共存,反依赖,独立,共生
  15. 小圈序号(1~50)
  16. AMEsim16安装启动后加载液压模块与车辆动力学模块
  17. python五子棋小游戏程序源码
  18. 加推携手京东开普勒打造超级IP名片,让人人都能轻松创业开店!
  19. PS切片工具(切图bug有阴影) - 解决篇
  20. php 自带模板标记,关于模板标记的9篇文章推荐

热门文章

  1. MOSE:针对配置管理服务器的后渗透工具
  2. NIO中的ByteBuffer读取中文错误的解决方法:MalformedInputException
  3. Java 并发编程常识 —— by 梁飞
  4. java字符串查找算法_java – 查找所有“字符相等”字符串的高效算法?
  5. tps5430应用电路详解_详解常用电阻的优缺点
  6. Effectively bypassing kptr_restrict on Android
  7. 新建samba配置步骤
  8. 关于cocoa 运行时runtime
  9. 项目管理其实可以简单一点——项目风险
  10. Mybatis查询时数据丢失的问题