【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”(不加引号)。
*题解:
分块。题目的意思大概就是求一个区间的半平面交(相当于bzoj1007的水平可见直线)。然而数据只有10的5次方,可以分块搞。每次修改就暴力重构这个块,在块内做半平面交。查询的话如果在同一块的话就暴力查,否则先把头尾两个不全的块暴力查一边,中间完整的块就按之前维护的半平面交查过去。然后因为t是单调的,所以可以计一个left表示当前这个块内查到了第几条直线上。
*代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#ifdef CT
#define debug(...) printf(__VA_ARGS__)
#define setfile()
#else
#define debug(...)
#define filename ""
#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
#endif
#define R register
#define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1 << 15], *S = B, *T = B;
inline int FastIn()
{
R char ch; R int cnt = 0; R bool minus = 0;
while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
ch == '-' ? minus = 1 : cnt = ch - '0';
while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
return minus ? -cnt : cnt;
}
#define maxn 100010
#define maxsize 3010
#define inf (1ll << 62)
int id[maxn], block, n, m, left[maxsize], right[maxsize], t;
long long ans;
bool in[maxn], build[maxsize];
struct Poi
{
int k;
long long b;
inline bool operator < (const Poi &that) const
{
return k < that.k || (k == that.k && b > that.b);
}
inline bool operator == (const Poi &that) const
{
return k == that.k && b == that.b;
}
inline double operator ^ (const Poi &that) const
{
return 1.0 * (that.b - b) / (k - that.k);
}
}a[maxn], b[maxn], st[maxsize][maxsize];
inline void add(R int x)
{
R int kk = id[x], l = block * kk, r = block * (kk + 1) - 1, cnt = 0;
build[kk] = 1;
cmin(r, n);
for (R int i = l; i <= r; ++i) if (in[i]) b[++cnt] = a[i];
std::sort(b + 1, b + cnt + 1);
#define stack st[kk]
R int top = 0; b[0].k = -inf;
for (R int i = 1; i <= cnt; ++i)
if (b[i].k != b[i - 1].k)
{
for ( ; top; )
{
if ( (stack[top].k == b[i].k)
|| (top > 1
&& ((b[i] ^ stack[top - 1]) <= (stack[top] ^ stack[top - 1]) ) )
)
top--;
else break;
}
stack[++top] = b[i];
}
left[kk] = 1;
right[kk] = top;
}
inline void voi(R int l, R int r)
{
for (R int i = l; i <= r; ++i) if (in[i])
cmax(ans, 1ll * a[i].k * t + a[i].b);
}
inline void query(R int x)
{
#define q st[x]
if (!build[x]) return ;
for (; left[x] < right[x]; ++left[x])
{
R double tmp = q[left[x]] ^ q[left[x] + 1];
if (tmp >= t) break;
}
cmax(ans, 1ll * q[left[x]].k * t + q[left[x]].b);
}
int main()
{
// setfile();
n = FastIn(), m = FastIn();
block = sqrt(n) / 3 + 1;
for (R int i = 1; i <= n; ++i) id[i] = i / block;
for ( ; m; --m)
{
R int opt = FastIn(); t = FastIn();
if (opt == 1)
{
R int k = FastIn(), z = FastIn(), s = FastIn();
in[k] = 1; a[k] = (Poi) {z, 1ll * s - 1ll * z * t};
add(k);
}
else
{
R int l = FastIn(), r = FastIn();
if (l > r) std::swap(l, r);
ans = -inf;
if (id[l] == id[r]) voi(l, r);
else
{
voi(l, (id[l] + 1) * block - 1);
voi(id[r] * block, r);
for (R int i = id[l] + 1; i < id[r]; ++i) query(i);
}
if (ans == -inf) puts("nema");
else printf("%lld\n", ans );
}
}
return 0;
}
【bzoj3463】[COCI2012] Inspector的更多相关文章
- 【UVa】12118 Inspector's Dilemma(欧拉道路)
题目 题目 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...
- 企业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 ...
随机推荐
- cocos2dx基础篇(11) 点九图CCScale9Sprite
[3.x] (1)去掉"CC" [v3.3] 我们在 ui模块 下实现了一个新的Scale9Sprite类.它的内部实现比之前的Scale9Sprite更为简洁,功能也更为强大. ...
- ActiveMQ学习教程/2.简单示例
ActiveMQ学习教程(二)——简单示例 一.应用IDEA构建Maven项目 File->New->Module...->Maven->勾选->选择->Next ...
- 深入理解java:1.3.2 JVM监控与调优
学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之. 本篇,来看看[ 如何监控和优化GC机制.] 通过学习,我觉得JVM监控与调优,主要在3个着眼点上: 1,如何配置 ...
- 深入理解java:1.2. 字节码执行引擎
执行引擎是Java虚拟机的核心组成部分之一. 首先,想想C++和Java在编译和运行时到底有啥不一样? 下图左边,C++发布的就是机器指令, 而下图右边Java发布的是字节码,字节码在运行时通过JVM ...
- 利用coverage工具进行Python代码覆盖率测试
Coverage是一种用于统计Python代码覆盖率的工具,通过它可以检测测试代码对被测代码的覆盖率情况. Coverage安装 1.安装命令:pip install coverage 2.查看cov ...
- XSS注入常用语句(整理)
<script>alert('hello,gaga!');</script> //经典语句,哈哈! >"'><img src="javas ...
- H264 RTP包解析
1. 预备 视频: 由一副副连续的图像构成,由于数据量比较大,因此为了节省带宽以及存储,就需要进行必要的压缩与解压缩,也就是编解码. h264裸码流: 对一个图像或者一个视频序列进行压缩,即产生码流 ...
- Intellij IDEA关闭 Build窗口提示
如果开启了Tomcat的话,我们在idea中代码有错误,并且在切换软件的时候,Idea会不断提示编译错误(Build错误),这个会很烦人.我们可以先将Tomcat关掉,就不会一直弹出Build窗口了.
- PythonDay07
第七章 今日内容 基础数据类型补充 以后会遇到的坑 二次编码 基础类型补充 stra = "One two"print(a.capitalize()) # 首字母大写print ...
- Scrapy 教程(一)-安装与入门
安装 具体请自行百度 依赖库 网上说pip安装会内分泌失调,我试了下还行吧,不过也遇到几个问题 解决方法 pip install -I cryptography 解决方法 pip install -U ...