E-card
E-card
题目描述
两个人各有n张牌
第一个人有n-1张平民和1张皇帝
第二个人有n-1张平民和1张奴隶
每次选择一张牌 进行对决 如果都是平民则平局
皇帝赢平民 奴隶赢皇帝 平民赢奴隶(显然只会有一局会不是平局 那局就是决胜局)
现在你是奴隶方 已知皇帝方是个沙茶 每次会在现有的手牌中随便选一张出 问你的最优决策(即在哪次出奴隶)
本来这是个沙茶问题 但是皇帝方有一天觉醒了 他不再每次随便选一张出 而是第i次以一个概率p选择出皇帝 1-p出平民
皇帝方对第i次出皇帝有估算一个收益vi(初始为0)
第i次出皇帝的概率是vi/Σv
当然皇帝方会改变他的看法(根据你的表情0 0)但是因为他是沙茶 他对他的猜想又不是很确定╮(╯_╰)╭ 所以他会在心里想一个模拟收益数组u(初始为0)
每次选择4个数L,R,a,b对于i (L<=i<=R)
u[i]更新为max(u[i], (i – L) * a + b)
在某个时刻他会确定他某次的猜想比较好 然后他会让v[i]=u[i] 这时候你会想知道你当前应该在哪出奴隶(如果多个最优解 输出最小的那个)
输入
第一行三个整数 n,m
代表n张牌 m次操作
接下来m行
如果第一个数是1 则后面跟4个数代表L,R,a,b
如果第一个数是2 则后面跟1个数i 代表把v[i]赋值为u[i] 并输出当前最优位置
对于30%的数据 n <= 10^5, m <= 1000
对于100%的数据n<=10^9, m<=100000, 1 <= L <= R <= n, |a,b|<=10^9
输出
每行一个数表示询问的结果
样例输入
1 5 10 -8 2
2 4
1 3 8 3 1
2 4
2 5
2 6
2 7
2 8
样例输出
1
4
5
6
7
8
怪题,浪费一下午
solution
对于 (i – L) * a + b
把它化为i*a-L*a+b 即一段一次函数(k=a,b=-L*a+b)
把区间(L,R)打上标记(k,b)
考虑如何处理已有标记的区间
假设有标记(k1,b1)
我要加入(k2,b2)
不妨设k1>k2
分类:
1.若b1>b2 保留(k1,b1)
2,b1<b2 这就麻烦了
k1*x+b1-k2*x-b2
t=(b2-b1)/(k1-k2)(取下整)
所以x>t 取k1,b1
x<=t k2,b2
再分类
t<l 取k1,b1
t>=r 取k2,,b2
l<t<=mid 左儿子全取k2,b2,右儿子未知
则 k保留k2,b2,递归更新右儿子
mid<t<r 右儿子全取k1,b1,左儿子未知
则 k保留k1,b1 递归更新左儿子
查询时,把i到根的路径取max
这样就可以了。
因为,对于一个点,可能造成贡献的答案,一定在i到根的路径上。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,m,pl,mp,tot;
long long maxv,li,ri,a1,b1;
struct no{
long long k,b;
};
struct node{
no x;long long ls,rs;
}tree[100005*42];
void ma(long long &k){
if(!k)k=++tot;
}
void orz(long long k,long long L,long long R,no a){
if(!tree[k].x.k)tree[k].x=a;
else {
if(a.k>tree[k].x.k)swap(a,tree[k].x);
if(a.b<=tree[k].x.b){return;}//k1>k2 b1>b2
if(a.k==tree[k].x.k){tree[k].x.b=max(tree[k].x.b,a.b);return;}
long long k1=a.k,k2=tree[k].x.k,b1=a.b,b2=tree[k].x.b;
long long t=(b2-b1)/(k1-k2);
long long mid=L+R>>1;
if(t<L){return;}//k1 b1
if(t>=R){tree[k].x=a;return;}//k2 b2
if(t<=mid){//mid+1~r k1b1
ma(tree[k].ls);
orz(tree[k].ls,L,mid,a);
}
if(t>mid){//l~mid k2b2
swap(a,tree[k].x);
ma(tree[k].rs);
orz(tree[k].rs,mid+1,R,a);
}
}
}
void lian(long long k,long long L,long long R,no a){
if(L>=li&&R<=ri){
orz(k,L,R,a);
return;
}
long long mid=L+R>>1;
if(li<=mid){
ma(tree[k].ls);
lian(tree[k].ls,L,mid,a);
}
if(ri>mid){
ma(tree[k].rs);
lian(tree[k].rs,mid+1,R,a);
}
}
long long ask(long long k,long long L,long long R){
if(!k)return 0;
if(L==R){
return tree[k].x.k*pl+tree[k].x.b;
}
long long mid=L+R>>1;
long long t=0;
if(tree[k].x.k)t=max(t,tree[k].x.k*pl+tree[k].x.b);
if(pl<=mid)t=max(t,ask(tree[k].ls,L,mid));
else t=max(t,ask(tree[k].rs,mid+1,R));
return t;
}
int main()
{
cin>>n>>m;tot=1;
maxv=0;mp=1;
for(long long i=1;i<=m;i++){
long long op;
scanf("%lld",&op);
if(op==1){
scanf("%lld%lld%lld%lld",&li,&ri,&a1,&b1);
no ne;ne.k=a1,ne.b=-a1*li+b1;
//cout<<ne.k<<' '<<ne.b<<endl;
lian(1,1,n,ne);
}
else {
scanf("%lld",&pl);
long long t=ask(1,1,n);
if(t>maxv)maxv=t,mp=pl;
if(t==maxv)mp=min(mp,pl);
printf("%lld\n",mp);
}
}
return 0;
}
E-card的更多相关文章
- Lesson 3 Please send me a card
Text Postcards always spoil my holidays. Last summer, I went to Italy. I visited museums and sat in ...
- iOS - Card Identification 银行卡号识别
1.CardIO 识别 框架 GitHub 下载地址 配置 1.把框架整个拉进自己的工程,然后在 TARGETS => Build Phases => Link Binary With L ...
- HDOJ 4336 Card Collector
容斥原理+状压 Card Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- Opensuse enable sound and mic card
Install application pavucontrol Run pavucontrol You will see the configuration about sound card and ...
- 进监狱全攻略之 Mifare1 Card 破解
补充新闻:程序员黑餐馆系统 给自己饭卡里充钱 ,技术是双刃剑,小心,小心! 前言 从M1卡的验证漏洞被发现到现今,破解设备层出不穷,所以快速傻瓜式一键破解不是本文的重点,年轻司机将从本文中获得如下技能 ...
- Card(bestcoder #26 B)
Card Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- [OpenJudge 3061]Flip The Card
[OpenJudge 3061]Flip The Card 试题描述 There are N× Ncards, which form an N× Nmatrix. The cards can be p ...
- [杂谈]交通工具orca card
How and Where to Use the ORCA Card The Microsoft ORCA card provides unlimited rides on all buses, tr ...
- [OrangePi] Backup internal EMMC to SD Card
Boot your Orange PI board from EMMC without SD Card inserted login insert your SD Card Run: sudo ins ...
- [OrangePi] Installation on SD Card
Download any of the available images (xz archive) from Mega or GoogleDrive Download scriptbin_kernel ...
随机推荐
- 前端安全之XSS和csrf攻击
1.Csrf攻击概念: csrf攻击(Cross-site request forgery):跨站请求伪造; 2.Csrf攻击原理: 用户是网站A的注册用户,且登录进去,于是网站A就给用户下发cook ...
- RPC - 麻雀虽小,五脏俱全
说起 RPC (远程过程调用),大家应该不陌生.随着微服务.分布式越来越流行,RPC 应用越来越普遍.常见的 RPC 框架如:Dubbo.gRPC.Thrift 等.本篇文章不是介绍各种 RPC 的使 ...
- Oracle 数据库、实例、表空间、用户、数据库对象
Oracle是一种数据库管理系统,是一种关系型的数据库管理系统.通常情况了我们称的“数据库”,包含了物理数据.数据库管理系统.内存.操作系统进程的组合体,就是指这里所说的数据库管理系统. 完整的Ora ...
- 第十二篇、OC_仿淘宝商品详情页的翻页
// // GFBProductViewController.m // elmsc // // Created by MAC on 2016/11/26. // Copyright © 2016年 G ...
- C#设计模式原则
原则的诞生:面向对象:封装.继承.多态三大支柱蕴含了用抽象来封装变化,降低耦合,实现复用的精髓: 封装:隐藏内部的实现,保护内部信息: 继承:实现复用,归纳共性: 多态:改写对象行为,实现更高级别的继 ...
- 分享 php array_column 函数 无法在低版本支持的 修改
function i_array_column($input, $columnKey, $indexKey=null){ if(!function_exists('array_column')){ $ ...
- Xenia and Bit Operations CodeForces - 339D
Xenia and Bit Operations CodeForces - 339D Xenia the beginner programmer has a sequence a, consistin ...
- docker 学习(2)
docker容器中安装vim ubuntu 中默认未装vim,docker run ubuntu vim 出现: container_linux.go:247: starting container ...
- 子窗体与父窗体调用对方js方法
有时候为了减少一个页面内的代码量,会将部分内容放到子窗体中,如后台管理中用iframe来进行管理 <div> <iframe id="dviframe" src= ...
- BZOJ 1531: [POI2005]Bank notes
按余数分类 单调队列优化 #include<cstdio> using namespace std; int n,m,b[205],c[205],F[20005]; struct node ...