atcoder square869120Contest#3 F 寿司
省选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 寿司的更多相关文章
- [atcoder contest 010] F - Tree Game
[atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ...
- 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT
[题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...
- 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分
[题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...
- 【AtCoder】ARC082 F - Sandglass
[链接]F - Sandglass [题意]给定沙漏A和B,分别装着a和X-a的沙子,开始时A在上B在下,每秒漏1,漏完不再漏.给定n,有n个时刻ai沙漏倒转.给定m个询问,每次询问给定初值a和时刻t ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树
题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...
- AtCoder abc 141 F - Xor Sum 3(线性基)
传送门 题意: 给出\(n\)个数\(a_i\),现在要将其分为两堆,使得这两堆数的异或和相加最大. 思路: 考虑线性基贪心求解. 但直接上线性基求出一组的答案是行不通的,原因之后会说. 注意到如果二 ...
- [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学
题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...
随机推荐
- C语言实现队列(纯C)
1. [代码][C/C++]代码 #include <stdio.h>#include <stdlib.h>#define ElemType int #define Statu ...
- 2017 google IO大会——5.17
大家好! 每年一度的全球互联网及新型技术的盛会 Google IO,今年的大会日期和地址已经公布了:大会将在5月17至19日在谷歌公司总部边上的会场,美国加州 Mountain View的 Shore ...
- COM对象创建过程
在客户端需要调用COM组件时,通常调用windowAPI函数: STDAPI CoCreateInstance( REFCLSID rclsid, //创建的Com对象的类标识符(CLSID) LPU ...
- 1053 Path of Equal Weight (30)(30 分)
Given a non-empty tree with root R, and with weight W~i~ assigned to each tree node T~i~. The weight ...
- 「LOJ#10036」「一本通 2.1 练习 2」Seek the Name, Seek the Fame (Hash
题目描述 原题来自:POJ 2752 给定若干字符串(这些字符串总长 ≤4×105 \le 4\times 10^5 ≤4×105),在每个字符串中求出所有既是前缀又是后缀的子串长度. 例如:abab ...
- Codeforces 756C Nikita and stack
Codeforces 756C Nikita and stack 题目大意: 给定一个对栈进行操作的操作序列,初始时序列上没有任何操作,每一次将一个本来没有操作的位置变为某一操作(push(x),po ...
- 【转】Pro Android学习笔记(二):开发环境:基础概念、连接真实设备、生命周期
在Android学习笔记(二):安装环境中已经有相应的内容.看看何为新.这是在source网站上的Android架构图,和标准图没有区别,只是这张图颜色好看多了,录之.本笔记主要讲述Android开发 ...
- UnrealScript常用函数汇总
转自:http://www.unrealchina.org/forum.php?mod=viewthread&tid=672&extra=page%3D1 foreach [用来遍历游 ...
- java性能调优的11个建议
1.在必要之前,先不要优化 2.使用分析器来找到真正的瓶颈 3 .为整个应用程序创建性能测试套件 4.首先解决最大的瓶颈问题 5.使用StringBuilder以编程方式连接字符串 Str ...
- __setup宏简介
内核组件用__setup宏来注册关键字及相关联的处理函数,__setup宏在include/linux/init.h中定义,其原型如下: __setup(string, fun ...