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的更多相关文章

  1. 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 ...

  2. iOS - Card Identification 银行卡号识别

    1.CardIO 识别 框架 GitHub 下载地址 配置 1.把框架整个拉进自己的工程,然后在 TARGETS => Build Phases => Link Binary With L ...

  3. HDOJ 4336 Card Collector

    容斥原理+状压 Card Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  4. Opensuse enable sound and mic card

    Install application pavucontrol Run pavucontrol You will see the configuration about sound card and ...

  5. 进监狱全攻略之 Mifare1 Card 破解

    补充新闻:程序员黑餐馆系统 给自己饭卡里充钱 ,技术是双刃剑,小心,小心! 前言 从M1卡的验证漏洞被发现到现今,破解设备层出不穷,所以快速傻瓜式一键破解不是本文的重点,年轻司机将从本文中获得如下技能 ...

  6. Card(bestcoder #26 B)

    Card Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. [OpenJudge 3061]Flip The Card

    [OpenJudge 3061]Flip The Card 试题描述 There are N× Ncards, which form an N× Nmatrix. The cards can be p ...

  8. [杂谈]交通工具orca card

    How and Where to Use the ORCA Card The Microsoft ORCA card provides unlimited rides on all buses, tr ...

  9. [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 ...

  10. [OrangePi] Installation on SD Card

    Download any of the available images (xz archive) from Mega or GoogleDrive Download scriptbin_kernel ...

随机推荐

  1. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  2. SpringBoot学习记录(一)

    一.SpringBoot入门 1.SpringBoot简介 简化Spring应用开发的一个框架:整个Spring技术栈的一个大整合:J2EE开发的一站式解决方案: SpringBoot的优点: (1) ...

  3. 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 ...

  4. RabbitMQ-消费者"未处理完的消息"丢失

    一个关于客户端(消费者)开启自动应答,重启后"未处理消息丢失"的小坑.(主要是对RabbitMQ理解不够) 首先,申明一下: 本文所谓的 "丢失消息" 不是指服 ...

  5. 短短几行css代码实现滚动条效果

    如何实现使用css实现滚动条效果 实现效果,运用线性渐变来实现功能 假设我们的页面被包裹在 <body> 中,可以滚动的是整个 body,给它添加这样一个从左下到到右上角的线性渐变: bo ...

  6. MySQL - GROUP_CONCAT 使用方法

    如上图,我想把结果集中的三行链接成一行,则可这样写:   总结: GROUP_CONCAT函数默认是用','逗号链接,如果你加上第二个参数,则以',第二个参数值'逗号+第二个参数值链接,如下图     ...

  7. 新装NGINX重启,出现错误 nginx: [error] open() "/usr/local/nginx/logs/nginx.pid"

    重装nginx出现,重启出现错误 ./nginx -s reload nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" ...

  8. Java中的接口和抽象类(转)

    在面向对象的概念中,我们知道所有的对象都是通过类来描述的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类往往用来表征我们在对问题 ...

  9. notification 使用的基本方法

    当某个应用程序希望向用户发出一些提示信息,而应用程序又不在前台,可以借助Notification来实现.发出一条通知后,手机最上方额通知栏会显示一个图标,下来状态栏以后可以看到详细内容. 一.通知的基 ...

  10. [BZOJ1010]玩具装箱toy(斜率优化)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...