题目:https://loj.ac/problem/3094

弱化版是 AGC017C 。

用线段树维护那个题里的序列即可。

对应关系大概是:

  真实值的范围是 [ 1-m , n+m ] ;考虑设偏移量 fx ,使得 a[ i ]+fx 是真实值。如果整体 +1 ,就 fx+1 。

  因为要记录每个值的个数,所以 a[ i ] 最好都是非负的。那么令 fx 的初值是 -m ,a[ i ] 的最小值是 “最小的真实值 - fx ”,就是 1-m+m 了。

  已经有了 a[ ] 的范围是 [ 1 , n+2*m ] 。考虑其个数 cnt ,覆盖的范围就是 [ 1-n , n+2*m ] 。所以令 fx2=n , a[ ] 加上 fx2 对应到线段树角标即可。

注意如果是在 [ 1 , n ] 之外的值带来的覆盖,不应该考虑。因为覆盖是在值的左边,所以只需要管 >n 的值对 [ 1 , n ] 的影响。因为 n 每次最多移动 1 的位置,所以可以维护。

如果是 >n 的值因为单点修改而使得 [ 1 , n ] 的位置上的值改变,也应该忽略,只修改 “值等于该值的元素个数” 即可。

原来维护了 “区间里 0 的个数” 。这样无法应对区间减。考虑到如果需要 “区间1的个数” ,那么此时区间里一定没有 0 ,所以(看题解)想到维护区间最小值的个数即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls Ls[cr]
#define rs Rs[cr]
using namespace std;
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
int Mn(int a,int b){return a<b?a:b;}
const int N=150005,N2=N*3,M=N*8;
int n,m,a[N],tp[N2],fx,fx2,lm;
int tot,Ls[M],Rs[M],tg[M];
struct Node{int mn,ct;Node(int m=0,int c=0):mn(m),ct(c) {}Node operator+ (const Node &b)const{int tmn=Mn(mn,b.mn),tct=0;if(mn==tmn)tct+=ct; if(b.mn==tmn)tct+=b.ct;return Node(tmn,tct);}
}vl[M];
void build(int l,int r,int cr)
{vl[cr].mn=0; vl[cr].ct=r-l+1;if(l==r)return; int mid=l+r>>1;ls=++tot; build(l,mid,ls);rs=++tot; build(mid+1,r,rs);
}
void pshd(int cr)
{if(!tg[cr])return; int w=tg[cr]; tg[cr]=0;tg[ls]+=w; tg[rs]+=w; vl[ls].mn+=w; vl[rs].mn+=w;
}
void mdfy(int l,int r,int cr,int L,int R,int k)
{if(l>=L&&r<=R){ tg[cr]+=k; vl[cr].mn+=k; return;}int mid=l+r>>1; pshd(cr);if(L<=mid)mdfy(l,mid,ls,L,R,k);if(mid<R)mdfy(mid+1,r,rs,L,R,k);vl[cr]=vl[ls]+vl[rs];
}
Node qry(int l,int r,int cr,int L,int R)
{if(l>=L&&r<=R)return vl[cr];int mid=l+r>>1; pshd(cr);if(R<=mid)return qry(l,mid,ls,L,R);if(mid<L)return qry(mid+1,r,rs,L,R);return qry(l,mid,ls,L,R)+qry(mid+1,r,rs,L,R);
}
int main()
{n=rdn();m=rdn(); fx=-m; fx2=n; lm=n+m-fx+fx2;for(int i=1;i<=n;i++){ a[i]=rdn()-fx; tp[a[i]]++;}tot=1; build(0,lm,1);for(int i=1;i<=n;i++){int k=i-fx;if(tp[k]) mdfy(0,lm,1,k-tp[k]+1+fx2,k+fx2,1);}for(int i=1,x,y;i<=m;i++){x=rdn(); y=rdn();if(x>0){int d=a[x]-tp[a[x]]+1;if(a[x]<=n-fx) mdfy(0,lm,1,d+fx2,d+fx2,-1);tp[a[x]]--;a[x]=y-fx; tp[a[x]]++; d=a[x]-tp[a[x]]+1;if(a[x]<=n-fx) mdfy(0,lm,1,d+fx2,d+fx2,1);}else {if(y==1){int k=n-fx; fx++;if(tp[k]) mdfy(0,lm,1,k-tp[k]+1+fx2,k+fx2,-1);}else{fx--; int k=n-fx;if(tp[k]) mdfy(0,lm,1,k-tp[k]+1+fx2,k+fx2,1);}}Node tp=qry(0,lm,1,1-fx+fx2,n-fx+fx2);if(tp.mn>0)tp.ct=0; printf("%d\n",tp.ct);}return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10948167.html

LOJ 3094 「BJOI2019」删数——角标偏移的线段树相关推荐

  1. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  2. LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域

    题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...

  3. loj 3090 「BJOI2019」勘破神机 - 数学

    题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...

  4. 「BJOI2019」

    #4372. 「BJOI2019」排兵布阵 题目描述: 小 C 正在玩一款排兵布阵的游戏.在游戏中有 $n$ 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 $m$ 名士兵,可以向第 $i$ 座 ...

  5. 【LOJ】#3090. 「BJOI2019」勘破神机

    LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...

  6. Loj #2983. 「WC2019」数树

    Loj #2983. 「WC2019」数树 题目背景 白兔喜欢树. 白云喜欢数数. 有 \(n\) 只鼠,白兔用 \(n − 1\) 根蓝色绳子把它们连成了一棵树,每根蓝色绳子连着两只鼠,白云用 \( ...

  7. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  8. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  9. Loj #2554. 「CTSC2018」青蕈领主

    Loj #2554. 「CTSC2018」青蕈领主 题目描述 "也许,我的生命也已经如同风中残烛了吧."小绿如是说. 小绿同学因为微积分这门课,对"连续"这一概 ...

最新文章

  1. python格式化输出print()
  2. 谈谈你对AOP的理解
  3. 0301——SearchController
  4. linux 格式化 目录,Linux 磁盘分区、格式化、目录挂载
  5. 快速特征点直方图描述器(FPFH)
  6. poj 2031 BuildingaSpaceStation 最小生成树 Prim、Kruskal
  7. python2.7使用TimeDelta中total_seconds()方法的问题
  8. [再学Python] - 面向对象的程序设计- 对象和类
  9. 软件自动化测试学习步骤
  10. Windows程序设计_学习总结(1)
  11. burpsuite基本设置与重复提交比较(一)
  12. 360*640是什么设备的分辨率?
  13. fiddler安装安全证书
  14. html脚本错误缺少函数,“Microsoft JScript 运行时错误: 缺少对象”问题请教
  15. [转] 李嘉诚的经典名言!
  16. springboot 整合 邮件发送
  17. 《庄子·杂篇·列御寇第三十二》
  18. [计算机组成原理]2-6、算数移位、逻辑移位、循环移位
  19. 记一次windowns7系统IE闪退恢复解决过程
  20. 生成带大写英文字母和数字的验证码(手机或邮箱)

热门文章

  1. python基础语法有哪些-Python基础语法一
  2. python写错了怎么更改-Python中如何修改文件?Python文件修改方法
  3. python使用界面-如何使用Python建立有窗口、按钮之类的图形界面
  4. python简介怎么写-python简历模板范文
  5. python安装numpy-NumPy 安装
  6. Ubuntu16.04 Linux上比较好用的截图工具Flameshot
  7. 遗传算法介绍和遗传算法的python实现
  8. HDU2022 海选女主角
  9. winform datagridview控件使用
  10. python json数据的转换