传送门

对于询问,首先如果正数数量不到 $c$ 个显然无解

然后如果大于等于 $s$ 的数大于等于 $c$ 个,那么显然有解

否则,考虑贪心地取数,首先初始大于等于 $s$ 的哪些数我们每次取都可以取到,所以直接把 $c-cnt$ ,其中 $cnt$ 是初始大于等于 $s$ 的数的个数

然后考虑剩下的哪些数的情况如何才能保证最终有解

发现剩下的数似乎只要总和大于等于 $c*s$ 就一定有解,证明可以这样考虑:

把剩下的数拆成若干个 $1$ 并重新组合,最终一定可以组合出 $c$ 个值为 $s$ 的数

考虑把每个 $1$ 都打上标记记录原本属于哪个数,重新组合以后对于每次 $-1$ 的操作,我们根据标记可以看成把标记表示的原本的数减 $1$

这样最终一定有解,所以证明完成

然后用线段树维护一下即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e6+;
int n,m,a[N],d[N],inv[N];
int t[N<<];
ll sum[N<<];
inline void pushup(int o) { t[o]=t[o<<]+t[o<<|]; sum[o]=sum[o<<]+sum[o<<|]; }
void change(int o,int l,int r,int pos,int v)
{
if(l==r) { t[o]+=v; sum[o]+=1ll*v*inv[l]; return; }
int mid=l+r>>;
pos<=mid ? change(o<<,l,mid,pos,v) : change(o<<|,mid+,r,pos,v);
pushup(o);
}
ll query2(int o,int l,int r,int qr)
{
if(r<=qr) return sum[o];
int mid=l+r>>;
if(mid<qr) return sum[o<<]+query2(o<<|,mid+,r,qr);
return query2(o<<,l,mid,qr);
}
int query3(int o,int l,int r,int pos)
{
if(l==r) return t[o];
int mid=l+r>>;
if(pos<=mid) return t[o<<|]+query3(o<<,l,mid,pos);
return query3(o<<|,mid+,r,pos);
}
char s[N]; int da[N],db[N];
int main()
{
n=read(),m=read();
for(int i=;i<=m;i++)
{
scanf("%s",&s[i]); da[i]=read(),db[i]=read();
d[i]=db[i];
}
sort(d+,d+m+); int tot=unique(d+,d+m+)-d-;
for(int i=;i<=m;i++)
{
int t=db[i]; db[i]=lower_bound(d+,d+tot+,db[i])-d;
inv[db[i]]=t;
}
int cnt=;
for(int i=;i<=m;i++)
{
if(s[i]=='U')
{
if(a[da[i]]) change(,,tot,a[da[i]],-);
else cnt++;
a[da[i]]=db[i]; change(,,tot,db[i],);
}
if(s[i]=='Z')
{
if(da[i]>cnt) { printf("NIE\n"); continue; }
int t=da[i]-query3(,,tot,db[i]);
if(t<=) { printf("TAK\n"); continue; }
if(1ll*t*inv[db[i]]<=query2(,,tot,db[i]-)) printf("TAK\n");
else printf("NIE\n");
}
}
return ;
}

P3586 [POI2015]LOG的更多相关文章

  1. 洛谷 P3586 [POI2015]LOG

    P3586 [POI2015]LOG 题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它 ...

  2. 洛谷P3586 [POI2015]LOG(贪心 权值线段树)

    题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...

  3. 树状数组【洛谷P3586】 [POI2015]LOG

    P3586 [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1 ...

  4. [POI2015]LOG(树状数组)

    今天考试考了这题,所以来贡献\([POI2015]LOG\)的第一篇题解.代码略丑,调了快三个小时才调出来\(AC\)代码. 对于这种小清新数据结构题,所以我觉得树状数组才是这道题的正确打开方式. 首 ...

  5. 【洛谷P3586】LOG

    题目大意:维护一个集合,支持单点修改.查询小于 X 的数的个数.查询小于 X 的数的和. 题解:学习到了动态开点线段树.对于一棵未经离散化的权值线段树来说,对于静态开点来说,过大的值域会导致不能承受的 ...

  6. [POI2015]LOG

    题目 发现询问是针对整个区间,也就是说位置什么用都没有 发现我们需要构造出\(s\)个长度为\(c\)的数列,每个数只能在一个数列中出现一次,且一个数最多的使用次数是其大小 对于那些大于等于\(s\) ...

  7. Luogu 3586 [POI2015]LOG

    考虑离散化后开权值线段树. 设序列中不小于$s$的数有$cnt$个,小于$s$的数的和为$sum$. 那么操作Z能成功的充要条件是$sum \geq (c - cnt) * s$. 如果序列中不小于$ ...

  8. HBSX2019 3月训练

    Day 1 3月有31天废话 今天先颓过了就只剩30天了 初步计划 每天一道字符串/数据结构题 图论学习 根据<若干图论模型探讨>(lyd)复习 二分图与网络流学习 <算法竞赛进阶指 ...

  9. POI2015 解题报告

    由于博主没有BZOJ权限号, 是在洛咕做的题~ 完成了13题(虽然有一半难题都是看题解的QAQ)剩下的题咕咕咕~~ Luogu3585 [POI2015]PIE Solution 模拟, 按顺序搜索, ...

随机推荐

  1. Java日志系统---Logger之简单入门

    Java 中自带的日志系统,今天抽空了解了一点,算是入了门,所以将自己的一些心得记录下来,以备日后查看,有兴趣的朋友,看到此文章,觉得有错误或需要添加的地方,请在下方评论留言,大家可以共同进步,谢谢: ...

  2. Eclipse改变成炫酷黑色主题

    有一个款Eclipse插件EclipseColorTheme,其官网地址是http://eclipsecolorthemes.org/,可以直接使用大量内置的样式主题模板,如果还不能满足你自己的个性化 ...

  3. DB 分库分表(2):全局主键生成策略

    DB 分库分表(2):全局主键生成策略 本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请 ...

  4. LC 711. Number of Distinct Islands II

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  5. 数据分析 - numpy 模块

    numpy 概述 ▨  Numerical Python. 补充了python所欠缺的数值计算能力 ▨  Numpy是其他数据分析及机器学习库的底层库 ▨  Numpy完全标准C语言实现,运行效率充分 ...

  6. mongdb mapReduce聚合操作

    1.数据准备 请看group操作 2.mapReduce名词解释 mapReduce 随着"大数据"概念而流行.其实mapReduce的概念非常简单,从功能上说,相当于RDBMS的 ...

  7. windows 重启java进程脚本

    这个脚本用于启动和重启javaWeb程序 @echo off rem 配置端口号 set port= rem 第一层循环检查端口占用的pid for /f "tokens=5" % ...

  8. 生成html报告

    jmeter -g "D:\JMeter WorkSpace\JMeterScript\IAC\Aggregate Graph\AggregateGraph.csv" -o &qu ...

  9. Linux 服务器基本优化

    一:修改ulimit数 vi /etc/security/limits.conf 添加如下行: * soft noproc 65535 * hard noproc 65535 * soft nofil ...

  10. RxJava2实战--第八章 RxJava的背压

    RxJava2实战--第八章 RxJava的背压 1 背压 在RxJava中,会遇到被观察者发送消息太快以至于它的操作符或者订阅者不能及时处理相关的消息,这就是典型的背压(Back Pressure) ...