2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

传送门

文章目录

  • 题意:
  • 思路:

题意:

题面挺绕口的,还是看原题比较好。
大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列,让后将这些下标存下来,在bbb中将这些位置拿出来后,如果相邻一对在模222的意义下不相同贡献就加一。
有三个操作,第一个是修改aaa数组,第二个是将bbb数组中[l,r][l,r][l,r]的位置都+1+1+1,第三个是询问[l,r][l,r][l,r]的上述过程的贡献。

在这里插入图片描述

思路:

比较明显的要用线段树区间合并来写,之前写过一个求全局的题楼房重建,这个题的重点就是calccalccalc函数,我们需要魔改一下他的函数实现即可。
先不考虑bbb数组的贡献,先考虑如何求以lll为起点,[l,r][l,r][l,r]中的最长非严格上升序列长度。
考虑函数calc(u,mx)calc(u,mx)calc(u,mx)表示uuu这个子树中最大值为mxmxmx的时候的答案,显然如果左区间的最大值<mx<mx<mx的话,直接返回右区间即可。否则说明两边的区间都可能有贡献,首先需要将答案加上calc(L,mx)calc(L,mx)calc(L,mx),如果暴力计算的话,我们还需要加上calc(R,tr[L].mx)calc(R,tr[L].mx)calc(R,tr[L].mx),但是我们在pushuppushuppushup过程中可以记一个lenlenlen,代表当前区间的答案,就是以当前区间左端点为起点的最长上升子序列长度。这个时候calc(R,tr[L].mx)=tr[u].len−tr[L].lencalc(R,tr[L].mx)=tr[u].len-tr[L].lencalc(R,tr[L].mx)=tr[u].lentr[L].len,这是为什么呢?可以发现不管calc(L,mx)calc(L,mx)calc(L,mx)计算的是多少,我们左区间选的最后一个数一定是左区间最大值,而我们的tr[u].len=tr[L].len+calc(R,tr[L].mx)tr[u].len=tr[L].len+calc(R,tr[L].mx)tr[u].len=tr[L].len+calc(R,tr[L].mx),所以直接移项即可。
这个时候已经成功一大半了,我们只需要在calccalccalc函数中计算一下bbb数组的贡献即可。所以维护一个flagflagflag表示当前区间的最后一个位置的bbb是多少,让后在calccalccalc函数到底的时候计算贡献即可,这个就比较简单了。
没做出来这个题还是对之前哪个题的calccalccalc函数有点误解,不然也不会被卡在怎么查询的问题上。或者是自己实现能力太差了,没想到可以直接引用参数让后在calccalccalc函数里面就可以修改。

// Problem: xay loves monotonicity
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11258/B
// Memory Limit: 524288 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int a[N],b[N];
struct Node {int l,r;int mx,cnt,flag,lazy;
}tr[N<<2];void pushdown(int u) {if(tr[u].lazy) {tr[L].flag^=1; tr[L].lazy^=1;tr[R].flag^=1; tr[R].lazy^=1;tr[u].lazy=0;}
}int query(int u,int &mx,int &flag) {if(tr[u].l==tr[u].r) {if(tr[u].mx>=mx) {int now=flag!=tr[u].flag;if(mx==-1) now=0;mx=tr[u].mx;flag=tr[u].flag;return now;}return 0;}int ans=0;pushdown(u);if(tr[L].mx>=mx) {ans=query(L,mx,flag)+tr[u].cnt-tr[L].cnt;// ans=query(L,l,Mid,mx,flag)+query(R,Mid+1,r,mx,flag);mx=tr[u].mx; flag=tr[u].flag;return ans;} else return query(R,mx,flag);
}void pushup(int u) {tr[u].mx=tr[L].mx; tr[u].flag=tr[L].flag;tr[u].cnt=tr[L].cnt+query(R,tr[u].mx,tr[u].flag);
}void build(int u,int l,int r) {tr[u]={l,r};if(l==r) {tr[u].mx=a[l]; tr[u].flag=b[l];return;}build(L,l,Mid); build(R,Mid+1,r);pushup(u);
}void change(int u,int pos,int x) {if(tr[u].l==tr[u].r) {tr[u].mx=x;return;}pushdown(u);if(pos<=Mid) change(L,pos,x);else change(R,pos,x);pushup(u);
}void filp(int u,int l,int r) {if(tr[u].l>=l&&tr[u].r<=r) {tr[u].lazy^=1; tr[u].flag^=1;return;}pushdown(u);if(l<=Mid) filp(L,l,r);if(r>Mid) filp(R,l,r);pushup(u);
}int aquery(int u,int l,int r,int &mx,int &flag) {if(tr[u].l>=l&&tr[u].r<=r)  return query(u,mx,flag);pushdown(u);int ans=0;if(l<=Mid) ans+=aquery(L,l,r,mx,flag);if(r>Mid) ans+=aquery(R,l,r,mx,flag);return ans;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=n;i++) scanf("%d",&b[i]);build(1,1,n);scanf("%d",&m);while(m--) {int op,t1,t2;scanf("%d%d%d",&op,&t1,&t2);if(op==1) change(1,t1,t2);else if(op==2) filp(1,t1,t2);else {int mx=-1,flag=0;printf("%d\n",aquery(1,t1,t2,mx,flag));}}return 0;
}
/**/

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

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

相关文章

容器化单页面应用中Nginx反向代理与Kubernetes部署

在《容器化单页面应用中RESTful API的访问》一文中&#xff0c;我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例。这里我将继续使用这个案例&#xff0c;介绍一下容器化单页面应用部署的另一个场景&#xff1a;将Nginx的职责独立出来。注&#xff1a;这里单页面应…

[蓝桥杯2019初赛]迷宫-DFS、BFS两种方法

迷宫问题的最短路&#xff0c;加最小字典序 迷宫文件maze.txt传送门 作者写的2019年B组蓝桥杯解集 . . . DFS的版本 #include<iostream> #include<cstring> using namespace std; const int ax[4]{0,0,1,-1}; const int ay[4]{1,-1,0,0}; const char dir[5]{R,L…

2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两棵树&#xff0c;让你在第一棵树选一条最长的深度递增的链&#xff0c;链上每一个点在第二棵树上都不互为祖先。 n≤3e5n\le3e5n≤3e5 思路&#xff1a; 之前做过差不多的题传送门。 之前哪个题是不…

xxl-job dotnet core executor执行器开源

DotXxlJob[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现&#xff0c;支持XXL-JOB 2.01 XXL-JOB概述[XXL-JOB][1]是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量…

2019年第十届蓝桥杯 C / C ++省赛 B 组真题题解

A: 组队 输入数据 编号 号位1 2 3 4 51 97 90 0 0 0 2 92 85 96 0 0 3 0 0 0 0 93 4 0 0 0 80 86 5 89 83 97 0 0 6 82 86 0 0 0 7 0 0 0 87 90 8 0 97 96 0 0 9 0 0 89 0 0 10 95 99 0 0 0 11 0 0 96 97 0 12 0 0 0 93 98 13 94 91 0 0 0 14 0 83 87 0 0 15 …

HDU - 7054 Yiwen with Formula 分治拆位FFT + dp + 费马小定理降幂

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 求aaa的所有子序列的和的乘积。 思路&#xff1a; 看到suma≤1e5sum_a\le1e5suma​≤1e5&#xff0c;这应该会给我们提示&#xff0c;但是我没看到。 我们可以记cntxcnt_xcntx​表示和为xxx的子序列有cnt…

使用Redis创建分布式锁

点击上方蓝色字关注我们~在本文中&#xff0c;我们将讨论如何在.NET Core中使用Redis创建分布式锁。当我们构建分布式系统时&#xff0c;我们将面临多个进程一起处理共享资源&#xff0c;由于其中只有一个可以一次使用共享资源&#xff0c;因此会导致一些意外问题&#xff01;我…

ASP.NET Core Web Api之JWT VS Session VS Cookie(二)

本文我们来探讨下JWT VS Session的问题&#xff0c;我们可直接抛出问题&#xff1a;使用客户端存储的JWT比服务端维持Session更好吗&#xff1f; 既然要比较JWT VS Session&#xff0c;那我们就得知道为何需要JWT和Session&#xff0c;它们共同是为了解决什么问题呢&#xff1f…

P4721 【模板】分治 FFT

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 写一下式子&#xff0c;发现每个fif_ifi​只有左边的fff对他有影响&#xff0c;所以考虑分治FFTFFTFFT来解决这个问题。 先递归左边&#xff0c;让后计算对右边贡献&#xff0c;再递归右边…

程序员生活之路--来自程序员爸爸的一封信

亲爱的孩子&#xff1a;当你看到爸爸这封信的时候&#xff0c;说明你已经长大了或者已经会玩微信公众号了&#xff0c;当然爸爸还是希望你长大了&#xff0c;并不希望你那么小就天天抱着手机刷微信。我写这个文章的时候正直盛夏&#xff0c;现在外边正是37度的高温&#xff0c;…

C#上位机与欧姆龙PLC的通信05---- HostLink协议

1、介绍 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可以对PLC进行I/O读写、可以对PLC进行I/O读写、改变操作模式、强制置位/复位等操作。由于是公开协议&#xff0c;即便是非欧姆龙的上位设备&#xff08;软件&#xff09;&…

Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较套路的一个题&#xff0c;我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少。 转移比较明显&#xff1a;dp[i]max(dp[j])dp[i]max(dp[j])dp[i]max(dp[j]) 其中jjj能…

从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

标题&#xff1a;从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件 作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/11260750.html源代码&#xff1a;https://github.com/lamondlu/DynamicPlugins前情回顾•从零开始实现ASP…

SP1043 GSS1 - Can you answer these queries I 猫树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 猫树是一种可以O(nlogn)O(nlogn)O(nlogn)预处理&#xff0c;O(1)O(1)O(1)查询的数据结构。预处理的信息应该满足可合并的性质&#xff0c;与线段树pushuppushuppushup的原理相同&#xff0…

动手造轮子:基于 Redis 实现 EventBus

动手造轮子&#xff1a;基于 Redis 实现 EventBusIntro上次我们造了一个简单的基于内存的 EventBus&#xff0c;但是如果要跨系统的话就不合适了&#xff0c;所以有了这篇基于 Redis 的 EventBus 探索。本文的实现是基于 StackExchange.Redis 来实现。RedisEventStore 实现既然…

最小生成树KrusKal算法(并查集)

洛谷p1111链接 克鲁斯卡尔算法的思路就是由森林变成树的过程&#xff0c;其中最主要的就是贪心和并查集的应用。 我们知道链接n个点需要n-1条边&#xff0c;这就满足的最后生成的是一颗树&#xff0c;而不是一个环。在这n-1条边的选择上我们又要尽可能的让边的权重小&#xff0…

#6278. 数列分块 2 分块 + 块内二分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 真 调一晚上血压上来了。 考虑第一个操作&#xff0c;块内打个标记&#xff0c;其他的暴力查询即可。 考虑第二个操作&#xff0c;讲块内元素排序之后&#xff0c;直接二分查询。 注意修改…

使用腾讯云提供的针对Nuget包管理器的缓存加速服务

继阿里巴巴开源镜像站&#xff08;https://opsx.alibaba.com/&#xff09;、华为云镜像站点&#xff08;https://mirrors.huaweicloud.com/ &#xff09;之后&#xff0c;腾讯也已于近日上线了类似的服务&#xff0c;官方名称为腾讯云软件源&#xff08;Tencent Open Source Mi…

最小生成树Prime算法

洛谷p1546链接 Prime算法的核心也是贪心&#xff0c;但是不同的就是&#xff0c;它是一直维护一颗树&#xff0c; 直到变成一颗最小生成树&#xff0c; #include<bits/stdc.h> using namespace std; const int maxn 110; const int inf 0x3f3f3f3f; int maze[maxn][m…

#6284. 数列分块 8 分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 乍一看貌似没有什么东西能维护块内同一个数的个数&#xff0c;但是通过第六感可以发现每次操作后区间都会被推成一个数&#xff0c;那么我们分个块&#xff0c;让后块内打个标记&#xff0…