http://s8pc-3.contest.atcoder.jp/tasks/s8pc_3_f (题目链接)

题意

  有一个长度为$N$的数列$A$,初始为$0$。$Q$次操作,每次两个参数$x,y$。

  1. 在$A[1]...A[x]$中找出最小的数,如果有多个找编号最小的,假设为$u$。
  2. $A[u]++$。
  3. 重复这个过程$y$次。

  输出最后的$A$序列。

Solution

  可以发现,数列$A$肯定是单调不降的,那就非常好做了。

  用一个线段树维护数列,区间赋值,支持区间求和。在询问区间中二分找到一个位置$pos$,$pos$到$x$的数改成与$pos-1$大小相同所需要花费的次数不超过$y$。剩余的次数全部加上就好。

细节

  注意特判$x=1$和$A[x-1]-A[x]>=y$的情况。

代码

// ATcoder
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int n,Q;
struct node {int l,r;LL s,tag;}tr[maxn<<2]; void pushdown(int k) {
int l=k<<1,r=k<<1|1;LL w=tr[k].tag;tr[k].tag=0;
tr[l].s=(tr[l].r-tr[l].l+1)*w;tr[l].tag=w;
tr[r].s=(tr[r].r-tr[r].l+1)*w;tr[r].tag=w;
}
void modify(int k,int s,int t,LL val) {
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;
if (l==s && r==t) {tr[k].s=val*(tr[k].r-tr[k].l+1);tr[k].tag=val;return;}
if (tr[k].tag) pushdown(k);
if (t<=mid) modify(k<<1,s,t,val);
else if (s>mid) modify(k<<1|1,s,t,val);
else modify(k<<1,s,mid,val),modify(k<<1|1,mid+1,t,val);
tr[k].s=tr[k<<1].s+tr[k<<1|1].s;
}
void build(int k,int s,int t) {
tr[k].l=s;tr[k].r=t;
if (s==t) return;
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
}
LL query(int k,int s,int t) {
int l=tr[k].l,r=tr[k].r,mid=(l+r)>>1;
if (l==s && r==t) return tr[k].s;
if (tr[k].tag) pushdown(k);
if (t<=mid) return query(k<<1,s,t);
else if (s>mid) return query(k<<1|1,s,t);
else return query(k<<1,s,mid)+query(k<<1|1,mid+1,t);
} int main() {
scanf("%d%d",&n,&Q);
build(1,1,n);
for (int x,i=1;i<=Q;i++) {
LL y;
scanf("%d%lld",&x,&y);
if (x==1) {modify(1,1,1,query(1,1,1)+y);continue;}
if (query(1,x-1,x-1)-query(1,x,x)>=y) {modify(1,x,x,query(1,x,x)+y);continue;}
int l=2,r=x,pos;
while (l<=r) {
int mid=(l+r)>>1;
if (query(1,mid-1,mid-1)*(x-mid+1)-query(1,mid,x)<=y) r=mid-1,pos=mid;
else l=mid+1;
}
LL val=query(1,pos-1,pos-1),num=x-pos+1;
y-=val*num-query(1,pos,x);
modify(1,pos,x,val);++num;
if (y/num) modify(1,pos-1,x,val+y/num);
if (y%num) modify(1,pos-1,pos-2+y%num,val+y/num+1);
}
for (int i=1;i<=n;i++) printf("%lld\n",query(1,i,i));
return 0;
}

【ATcoder s8pc_3 F】 寿司的更多相关文章

  1. Atcoder abc187 F Close Group(动态规划)

    Atcoder abc187 F Close Group 题目 给出一张n个点,m条边的无向图,问删除任意数量的边后,留下来的最少数量的团的个数(\(n \le 18\) ) 题解 核心:枚举状态+动 ...

  2. atcoder square869120Contest#3 F 寿司

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

  3. [AtCoder ARC076] F Exhausted?

    霍尔定理 + 线段树? 咱学学霍尔定理... 霍尔定理和二分图完美匹配有关,具体而言,就是定义了二分图存在完美匹配的充要条件: 不妨设当前二分图左端集合为 X ,右端集合为 Y ,X 与 Y 之间的边 ...

  4. 【Atcoder ARC060F】最良表現 / Best Representation

    Atcoder ARC060 F 题意:给一个串,求将其分成最少的没有循环节的串的种数. 思路:先求KMP的\(fail\)数组.然后发现最少的串数只有三种可能:\(1\).\(2\).\(n\). ...

  5. JOI2017 春季合宿:Railway Trip

    自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排 ...

  6. Mysql_以案例为基准之查询

    查询数据操作

  7. [atcoder contest 010] F - Tree Game

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

  8. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  9. AtCoder Grand Contest 017 F - Zigzag

    题目传送门:https://agc017.contest.atcoder.jp/tasks/agc017_f 题目大意: 找出\(m\)个长度为\(n\)的二进制数,定义两个二进制数的大小关系如下:若 ...

随机推荐

  1. STM32 M3内核的位带操作原理及步骤

    STM32 M3内核的位带操作原理及步骤 一.位带操作有什么用?什么是位带操作 位带操作的作用:可以实现对某一GPIO口寄存器(或SRAM内存中)的某一bit位直接写0或1,达到控制GPIO口输出(或 ...

  2. 【强化学习】python 实现 saras 例一

    本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10146554.html 说明:将之前 q-learning 实现的例一,用 saras 重新 ...

  3. BodeAbp服务端介绍

    BodeAbp服务端只提供api,绝大部分api通过abp的动态WebApi机制提供,原理可以参考这篇文章:http://www.cnblogs.com/1zhk/p/5418694.html 与业务 ...

  4. BugkuCTF sql注入

    前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...

  5. CrackMe-005全破详解(图文+源码)--上篇

    逆向破解 | 逆向 | 逆向分析 | CrackMe | Crack | CrackMe5 | CrackMe05 前言 CrackMe005,都说比较变态,很多人给放过去了,但是我还是决定上了它,既 ...

  6. cometd简单用例

    准备工作 整个例子的源码下载:http://pan.baidu.com/s/1gfFYSbp 下载服务端jar文件 Comet4J目前仅支持Tomcat6.7版本,根据您所使用的Tomcat版本下载[ ...

  7. Visual Studio的安装与单元测试

    一.Visual Studio的安装 由于上学期重装了win10系统,以前使用的vc++6.0不能够正常使用,所以直接就安装了Visual Studio 2015,安装的时候就直接按照提示的步骤进行安 ...

  8. M2阶段团队个人贡献分

    团队个人贡献分: 徐钧鸿:53 张艺:48 黄可嵩:51 徐方宇:47 刘浩然:52 钟毅恒:49 杨伊:50

  9. BUAAMOOC项目终审报告

    工作总结 我们是歪果仁带你灰开发团队.我们开发的项目是北航学堂(MOOC)的android客户端:BUAAMOOC. 目前我们完成了主要功能,包括UI设计,视频播放,视频下载,学习进度,个人信息等功能 ...

  10. 20135316Linux内核学习笔记第八周

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.进程调度与进程调度的时机分析 ...