P3586 [POI2015]LOG
对于询问,首先如果正数数量不到 $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的更多相关文章
- 洛谷 P3586 [POI2015]LOG
P3586 [POI2015]LOG 题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它 ...
- 洛谷P3586 [POI2015]LOG(贪心 权值线段树)
题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...
- 树状数组【洛谷P3586】 [POI2015]LOG
P3586 [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1 ...
- [POI2015]LOG(树状数组)
今天考试考了这题,所以来贡献\([POI2015]LOG\)的第一篇题解.代码略丑,调了快三个小时才调出来\(AC\)代码. 对于这种小清新数据结构题,所以我觉得树状数组才是这道题的正确打开方式. 首 ...
- 【洛谷P3586】LOG
题目大意:维护一个集合,支持单点修改.查询小于 X 的数的个数.查询小于 X 的数的和. 题解:学习到了动态开点线段树.对于一棵未经离散化的权值线段树来说,对于静态开点来说,过大的值域会导致不能承受的 ...
- [POI2015]LOG
题目 发现询问是针对整个区间,也就是说位置什么用都没有 发现我们需要构造出\(s\)个长度为\(c\)的数列,每个数只能在一个数列中出现一次,且一个数最多的使用次数是其大小 对于那些大于等于\(s\) ...
- Luogu 3586 [POI2015]LOG
考虑离散化后开权值线段树. 设序列中不小于$s$的数有$cnt$个,小于$s$的数的和为$sum$. 那么操作Z能成功的充要条件是$sum \geq (c - cnt) * s$. 如果序列中不小于$ ...
- HBSX2019 3月训练
Day 1 3月有31天废话 今天先颓过了就只剩30天了 初步计划 每天一道字符串/数据结构题 图论学习 根据<若干图论模型探讨>(lyd)复习 二分图与网络流学习 <算法竞赛进阶指 ...
- POI2015 解题报告
由于博主没有BZOJ权限号, 是在洛咕做的题~ 完成了13题(虽然有一半难题都是看题解的QAQ)剩下的题咕咕咕~~ Luogu3585 [POI2015]PIE Solution 模拟, 按顺序搜索, ...
随机推荐
- 关于数据上传阿里云MaxCompute调研
1.背景 当前的数据存储基于mysql库表存储形式,目前已经无法满足愈加增大的数据存储需求,新项目基于Maxcompute数据仓库架构,需要将统计日志上传Maxcompute,本文对Maxcomput ...
- 0.2 IDEA配置
一.IDEA配置maven 在启动配置设置清理方式:clean jetty:run maven版本以及本地setting和repository JRE版本以及编码格式:-Dfile.encoding= ...
- js监听某个元素高度变化来改变父级iframe的高度
最近需要做一个iframe调用其他页面内容,这个iframe地址是可变化的,但是里面的内容高度不确定且里面内容高度可调整,所以需要通过监听iframe里面body的高度变化来调整iframe的高度. ...
- 2.ibatis执行流程解析
以下仅为个人理解,如有问题,欢迎指正
- Message 消息提示
常用于主动操作后的反馈提示.与 Notification 的区别是后者更多用于系统级通知的被动提醒. 基础用法 从顶部出现,3 秒后自动消失. Message 在配置上与 Notification 非 ...
- UML学习笔记_02_UML初识(简单的流程)
UML建模简单流程: 分析->定义用例->定义领域模型->定义交互图->定义设计类图 1.分析: 分析需求,对项目的结构有一个大致的定义 2.定义用例: 用例是需求分析的一种工 ...
- MySQL乱码的原因和设置UTF8数据格式
https://segmentfault.com/a/1190000018662023 MySQL使用时,有一件很痛苦的事情肯定是结果乱码.将编码格式都设置为UTF8可以解决这个问题,我们今天来说下为 ...
- C基础知识(8):结构体、共用体、位域
结构体 数组允许定义可存储相同类型数据项的变量,而结构体是C编程中另一种用户自定义的可用的数据类型,它允许用户可以存储不同类型的数据项. struct 语句的格式如下: struct [structu ...
- python基础知识(保留字和标识符、变量、常量、基本数据类型)
保留字 保留字是python语言中已经被赋予特定意义的一些单词,开发程序时,不可以作为变量.函数.类.模块和其他对象的名称来使用例如:import 关键字输入后会变色 通过代码进行查看 import ...
- 重学Python - Day 07 - python基础 -> linux命令行学习 -- 常用命令 一
常用命令和使用方法如下: man man 命令 #可以查询命令的用法 cat 和 tac cat是正序显示文件内容 tac是倒叙显示文件内容 sort 对文件内容排序 uniq 忽略文件中重复行 hi ...