省选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 ;
}

atcoder square869120Contest#3 F 寿司的更多相关文章

  1. [atcoder contest 010] F - Tree Game

    [atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...

  2. 【AtCoder】AGC022 F - Leftmost Ball 计数DP

    [题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...

  3. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  4. 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分

    [题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...

  5. 【AtCoder】ARC082 F - Sandglass

    [链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...

  6. 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)

    题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...

  7. 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树

    题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...

  8. AtCoder abc 141 F - Xor Sum 3(线性基)

    传送门 题意: 给出\(n\)个数\(a_i\),现在要将其分为两堆,使得这两堆数的异或和相加最大. 思路: 考虑线性基贪心求解. 但直接上线性基求出一组的答案是行不通的,原因之后会说. 注意到如果二 ...

  9. [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学

    题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...

随机推荐

  1. javascript(6)

    javascript的冒泡排序 var arr=[5,0,-56,900,12]; //大的排序次数(arr.length-1) var flag=false; for(var i=0;i<=a ...

  2. centos7搭建redis主从复制,并模拟故障切换。

    Cntos7搭建redis主从复制,并模拟故障主从切换 主从复制搭建 主机:192.168.161.179 从机:192.168.161.180 1.        安装主redis 自己本地环境,关 ...

  3. java面试题06

    题目: 数据库 1. 表名:g_cardapply 字段(字段名/类型/长度): g_applyno varchar 8://申请单号(关键字) g_applydate bigint 8://申请日期 ...

  4. vim 模式下的几个快捷用法

    1.ctrl + v  (-- VISUAL BLOCK --) 选中块模式,y 复制,d 剪切,p 粘贴,Esc退出模式 2.Shift + v  (-- VISUAL LINE -- ) 快速行选 ...

  5. 关于STM32中GPIO的8种工作模式

    CSDN:http://blog.csdn.net/l20130316 博客园:http://www.cnblogs.com/luckyalan/ 1 综述 I/O口是单片机中非常常用的外设,STM3 ...

  6. MySQL交叉表处理_20160923

    交叉表处理,在二维表中例如下面表 想把年月字段放到列字段,在sql中可以使用sum(if(条件,求和字段,null)) 函数来进行行列的转置 1.首先是上篇的年月字段在一列 SELECT city A ...

  7. 「BZOJ2721」「LuoguP1445」 [Violet]樱花(数论

    题目背景 我很愤怒 题目描述 求方程 $\frac{1}{x}+\frac{1}{y}=\frac{1}{N!}$ 的正整数解的组数,其中$N≤10^6$. 解的组数,应模$1e9+7$. 输入输出格 ...

  8. Codeforces 755B. PolandBall and Game 贪心

    题目大意: 有两个人轮流说单词,已经说过的单词不能再说.给出两人掌握的不同的单词,两人可能掌握相同的单词,但是这个单词也只能说一边.问在两人都是最优策略下先手是否必胜. 题解: 我们发现最优策略一定是 ...

  9. QT(2)项目文件介绍

    一.项目创建 二.文件说明 三.QT模块

  10. JQuery Mobile+cordova构建一个Android项目

    1.安装Android开发环境     Android开发环境的安装,现在主要是由于不能访问谷歌站点,在windows下在host文件中添加一个对应的74.125.195.190 dl-ssl.goo ...