BZOJ1568:[JSOI2008]Blue Mary开公司
浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1568
什么是李超线段树?李超线段树就是用标记永久化维护平面内线段覆盖的线段树。
对于这个题,对于每个区间,我们可以存下来在这个区间的中点\(y\)值最大的直线。
对于添加一条线段,我们在线段树上对其进行递归替换原有标记:
如果当前线段的斜率大于当前区间标记线段的斜率:
如果在中点当前线段更大,由于斜率更大,说明在中点及中点以后的部分中,当前线段会比标记线段更优,我们先用标记线段去替换更新中点以前的部分,再把当前线段变成当前区间的标记线段。
否则,递归用当前线段去替换更新中点以后的区间。
如果当前线段的斜率小于当前区间标记线段的斜率:
如果在中点当前线段更大,由于斜率更小,说明在中点及中点以前的部分中,当前线段会比标记线段更优,我们先用标记线段去替换更新中点以后的部分,再把当前线段变成当前区间的标记线段。
否则,递归用当前线段去替换更新中点以前的区间。
对于询问,就拿一个一个区间标记的直线算算取最大值就行了。
时间复杂度:\(O(NlogT)\)
空间复杂度:\(O(T)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=5e4+5;
int n,tot;
char s[10];
double b[maxn<<1],k[maxn<<1];
int read() {
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    return x*f;
}
inline double calc(int id,int x) {
    return b[id]+k[id]*(x-1);
}
struct segment_tree {
    int tag[maxn<<2];
    void change(int p,int l,int r,int id) {
        if(l==r) {
            if(calc(id,l)>calc(tag[p],l))tag[p]=id;
            return;
        }
        int mid=(l+r)>>1;
        if(k[id]>k[tag[p]]) {
            if(calc(id,mid)>calc(tag[p],mid))change(p<<1,l,mid,tag[p]),tag[p]=id;
            else change(p<<1|1,mid+1,r,id);
        }
        else {
            if(calc(id,mid)>calc(tag[p],mid))change(p<<1|1,mid+1,r,tag[p]),tag[p]=id;
            else change(p<<1,l,mid,id);
        }
    }
    double query(int p,int l,int r,int pos) {
        if(l==r)return calc(tag[p],l);
        int mid=(l+r)>>1;double ans=calc(tag[p],pos);
        if(pos<=mid)ans=max(ans,query(p<<1,l,mid,pos));
        else ans=max(ans,query(p<<1|1,mid+1,r,pos));
        return ans;
    }
}T;
int main() {
    n=read();
    for(int i=1;i<=n;i++) {
        scanf("%s",s+1);
        if(s[1]=='Q') {
            int pos=read();
            double ans=T.query(1,1,5e4,pos);
            printf("%d\n",(int)(ans/100));
        }
        else {
            tot++;
            scanf("%lf%lf",b+tot,k+tot);
            T.change(1,1,5e4,tot);
        }
    }
    return 0;
}
												
											BZOJ1568:[JSOI2008]Blue Mary开公司的更多相关文章
- bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...
 - BZOJ1568: [JSOI2008]Blue Mary开公司【李超树】
		
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词"Query"或"Project". 若单词为Q ...
 - BZOJ1568: [JSOI2008]Blue Mary开公司
		
可以平衡树或线段树维护斜率来做. 还有一种线段树直接打标记的做法: 线段树每个节点存一条线段作为标记,打标记时如果已有标记,则把占优区间小的那个线段下放. #include<cstdio> ...
 - 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)
		
传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...
 - [bzoj1568][JSOI2008]Blue Mary开公司——李超线段树
		
题目大意 题解 这道题需要用到一种叫做李超线段树的东西.我对于李超线段树,是这样理解的: 给节点打下的标记不进行下传,而是仅仅在需要的时候进行下传,这就是所谓永久化标记. 对于这道题,借用一张图, 这 ...
 - 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)
		
[BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...
 - 【BZOJ1568】[JSOI2008]Blue Mary开公司 线段树
		
[BZOJ1568][JSOI2008]Blue Mary开公司 Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“P ...
 - 【BZOJ-1568】Blue Mary开公司        李超线段树 (标记永久化)
		
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 557 Solved: 192[Submit ...
 - 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
		
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 602 Solved: 214[Submit ...
 - [BZOJ 1568][JSOI2008]Blue Mary开公司
		
[BZOJ 1568][JSOI2008]Blue Mary开公司 题意 \(n\) 次操作, 维护一个一次函数集合 \(S\). 有两种操作: 给定 \(b\) 和 \(k\), 向 \(S\) 中 ...
 
随机推荐
- sed: -e expression #1, unknown option to `s'解决办法
			
报错如下: sed: -e expression #1, char 13: unknown option to `s' 需要替换的行为: monitor.url=http://192.168.25.1 ...
 - 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
			
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...
 - linux下开启ftp的21号port
			
1.先执行vsftpd服务: #service vsftpd start 2.通过iptables开放21号port (1) 先查看iptables设置: #iptables -nL Chain IN ...
 - webpack 样式分离之The root route must render a single element
			
公司项目使用的是webpack1,使用extract-text-webpack-plugin 插件无法将css分离出来,检查原因,发现有如下代码 <Route path="/home& ...
 - angularcli填坑系列(持续更新...)
			
1.在xx.ts中引入css样式无效 @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls ...
 - 九度OJ 1150:Counterfeit Dollar(假美元) (分析、检验)
			
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:485 解决:215 题目描述: Sally Jones has a dozen Voyageur silver dollars. Howev ...
 - curl   post  请求  es 数据 REST 批量删除
			
curl -d "keyword=牛" http://api.com/path/index curl模拟http发送get或post接口测试 - 一生守候 - 博客园 http ...
 - Nginx报出504 Gateway Timeout错误2
			
昨天,一个程序需要导出500条数据,结果发现到150条是,Nginx报出504 Gateway Timeout错误 经观察,发现大约30秒时超时,php.ini中执行时间配置已经是300秒: 复制代码 ...
 - Flask中的CBV和上下文初步解读
			
一 . flask中的CBV 相对于Django中的CBV,让我们来看看flask中的CBV是如何实现的 ? from flask import Flask, render_template, url ...
 - IOS  关于 NSUserDefault
			
转载 并不是所有的东西都能往里放的.NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary. NSUserDefa ...