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/) 题面 有 ...
随机推荐
- 【iOS】The filename 未命名.ipa in the package contains an invalid character(s)
提交 APP 到苹果官网审核时遇到了这个问题,如图: 其实就是不支持中文,随便换个英文名就行了. 参考:http://blog.csdn.net/u011439689/article/details/ ...
- S2:面向对象
面向对象七大设计原则 1. 开闭原则 2. 里氏替换原则 3. 单一职责原则 4. 接口隔离原则 5. 依赖倒置原则 6. 迪米特原则 7.组合/聚合复用原则 原则一:(SRP:Single resp ...
- 夯实Java基础(十四)——Java8新的日期处理类
1.前言 Java8之前处理日期一直是Java程序员比较头疼的问题,从Java 8之后,Java里面添加了许多的新特性,其中一个最常见也是最实用的便是日期处理的类——LocalDate.LocalDa ...
- 【数据结构学习】关于HashMap的那些事儿
涉及数据结构 红黑树 链表 哈希 从CRUD说起 预热知识: DEFAULT_INITIAL_CAPACITY = 1 << 4, HashMap默认容量为16(n << m意 ...
- 11、增强型for循环对二维数组的输出(test8.java)
由于笔者原因,这部分知识,尚不能整理出代码,笔者会好好学习增强型for循环中迭代起的相关知识,在笔者有能力,书写好这段代码后,将对本篇文章,进行二次修改,也同时欢迎大家与笔者交流,共同学习,共同进步. ...
- 伪分布式Spark + Hive on Spark搭建
Spark大数据平台有使用一段时间了,但大部分都是用于实验而搭建起来用的,搭建过Spark完全分布式,也搭建过用于测试的伪分布式.现在是写一遍随笔,记录一下曾经搭建过的环境,免得以后自己忘记了.也给和 ...
- form提交的几种方式
背景 一直使用postman作为restful接口的调试工具,但是针对post方法的几种类型,始终不明白其含义,今天彻底了解了下 form提交的来源 html页面上的form表单 <form a ...
- Opengl_入门学习分享和记录_番外篇00(MacOS上如何给Xcode 适配openGL)
现在前面的废话:哇这次没有鸽太久,突然想起来还没有介绍如何适配opengl的衍生库.今天一并介绍下,同样看时间允不允许,让我再把之前学到的一些东西再次总结一遍. 正文开始: 首先大家要知道我们的Ope ...
- js实现图片上传方法
知识点 onchange事件 循环 封装函数 ajax php Javascript代码 //找到元素 var file=document.getElementById("file" ...
- (三十九)c#Winform自定义控件-面包屑导航
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...