[noi1994]海盗

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2000005
4 #define ll long long
5 #define pii pair<int,int>
6 #define fi first
7 #define se second
8 #define s(p) son[k][p]
9 int V,n,r,x,tag,tot[N],sz[N],ra[N],son[N][2];
10 ll k,ans,a[N],f[N];
11 void up(int k){
12 sz[k]=sz[s(0)]+sz[s(1)]+tot[k];
13 f[k]=1LL*a[k]*tot[k]+f[s(0)]+f[s(1)];
14 }
15 void rotate(int &k,int u,int p){
16 s(p)=son[u][p^1];
17 son[u][p^1]=k;
18 up(k);
19 k=u;
20 }
21 void add(int &k,ll x,int y){
22 if (!k){
23 k=++V;
24 a[k]=f[k]=x;
25 ra[k]=rand();
26 }
27 if (a[k]==x){
28 tot[k]+=y;
29 up(k);
30 return;
31 }
32 bool p=(a[k]<x);
33 add(s(p),x,y);
34 if (ra[s(p)]<ra[k])rotate(k,s(p),p);
35 up(k);
36 }
37 ll query(int k,int x){
38 if (!k)return 0;
39 if (x<=sz[s(0)])return query(s(0),x);
40 if (x<=sz[s(0)]+tot[k])return f[s(0)]+1LL*a[k]*(x-sz[s(0)]);
41 return f[s(0)]+1LL*a[k]*tot[k]+query(s(1),x-sz[s(0)]-tot[k]);
42 }
43 void del(int &k,int x){
44 if (!k)return;
45 if (x<=sz[s(0)])del(k=s(0),x);
46 else
47 if (x>sz[s(0)]+tot[k])del(s(1),x-sz[s(0)]-tot[k]);
48 else{
49 tot[k]-=sz[s(0)]+tot[k]-x;
50 s(1)=0;
51 }
52 up(k);
53 }
54 int main(){
55 scanf("%d%lld",&n,&k);
56 for(int i=1;i<=n;i++){
57 scanf("%d",&x);
58 ans=max(k-(query(r,x-1)+(x-1LL)*(tag+1)),-1LL);
59 if (ans!=-1){
60 int s=sz[r]-(x-1);
61 del(r,x-1);
62 tag++;
63 add(r,-tag,s);
64 }
65 add(r,ans-tag,1);
66 printf("%lld\n",ans);
67 }
68 }
[noi1994]海盗的更多相关文章
- bnu24252 海盗分赃
题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=24252 这是四川2012年省赛的一道题,背景:海盗分宝藏.大概题意:给你N种价值的物品,物品有两 ...
- NYOJ 994 海盗分金 逆向递推
链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=994 题意: 有n个海盗劫得了窖藏的m块金子,并准备瓜分这些战利品.按照古老流传下来的分金法则 ...
- 【HDU1538】A Puzzle for Pirates(经典的海盗问题)
[题目] Description A bunch of pirates have gotten their hands on a hoard of gold pieces and wish to di ...
- 【 HDU 1538 】A Puzzle for Pirates (海盗博弈论)
BUPT2017 wintertraining(15) #5D HDU 1538 偷懒直接放个果壳的链接了,感觉比网上直接找这题的题解要更正确.易懂. 海盗博弈论 代码 #include <cs ...
- 2012年蓝桥杯省赛A组c++第3题(喝断片的海盗)
/* 有一群海盗(不多于20人),在船上比拼酒量.过程如下:打开一瓶酒, 所有在场的人平分喝下,有几个人倒下了.再打开一瓶酒平分,又有倒下的, 再次重复...... 直到开了第4瓶酒,坐着的已经所剩无 ...
- ZBrush细说3D海盗角色的创建艺术
一提到海盗,就不由自主想到了<加勒比海盗>,那个帅得一塌糊涂的杰克船长更是让人夜不能寐寝难安,但在艺术的世界里,角色无美丑,今天我们要讲的这位海盗,就与“帅气”八竿子打不着了,它甚至有点古 ...
- 海盗分金问题SQL求解(贪心算法)
问题 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂鲨 ...
- 浙大PAT 2-10. 海盗分赃——经典博弈
题意 P个海盗偷了D颗钻石后分赃($3 \leq P, D\leq 100$),采用分赃策略: 从1号开始,提出一个分配金币的方案,如果能够得到包括1号在内的绝对多数(即大于半数)同意,则执行该方案, ...
- java实现海盗比酒量
** 海盗比酒量** 有一群海盗(不多于20人),在船上比拼酒量.过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了.再打开一瓶酒平分,又有倒下的,再次重复- 直到开了第4瓶酒,坐着的已经所剩 ...
随机推荐
- 遇到括号就是栈(bushi)
CF508E Arthur and Brackets 我在赛场上想都没想直接DP \(O(n^3)\)过了 但别人说正解是栈+贪心 讲讲DP \(bool\) \(dp[i][j]\)表示从第i对括号 ...
- 题解 [JSOI2011]柠檬
题目传送门 题目大意 给出一个区间,每个点都有一个颜色,把这个区间分为许多块,每一块的权值为 \(\max\{s\times t^2\}\) ,其中 \(s\) 为某种颜色,\(t\) 为该颜色在该块 ...
- 洛谷3163 CQOI2014危桥 (最大流)
一开始想了一发费用流做法然后直接出负环了 首先,比较显然的思路就是对于原图中没有限制的边,对应的流量就是\(inf\),如果是危桥,那么流量就应该是\(2\). 由于存在两个起始点,我们考虑直接\(s ...
- 创建第一个Android项目
目录 创建第一个Android项目 创建HelloWorld项目 选择模板 选择模板界面的英文翻译 配置项目 配置项目界面英文翻译及解释 配置项目界面的注意事项 Name的命名规范 Package n ...
- GoLang设计模式10 - 中介者模式
中介者模式是一种行为型设计模式.在中介者模式中创建了一个中介对象来负责不同类间的通信.因为这些类不需要直接交互,所以也就能避免它们之间的直接依赖,实现解耦的效果. 中介者模式的一个典型案例是老式小火车 ...
- python OptionParser的用法
from optparse import OptionParser parser = OptionParser(usage = "usage: %prog [options] arg&quo ...
- Less-(26~28) preg_replace3
Less-26: 核心语句: 各种回显均存在. 本题相比Less-25,多屏蔽了很多符号: 首先是各种注释符 --+,#,/**/ . /[]/表示字符集合:任何出现在里面的字符均会被替换. 屏蔽 ...
- aritest发送测试报告到邮件
#!/usr/bin/env python # -*- coding=utf-8 -*- __CreateAt__ = '2020/4/19-17:34' import shutil from air ...
- spring security实现简单的url权限拦截
在一个系统中,权限的拦截是很常见的事情,通常情况下我们都是基于url进行拦截.那么在spring security中应该怎么配置呢. 大致步骤如下: 1.用户登录成功后我们需要拿到用户所拥有的权限,并 ...
- 2021.8.6考试总结[NOIP模拟32]
T1 smooth 考场上水个了优先队列多带个$log$,前$80$分的点跑的飞快,后面直接萎了. 其实只需开$B$个队列,每次向对应队列中插入新的光滑数,就能保证队列中的数是单调的. 为了保证不重, ...