【2020NOI.AC省选模拟#8】C. 海盗
题目链接
原题解:
可以发现,在给定的规则下,若前$i$个人参与分配,则每个人得到的金币个数是固定的。
假设在前$i-1$个海盗参与分配时,某个海盗能得到$x$个金币,则第$i$个海盗需要给他$x+1$个金币才能得到支持。
如果某个海盗在前$i-1$个海盗分配时会被扔到海里,那么他一定会支持第$i$个海盗。
可以发现,如果我们用收益$-1$来表示被扔到海里,$i$号海盗需要给某个在$i-1$给个海盗分配时收益为$x$的海盗$x+1$个金币才能得到支持。
为了获得尽量多的金币,海盗一定会获取收益尽量低的$V_i-1$个海盗的收益,然后把其他金币全都分配给自己。
我们可以用平衡树维护这个过程,需要支持区间赋值,区间加,分裂,合并。
如果总的金币数足够获得$V_i-1$个其他海盗的支持,那这$V_i-1$个海盗的收益会增加$1$,$i$号海盗 的收益为剩下的金币数,其他海盗的金币数变成了$0$。
否则,$i$号海盗的收益是$-1$,其他海盗的收益不变。
补充:
如果连续有几个海盗被扔进海里,他们的收益会都保持为$-1$,直到出现一个没被扔进海里的海盗。
代码(100分):

#include <bits/stdc++.h> template <class T>
inline void read(T &res)
{
res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
if (bo) res = ~res + 1;
} typedef long long ll; const int N = 2e6 + 5; int n, delta, sze[N], fa[N], lc[N], rc[N], cnt[N], Root, ToT;
ll K, val[N], sum[N]; bool which(int x) {return rc[fa[x]] == x;} void upt(int x)
{
sze[x] = sze[lc[x]] + sze[rc[x]] + cnt[x];
sum[x] = sum[lc[x]] + sum[rc[x]] + val[x] * cnt[x];
} void rotate(int x)
{
int y = fa[x], z = fa[y], b = lc[y] == x ? rc[x] : lc[x];
if (z) (lc[z] == y ? lc[z] : rc[z]) = x;
fa[x] = z; fa[y] = x; if (b) fa[b] = y;
if (lc[y] == x) rc[x] = y, lc[y] = b;
else lc[x] = y, rc[y] = b; upt(y);
} void splay(int x, int tar)
{
while (fa[x] != tar)
{
if (fa[fa[x]] != tar)
{
if (which(x) == which(fa[x])) rotate(fa[x]);
else rotate(x);
}
rotate(x);
}
upt(x); if (!tar) Root = x;
} int ins(int &x, int np, ll num, int c, int ft)
{
if (!x) return x = np, fa[x] = ft, x = np, sze[x] = cnt[x] = c,
val[x] = num, sum[x] = num * c, lc[x] = rc[x] = 0, x;
if (val[x] == num) return sze[x] += c, cnt[x] += c, sum[x] += num * c, x;
sze[x] += c; sum[x] += num * c;
if (num < val[x]) ins(lc[x], np, num, c, x);
else ins(rc[x], np, num, c, x);
} int kth(int x, int k)
{
while (x)
{
int lw = sze[lc[x]], mw = cnt[x];
if (lw < k && k <= lw + mw) return x;
if (k <= lw) x = lc[x];
else x = rc[x], k -= lw + mw;
}
return 0;
} int main()
{
//freopen("c.in", "r", stdin);
//freopen("c.out", "w", stdout); int cur = 0, V;
read(n); read(K);
for (int i = 1; i <= n; i++)
{
read(V);
if (cur + 1 >= V)
{
if (i == 1) Root = ToT = 1, delta = fa[1] = lc[1] = rc[1] = 0,
sze[1] = cnt[1] = 1, val[1] = sum[1] = K;
else Root = 1, delta = fa[1] = lc[1] = lc[2] = rc[2] = 0,
sze[1] = i, cnt[1] = i - 1, val[1] = 0, sum[1] = sum[2] = val[2] = K,
fa[2] = cnt[2] = sze[2] = 1, rc[1] = ToT = 2;
printf("%lld\n", K); cur = 0; continue;
}
int k = V - cur - 1; splay(kth(Root, k), 0);
ll s = 1ll * (delta + 1) * k + sum[lc[Root]] + val[Root] * (k - sze[lc[Root]]);
if (s > K) {puts("-1"); cur++; continue;}
printf("%lld\n", K - s); cur = 0;
delta++; rc[Root] = 0; cnt[Root] = k - sze[lc[Root]]; upt(Root);
if (i - k - 1) splay(ins(Root, ++ToT, -delta, i - k - 1, 0), 0);
splay(ins(Root, ++ToT, K - s - delta, 1, 0), 0);
}
return 0;
}
【2020NOI.AC省选模拟#8】C. 海盗的更多相关文章
- NOI.AC省选模拟赛第一场 T1 (树上高斯消元)
link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...
- [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]
题面 传送门 思路 懒得解释了......也是比较简单的结论 但是自己看到几何就退缩了...... 下周之内写一个计算几何的学习笔记! Code #include<iostream> #i ...
- [NOI.AC省选模拟赛3.31] 附耳而至 [平面图+最小割]
题面 传送门 思路 其实就是很明显的平面图模型. 不咕咕咕的平面图学习笔记 用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁 建立网络流图: 源点连接至每一个对偶图点,权值为这个区域的光明能量 ...
- [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]
题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...
- [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]
题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...
- [NOI.AC省选模拟赛3.23] 集合 [数学]
题面 传送门 一句话题意: 给定$n\leq 1e9,k\leq 1e7,T\leq 1e9$ 设全集$U=\lbrace 1,2,3,...n\rbrace $,求$(min_{x\in S}\lb ...
- [noi.ac省选模拟赛]第12场题解集合
题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...
- [noi.ac省选模拟赛]第10场题解集合
题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...
- [noi.ac省选模拟赛]第11场题解集合
题目 比赛界面. T1 比较简单.容易想到是求鱼竿的最大独立集.由于题目的鱼竿可以被分割为二分图,就可以想到最大匹配. 尝试建边之后会发现边的数量不小,但联系题目性质会发现对于一条鱼竿,它 ...
- [noi.ac省选模拟赛20200606]赌怪
题目 点这里看题目. 分析 先特判掉\(K=2\)的情况. 首先可以考虑到一个简单 DP : \(f(i)\):前\(i\)张牌的最大贡献. 转移可以\(O(n^2)\)地枚举区间 ...
随机推荐
- 【PDF】日本流行文化中的中国经典巨著:《三国志》与《三国演义》 | 陈曦子 |
书本详情 标题:日本流行文化中的中国经典巨著:<三国志>与<三国演义> | 陈曦子 |年份:2019出版社:暨南大学出版社ISBN10:7566828355ISBN13:978 ...
- [SQL Server]储存过程中使用临时表循环操作数据
本文为原创文章,转载请注明出处!我的博客地址:http://www.cnblogs.com/txwd 由于工作原因,到目前为此已有一年多没有写SQL Server的储存过程了,已有些生疏.日前工作中有 ...
- 24js Number(数字)对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Axure的认识与使用
[软件介绍] Axure RP 是一款产品经理必备的交互式快速产品原型设计制作工具,能够高效率的制作产品原型,快速绘制线框图.流程图.网站架构图.示意图.HTML 模版等. [工具使用] 1.环境与画 ...
- 个人css样式_2: 渐变色
css的魅惑力 css渐变色用途还是 比较广的. ---------------------------- 效果图: html代码(三个div): <div class="div1&q ...
- Jmeter:随机类函数
一.__Random 功能介绍:计算范围内的随机数 ${__Random(参数 1,参数 2,参数 3)} 参数 1:开始数字,包括在内 参数 2:结束数字,包括在内 参数 3:注册变量名称 二._ ...
- Quartz 2D实现文字镂空效果
什么是镂空效果,下图就是一个镂空效果的文字: 从图可知,文字是透明的,可以看到下面的图片内容,而UILabel其它部分是白色背景. 使用Quartz 2D绘制镂空效果,大体思路如下: 实现一个UILa ...
- ES6-新增方法
一.字符串的新增方法 1.includes方法(实例的方法): 应用: 代码优化: (1)先使用includes方法判断是url中否包含? (2)如果包含?, 再判断url最后一位字符是不是?或&am ...
- webpack5用url-loader(file-loader)处理图片和img-loader压缩图片
webpack-cli 4.0的版本和 webpack-dev-server 3.11.0的版本不兼容,只能用webpack@5.0 + webpack-cli@3.3.12 + webpack-de ...
- 蓝牙信标、智能楼宇应用国产低功耗芯片BLE5.2 PHY6252
PHY6252是一款支持BLE 5.2功能的系统级芯片(SoC),集成了低功耗的高性能多模射频收发机,搭载32位高性能低功耗处理器,提供64K retention SRAM.可选512/256K Fl ...