[POI 2009]Lyz
Description
初始时滑冰俱乐部有 \(1\) 到 \(n\) 号的溜冰鞋各 \(k\) 双。已知 \(x\) 号脚的人可以穿 \(x\) 到 \(x+d\) 的溜冰鞋。有 \(m\) 次操作,每次包含两个数 \(r_i\) , \(x_i\) 代表来了 \(x_i\) 个 \(r_i\) 号脚的人。 \(x_i\) 为负,则代表走了这么多人。 对于每次操作,输出溜冰鞋是否足够。
\(1\leq n\leq 200,000,1\leq m\leq 500,000\)
Solution
用 \(\text{Hall}\) 定理以及贪心的思想,容易得到 \(\forall l,r\in[1,n],l\leq r\)
\[\sum_{i=l}^rx_i\leq k(r+d-l+1)\]
移项,得到
\[\sum_{i=l}^r(x_i-k)\leq k\times d\]
显然只要有 \((x_i-k)\) 最大子段和 \(\leq k\times d\) 。线段树维护即可。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 200000+5;
int n, m, k, d, x, r;
struct node {
ll mx, l, r, sum;
node (ll _mx = 0, ll _l = 0, ll _r = 0, ll _sum = 0) {
mx = _mx, l = _l, r = _r, sum = _sum;
}
node operator + (const node &b) const {
node ans;
ans.l = max(l, sum+b.l); ans.r = max(b.r, b.sum+r);
ans.sum = sum+b.sum; ans.mx = max(r+b.l, max(mx, b.mx));
return ans;
}
} ;
struct Segment_tree {
#define lr(o) (o<<1)
#define rr(o) (o<<1|1)
node key[N<<2];
void build(int o, int l, int r) {
if (l == r) {key[o] = node(-k, -k, -k, -k); return; }
int mid = (l+r)>>1;
build(lr(o), l, mid), build(rr(o), mid+1, r);
key[o] = key[lr(o)]+key[rr(o)];
}
void modify(int o, int l, int r, int loc, int val) {
if (l == r) {
ll t = key[o].sum+val;
key[o] = node(t, t, t, t);
return;
}
int mid = (l+r)>>1;
if (loc <= mid) modify(lr(o), l, mid, loc, val);
else modify(rr(o), mid+1, r, loc, val);
key[o] = key[lr(o)]+key[rr(o)];
}
} T;
void work() {
scanf("%d%d%d%d", &n, &m, &k, &d);
T.build(1, 1, n);
while (m--) {
scanf("%d%d", &r, &x);
T.modify(1, 1, n, r, x);
puts(T.key[1].mx <= 1ll*k*d ? "TAK" : "NIE");
}
}
int main() {work(); return 0; }
[POI 2009]Lyz的更多相关文章
- 解题:POI 2009 Lyz
题面 板板讲的霍尔定理 霍尔定理:一张二分图有完全匹配的充要条件是对于任$i$个左部点都有至少$i$个右部点与它们相邻.放在这个题里就是说显然最容易使得鞋不够的情况是一段连续的人,那就维护一下最大子段 ...
- 解题:POI 2009 Fire Extinguishers
题面 洛谷数据非常水,建议去bzoj 我第一眼一看这不是那个POI2011的升级版吗(明明这个是2009年的,应该说那个是这个的弱化版,果然思想差不多. 因为$k$很小,可以考虑每个间隔距离来转移.我 ...
- 解题:POI 2009 Ticket Inspector
题面 看起来很水,然而不会DP的蒟蒻并不会做,PoPoqqq orz 设$f[i][j]$表示当前在第$i$个点和第$i+1$个点之间查票,已经查了$j$次的最大收益.然后就是那种很常见的枚举前一个结 ...
- 解题:POI 2009 TAB
题面 这也算是个套路题(算吗)?发现换来换去每行每列数的组成是不变的,那么就把每行每列拎出来哈希一下,复杂度$O(Tn^2log$ $n)$有点卡时=.=. 然而正解似乎不需要哈希,就像这样↓ ;i& ...
- 【BZOJ 1115】【POI 2009】石子游戏Kam
http://www.lydsy.com/JudgeOnline/problem.php?id=1115 差分后变成阶梯博弈. #include<cstdio> #include<c ...
- 【Nim 游戏】 学习笔记
前言 没脑子选手随便一道博弈论都不会 -- 正文 Nim 游戏引入 这里给出最简单的 \(Nim\) 游戏的题目描述: \(Nim\) 游戏 有两个顶尖聪明的人在玩游戏,游戏规则是这样的: 有\(n\ ...
- OAF_文件系列11_实现OAF读写Excel包JXL和POI的区别(概念)
20150803 Created By BaoXinjian
- Java生成excel导出文件(使用poi+JXL)
1.使用poi生成文件 package com.mi.entity; import java.util.Date; public class Student { private int id; pri ...
- Java POI 两种导出方式
这里面包含了模板导出方法和自定义模板进行导出 package jp.co.syspro.poo.action.hibikoyou; import java.io.ByteArrayOutputStre ...
随机推荐
- python中for循环的三种遍历方式
#!/usr/bin/env python# -*- coding: utf-8 -*-if __name__ == '__main__': list = ['A', 'B', 'C', 'D'] # ...
- Chapter3_操作符_关系操作符
java中的关系操作符有等于“=”,不等于“!=”,大于“>”,小于“<”,大于等于“≥”,小于等于“≤”等.这些都不再赘述了,有一个有意思的点是关于等价性的讨论. 在java中测试两个对 ...
- selenium_unittest基本框架
from selenium import webdriver import unittest import time #创建类引入unitest.testcase用例库 class BaiDu_tes ...
- LOJ-10103(求删去割点后最多的连通分量)
题目链接:传送门 思路: (1)这道题的图可能不连通,所以需要多次Tarjan: (2)设置cut[i]=x数组表示第i个节点被删除后右多少个子图(这个只是在一个图中),如果是根节点就要-1,因为根节 ...
- linux mysql 5.7.25 安裝
1.下载 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 2.解压 tar ...
- fcitx4.2.0自定义中文标点符号
+fcitx 定制标点 http://forum.ubuntu.com.cn/viewtopic.PHP?t=376701&p=2755636 下载punc.mb.gz放到~/.config/ ...
- Mac 下 Java 多版本切换
Step 1: 安装 jdk1.7 jdk1.8 路径如下: + /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk + /Library/Java/J ...
- [Unity插件]DOTween基础
官方文档链接:http://dotween.demigiant.com/documentation.PHP#globalSettings 普通版下载地址:http://dotween.demigian ...
- 「LOJ2000~2023」各省省选题选做
「LOJ2000~2023」各省省选题选做 「SDOI2017」数字表格 莫比乌斯反演. 「SDOI2017」树点涂色 咕咕咕. 「SDOI2017」序列计数 多项式快速幂. 我们将超过 \(p\) ...
- 第二篇:服务消费者(RestTemplate+ribbon)
第一篇讲了服务的注册,这篇来说说服务的调用,服务与服务的通讯是基于http restful,springcloud的服务调用是通过ribbon方式的,客户端的负载均衡. Talk is cheap.S ...