codeforces 626 G. Raffles(线段树+思维+贪心)
题目链接:http://codeforces.com/contest/626/problem/G
题解:这题很明显买彩票肯定要买贡献最大的也就是说买p[i]*(num[i]+1)/(num[i]+a[i]+1)-p[i]*num[i]/(num[i]+a[i])的最大值,当然这个最大值时随时改变的所以要用线段树来维护,先不考虑加彩票减彩票,可以先一开始for一遍全部的彩票先买好,然后再加彩票的或者减彩票的时候考虑不买那个改买那个。这个就需要在线段树上维护一个买一张获得贡献最大的点和不买那个减掉的贡献最小的一个,每次修改只要更新这个线段树上的这两个点就行。最后注意一下细节
#include <iostream>
#include <cstring>
#include <cstdio>
#define inf 100000000000000
using namespace std;
typedef double db;
typedef long long ll;
const db lim = 1e-;
const int M = 2e5 + ;
int a[M] , num[M];
db p[M];
struct TnT {
int l , r;
int fi , se;
db win , lose , ans;
}T[M << ];
void push_up(int i) {
T[i].ans = T[i << ].ans + T[(i << ) | ].ans;
T[i].win = max(T[i << ].win , T[(i << ) | ].win);
T[i].lose = min(T[i << ].lose , T[(i << ) | ].lose);
if(T[i].win == T[i << ].win) T[i].fi = T[i << ].fi;
else T[i].fi = T[(i << ) | ].fi;
if(T[i].lose == T[i << ].lose) T[i].se = T[i << ].se;
else T[i].se = T[(i << ) | ].se;
}
void getnum(int i , int l) {
T[i].ans = p[l] * (1.0 * num[l]) / (1.0 * (num[l] + a[l]));
T[i].ans = min(T[i].ans , 1.0 * p[l] / (1.0 * ));
if(num[l] >= a[l]) T[i].win = 0.0;
else T[i].win = p[l] * (1.0 * (num[l] + )) / (1.0 * (num[l] + a[l] + )) - p[l] * (1.0 * num[l]) / (1.0 * (num[l] + a[l]));
if(num[l] == ) T[i].lose = 1.0 * inf;
else if(num[l] > a[l]) T[i].lose = 0.0;
else T[i].lose = p[l] * (1.0 * num[l]) / (1.0 * (num[l] + a[l])) - p[l] * (1.0 * (num[l] - )) / (1.0 * (num[l] + a[l] - ));
T[i].fi = l , T[i].se = l;
}
void build(int l , int r , int i) {
int mid = (l + r) >> ;
T[i].l = l , T[i].r = r , T[i].win = , T[i].lose = , T[i].ans = ;
if(l == r) {
getnum(i , l);
return ;
}
build(l , mid , i << );
build(mid + , r , (i << ) | );
push_up(i);
}
void update(int pos , int i) {
int mid = (T[i].l + T[i].r) >> ;
if(pos == T[i].l && T[i].r == pos) {
getnum(i , pos);
return ;
}
if(mid < pos) update(pos , (i << ) | );
else update(pos , i << );
push_up(i);
}
int main() {
int n , t , q;
memset(num , , sizeof(num));
scanf("%d%d%d" , &n , &t , &q);
for(int i = ; i <= n ; i++) {
scanf("%lf" , &p[i]);
}
for(int i = ; i <= n ; i++) {
scanf("%d" , &a[i]);
}
build( , n , );
for(int i = ; i <= t ; i++) {
int now = T[].fi;
num[now]++;
update(now , );
}
while(q--) {
int t , r;
scanf("%d%d" , &t , &r);
if(t == ) a[r]++;
else a[r]--;
update(r , );
while(T[].win - T[].lose > lim) {
int now1 = T[].fi , now2 = T[].se;
num[now1]++ , num[now2]--;
update(now1 , );
update(now2 , );
}
printf("%.8lf\n" , T[].ans);
}
return ;
}
codeforces 626 G. Raffles(线段树+思维+贪心)的更多相关文章
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 8VC Venture Cup 2016 - Elimination Round G. Raffles 线段树
G. Raffles 题目连接: http://www.codeforces.com/contest/626/problem/G Description Johnny is at a carnival ...
- CodeForces 877E DFS序+线段树
CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...
- 【arc073e】Ball Coloring(线段树,贪心)
[arc073e]Ball Coloring(线段树,贪心) 题面 AtCoder 洛谷 题解 大型翻车现场,菊队完美压中男神的模拟题 首先钦定全局最小值为红色,剩下的袋子按照其中较大值排序. 枚举前 ...
- 【agc028E】High Elements(动态规划,线段树,贪心)
[agc028E]High Elements(动态规划,线段树,贪心) 题面 AtCoder 你有一个\([1,N]\)的排列\(P\). 一个长度为\(N\)的字符串\(S\)是好的,当且仅当: 两 ...
- Buses and People CodeForces 160E 三维偏序+线段树
Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...
- [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)
[Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...
- [Codeforces 1199D]Welfare State(线段树)
[Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...
- [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)
[Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...
随机推荐
- 【Java】Class JavaLaunchHelper is implemented in both ** and **
详细问题描述如下: objc[64179]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachin ...
- 【iOS】获取项目名和版本号
iOS 开发中,有时候需要获取项目名和版本号,示例代码如下: -(void)getProjectNameAndVersion{ appName = [[[NSBundle mainBundle] in ...
- Appium+python自动化(二十六)- 烟花一瞬,昙花一现 -Toats提示(超详解)
简介 今天宏哥在这里首先给小伙伴们和童鞋们分享一个有关昙花的小典故:话说昙花原是一位花神,她每天都开花,四季都灿烂.她还爱上了每天给她浇水除草的年轻人.后来,此事给玉帝得知.于是,玉帝大发雷霆,要拆散 ...
- Pyinstaller 打包工具的使用!!!
打包成一个文件夹: pyinstaller xxx.py 打包成单个文件: pyinstaller -F xxx.py 打包成不显示终端的单个文件: pyinstaller -F -w xxx.py ...
- 在.NET CORE中使用配置文件:对 ConfigurationBuilder 的使用说明
示例:ASP.NET MVC 使用示例: 如何覆写默认行为?如取消热更新支持,方法如下: 示例:控制台 使用应用程序参数 使用键值对枚举(这里以字典来说明) 使用JSON文件 注册配置文件中的某一个段 ...
- java 动手动脑7
---恢复内容开始--- 一.动手动脑:多层的异常捕获-1 阅读以下代码(CatchWho.java),写出程序运行结果: ArrayIndexOutOfBoundsException/内层try-c ...
- Codeforces Round #575 (Div. 3)
本蒟蒻已经掉到灰名了(菜到落泪),希望这次打完能重回绿名吧...... 这次赛中A了三题 下面是本蒟蒻的题解 A.Three Piles of Candies 这题没啥好说的,相加除2就完事了 #in ...
- 有趣的RPC理解
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通 ...
- cinder支持nfs快照
[问题描述] cinder后端设置为NFS,磁盘创建快照失败. 日志里面发现了这个错误: VolumeDriverException: Volume driver reported an error: ...
- 微信小程序云开发报错解决: Setting data field "openid" to undefined is invalid.
最近在学习微信小程序云开发,刚一开始就遇到了问题. 点击获取openid的时候控制台开始报错: [云函数] [login] user openid: undefined VM97:1 Setting ...