省选round1的时候dalao的推荐——atcoder的题目码量不大,但很巧妙,题目比较难找,挂个链冷静一下:http://s8pc-3.contest.atcoder.jp/tasks/s8pc_3_f

还行吧。。。

好久没写标记下传的线段树了(这次一写就是个双标记)居然能一遍写对核心代码(没开longlongRE了一发,改longlong就A了)

因为本来都是0,就好处理了

对于这道题我的理解是灌水(水泥):每次在a的地方灌b体积的水,如果平就往左灌

感性理解得到单调性(数学归纳可证),而且被灌的地方分成三个阶段:先填平,再竖直向上涨,最后在左边的一段填1

二分填到哪里位置,然后直接(用线段树)模拟就可以了,复杂度两个log

 #include <bits/stdc++.h>
#define sum(x,y) que(1,1,n,x,y)
#define change(x,y,z) chan(1,1,n,x,y,z)
#define add(x,y,z) Plus(1,1,n,x,y,z)
#define mid (l+r>>1)
using namespace std;
long long sum[],fg[],ad[];
long long n,m,a,b;
void down(int now,int l,int r)
{
if(fg[now])
{
fg[now]+=ad[now];
fg[now<<]=fg[now];
fg[now<<|]=fg[now];
ad[now]=ad[now<<]=ad[now<<|]=fg[now]=;
sum[now<<]=fg[now<<]*(mid-l+);
sum[now<<|]=fg[now<<|]*(r-mid);
}
if(ad[now])
{
ad[now<<]+=ad[now];
ad[now<<|]+=ad[now];
sum[now<<]+=ad[now]*(mid-l+);
sum[now<<|]+=ad[now]*(r-mid);
ad[now]=;
}
}
void updata(int now)
{
sum[now]=sum[now<<]+sum[now<<|];
}
void chan(int now,int l,int r,int x,int y,long long z)
{
if(l==x && r==y)
{
fg[now]=z;
ad[now]=;
sum[now]=z*(r-l+);
return;
}
down(now,l,r);
if(x<=mid)
chan(now<<,l,mid,x,min(mid,y),z);
if(y>mid)
chan(now<<|,mid+,r,max(mid+,x),y,z);
updata(now);
}
void Plus(int now,int l,int r,int x,int y,long long z)
{
if(l==x && r==y)
{
ad[now]+=z;
sum[now]+=z*(r-l+);
return;
}
down(now,l,r);
if(x<=mid)
Plus(now<<,l,mid,x,min(mid,y),z);
if(y>mid)
Plus(now<<|,mid+,r,max(mid+,x),y,z);
updata(now);
}
long long que(int now,int l,int r,int x,int y)
{
if(l==x && r==y)
return sum[now];
down(now,l,r);
long long ret=;
if(x<=mid)
ret+=que(now<<,l,mid,x,min(y,mid));
if(y>mid)
ret+=que(now<<|,mid+,r,max(x,mid+),y);
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d%lld",&a,&b);
int l=,r=a;
for(;l<r;)
if(sum(mid,mid)*(a-mid+)-sum(mid,a)<=b)
r=mid;
else
l=mid+;
b-=sum(l,l)*(a-l+)-sum(l,a);
change(l,a,sum(l,l));
add(l,a,b/(a-l+));
if(b%(a-l+))
add(l,l+b%(a-l+)-,);
}
for(int i=;i<=n;i++)
printf("%lld\n",sum(i,i));
return ;
}

最新文章

  1. 扩展ValidationAttribute 1
  2. 关于sitemesh和freemark在struts2中的一些问题总结
  3. Hbase 建表基本命令总结
  4. SqlSugar常用查询实例-拉姆达表达式
  5. Linux如何修改SSH端口号
  6. 程序员的自我救赎---11.3:WinService服务
  7. 【iOS】OC-时间转化的时区问题
  8. jenkins中集成commander应用
  9. CSS3基础入门03
  10. BZOJ2567 : 篱笆
  11. gmail及youtube
  12. 使用Python matplotlib做动态曲线
  13. 在 Linux 上安装 Oracle 数据库 11g
  14. git工具使用包括上传本地代码到服务器
  15. 12C配置EM Express的https端口
  16. GDB用法简要整理
  17. 【Oracle】ORA 01810 格式代码出现两次-转
  18. Tornado cookie 笔记
  19. MV人物抹去
  20. 集成maven和Spring boot的profile功能

热门文章

  1. 分享知识-快乐自己:初识 Hibernate 概念片(一)
  2. Apache Flink vs Apache Spark——感觉二者是互相抄袭啊 看谁的好就抄过来 Flink支持在runtime中的有环数据流,这样表示机器学习算法更有效而且更有效率
  3. codeforces 660C C. Hard Process(二分)
  4. kettle导数删除并插入更新数据_20161130
  5. BZOJ_2957_楼房重建_线段树
  6. Vijos1132:求二叉树的先序序列
  7. struts2的使用知识点
  8. UDK游戏打包详解
  9. 阿里云服务器,无法通过公网ip访问实例
  10. 20.Consent Controller Get请求逻辑实现