传送门

对于询问,首先如果正数数量不到 $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. sqoop数据导出

    1.将oracle的jdbc的jar包copy到sqoop的lib目录下 2. sqoop export --connect jdbc:oracle:thin:@XXXXX:1521:TMDM --u ...

  2. 【面试】Spring 执行流程

    Spring Aop的实现原理: AOP 的全称是  Aspect Orient Programming  ,即面向切面编程.是对 OOP (Object Orient Programming) 的一 ...

  3. NetScaler VPX configration

    境搭建概述 本文主要介绍Netscaler的安装配置,以及与StoreFront相结合,实现外网访问内网资源.当用户访问时,Netscaler Gateway Virtual Server将把请求转给 ...

  4. android 知识体系

  5. [Ajax三级联动 无刷新]

    三级联动 的效果图 html页面: <body> <label class="fl">区域:</label> <select class= ...

  6. PLSQL报错: ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务

    一开始吓尿了,以为自己动着什么东西了把数据库玩坏了,谁知道打开服务发现服务没启动........... 我们要确保数据库服务是启动状态

  7. 一个好看的测试报告模板BeautifulReport

    def nrun(): report = ('report_' + ('%s') % time.strftime("%Y-%m-%d-%H-%M-%S", time.localti ...

  8. LoadRunner中的Web 函数列表

    LoadRunner中的Web 函数列表 web test LoadRunner fuction_list D:\Program Files (x86)\Mercury Interactive\Mer ...

  9. POJ 1182-食物链 [并查集] 《挑战程序设计竞赛》2.4

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  10. MUT值设置、top等命令无法执行、ssh无法登陆、vim命令卡住

    [root@host---- ~]# ifconfig eth0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu inet 10.1.1.204 n ...