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. MySQL派生表(derived)优化一例

    1.什么是派生表derived 关键字:子查询–>在From后where前的子查询 mysql; +----+-------------+------------+------+-------- ...

  2. react属性校验

    https://reactjs.org/docs/typechecking-with-proptypes.html 1.安装:cnpm i prop-types -S import PropTypes ...

  3. 【Django】Django中的模糊查询以及Q对象的简单使用

    Django中的模糊查询: 需要做一个查找的功能,所以需要使用到模糊查询. 使用方法是:字段名加上双下划线跟上contains或者icontains,icontains和contains表示是否区分大 ...

  4. Centos7之Nginx

    1.安装 下载RPM: wget http://nginx.org/download/nginx-1.16.0.tar.gz 解压:tar -zxf nginx-1.16.0.tar.gz 安装: c ...

  5. 三、Linux 系统目录结构

    Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令:  ls /  你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最 ...

  6. Base64及其Python实现

    1. 什么是Base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法 Base64是一种编码方式,提及编码方式,必然有其对应的字符集合.在Base64编码中,相互映射的两个集合是 ...

  7. Python 格式化

    数字前面补0 字符型: print('23'.zfill(5)) 数字型: print('%011d' % 124) 日期与str互转: datetime 转 str str_date = datet ...

  8. Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码

    题记: 11月14日早晨8点,人人网发布公告,宣布人人公司将人人网社交平台业务相关资产以2000万美元的现金加4000万美元的股票对价出售予北京多牛传媒,自此,人人公司将专注于境内的二手车业务和在美国 ...

  9. CountDownLatch、CyclicBarrier、Semaphore的区别

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就学习一下这三个辅助类的用法. 以下是 ...

  10. 求 1 到 n 的所有数的约数和

    求 1 到 n 的所有数的约数和 暴力方法就是枚举每个数,算出他的约数和即可,这样有点慢. 另一种思路,枚举约数,判断他是谁的约数,并记录(即他的倍数有多少个),在乘以他自己. n/i求的是n以内,i ...