2021牛客暑期多校训练营7 B-xay loves monotonicity(线段树+不降子序列)

P4198 楼房重建
线段树维护以某点为开头的最长不下降子序列

使用下面calc函数能够计算线段树u维护的区间中,以x为开头最长不下降子序列的个数。

calc需要维护区间最值。

template<typename T>
int calc(int u,T x)
{if(tree[u].l==tree[u].r) return tree[u].v>x?1:0;if(tree[u<<1].v<=x) return calc(u<<1|1,x);return tree[u].cnt-tree[u<<1].cnt+calc(u<<1,x);
}

B-xay loves monotonicity

如果本题没有b数组,就是上面的楼房重建,用上面calc函数递归解决问题。

由于存在b数组的操作,首先是区间翻转可以懒标记解决。
对于贡献来说我们同样记录每个区间的最值,并且记录一下最值出现位置pos\text {pos}posbposb_{\text{pos}}bpos值,然后calc过程中记录一个pre即可实现递归。

注意引用的巧妙使用!!!

由于引用不难知道:
int calc(int u,int &mx,int &pre)中的mx\text{mx}mxpre\text{pre}pre始终表示当前考虑的子序列最后一个值和最后一个值的b

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=200010;
int a[N],b[N],n,m;
struct node
{int l,r;int v,cnt;// 区间最值v 以左端点为起点的最长不下降子序列int bt,tag;// 区间最值位置的b值 懒标记
}tree[N<<2];
void pushdown(int u)
{if(!tree[u].tag) return;tree[u<<1].tag^=1;tree[u<<1|1].tag^=1;tree[u<<1].bt ^=1;tree[u<<1|1].bt ^=1;tree[u].tag=0;
}
int calc(int u,int &mx,int &pre)//在子树u中以mx为起点的贡献,pre为mx位置的b的值
{if(tree[u].v<mx) return 0;if(tree[u].l==tree[u].r){if(tree[u].v>=mx) // 满足不下降{int ans=(tree[u].bt!=pre); // 贡献需要和前一个b不一样mx=tree[u].v,pre=tree[u].bt;// 修改mx和prereturn ans;}return 0;}pushdown(u);if(tree[u<<1].v<mx) return calc(u<<1|1,mx,pre);int ans=calc(u<<1,mx,pre)+tree[u].cnt-tree[u<<1].cnt;mx=tree[u].v,pre=tree[u].bt;return ans;}
void pushup(int u)
{if(tree[u<<1].v>tree[u<<1|1].v)// 区间最值和最值出现位置的b(靠右边)tree[u].v=tree[u<<1].v,tree[u].bt=tree[u<<1].bt;elsetree[u].v=tree[u<<1|1].v,tree[u].bt=tree[u<<1|1].bt;int mx=tree[u<<1].v,pre=tree[u<<1].bt;tree[u].cnt=tree[u<<1].cnt+calc(u<<1|1,mx,pre);
}
void build(int u,int l,int r)
{tree[u]={l,r};if(l==r){tree[u].v=a[l];tree[u].bt=b[l];tree[u].cnt=1;return;}int mid=l+r>>1;build(u<<1,l,mid),build(u<<1|1,mid+1,r);pushup(u);
}
void change(int u,int pos,int v)
{if(tree[u].l==tree[u].r) return tree[u].v=v,void();pushdown(u);int mid=tree[u].l+tree[u].r>>1;if(pos<=mid) change(u<<1,pos,v);elsechange(u<<1|1,pos,v);pushup(u);
}
void filp(int u,int l,int r)
{if(l<=tree[u].l&&tree[u].r<=r){tree[u].bt^=1;tree[u].tag^=1;return;}pushdown(u);int mid=tree[u].l+tree[u].r>>1;if(l<=mid) filp(u<<1,l,r);if(r>mid)filp(u<<1|1,l,r);pushup(u);
}
int query(int u,int l,int r,int &mx,int &pre)
{if(l<=tree[u].l&&tree[u].r<=r) return calc(u,mx,pre);pushdown(u);int mid=tree[u].l+tree[u].r>>1;int v=0;if(l<=mid) v+=query(u<<1,l,r,mx,pre);if(r>mid)v+=query(u<<1|1,l,r,mx,pre);return v;
}
int main()
{n=rd();for(int i=1;i<=n;i++) a[i]=rd();for(int i=1;i<=n;i++) b[i]=rd();build(1,1,n);m=rd();while(m--){int op=rd(),t1=rd(),t2=rd();if(op==1) change(1,t1,t2);else if(op==2) filp(1,t1,t2);else{int mx=-1,pre=-1;// 先假计算上序列一个值的贡献printf("%d\n",query(1,t1,t2,mx,pre)-1);// -1表示删去计算上序列一个值的贡献}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不止代码:最长上升序列

文章目录题目描述样例解析仔细审题&#xff01;&#xff01;&#xff01;&#xff01;代码题目描述 给定一个序列 求出它的单调上升序列长度并输出这个序列 样例 in: 13 7 9 16 38 24 37 18 44 19 21 22 63 15 out&#xff1a; max8 7 9 16 18 19 21 22 63解析 这题我一开始…

AT2305-[AGC010D]Decrementing【博弈论】

正题 题目链接:https://www.luogu.com.cn/problem/AT2305 题目大意 nnn个数字两个人进行博弈&#xff0c;每个人的操作为 选择一个大于1的数字减一之后所有数字除以所有数字的gcdgcdgcd 无法操作者败&#xff0c;保证初始所有数字互质 求是否先手必胜 1≤n≤1051\leq n\leq…

牛客题霸 [删除链表的倒数第n个节点] C++题解/答案

牛客题霸 [删除链表的倒数第n个节点] C题解/答案 题目描述 给定一个链表&#xff0c;删除链表的倒数第n个节点并返回链表的头指针 例如&#xff0c; 给出的链表为:1->2->3->4->5, n 2. 删除了链表的倒数第n个节点之后,链表变为1->2->3->5. 备注&#xf…

2021牛客暑期多校训练营7 K-xay loves sequence(主席树+二分)

K-xay loves sequence 首先不考虑模kkk的限制&#xff0c;容易想到对原数组做一个差分得到diai−ai−1d_ia_i-a_{i-1}di​ai​−ai−1​&#xff0c;显然对于∀1≤i≤nai0\forall_{1\leq i\leq n} a_i0∀1≤i≤n​ai​0 等价于∀1≤i≤ndi0\forall_{1\leq i\leq n} d_i0∀1≤i…

ASP.NET Core 搭配 Nginx 的真实IP问题

一.前言Nginx&#xff08;Engine X&#xff09;是一个高性能HTTP和反向代理服务&#xff0c;是由俄罗斯人伊戈尔赛索耶夫为访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。 如果…

不止代码:保留道路(ybtoj 最小生成树)

文章目录题目描述解析代码thanks for reading!题目描述 解析 其实就是修建道路 我一开始只能想到枚举g去跑最小生成树 是m^2的算法&#xff08;50pts&#xff09; 但是其实每次加入的边只有一条 而且之前都不在最小生成树上的边以后也肯定不会在 所以可以建一个新的边的集合存…

P7515-[省选联考 2021A卷]矩阵游戏【差分约束】

正题 题目链接:https://www.luogu.com.cn/problem/P7515 题目大意 有一个n∗mn*mn∗m的矩形AAA&#xff0c;然后给出一个(n−1)∗(m−1)(n-1)*(m-1)(n−1)∗(m−1)的矩形BBB满足 Bi,jAi,jAi1,jAi,j1Ai1,j1B_{i,j}A_{i,j}A_{i1,j}A_{i,j1}A_{i1,j1}Bi,j​Ai,j​Ai1,j​Ai,j1​…

牛客题霸 [链表中环的入口节点] C++题解/答案

牛客题霸 [链表中环的入口节点] C题解/答案 题目描述 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 题解&#xff1a; 判断环有个很巧妙的方法&#xff0c;之…

2021牛客暑期多校训练营8 F-Robots(bitset优化dp)

F-Robots 第一种第二种机器人直接O(n)O(n)O(n)判断即可。 第三种机器人暴力dp&#xff0c;用bitset优化。 bitset<250005> b[i][j] 表示从(i,j)(i,j)(i,j)能到达哪些点&#xff0c;第三种机器人向右向下转移即可。 状态压缩&#xff01; 时间复杂度O(qnn4w)O(qn\frac{…

不止代码:路径数量(ybtoj-最小生成树)

文章目录题目描述解析代码题目描述 解析 乍一看&#xff1a;是个水题啊&#xff01; 显然如果途径存在强连通的点&#xff0c;路径就会变为正无穷 所以缩点加拓扑dp以及一些特判应该就可以解决了&#xff01; 一交&#xff1a;40分。。。 然后就开始拆东墙补西墙的debug。。。…

重磅!!!微软发布.NET Core 2.2

我们很高兴地宣布发布.NET Core 2.2。它包括对运行时的诊断改进&#xff0c;对ARM32 for Windows和Azure Active Directory for SQL Client的支持。此版本中最大的改进是在ASP.NET Core中。ASP.NET Core 2.2和Entity Framework Core 2.2。您可以在Windows&#xff0c;macOS和Li…

Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】

正题 题目链接:https://loj.ac/p/2769 题目大意 给出nnn个点mmm条地铁线路&#xff0c;每条线路是一条路径。 求111到nnn的最短路且在最短路径的情况下相邻换乘点的距离平方和最大。 1≤n,m,∑si≤1061\leq n,m,\sum s_i\leq 10^61≤n,m,∑si​≤106 解题思路 首先肯定是在…

牛客题霸 [两个链表生成相加链表] C++题解/答案

牛客题霸 [两个链表生成相加链表] C题解/答案 题目描述 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0c;请生成代表两个整数相加值的结果链表。 例如&#xff1a;链表 1 为 9->3->7&#xff0c;链…

2021牛客暑期多校训练营8 J-Tree(思维dp+rmq)

J-Tree Cosmic_Tree题解 赛时队友想到了预处理s→ts\to ts→t路径上的点最远到达的点&#xff0c;后面贪心做的一直wa。正解是dp。 下面的solve(l,r,op)\text{solve}(l,r,\text{op})solve(l,r,op)函数中&#xff0c;当lrlrlr时不满足题意不合法&#xff0c;当op0\text{op}0op…

[翻译] ASP.NET Core 2.2 正式版发布

本文为翻译&#xff0c;原文地址&#xff1a;https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/我&#xff08;文章作者&#xff09;很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供&#xff01;怎么获取它您可以从 .NET…

理解至上:数位dp(ybtoj-B数计数)

文章目录简要题目描述解析dp定义:试填法代码thanks for reading&#xff01;简要 数位dp&#xff0c;天下第一 最重要的应该有两个&#xff1a; 1.状态转移式的确定 2.试填法不断往后模拟 &#xff08;至今是唯一一道数位dp&#xff0c;究竟重要的是啥我其实也没有太多经验 &am…

P7408-[JOI 2021 Final]ダンジョン 3【贪心,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P7408 题目大意 一个有n1n1n1层的地牢&#xff0c;从iii到i1i1i1层要AiA_iAi​点能量&#xff0c;第iii层可以花费BiB_iBi​获得111点能量。 mmm次询问从SiS_iSi​层出发到第TiT_iTi​层在能量上限为UiU_iUi​的情况下至少需…

牛客题霸 [输出二叉树的右视图] C++题解/答案

牛客题霸 [输出二叉树的右视图] C题解/答案 题目描述 请根据二叉树的前序遍历&#xff0c;中序遍历恢复二叉树&#xff0c;并打印出二叉树的右视图 题解&#xff1b; 分两个过程&#xff1a; 先用前序遍历中序遍历恢复二叉树&#xff0c;这个应该都会。。 打印二叉树的后视…

2021“MINIEYE杯”中国大学生算法设计超级联赛(10)Pty loves string(Border+二维数点)

Pty loves string 建立Border树后&#xff0c;发现可以转化成两个子树中相同点的数量&#xff0c;时间戳转化为连续的区间后相当于有两个数组&#xff0c;每次给两个区间&#xff0c;问区间相同点权的数目。 第一个数组作为区间&#xff0c;第二个数组作为权值。将第一个数组建…

微软推出了Cloud Native Application Bundles和开源ONNX Runtime

微软的Microsoft Connect(); 2018年的开发者大会 对Azure和IoT Edge服务进行了大量更新; Windows Presentation Foundation&#xff0c;Windows Forms和Windows UI XAML Library的开源 以及.NET 基金会会员模型的扩展。但那些只是冰山一角。微软还联合Docker发布了Cloud Native…