[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)树状数组 总结:树状数组是一个查 ...
随机推荐
- python之web开发“三剑客”
# django import django # flask import flask # tornado import tornado
- (转)用webbrowser做的网站登陆程序,如何获取cookie并且保存在程序中 (IE8有效) ,用途嘛,你懂的。
今天帮朋友做了个工具,用webbrowser做的,用户使用用户名密码登陆网站后,需要在后台下载和分析一些页面. 分析页面使用的是htmlparser .net版 里面唯一需要解决的问题是,登陆后的co ...
- [ASP.NET]使用Oracle.ManagedDataAccess的OracleParameter参数化和OracleDataAdapter模糊查询
今天写个查询员工的信息的demo遇到了2个问题 问题1.使用Oracle.ManagedDataAccess的OracleParameter参数化 OracleParameter 的使用(参数名要以: ...
- CSS-弹性布局-动画-过渡
1.弹性布局 1.项目的属性 该组属性只能设置在某项目元素上,只控制一个项目,是不影响容器以及其他项目的效果. 1.order 作用:定义项目的排列顺序,值越小,越靠近起点,默认值是0 取值:整数数字 ...
- 【转】【MySQL】时间类型存储格式选择
一 前言 昨天在给开发同学做数据库设计规范分享的时候,讲到时间字段常用的有三个选择datetime.timestamp.int,应该使用什么类型的合适?本文通过三种类型的各个维度来分析,声明:本文 ...
- Le Chapitre IX
Je crois qu'il profita, pour son évasion[evazjɔ̃]逃跑, d'une migration d'oiseaux sauvages[sovaʒ]未驯化的. ...
- TCP粘包问题分析和解决(全)
TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...
- 最全js表单验证
/***************************************************************** 表单校验工具类 (linjq) ***************** ...
- UVa 11021 Tribles (概率DP + 组合数学)
题意:有 k 只小鸟,每只都只能活一天,但是每只都可以生出一些新的小鸟,生出 i 个小鸟的概率是 Pi,问你 m 天所有的小鸟都死亡的概率是多少. 析:先考虑只有一只小鸟,dp[i] 表示 i 天全部 ...
- 解决普通用户sudo时出现/usr/bin/sudo must be owned by uid 0 and have the setuid bit set
一:因为之前误操作使用sudo chmod -R 777 /usr命令修改了usr文件的所有者导致了此问题: 二:网上说需要进入recovery mode,经过自己的测试是不需要的: 三:步骤(只需登 ...