题目:

2019ICPC南昌网络赛I:Yukino With Subinterval

题意:

给定长度为 N 的数组,有两种操作:(1)单点修改,(2)查询区间【qL,qR】内有多少个不同的段(连续相同的为一段),且满足每一段的数字介于【x,y】之间

分析:

为了补这个题,专门学了带修主席树~~~

先把每一段的数字压缩到它的左端点上,其它位置为0,那么(2)操作相当于查询区间 [qL,qR] 内属于 [x,y] 的数字有多少个(当然要特判一下 qL 的情况),这是主席树的简单应用;对于(1)操作,修改后会影响 x 和 x+1,主席树单点修改即可;注意修改操作没写好极容易消耗更多的内存,导致MLE或段错误

#include <bits/stdc++.h>#define lowbit(x) (x)&(-x)
using namespace std;
const int maxn = 2e5+25;
int n,m,tot,a[maxn],c[maxn],root[maxn],bit[maxn],op,l,r,x,y;
struct tree{int l,r,sum;
}T[maxn*150];
void updata(int l,int r,int &x,int y,int val,int w,int f){if(f){T[++tot] = T[y]; T[tot].sum += w; x = tot;}else{if(!x) x = ++tot; T[x].sum += w;}           //树状数组不需要可持久化,这样写能省很多空间if(l == r) return;int mid = (l+r) >> 1;if(val > mid) updata(mid+1,r,T[x].r,T[y].r,val,w,f);else updata(l,mid,T[x].l,T[y].l,val,w,f);
}
void change(int x,int w){int val = c[x];while(x <= n){updata(1,n,bit[x],bit[x],val,w,0);x += lowbit(x);}
}
int persum(int x,int t,int nxt[][2]){int res = 0,k = 0;while(x > 0){res += T[nxt[k++][t]].sum;x -= lowbit(x);}return res;
}
void query(int l,int r,int L,int R,int ql,int qr,int x,int y,int &ans,int nxt[][2]){if(l > R || r < L) return;if(l >= L && r <= R){ans += T[y].sum-T[x].sum+persum(qr,0,nxt)-persum(ql,1,nxt);return ;}int mid = (l+r)>>1;int nxt1[25][2] = {0},k0 = 0,k1 = 0;for(int i = qr;i > 0;i -= lowbit(i),k0++) nxt1[k0][0] = T[nxt[k0][0]].l;for(int i = ql;i > 0;i -= lowbit(i),k1++) nxt1[k1][1] = T[nxt[k1][1]].l;query(l,mid,L,R,ql,qr,T[x].l,T[y].l,ans,nxt1);k0 = 0,k1 = 0; for(int i = qr;i > 0;i -= lowbit(i),k0++) nxt1[k0][0] = T[nxt[k0][0]].r;for(int i = ql;i > 0;i -= lowbit(i),k1++) nxt1[k1][1] = T[nxt[k1][1]].r;query(mid+1,r,L,R,ql,qr,T[x].r,T[y].r,ans,nxt1);
}
int nxt[25][2];
int main(){scanf("%d %d",&n,&m);for(int i = 1;i <= n; ++i) scanf("%d",a+i);for(int i = 1;i <= n; ++i){if(a[i] != a[i-1]) updata(1,n,root[i],root[i-1],a[i],1,1),c[i] = a[i];else root[i] = root[i-1],c[i] = 0;}while(m--){scanf("%d",&op);if(op == 1){scanf("%d %d",&x,&y);if(a[x] == y) continue;a[x] = y;if(c[x] != 0) change(x,-1);if(a[x] != a[x-1]){c[x] = a[x]; change(x,1);}else c[x] = 0;if(x+1 > n) continue;if(c[x+1]!=0&&a[x+1]==a[x]) change(x+1,-1),c[x+1] = 0;if(c[x+1]==0&&a[x+1]!=a[x]) c[x+1]=a[x+1],change(x+1,1);}else{scanf("%d %d %d %d",&l,&r,&x,&y);int ans = 0,k0 = 0,k1 = 0;for(int i = r;i > 0;i -= lowbit(i)) nxt[k0++][0] = bit[i];for(int i = l-1;i > 0;i-=lowbit(i)) nxt[k1++][1] = bit[i];query(1,n,x,y,l-1,r,root[l-1],root[r],ans,nxt);if(c[l]==0&&a[l]>=x&&a[l]<=y) ans++;    //特判左端点printf("%d\n",ans);}}return 0;
}

2019年ACM-ICPC - 南昌网络赛I:Yukino With Subinterval【带修主席树】相关推荐

  1. 2019ICPC南昌网络赛 - I. Yukino With Subinterval

    题意: 给定一个长为 n 的数组,定义值相同的区间为一子段,有 m 个操作,①:1,pos,v,修改 pos 上的值为 v:②:2,l,r,x,y,询问区间 [ l, r ] 的值域在 [ x, y ...

  2. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  3. 2019 ICPC 南昌网络赛 H. The Nth Item

    2019 ICPC 南昌网络赛 H. The Nth Item 题目大意:已知一个数列F(n): F(0)=0,F(1)=1 F(n)=3∗F(n−1)+2∗F(n−2),(n≥2) ​ 给你一个操作 ...

  4. 2019 ICPC南昌网络赛 E题 Magic Master 【双向队列】

    传送门:E.Magic Master John is not only a magic master but also a shuffling master. Famous though he is, h ...

  5. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  6. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

  7. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  8. 2013 ACM/ICPC 长沙网络赛J题

    题意:一个数列,给出这个数列中的某些位置的数,给出所有相邻的三个数字的和,数列头和尾处给出相邻两个数字的和.有若干次询问,每次问某一位置的数字的最大值. 分析:设数列为a1-an.首先通过相邻三个数字 ...

  9. 2019暑假牛客多校赛第九场H.Cutting Bamboos (主席树+二分)

    题意: 有n条柱子,高度为aia_iai​ ,我们有qqq次操作.在l到r的范围内砍yyy次,将所有的树高都砍为0,但是保证每一刀砍出来的长度(砍除树高于该高度的和)都是相同的.问你第xxx次砍的时候 ...

最新文章

  1. Java was started but returned exit code=13
  2. 下载Java Jar包的网站(托管厂库)
  3. 使用PhpSpreadsheet将Excel导入到MySQL数据库
  4. java 空接口_学Java,java接口搞明白了吗?大牛让你一文搞清楚
  5. 软考考前冲刺第一章计算机硬件基础知识
  6. Linux系统常用的基本命令【转载CSDN象在舞】
  7. JavaScript数据结构与算法(1)(数组、栈、队列、链表)(ES6)
  8. 一晚带货千万,谁在买8000一面的健身镜?
  9. 【elasticsearch】elasticsearch 生命周期 resourceAlreadyExistsException
  10. mysql安装了老版本_Windows 环境下 MySQL 5.7 安装配置指南
  11. C语言入门项目篇:贪吃蛇(完整代码+详细注释)
  12. 拼多多带货视频是什么?拼多多带货视频如何上传
  13. allegro铜皮优先级设置
  14. HCIE公开课之VLAN
  15. 在线预览文档 Office Online
  16. Android百度地图SDK:隐藏比例尺,隐藏百度LOGO,隐藏缩放控件
  17. 苹果IAP内购验证工具类
  18. Vue 解决兄弟组件之间传值问题
  19. 怎么学习java?学习java的路线
  20. 靶机渗透之Wakanda

热门文章

  1. 怎么将网站由http变为https
  2. 小项目网上商城学习心得
  3. dwg文件怎么打开?dwg文件用什么打开?
  4. uniapp获取手机号(详细教程附代码)
  5. 移动端开发的方式--浅显易懂
  6. 计算机图形学(1)(基础变换矩阵:缩放,旋转,平移)
  7. linux CPU主频配置
  8. opengl实现曲柄连杆
  9. 为什么至少三个哨兵_Redis哨兵的详解
  10. Ubuntu20.04 安装向日葵远程控制软件