题目链接: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(线段树+思维+贪心)的更多相关文章

  1. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  2. 8VC Venture Cup 2016 - Elimination Round G. Raffles 线段树

    G. Raffles 题目连接: http://www.codeforces.com/contest/626/problem/G Description Johnny is at a carnival ...

  3. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  4. 【arc073e】Ball Coloring(线段树,贪心)

    [arc073e]Ball Coloring(线段树,贪心) 题面 AtCoder 洛谷 题解 大型翻车现场,菊队完美压中男神的模拟题 首先钦定全局最小值为红色,剩下的袋子按照其中较大值排序. 枚举前 ...

  5. 【agc028E】High Elements(动态规划,线段树,贪心)

    [agc028E]High Elements(动态规划,线段树,贪心) 题面 AtCoder 你有一个\([1,N]\)的排列\(P\). 一个长度为\(N\)的字符串\(S\)是好的,当且仅当: 两 ...

  6. Buses and People CodeForces 160E 三维偏序+线段树

    Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...

  7. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  8. [Codeforces 1199D]Welfare State(线段树)

    [Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...

  9. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...

随机推荐

  1. ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)

    目录 1 普通聚合分析 1.1 直接聚合统计 1.2 先检索, 再聚合 1.3 扩展: fielddata和keyword的聚合比较 2 嵌套聚合 2.1 先分组, 再聚合统计 2.2 先分组, 再统 ...

  2. 去掉matlab图像显示刻度

    图像显示后面加 set( gca, 'XTick', [], 'YTick', [] );

  3. JVM内存结构 VS Java内存模型 VS Java对象模型

    前面几篇文章中, 系统的学习了下JVM内存结构.Java内存模型.Java对象模型, 但是发现自己还是对这三者的概念和区别比较模糊, 傻傻分不清楚.所以就有了这篇文章, 本文主要是对这三个技术点再做一 ...

  4. 图片格式:gif / png / pg / webp 介绍

    本文引自:https://www.cnblogs.com/changyangzhe/articles/5718285.html GIF介绍 GIF 意为Graphics Interchange for ...

  5. 洛谷 P1120 小木棍

    题意简述 给出n个数,求最小的l,使n个数可分成若干组,每组和都为l. 题解思路 暴力搜索+剪枝 代码 #include <cstdio> #include <cstdlib> ...

  6. Jedis的配置和优化

    参数名:maxTotal 含义:资源池最大连接数 [默认值:8] 使用建议:需要考虑以下几点 1.业务希望的Redis并发量 2.客户端执行命令时间 3.Redis资源:例如应用个数(客户端)* ma ...

  7. CSV Data Set Config 拓展开发

    1.目的 在日常的性能测试项目中,经常会遇到参数化的问题,我们所熟知的LR工具对参数化支持非常友好,然而JMeter相对逊色一些.大家都知道在使用JMeter工具参数化时常用CSV Data Set ...

  8. (四十五)c#Winform自定义控件-水波图表

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  9. freemarker导出复杂样式的Excel

    freemarker导出复杂样式的Excel 代码地址: gitee https://gitee.com/suveng/demo/tree/master/chapter.002 代码存放于demo下面 ...

  10. CMS和G1的区别

    CMS:以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现 过程: 1.初始标记:独占PUC,仅标记GCroots能直接关联的对象 2.并发标记:可以和用户线程并行执行,标记所有可达对象 ...