bzoj3463【COCI2012】 Inspector
题目描述
在一个小国家中,一个新的小镇终于建成了!如往常一样,Mirko获得了“首席税务巡查员”的职位。他的任务是保证正确地计算各公司的收入情况。一共有N家办公室坐落在主干道上,从左到右被编号为1~N。一开始,所有办公室一开始都是空的。随后,一些公司会搬入或搬出某些办公室。Mirko时不时地会经过某些办公室并审查在这些办公室中,最富有的公司的账目。
一个公司被以如下的方式描述:
T-表示搬入的第一天。
K-表示搬入的办公室的标号。
Z-公司每日的盈利。(可以是负值表示亏损)
S-公司搬入时的公司财务情况。(即公司的账户资金,也可以是负值)
如果一家公司已经在 K 办公室了,当有新公司要进入 K 办公室时,这家公司会立刻搬出。
新公司第一天并不会运营,盈利从第二天开始计算。
Mirko的审查以 3 个整数来描述:
T-审查的时间。
A 和 B-Mirko会检查 A 办公室至 B 办公室(包括A和B)之间的公司。
Mirko只会在一天结束时检查,所有公司这时已经计算完成了当天利润。
输入格式
第一行包含 2 个正整数:N(1<=N<=100000)表示办公室的数量和M(1<=M<=300000)表示事件的个数。
接下来 M 行,遵循以下格式:“1 T K Z S”或“2 T A B”(含义如题目描述)。其中 T 会严格递增,并且最后一天小于 1000000,Z 和 S 的绝对值也严格小于 1000000。
(注意A可能大于B)
输出格式
对于每次Mirko的审查,每行输出一个整数,表示当天最富有的公司的资产(可以为负)。如果Mirko经过的所有办公室中都没有公司入驻,则输出“nema”(不加引号)。
题解:
- 由于$T$单调递增,所以题意是支持插入,求某个点在标号为$[L,R]$的一次函数上的最大值;
- 答案一定在下凸壳上,分块维护凸壳,有修改操作就打修改标记,查询时遇到修改标记暴力重构区间的凸壳;
- 同时$T$是单调递增的,可以维护每个块的最优值位置,查询向后移动;
- 设分块大小为$B$
- $T = nB \ log B+\frac{n^2}{B} \ \ = n( BlogB + \frac{n}{B})$
- 取$B = \sqrt{\frac{n}{logn}}$,$T = O(n \sqrt{n} \sqrt{log n})$
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<stack>
#include<map>
#include<set>
#define Run(i,l,r) for(int i=l;i<=r;i++)
#define Don(i,l,r) for(int i=l;i>=r;i--)
#define ll long long
#define ld double
#define mk make_pair
#define fir first
#define sec second
#define il inline
#define rg register
#define pb push_back
using namespace std;
const int N=;
const ll inf = 1e18;
int n,m,u,bl[N],st[N],ed[N],vis[N],mfy[N],L[N],R[N],used[N];
ld px[N];
il char gc(){
static char*p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
il int rd(){
int x=,f=; char c=gc();
while(c<''||c>''){if(c=='-')f=-;c=gc();}
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x*f;
}
struct line{
ll k,b;
line(ll _k=,ll _b=):k(_k),b(_b){};
bool operator <(const line&l)const{return k==l.k?b>l.b:k<l.k;}
}a[N],b[N];
ld calx(line x,line y){return (ld)(x.b-y.b)/(y.k-x.k);}
il void build(int x){
int cnt=st[x],top=st[x];
for(rg int i=st[x];i<=ed[x];++i)if(vis[i])b[cnt++]=a[i];
sort(b+st[x],b+cnt);
for(rg int i=st[x]+;i<cnt;++i)if(b[i].k!=b[i-].k){
while(top>st[x]&&calx(b[i],b[top])<px[top-])top--;
px[top]=calx(b[i],b[top]);b[++top]=b[i];
}
L[x]=st[x];R[x]=top;
}
il ll max(ll x,ll y){return x>y?x:y;}
il void query(int T,int x,int y){
if(x>y)swap(x,y);
ll re=-inf;
int l=bl[x],r=bl[y];
if(l==r){for(rg int i=x;i<=y;++i)if(vis[i])re=max(re,a[i].k*T+a[i].b);}
else{
for(rg int i=x;i<=ed[bl[x]];++i)if(vis[i])re=max(re,a[i].k*T+a[i].b);
for(rg int i=st[bl[y]];i<=y;++i)if(vis[i])re=max(re,a[i].k*T+a[i].b);
for(rg int i=l+;i<r;++i){
if(mfy[i])build(i),mfy[i]=,used[i]=;
if(used[i]){
while(L[i]<R[i]&&px[L[i]]<T)L[i]++;
re=max(re,b[L[i]].k*T+b[L[i]].b);
}
}
}
if(re==-inf)puts("nema");else printf("%lld\n",re);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj3463.in","r",stdin);
freopen("bzoj3463.out","w",stdout);
#endif
n=rd();m=rd();u=sqrt(n/log2(n))+;
for(int i=;i<=n;++i)bl[i]=(i-)/u+;
for(int i=;i<=bl[n];++i)st[i]=ed[i-]+,ed[i]=ed[i-]+u;
ed[bl[n]]=n;
for(int i=,op,T,x,y;i<=m;++i){
op=rd();T=rd();x=rd();y=rd();
if(op&){
vis[x]=;mfy[bl[x]]=;
a[x]=line(y,rd()-(ll)T*y);
}else query(T,x,y);
}
return ;
}//by tkys_Austin;bzoj3463
bzoj3463【COCI2012】 Inspector的更多相关文章
- 【COCI2012】覆盖字符串
[题目描述] 给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串.现在Mirko要用这M个字符串去覆盖给出的那个字符串的.覆盖时,必须保证:1.Mirko的字符串不能拆开,旋转:2 ...
- 企业IT管理员IE11升级指南【16】—— 使用Compat Inspector快速定位IE兼容性问题
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 【题解】Informacije [COCI2012]
[题解]Informacije [COCI2012] 传送门:官方题面 [题目描述] 有一个长度为 \(n\) 的 序列 \(a\)(由 \([1,n]\) 中的数组成,且每个数只会出现一次),现给出 ...
- 企业IT管理员IE11升级指南【17】—— F12 开发者工具
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 企业IT管理员IE11升级指南【15】—— 代理自动配置脚本
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 企业IT管理员IE11升级指南【1】—— Internet Explorer 11增强保护模式 (EPM) 介绍
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 企业IT管理员IE11升级指南【2】—— Internet Explorer 11 对Adobe Flash的支持
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 企业IT管理员IE11升级指南【3】—— IE11 新的GPO设置
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 企业IT管理员IE11升级指南【4】—— IE企业模式介绍
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
随机推荐
- 3分钟手把手带你搭建基于selenium的自动化框架
1 .什么是seleniumSelenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Sel ...
- 企业上云这四大要点,你 get 了吗?
本文由 Platform9(一家专注于云计算.专有云.混合云.OpenStack 以及容器技术的北美初创公司)技术产品营销经理 Akshai Parthasarathy 撰写,描述了企业在向云基础设施 ...
- Mac环境搭建以太坊私有链
原文地址: 石匠的blog 为了测试以太坊智能合约,最方便的是在本地搭建一个以太坊私有链.在mac上搭建环境主要需要以下步骤. geth安装 geth是go-ethereum的简写,是一个用go语言编 ...
- 数据库——SQL数据定义
数据定义 SQL的数据定义语句 操 作 对 象 操 作 方 式 创 建 删 除 修 改 表 CREATE TABLE DROP TABLE ALTER TABLE 视 图 CREATE ...
- “Hello World!”团队第五周第七次会议
博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.checkout&push代码 一.会议时间 2017年11月16日 ...
- 跟踪调试Linux内核的启动过程
跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
- 文件上传到tomcat服务器 commons-fileupload的详细介绍与使用
三个类:DiskFileUpload.FileItem和FileUploadException.这三个类全部位于org.apache.commons.fileupload包中. 首先需要说明一下for ...
- 【CS231N】3、Softmax分类器
wiki百科:softmax函数的本质就是将一个K维的任意实数向量压缩(映射)成另一个K维的实数向量,其中向量中的每个元素取值都介于(0,1)之间. 一.疑问 二.知识点 1. softmax函数公式 ...
- C#简单窗体应用程序(二)
使用C#创建控制台应用程序的基本步骤: (1)创建项目: (2)用户界面设计: (3)属性设置: (4)编写程序代码: (5)保存.调试.运行: 例题:设计登录界面,效果如下: 第一步:创建项目: 文 ...
- 四则运算之GUI
四则运算之GUI Coding克隆地址:https://git.coding.net/lvgx/pair_programming.git 目录: 一.前言 二.计划时间——PSP 三.接口设计 四 ...