Codeforces 626G Raffles 【贪心】【线段树】

时间:2022-09-01 00:02:40

题意:

给n个奖池,t张彩票,q次操作。

每个奖池的奖金为pi。

每个奖池现有的彩票的数量为ai,保证ai>=1;

q次操作,每次有两种,第i个奖池的现有彩票数量加一,或减一。

不允许投票的数量多于奖池数量的二分之一。

保证:

n,t,q<=2e5

ai<=1000 pi<=1000

求在采用最佳策略的前提下获得奖金的期望。

思路:

首先要证明贪心的正确性,即把某张票投入某奖池之后其下一张票给期望做出的贡献要小于上一张彩票...

把式子写一下,求导,发现导数是单调递减的...

然后是对于每次操作的处理。

一开始一直纠结如何处理从某奖池拿出的亏损。因为按照贡献差来说第一个和后来的是有区别的,而且还要处理是否超票的问题。

但是看了卿学姐的思路...

其实思路是很简洁的,大概的内容是维护一个亏损的线段树一个盈利的线段树,亏损的意思是从某一奖池拿出一张票我们期望的减少,盈利的意思是往某一奖池投入一张票期望的增加。其实奖池的投递数量不用限制的,只要把盈利控制为0就可以了。而对于减少某奖池现有彩票的数量,直接对上限和投递数量的数组进行处理,然后更新维护这个奖池的盈利和亏损就可以了。因为亏损和盈利是可以直接根据这两个数据确定的。

线段树几天没写手有点生...

#include<bits/stdc++.h>
using namespace std;
double power[];
int num[];
int have[];
struct tr{
int get_id,lose_id,s,e;
double ans,get,lose;
void updatte(){
ans=power[s]*min(1.0*have[s]/(have[s]+num[s]),0.5);
get_id=lose_id=s;
if(have[s]>=num[s])get=;
else{
get=power[s]*(have[s]+)/(have[s]+num[s]+);
get-=power[s]*have[s]/(have[s]+num[s]);
}
if(have[s]>num[s])lose=;
else if(have[s]){
lose=power[s]*have[s]/(have[s]+num[s]);
lose-=power[s]*(have[s]-)/(have[s]+num[s]-);
}
else lose=1e18;
}
};
tr tree[<<];
void update(int k){
tree[k].ans=tree[k<<].ans+tree[k<<|].ans;
tree[k].get=max(tree[k<<].get,tree[k<<|].get);
tree[k].lose=min(tree[k<<].lose,tree[k<<|].lose);
if(tree[k<<].get<tree[k<<|].get)tree[k].get_id=tree[k<<|].get_id;
else tree[k].get_id=tree[k<<].get_id;
if(tree[k<<].lose<tree[k<<|].lose)tree[k].lose_id=tree[k<<].lose_id;
else tree[k].lose_id=tree[k<<|].lose_id;
}
void build(int s,int e,int k){
tree[k].s=s;
tree[k].e=e;
if(s==e){
tree[k].updatte();
return;
}
int mid=(s+e)>>;
build(s,mid,k<<);
build(mid+,e,k<<|);
update(k);
}
int ttmp=;
void nnn(int pos,int k){
int s=tree[k].s;
int e=tree[k].e;
if(s==e){
tree[k].updatte();
return;
}
int mid=(s+e)>>;
if(pos<=mid)nnn(pos,k<<);
else nnn(pos,k<<|);
update(k);
}
int main()
{
int n,t,q;
scanf("%d%d%d",&n,&t,&q);
for(int i=;i<=n;i++){
scanf("%lf",&power[i]);
}
for(int i=;i<=n;i++){
scanf("%d",&num[i]);
}
build(,n,);
while(t>){
int get_id=tree[].get_id;
have[get_id]++;
nnn(get_id,);
t--;
}
for(int i=;i<q;i++){
int typ,id;
scanf("%d%d",&typ,&id);
if(typ==){
num[id]++;
nnn(id,);
while(tree[].get>tree[].lose){
int get_id=tree[].get_id;
int lose_id=tree[].lose_id;
have[get_id]++;
have[lose_id]--;
nnn(get_id,);
nnn(lose_id,);
}
}
else{
num[id]--;
nnn(id,);
while(tree[].get>tree[].lose){
int get_id=tree[].get_id;
int lose_id=tree[].lose_id;
have[get_id]++;
have[lose_id]--;
nnn(get_id,);
nnn(lose_id,);
}
}
printf("%.12lf\n",tree[].ans);
}
return ;
}

Codeforces 626G Raffles 【贪心】【线段树】的更多相关文章

  1. Codeforces 626G Raffles&lpar;贪心&plus;线段树&rpar;

    G. Raffles time limit per test:5 seconds memory limit per test:256 megabytes input:standard input ou ...

  2. BZOJ4391 High Card Low Card &lbrack;Usaco2015 dec&rsqb;(贪心&plus;线段树&sol;set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  3. Buses and People CodeForces 160E 三维偏序&plus;线段树

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

  4. CodeForces 877E DFS序&plus;线段树

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

  5. &lbrack;Codeforces 1197E&rsqb;Culture Code&lpar;线段树优化建图&plus;DAG上最短路&rpar;

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

  6. &lbrack;Codeforces 1199D&rsqb;Welfare State&lpar;线段树&rpar;

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

  7. &lbrack;Codeforces 316E3&rsqb;Summer Homework&lpar;线段树&plus;斐波那契数列&rpar;

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

  8. 【题解】P1712 &lbrack;NOI2016&rsqb;区间&lpar;贪心&plus;线段树&rpar;

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  9. codeforces 626 G&period; Raffles(线段树&plus;思维&plus;贪心)

    题目链接:http://codeforces.com/contest/626/problem/G 题解:这题很明显买彩票肯定要买贡献最大的也就是说买p[i]*(num[i]+1)/(num[i]+a[ ...

随机推荐

  1. centos 使用pip安装mysql-python

    直接使用# pip install mysql-python 命令报 EnvironmentError: mysql_config not found 错误 安装mysql-phthon 需要用的my ...

  2. LInux SSH远程文件&sol;目录传输命令scp(转载)

    From:http://www.vpser.net/manage/scp.html 相信各位VPSer在使用VPS是经常会在不同VPS间相互备份数据或转移数据.一般情况下VPS都已安装了Ngnix或者 ...

  3. C&num; 添加系统计划任务方案

    你可以在Windows 计划任务管理器里面添加计划任务,调试OK后导出XML文件,然后在要部署的计算机上执行CMD导入命令,把计划任务信息配置导入到服务器上的计划任务列表中,命令如下: SCHTASK ...

  4. iOS中使用自定义字体

    1.确定你的项目工程的Resources下有你要用的字体文件(.ttf或者.odf). 2.然后在你的工程的Info.plist文件中新建一行,添加key为:UIAppFonts,类型为Array或D ...

  5. Inject js code to exchange 2013

    1. save the following code to C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa ...

  6. OpenJudge 2802 小游戏 &sol; Poj 1101 The Game

    1.链接地址: http://bailian.openjudge.cn/practice/2802 http://poj.org/problem?id=1101 2.题目: 总时间限制: 1000ms ...

  7. 开源的Android开发框架-------PowerFramework使用心得(五)网络请求HTTPRequest

    GET请求示例 //所有参数都使用Bundle,用putString Bundle bundle = new Bundle(); bundle.putString("username&quo ...

  8. WebUploader IE9下报错

    WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在项目中,推荐并一直在使用WebUploader进行文件上传业务开发. ...

  9. idea src下源文件和class编译文件不一致

    今天遇到一个神奇BUG,一个和elasticsearch没有任何关系的项目,报错ES某个包找不到,刚开始以为是依赖了父项目的某个包,并且本项目主启动类ComponentScan扫描了相关的类进入Spr ...

  10. python2x 和 python 3x的区别

    1,大环境: python2x: 大神贡献源码,这些源码有自己语言的特色,源码不规范,源码重复代码太多. python崇尚的是优美清晰简单. python3x: 龟叔重新整理,将源码规范化,简单化,统 ...