传送门

对于询问,首先如果正数数量不到 $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. 前端 Jenkins 自动化部署

    这两天折腾了一下 Jenkins 持续集成,由于公司使用自己搭建的 svn 服务器来进行代码管理,因此这里 Jenkins 是针对 svn 服务器来进行的配置,Git 配置基本一致,后面也介绍了下针对 ...

  2. Runtime Error R6034 Application has attempt to load the C runtime library incorrectly

    1.问题描述 vs2015 去开发一个写入pg数据库的程序,使用libpqxx.dll,libpq.dll,这个库文件之前是用vs2008的程序中复制过来的,基于的运行时库应该是vs2008,现在开发 ...

  3. Nginx一个server配置多个location

    在配置文件中增加多个location,每个location对应一个项目 比如使用8066端口,location / 访问官网: location /demo访问培训管理系统配置多个站点我选择了配置多个 ...

  4. PHP7 的部分新特性

    1. 运算符(NULL 合并运算符) $a = $_GET['a'] ?? 1; 它相当于: <php$a = isset($_GET['a']) ? $_GET['a'] : 1; 我们知道三 ...

  5. Movidius的深度学习入门

    1.Ubuntu虚拟机上安装NC SDK cd /home/shine/Downloads/ mkdir NC_SDK git clone https://github.com/movidius/nc ...

  6. ip地址后面的斜杠24

    ip地址后面的斜杠24表示掩码位是24位的,即用32位二进制表示的子网掩码中有连续的24个“1”:11111111 11111111 11111111 00000000,将其转化为十进制,就是:255 ...

  7. 使用Navicat Premium 客户端绕过白名单限制mysql数据库

    针对有些数据库有白名单限制,但如果IP经常浮动的话,会要经常加白名单,但如果知道可以连接数据库的linux用户密码就能 通过SSH通道代理来连接数据库.保存密码后,这样就能直接连接数据库,减省很多麻烦 ...

  8. RxJava2实战--第二章 RxJava基础知识

    第二章 RxJava基础知识 1. Observable 1.1 RxJava的使用三步骤 创建Observable 创建Observer 使用subscribe()进行订阅 Observable.j ...

  9. java解析和组装json以及一些方法的理解

    这是一个json格式的字符串 第一种情况(简单格式) String result = "{\"name\":\"小明\",\"age\&qu ...

  10. SQLServer 断开数据库连接

    数据库名:test1 1. 查询数据库当前连接 select * from master.sys.sysprocesses where dbid = db_id('test1') 2. 断开指定连接 ...