8VC Venture Cup 2016 - Elimination Round G. Raffles 线段树
G. Raffles
题目连接:
http://www.codeforces.com/contest/626/problem/G
Description
Johnny is at a carnival which has n raffles. Raffle i has a prize with value pi. Each participant can put tickets in whichever raffles they choose (they may have more than one ticket in a single raffle). At the end of the carnival, one ticket is selected at random from each raffle, and the owner of the ticket wins the associated prize. A single person can win multiple prizes from different raffles.
However, county rules prevent any one participant from owning more than half the tickets in a single raffle, i.e. putting more tickets in the raffle than all the other participants combined. To help combat this (and possibly win some prizes), the organizers started by placing a single ticket in each raffle, which they will never remove.
Johnny bought t tickets and is wondering where to place them. Currently, there are a total of li tickets in the i-th raffle. He watches as other participants place tickets and modify their decisions and, at every moment in time, wants to know how much he can possibly earn. Find the maximum possible expected value of Johnny's winnings at each moment if he distributes his tickets optimally. Johnny may redistribute all of his tickets arbitrarily between each update, but he may not place more than t tickets total or have more tickets in a single raffle than all other participants combined.
Input
The first line contains two integers n, t, and q (1 ≤ n, t, q ≤ 200 000) — the number of raffles, the number of tickets Johnny has, and the total number of updates, respectively.
The second line contains n space-separated integers pi (1 ≤ pi ≤ 1000) — the value of the i-th prize.
The third line contains n space-separated integers li (1 ≤ li ≤ 1000) — the number of tickets initially in the i-th raffle.
The last q lines contain the descriptions of the updates. Each description contains two integers tk, rk (1 ≤ tk ≤ 2, 1 ≤ rk ≤ n) — the type of the update and the raffle number. An update of type 1 represents another participant adding a ticket to raffle rk. An update of type 2 represents another participant removing a ticket from raffle rk.
It is guaranteed that, after each update, each raffle has at least 1 ticket (not including Johnny's) in it.
Output
Print q lines, each containing a single real number — the maximum expected value of Johnny's winnings after the k-th update. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.
Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if .
Sample Input
2 1 3
4 5
1 2
1 1
1 2
2 1
Sample Output
1.666666667
1.333333333
2.000000000
Hint
题意
有n个奖池,每个奖池价值p[i],你有t张票
现在每个奖池里面已经有了y[i]张票,然后你可以向每个奖池里面投入x[i]张票,当然x[i]的和需要小于等于t
然后你可以获得p[i]*x[i]/(y[i]+x[i])元钱(其实题意是你有x[i]/(y[i]+x[i])的概率获得p[i]元),但是有规定,你最多获得p[i]/2元
问你怎么投资,可以获得最多的钱
有q次修改
修改有两个操作:
1.使得y[i]+1
2.使得y[i]-1
每次修改完后,输出答案。
题解:
简单思考一下,假设没有修改操作的话,我们可以用一个堆来维护,每一块钱投入进当前我能够赚取最多的奖池就好了。
修改操作也是一样的,我修改之后,我讨论一下我当前的状态,只要我的一块钱从一个地方移动到另外一个地方,能够赚钱的话,我就去移动就好了
现在我就用线段树去维护,我从一个地方失去一块钱,我亏多少,从一个地方投入一块钱,我赚多少
然后从亏最少的地方转移到最多的地方就好了
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+6;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int x[maxn],y[maxn],p[maxn];
struct treenode
{
int L , R ;
double Up,Down,Max,Min,ans;
void updata()
{
ans=1.0*p[L]*min(1.0*x[L]/(x[L]+y[L]),0.5);
if(x[L]>=y[L])Up=0;
else
{
Up=1.0*p[L]*(x[L]+1.0)/(x[L]+y[L]+1.0);
Up-=1.0*p[L]*x[L]/(x[L]+y[L]);
}
if(x[L])
{
if(x[L]>y[L])Down=0;
else
{
Down=1.0*p[L]*x[L]/(x[L]+y[L]);
Down-=1.0*p[L]*(x[L]-1.0)/(x[L]-1.0+y[L]);
}
}
else
Down=1e18;
}
};
treenode tree[maxn*4];
inline void push_up(int o)
{
tree[o].ans=tree[o<<1].ans+tree[o<<1|1].ans;
tree[o].Up=max(tree[o<<1].Up,tree[o<<1|1].Up);
tree[o].Down=min(tree[o<<1].Down,tree[o<<1|1].Down);
if(tree[o<<1].Up>tree[o<<1|1].Up)
tree[o].Max=tree[o<<1].Max;
else
tree[o].Max=tree[o<<1|1].Max;
if(tree[o<<1].Down<tree[o<<1|1].Down)
tree[o].Min=tree[o<<1].Min;
else
tree[o].Min=tree[o<<1|1].Min;
}
inline void build_tree(int L , int R , int o)
{
tree[o].L = L , tree[o].R = R, tree[o].ans=0;
if(L==R)
tree[o].Min=tree[o].Max=L,tree[o].updata();
if (R > L)
{
int mid = (L+R) >> 1;
build_tree(L,mid,o*2);
build_tree(mid+1,R,o*2+1);
push_up(o);
}
}
inline void updata(int QL,int o)
{
int L = tree[o].L , R = tree[o].R;
if (L==R)
{
tree[o].updata();
}
else
{
int mid = (L+R)>>1;
if (QL <= mid) updata(QL,o*2);
else updata(QL,o*2+1);
push_up(o);
}
}
int main()
{
int n,t,q,mx,mi;
scanf("%d%d%d",&n,&t,&q);
for(int i=1;i<=n;i++)
p[i]=read();
for(int i=1;i<=n;i++)
y[i]=read();
build_tree(1,n,1);
while(t--)mx=tree[1].Max,x[mx]++,updata(mx,1);
while(q--)
{
int type,r;type=read(),r=read();
if(type==1)y[r]++;else y[r]--;
updata(r,1);
while(1)
{
int mx = tree[1].Max;
int mi = tree[1].Min;
//cout<<mx<<" "<<mi<<" "<<tree[1].Up<<" "<<tree[1].Down<<endl;
if(tree[1].Up<=tree[1].Down)break;
x[mx]++,x[mi]--;
updata(mx,1);
updata(mi,1);
}
printf("%.12f\n",tree[1].ans);
}
}
8VC Venture Cup 2016 - Elimination Round G. Raffles 线段树的更多相关文章
- 8VC Venture Cup 2016 - Elimination Round
在家补补题 模拟 A - Robot Sequence #include <bits/stdc++.h> char str[202]; void move(int &x, in ...
- 8VC Venture Cup 2016 - Elimination Round D. Jerry's Protest 暴力
D. Jerry's Protest 题目连接: http://www.codeforces.com/contest/626/problem/D Description Andrew and Jerr ...
- 8VC Venture Cup 2016 - Elimination Round B. Cards 瞎搞
B. Cards 题目连接: http://www.codeforces.com/contest/626/problem/B Description Catherine has a deck of n ...
- 8VC Venture Cup 2016 - Elimination Round (C. Block Towers)
题目链接:http://codeforces.com/contest/626/problem/C 题意就是给你n个分别拿着2的倍数积木的小朋友和m个分别拿着3的倍数积木的小朋友,每个小朋友拿着积木的数 ...
- codeforces 8VC Venture Cup 2016 - Elimination Round C. Lieges of Legendre
C. Lieges of Legendre 题意:给n,m表示有n个为2的倍数,m个为3的倍数:问这n+m个数不重复时的最大值 最小为多少? 数据:(0 ≤ n, m ≤ 1 000 000, n + ...
- 8VC Venture Cup 2016 - Elimination Round F - Group Projects dp好题
F - Group Projects 题目大意:给你n个物品, 每个物品有个权值ai, 把它们分成若干组, 总消耗为每组里的最大值减最小值之和. 问你一共有多少种分组方法. 思路:感觉刚看到的时候的想 ...
- 8VC Venture Cup 2016 - Elimination Round F. Group Projects dp
F. Group Projects 题目连接: http://www.codeforces.com/contest/626/problem/F Description There are n stud ...
- 8VC Venture Cup 2016 - Elimination Round E. Simple Skewness 暴力+二分
E. Simple Skewness 题目连接: http://www.codeforces.com/contest/626/problem/E Description Define the simp ...
- 8VC Venture Cup 2016 - Elimination Round C. Block Towers 二分
C. Block Towers 题目连接: http://www.codeforces.com/contest/626/problem/C Description Students in a clas ...
随机推荐
- Linux 入门记录:六、Linux 硬件相关概念(硬盘、磁盘、磁道、柱面、磁头、扇区、分区、MBR、GPT)
一.硬盘 硬盘的功能相当简单但很重要,它负责记录系统所需要的各种数据.硬盘记录数据有两个方面,一个是硬件方面的存储原理和结构,另外一方面则是软件方面的数据和文件系统.硬盘的主要行为就是数据的存放和取出 ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意:给了串s和t,要求每个t的后缀在在s中的出现次数,然后每个次数乘上对应长度求和. 解法:关 ...
- 【C++】C++11的auto和decltype关键字
转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...
- hihocoder 1178 : 计数
#1178 : 计数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Rowdark是一个邪恶的魔法师.在他阅读大巫术师Lich的传记时,他发现一类黑魔法来召唤远古生物, ...
- kafka 设置消费者线程数
http://blog.csdn.net/derekjiang/article/details/9053863 分布式发布订阅消息系统 Kafka 架构设计 - 目前见到的最好的Kafka中文文章 M ...
- 七:zooKeeper开源客户端ZkClient的api测试
ZkClient是Gitthub上一个开源的ZooKeeper客户端.ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端.同时ZKClient在 ...
- hdu 2686&&hdu 3376(拆点+构图+最小费用最大流)
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 初次接触express
今天初次使用express,还是写写心得好了. 中间件 mothod nodemon ~的使用 中间件 中间件我觉得就是个开箱即用的工具,写好中间件函数,直接use就好. 示例1: let myLog ...
- 关于多属性查找问题的sphinx解决方案
需求描述 mysql中,每一个文档都有多个标签,查询时可以筛选一个标签也可以筛选同时拥有多个标签的文档. 数据示例 文档 标签 1 1,2,3,4,5 2 2,3,4,5,6 3 3,4,5,6,7 ...
- PHP给图片加水印具体实现
给图片加水印实现方法如下: class Mark { public function __construct() { } /** * 加水印 * @param file $srcImg 要加水印的图片 ...