AtCoder square869120 Contest #3 F sushi
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
题目链接:sushi
正解:线段树
解题报告:
考虑$a[i]>=a[i+1]$恒成立,那么序列为一段段相等的数,类似于灌水的问题。
那么用线段树维护每个点的权值,不难发现,每次$add$操作,应该是先填平差距,有剩余的话就整体上升,余下的部分补给一段前缀。
那么只需要用线段树来维护就好了,在线段树上维护$set$和$add$标记,$pushdown$的时候注意先后顺序。
//It is made by ljh2000
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <queue>
#include <cmath>
#include <ctime>
#define lc root<<1
#define rc root<<1|1
using namespace std;
typedef long long LL;
const int MAXN = 200011;
int n,Q;
struct node{ LL set,add,sum; }a[MAXN*3];
inline void update(int root){ a[root].sum=a[lc].sum+a[rc].sum; }
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void pushdown(int root,int l,int r){
if(a[root].set==0 && a[root].add==0) return ; if(l==r) return ;
int mid=(l+r)>>1;
if(a[root].set>0) {
a[lc].set=a[rc].set=a[root].set;
a[lc].sum=1LL*a[root].set*(mid-l+1); a[rc].sum=1LL*a[root].set*(r-mid);
a[lc].add=a[rc].add=a[root].set=0;
} if(a[root].add>0) {
a[lc].add+=a[root].add; a[rc].add+=a[root].add;
a[lc].sum+=1LL*a[root].add*(mid-l+1); a[rc].sum+=1LL*a[root].add*(r-mid);
a[root].add=0;
}
} inline void modify(int root,int l,int r,int ql,int qr,LL val){
pushdown(root,l,r);
if(ql<=l && r<=qr) {
a[root].set=val; a[root].add=0;
a[root].sum=1LL*(r-l+1)*val;
return ;
}
int mid=(l+r)>>1;
if(ql<=mid) modify(lc,l,mid,ql,qr,val);
if(qr>mid) modify(rc,mid+1,r,ql,qr,val);
update(root);
} inline void add(int root,int l,int r,int ql,int qr,LL val){
pushdown(root,l,r);
if(ql<=l && r<=qr) {
a[root].sum+=1LL*val*(r-l+1);
a[root].add+=val;
return ;
}
int mid=(l+r)>>1;
if(ql<=mid) add(lc,l,mid,ql,qr,val);
if(qr>mid) add(rc,mid+1,r,ql,qr,val);
update(root);
} inline LL query(int root,int l,int r,int ql,int qr){
if(ql<=l && r<=qr) return a[root].sum;
pushdown(root,l,r); int mid=(l+r)>>1;
if(qr<=mid) return query(lc,l,mid,ql,qr);
else if(ql>mid) return query(rc,mid+1,r,ql,qr);
return query(lc,l,mid,ql,qr)+query(rc,mid+1,r,ql,qr);
} inline void dfs(int root,int l,int r){
if(l==r) { printf("%lld\n",a[root].sum); return ; }
pushdown(root,l,r); int mid=(l+r)>>1;
dfs(lc,l,mid); dfs(rc,mid+1,r);
} inline void work(){
n=getint(); Q=getint(); int x; LL y; int l,r,mid,pos;
while(Q--) {
x=getint(); scanf("%lld",&y);
if(x==1) { add(1,1,n,1,1,y); continue; }
l=1; r=x; pos=0;
while(l<=r) {
mid=(l+r)>>1;
if(1LL*query(1,1,n,mid,mid)*(x-mid+1)-query(1,1,n,mid,x) <= y) r=mid-1;
else l=mid+1,pos=mid;
}
y-=1LL*query(1,1,n,pos+1,pos+1)*(x-pos)-query(1,1,n,pos+1,x);
modify(1,1,n,pos+1,x, query(1,1,n,pos+1,pos+1) );
if(y/(x-pos)) add(1,1,n,pos+1,x,y/(x-pos));
if(y%(x-pos)) add(1,1,n,pos+1,pos+y%(x-pos),1);
}
dfs(1,1,n);
} int main()
{
work();
return 0;
}
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
AtCoder square869120 Contest #3 F sushi的更多相关文章
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Grand Contest 002 F:Leftmost Ball
题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...
- AtCoder Grand Contest 017 F - Zigzag
题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...
- AtCoder Regular Contest 074 F - Lotus Leaves
题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_d 题目大意: 给定一个\(H×W\)的网格图,o是可以踩踏的点,.是不可踩踏的点. 现有一人 ...
- AtCoder Grand Contest 003 F - Fraction of Fractal
题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...
- AtCoder Grand Contest 011 F - Train Service Planning
题目传送门:https://agc011.contest.atcoder.jp/tasks/agc011_f 题目大意: 现有一条铁路,铁路分为\(1\sim n\)个区间和\(0\sim n\)个站 ...
- AtCoder Grand Contest 010 F - Tree Game
题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...
- AtCoder Regular Contest 081 F - Flip and Rectangles
题目传送门:https://arc081.contest.atcoder.jp/tasks/arc081_d 题目大意: 给定一个\(n×m\)的棋盘,棋盘上有一些黑点和白点,每次你可以选择一行或一列 ...
随机推荐
- vue学习之npm
任何一门计算机语言都包含了丰富的第三方库,npm就是JavaScript这门语言的第三方库管理工具,本文详细介绍了JavaScript的包管理工具,npm. 在计算机中安装好Node.js之后,默认已 ...
- CentOS6.5安装RHadoop
1.首先安装依赖包(各个节点都要安装) [root@Hadoop-NN-01 ~]$ yum install gcc-gfortran #否则报”configure: error: No F77 co ...
- Python OS模块重要知识点
Python OS模块重要知识点 这几点很重要,主要是关于文件路径,我之前踩了很多坑,今天总结一下,方便以后能够避免与path相关的各种坑! 1,首先我们想获取某个文件夹下面的所有文件夹以及文件(不包 ...
- JQ 给textarea赋值
<textarea id='t1'></textarea> 下面是 jq赋值的三种方式 $("#t1").text("AAA"); $( ...
- 利用js添加class
来来来,开篇点题. 分页应用.当在当前页时,分页的数字有个框之类的. 重要代码如下 <ul class="pagination"> <li><a hr ...
- MySQL从删库到跑路_高级(一)——数据完整性
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.数据完整性简介 1.数据完整性简介 数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确 ...
- 搭建Linux-java web运行环境之二:安装mysql
环境 OS:Red Hat Enterprise Linux Server release 7.3 (Maipo) JDK:jdk-7u80-linux-x64.tar.gz Tomcat:apach ...
- linux常用命令:用SecureCRT来上传和下载文件
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...
- phpstudy composer 使用安装
本人是windows 系统 phpstudy 是最新2018版本 以安装laravel框架为例子 一如图一,点击php Composer出现系统指令框,根据指令框路径找到文件 二把红框内文件删除 三在 ...
- centos+Jenkins+maven搭建持续集成
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成 ...