今天考试考了这题,所以来贡献\([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(树状数组)的更多相关文章

  1. BZOJ_4378_[POI2015]Logistyka_树状数组

    BZOJ_4378_[POI2015]Logistyka_树状数组 Description 维护一个长度为n的序列,一开始都是0,支持以下两种操作: 1.U k a 将序列中第k个数修改为a. 2.Z ...

  2. 【BZOJ4378】[POI2015]Logistyka 树状数组

    [BZOJ4378][POI2015]Logistyka Description 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这 ...

  3. BZOJ4378[POI2015]Logistyka——树状数组

    题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作.每次 ...

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

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

  5. 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组

    [BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...

  6. 【BZOJ4384】[POI2015]Trzy wieże 树状数组

    [BZOJ4384][POI2015]Trzy wieże Description 给定一个长度为n的仅包含'B'.'C'.'S'三种字符的字符串,请找到最长的一段连续子串,使得这一段要么只有一种字符 ...

  7. Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)

    Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...

  8. 【bzoj4378】[POI2015]Logistyka 离散化+树状数组

    题目描述 维护一个长度为n的序列,一开始都是0,支持以下两种操作:1.U k a 将序列中第k个数修改为a.2.Z c s 在这个序列上,每次选出c个正数,并将它们都减去1,询问能否进行s次操作.每次 ...

  9. HDU 1556 线段树或树状数组,插段求点

    1.HDU 1556  Color the ball   区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...

随机推荐

  1. Python常见错误:IndexError: list index out of range

    用python写脚本查询字典时,在遍历字典时循环到某一项时老是报错   出现这种错误有两种情况: 第1种可能情况 list[index]index超出范围 第2种可能情况 list是空值就会出现 In ...

  2. 【Redis】Redis cluster集群搭建

    Redis集群基本介绍 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation. Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行 ...

  3. 分享url带中文参数,打开html操作完毕跳转jsp页面中文乱码解决

    1.在app端分享参数组合时不对传递的url进行任何编码. 2.打开html页面时使用 escape函数对有中文的参数进行编码 escape(GetQueryString("paramete ...

  4. WZ后台管理框架

    http://herozhou.coding.me/vue-framework-wz/#/dashboard

  5. Python-类-dict

    class dict(object): """ dict() -> new empty dictionary dict(mapping) -> new dic ...

  6. 第03章:MongoDB启动参数说明

    ①基本配置 --quiet # 安静输出 --port arg # 指定服务端口号,默认端口27017 --bind_ip arg # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默 ...

  7. RGB,YCBCR在HDMI传输线是数据排列

    RGB4:4:4 YCbCr4:4:4 YCbCr4:2:2 YCbCr4:2:0

  8. 从客户端(f="<zhaoyuntang.com")中检测到有潜在危险的 Request.Form 值。

    从客户端(f="<yi733.com")中检测到有潜在危险的 Request.Form 值. 解决办法1:在aspx页面头部加 ValidateRequest="f ...

  9. 开源javacsv读取csv文件

    一.下载地址:https://sourceforge.net/projects/javacsv/ 读取示例: public static void main(String[] args) { // 1 ...

  10. linux之vim配置及使用示例

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7056193.html linux之vim配置及使用示例 vi的三种模式: 一 ...