[POI2015]LOG(树状数组)
今天考试考了这题,所以来贡献\([POI2015]LOG\)的第一篇题解。代码略丑,调了快三个小时才调出来\(AC\)代码。
对于这种小清新数据结构题,所以我觉得树状数组才是这道题的正确打开方式。
首先离散化,这样才不会爆内存。开两个树状数组,第一个树状数组记录离散化后\(1\)到\(i\)中数字出现的个数,第二个树状数组离散化前\(1\)到\(i\)数字出现值的和。把所有询问都读入进来,对于每次操作:
操作\(1\):单点修改,若之前的数是正数,第一个树状数组\(-1\),第二个树状数组\(-\)原来的数,若之后的数是正数,第一个树状数组\(+1\),第二个树状数组\(+\)之后的数
操作\(2\):区间询问,先将大于\(s\)的个数求出来,再比较\(c-\)大于\(s\)的个数乘上\(c\)与剩余数之和,若前者大,输出\(NIE\),否则输出\(TAK\)
再开一个数组记录当前序列的值,就完事了
\(Code\ Below:\)
#include <bits/stdc++.h>
#define ll long long
#define res register
using namespace std;
const ll maxn=1000000+10;
ll n,m,a[maxn],b[maxn],mp[maxn],tot,num;
//a[i]是目前的序列情况,b[i]是第几次修改后离散化1-num,mp记录离散化后的数组1-1e9
//tot是几次修改,num是离散化后的修改,c1[i]是1-i的个数,c2[i]是1-i的值的和
ll c1[maxn],c2[maxn];
struct node{
ll k,x,id;
}q[maxn];
//id是第几次修改
inline ll read(){
res ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
ll lowbit(ll x){return x & (-x);}
void add_num(ll x,ll y){
for(;x<maxn;x+=lowbit(x))
c1[x]+=y;
}
void add_sum(ll x,ll y){
for(;x<maxn;x+=lowbit(x))
c2[x]+=y;
}
ll query_num(ll x){
ll ans=0;
for(;x>0;x-=lowbit(x))
ans+=c1[x];
return ans;
}
ll query_sum(ll x){
ll ans=0;
for(;x>0;x-=lowbit(x))
ans+=c2[x];
return ans;
}
int main()
{
n=read(),m=read();
res ll k,x,c,s;char ch=getchar();
for(ll i=1;i<=m;i++){
while(ch!='U'&&ch!='Z') ch=getchar();
q[i].k=read(),q[i].x=read();
if(ch=='U') {
q[i].id=++tot;
b[tot]=mp[tot]=q[i].x;
}
else q[i].id=-1;
if(i!=m) ch=getchar();
}
sort(mp+1,mp+tot+1);
num=unique(mp+1,mp+tot+1)-mp-1;
for(ll i=1;i<=tot;i++)
b[i]=lower_bound(mp+1,mp+num+1,b[i])-mp;
for(ll i=1;i<=m;i++)
if(q[i].id!=-1) q[i].x=b[q[i].id];
for(ll i=1;i<=m;i++){
if(q[i].id!=-1){//q[i].x被离散化
if(a[q[i].k]>0){
ll real=lower_bound(mp+1,mp+num+1,a[q[i].k])-mp;
add_num(real+1,-1);
add_sum(real+1,-a[q[i].k]);
}
a[q[i].k]=mp[q[i].x];
if(mp[q[i].x]>0){
add_num(q[i].x+1,1);
add_sum(q[i].x+1,mp[q[i].x]);
}
}
else {//q[i].x没被离散化,real是去q[i].x在mp中的位置
ll real=upper_bound(mp+1,mp+num+1,q[i].x)-mp-1;
ll bigans=query_num(maxn+1)-query_num(real+1);
ll smallans=query_sum(real+1);
if(smallans>=(q[i].k-bigans)*q[i].x) printf("TAK\n");
else printf("NIE\n");
}
}
return 0;
}
[POI2015]LOG(树状数组)的更多相关文章
- BZOJ_4378_[POI2015]Logistyka_树状数组
BZOJ_4378_[POI2015]Logistyka_树状数组 Description 维护一个长度为n的序列,一开始都是0,支持以下两种操作: 1.U k a 将序列中第k个数修改为a. 2.Z ...
- 【BZOJ4378】[POI2015]Logistyka 树状数组
[BZOJ4378][POI2015]Logistyka Description 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这 ...
- BZOJ4378[POI2015]Logistyka——树状数组
题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作.每次 ...
- 树状数组【洛谷P3586】 [POI2015]LOG
P3586 [POI2015]LOG 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1 ...
- 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组
[BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...
- 【BZOJ4384】[POI2015]Trzy wieże 树状数组
[BZOJ4384][POI2015]Trzy wieże Description 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符 ...
- Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...
- 【bzoj4378】[POI2015]Logistyka 离散化+树状数组
题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作.每次 ...
- HDU 1556 线段树或树状数组,插段求点
1.HDU 1556 Color the ball 区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...
随机推荐
- js之function
function* function* 这种声明方式(function关键字后跟一个星号)会定义一个生成器函数 (generator function),它返回一个 Generator 对象. 你 ...
- [C#]做服务使用Process启动外部程序没窗体
这几天会到一个需要,要时时侦测文件生成,并上传到Server上,侦测文件生成使用的FileSystemWatch.但是时时运行遇到了问题,程序可能会人为退出或者意外终止,使用一个进程监控程序的监程,也 ...
- KiB和KB的区别
原文链接:http://blog.csdn.net/starshine/article/details/8226320 原来没太注意MB与MiB的区别,甚至没太关注还有MiB这等单位,今天认真了一下, ...
- HQL和SQL查询
转自http://blog.csdn.net/aaa1117a8w5s6d/article/details/7757097 HQL和SQL的区别 标签: sqlhibernatejavasessio ...
- 在 Anaconda下解决国内安装tensorflow等下载慢和中断,出错,异常问题的一点思路
把镜像地址改为清华大学开源软件镜像站,打开 管理员身份打开cmd 输入conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...
- ZSetOperations 操作解释 拷贝过来的 哈哈哈
有序集合,默认按照score升序排列,存储格式K(1)==V(n),V(1)=S(1)(K=key,V=value,S=score) 1.add(K,V,S):添加 2.count(K,Smin,Sm ...
- Tomcat架构解析(六)-----BIO、NIO、NIO2、APR
对于应用服务器来说,性能是非常重要的,基本可以说决定着这款应用服务器的未来.通常从软件角度来说,应用服务器性能包括如下几个方面: 1.请求处理的并发程度,当前主流服务器均采用异步的方式处理客户端的请求 ...
- 学习fortran77基础语法
Program ParamaterDefine Implicit None C FORTRAN变量名和关键字不区分大小写.但调用外部函数的话,需要在编译选项里指定 c 大小写等选项 因为链接器是区分大 ...
- Spring MVC 指导文档解读(二)
Special Bean Types In the WebApplicationContext 解读 1.WebApplicationContext 特有的几种 Bean Types 2. 也表明 与 ...
- maven依赖管理
maven依赖管理 1.依赖范围 (依赖相当于java中的import 是否需要导入别的jar包) 使用控制依赖与三种classpath(编译期,测试时期,运行时期)的关系 complie ...