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 ...
随机推荐
- DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解
本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...
- SpringBoot学习记录(一)
一.SpringBoot入门 1.SpringBoot简介 简化Spring应用开发的一个框架:整个Spring技术栈的一个大整合:J2EE开发的一站式解决方案: SpringBoot的优点: (1) ...
- java算法面试题:编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...
- RabbitMQ-消费者"未处理完的消息"丢失
一个关于客户端(消费者)开启自动应答,重启后"未处理消息丢失"的小坑.(主要是对RabbitMQ理解不够) 首先,申明一下: 本文所谓的 "丢失消息" 不是指服 ...
- 短短几行css代码实现滚动条效果
如何实现使用css实现滚动条效果 实现效果,运用线性渐变来实现功能 假设我们的页面被包裹在 <body> 中,可以滚动的是整个 body,给它添加这样一个从左下到到右上角的线性渐变: bo ...
- MySQL - GROUP_CONCAT 使用方法
如上图,我想把结果集中的三行链接成一行,则可这样写: 总结: GROUP_CONCAT函数默认是用','逗号链接,如果你加上第二个参数,则以',第二个参数值'逗号+第二个参数值链接,如下图 ...
- 新装NGINX重启,出现错误 nginx: [error] open() "/usr/local/nginx/logs/nginx.pid"
重装nginx出现,重启出现错误 ./nginx -s reload nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" ...
- Java中的接口和抽象类(转)
在面向对象的概念中,我们知道所有的对象都是通过类来描述的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类往往用来表征我们在对问题 ...
- notification 使用的基本方法
当某个应用程序希望向用户发出一些提示信息,而应用程序又不在前台,可以借助Notification来实现.发出一条通知后,手机最上方额通知栏会显示一个图标,下来状态栏以后可以看到详细内容. 一.通知的基 ...
- [BZOJ1010]玩具装箱toy(斜率优化)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...