【做题记录】区间排序—线段树

1. CF558E A Simple Task

题意:

给定由小写字母组成的字符串 \(s\) 每一次操作如下:

  • \(opt=0\) :将 \([l,r]\) 降序排序

  • \(opt=1\) :将 \([l,r]\) 升序排序

输出最终字符串

题解:

大致思想为,建 \(26\) 棵线段树,代表每一种字母。

操作:区间查询出每一种字母的个数,记为 \(cnt[c]\)

排序:按照 \(a\)\(z\)\(z\)\(a\) 依次向后覆盖 \(cnt[i]\) 个位置 。

输出答案:对于每一位,枚举 \([a,z]\) ,找出覆盖这一位的字母 。

代码:

#include<bits/stdc++.h>
using namespace std;
#define Maxn 100005
#define Maxc 27
int n,m;
struct Tree
{int sum,ch_laz;
}tree[Maxc][Maxn<<2];
int cnt[Maxc];
void build(int opt,int p,int nl,int nr)
{tree[opt][p].ch_laz=-1;if(nl==nr) return;int mid=(nl+nr)>>1;if(mid>=nl) build(opt,p<<1,nl,mid);if(mid<nr) build(opt,p<<1|1,mid+1,nr);
}
void pushdown(int opt,int p,int nl,int nr)
{if(tree[opt][p].ch_laz==-1) return;int mid=(nl+nr)>>1;tree[opt][p<<1].sum=(mid-nl+1)*tree[opt][p].ch_laz;tree[opt][p<<1|1].sum=(nr-mid)*tree[opt][p].ch_laz;tree[opt][p<<1].ch_laz=tree[opt][p<<1|1].ch_laz=tree[opt][p].ch_laz;tree[opt][p].ch_laz=-1;
}
void pushup(int opt,int p)
{tree[opt][p].sum=tree[opt][p<<1].sum+tree[opt][p<<1|1].sum;
}
void change(int opt,int p,int nl,int nr,int l,int r,int x)
{if(nl>=l && nr<=r){tree[opt][p].sum=(nr-nl+1)*x;tree[opt][p].ch_laz=x;return;}pushdown(opt,p,nl,nr);int mid=(nl+nr)>>1;if(mid>=l) change(opt,p<<1,nl,mid,l,r,x);if(mid<r) change(opt,p<<1|1,mid+1,nr,l,r,x);pushup(opt,p);
}
int query(int opt,int p,int nl,int nr,int l,int r)
{if(nl>=l && nr<=r) return tree[opt][p].sum;pushdown(opt,p,nl,nr);int mid=(nl+nr)>>1,ret=0;if(mid>=l) ret+=query(opt,p<<1,nl,mid,l,r);if(mid<r) ret+=query(opt,p<<1|1,mid+1,nr,l,r);pushup(opt,p);return ret;
}
int main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);cin>>n>>m;for(int i=0;i<26;i++) build(i,1,1,n);char x;for(int i=1;i<=n;i++) cin>>x,change(x-'a',1,1,n,i,i,1);for(int i=1,l,r,k;i<=m;i++){cin>>l>>r>>k;memset(cnt,0,sizeof(cnt));if(k){for(int i=0;i<26;i++) cnt[i]=query(i,1,1,n,l,r),change(i,1,1,n,l,r,0);for(int i=0,pos=l;i<26;i++) if(cnt[i]) change(i,1,1,n,pos,pos+cnt[i]-1,1),pos+=cnt[i];}else{for(int i=25;i>=0;i--) cnt[i]=query(i,1,1,n,l,r),change(i,1,1,n,l,r,0);for(int i=25,pos=l;i>=0;i--) if(cnt[i]) change(i,1,1,n,pos,pos+cnt[i]-1,1),pos+=cnt[i];}}for(int i=1;i<=n;i++) for(int j=0;j<26;j++)if(query(j,1,1,n,i,i)) { printf("%c",j+'a'); break; }printf("\n");//fclose(stdin);//fclose(stdout);return 0;
}

2. P2824 [HEOI2016/TJOI2016]排序

题意:

给定由 \([1,n]\) 组成的排列,每一次操作如下:

  • \(opt=0\) :将 \([l,r]\) 升序排序

  • \(opt=1\) :将 \([l,r]\) 降序排序

最后输出第 \(Pos\) 位的值。

题解:

与上一题不同的是:这里有 \(n\) 种元素,但是只用查询一位的值 。

考虑二分答案!!

二分第 \(Pos\) 位的取值,将大于等于 \(mid\) 的值都改为 \(1\) ,将小于 \(mid\) 的值都改为 \(0\) ,离线进行一遍所有操作。

若操作完后第 \(Pos\) 位为 \(1\) ,则 \(ans\ge mid\) ,否则 \(ans<mid\)

注意:(代码第 \(72\) 行)

cnt=query(1,1,n,l[i],r[i]); 中, \(cnt\) 的可能为 \(0\) ,在接下来的覆盖中可能会出现 \(l>r\) ,应该及时判断 。

代码:

#include<bits/stdc++.h>
using namespace std;
#define Maxn 100005
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
int n,m,Pos,L,R,ans;
int a[Maxn],tmp[Maxn],opt[Maxn],l[Maxn],r[Maxn];
struct Data
{int sum,laz;
}tree[Maxn<<2];
void pushup(int p)
{tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;
}
void pushdown(int p,int nl,int nr)
{if(tree[p].laz!=-1){int mid=(nl+nr)>>1;tree[p<<1].sum=(mid-nl+1)*tree[p].laz;tree[p<<1|1].sum=(nr-mid)*tree[p].laz;tree[p<<1].laz=tree[p<<1|1].laz=tree[p].laz;tree[p].laz=-1;}
}
void build(int p,int nl,int nr)
{tree[p].sum=0,tree[p].laz=-1;if(nl==nr) { tree[p].sum=tmp[nl]; return; }int mid=(nl+nr)>>1;build(p<<1,nl,mid),build(p<<1|1,mid+1,nr);pushup(p);
}
void change(int p,int nl,int nr,int l,int r,int k)
{if(nl>=l && nr<=r){tree[p].sum=(nr-nl+1)*k;tree[p].laz=k;return;}pushdown(p,nl,nr);int mid=(nl+nr)>>1;if(mid>=l) change(p<<1,nl,mid,l,r,k);if(mid<r) change(p<<1|1,mid+1,nr,l,r,k);pushup(p);
}
int query(int p,int nl,int nr,int l,int r)
{if(nl>=l && nr<=r) return tree[p].sum;pushdown(p,nl,nr);int mid=(nl+nr)>>1,ret=0;if(mid>=l) ret+=query(p<<1,nl,mid,l,r);if(mid<r) ret+=query(p<<1|1,mid+1,nr,l,r);pushup(p);return ret;
}
bool check(int val)
{for(int i=1;i<=n;i++) tmp[i]=(a[i]>=val)?1:0;build(1,1,n);for(int i=1,cnt;i<=m;i++){cnt=query(1,1,n,l[i],r[i]);change(1,1,n,l[i],r[i],0);if(!cnt) continue;if(opt[i]==0) change(1,1,n,r[i]-cnt+1,r[i],1);else change(1,1,n,l[i],l[i]+cnt-1,1);}return query(1,1,n,Pos,Pos);
}
int main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=rd(),m=rd();for(int i=1;i<=n;i++) a[i]=rd();for(int i=1;i<=m;i++) opt[i]=rd(),l[i]=rd(),r[i]=rd();Pos=rd();L=1,R=n,ans=1;while(L<=R){int mid=(L+R)>>1;if(check(mid)) ans=mid,L=mid+1;else R=mid-1;}printf("%d\n",ans);//fclose(stdin);//fclose(stdout);return 0;
}

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

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

相关文章

Quadratic Form

Quadratic Form 题意&#xff1a; 一个n * n 的正定矩阵和一个n维的向量b&#xff0c;现在找一个x1&#xff0c;x2&#xff0c;…xn满足以下条件&#xff1a; 求这个式子&#xff0c;最后输出P * Q-1 mod 998244353. 题解&#xff1a; 参考 线性代数学过n阶正定的实矩阵等…

P3426-[POI2005]SZA-Template【KMP】

正题 题目链接:https://www.luogu.com.cn/problem/P3426 题目大意 给出一个长度为nnn的字符串sss&#xff0c;求一个长度最小的字符串ttt使得sss所有ttt和ttt匹配的位置能覆盖串sss。 1≤n≤51051\leq n\leq 5\times 10^51≤n≤5105 解题思路 首先答案肯定是原串的一个borde…

8分钟学会Consul集群搭建及微服务概念

Consul介绍&#xff1a;Consul 是由 HashiCorp 公司推出的开源软件&#xff0c;用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案&#xff0c;Consul 的方案更“一站式”&#xff0c;内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Valu…

取模除法(逆元)(费马小定理)(线性求逆元)

文章目录引言逆元费马小定理内容应用证明线性求逆元thanks for reading&#xff01;引言 我们做题时经常会由于答案过大&#xff0c;被要求使答案对一个质数取模 我们都知道&#xff0c;加和乘对取模是没有影响的 减法也只需要写一个&#xff1a; int mod_minus(int a,int b)…

数学基础知识(高精、快速幂、龟速乘……)

压位高精 模板代码 龟速乘 ll ch(ll x,ll y) {ll ret0;while(y){if(y&1) ret(retx)%m;x(xx)%m,y>>1;}return ret; }

P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包

P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包 题目&#xff1a; 给定一些点&#xff0c;问围住所有点所用的围栏的长度 题解&#xff1a; 凸包模板题 凸包详细 代码&#xff1a; #include<iostream> #include<algorithm> #include<cstdio&g…

最小代价(区间dp)(ybtoj)

文章目录题目描述解析代码题目描述 解析 &#xff08;我觉得&#xff09;很难的dp 思路是真的没有想出来 关键在于dp的设计&#xff1a; dp[l][r]&#xff1a;[l,r]的最小价值 f[l][r][a][b]&#xff1a;把l到r之间除了数值在[a,b]之间的数全部消掉需要的最小价值 &#xff08…

P4783-[模板]矩阵求逆

正题 题目链接:https://www.luogu.com.cn/problem/P4783 题目大意 给出一个矩阵&#xff0c;求它的逆矩阵。 1≤n≤4001\leq n\leq 4001≤n≤400 解题思路 记给出矩阵PPP&#xff0c;记单位矩阵EEE。 PP−1E⇒P(EP−1)EP\times P^{-1}E\Rightarrow P\times (E\times P^{-1})…

.net core i上 K8S(六).netcore程序的service网络代理模式

正文上一章我们讲了pod的hostip模式&#xff0c;但在生产环境中&#xff0c;我们都是通过service来访问k8s集群的&#xff0c;service有两种模式来暴漏端口&#xff0c;今天我们来分享一下1.clusterIP模式我们在创建service的时候&#xff0c;默认创建的时clusterIP模式&#x…

CF183D-T-shirtx【dp,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF183D 题目大意 nnn个人&#xff0c;mmm种衣服&#xff0c;给出每个人喜欢某件衣服的概率&#xff0c;你可以选择nnn件衣服带过去&#xff08;可以重复款式&#xff09;。求最大化能拿到喜欢衣服人的期望数量。 1≤n≤3000,1…

Jamie and Tree[CF916E]

Jamie and Tree[CF916E] 题意&#xff1a; 有一棵n个点的树&#xff0c;每个节点上有一个权值wi&#xff0c;最开始根为1号点&#xff0e;现在有3种 类型的操作&#xff1a; • 1 root, 表示将根设为root. • 2 u v x, 设u, v的最近公共祖先为p, 将p的子树中的所有点的权值加…

领域驱动设计,让程序员心中有码(三)

“正如西方古典哲学在现代社会逐渐式微&#xff0c;成为少数内心丰满者们填充自己精神世界的宝贵食物&#xff0c;UML也这样&#xff1b;互联网技术飞速发展的今天&#xff0c;各类软件设计思想层出不穷&#xff0c;正是站在UML和其他各种软件基础理论巨人的肩膀上&#xff0c;…

P4127 [AHOI2009]同类分布(数位dp)

洛谷传送门 文章目录题目描述解析代码题目描述 给出两个数a,b求出[a,b]中各位数字之和能整除原数的数的个数。 1<a<b<1018 解析 容易想到数位dp 但本题的难点是如果只记录数位和sum与取模的结果res&#xff0c;因为取模的除数发生改变&#xff0c;难以转移 如何解决…

线性代数(矩阵、高斯、线性基……)

矩阵 矩阵加法&#xff1a; 相同位置相加。 矩阵乘法&#xff1a; 满足分配率、结合律&#xff0c;不满足交换律(矩阵与逆矩阵之间除外) 。 矩阵转置&#xff1a; 记矩阵为 \(A\) &#xff0c;则 \(A\) 的转置记为 \(A^T\) 。 性质&#xff1a; \[{(A^T)}^TA \]\[{(AB)}^TA^TB^…

Tavan

Tavan–简单的k进制题 呵呵真的简单 也就是考试没做出来罢了&#xff0c;不慌不慌&#xff0c;奶我一口&#xff0c;还能活 【题目摘要】 题目描述 小 Zeljko 一直在阁楼里读他奶奶的旧信&#xff0c;并且发现了一个长度为 N 的单词。 不幸的是&#xff0c;由于溢出的墨水&…

.NET Core 2.x中使用Named Options处理多个强类型配置实例

来源&#xff1a; Using multiple instances of strongly-typed settings with named options in .NET Core 2.x作者&#xff1a; Andrew Lock译者&#xff1a; Lamond Lu.NET Core从1.0版本开始&#xff0c;就已经开始使用Options模式绑定强类型配置对象。从那时起到现在&…

CF235D-Graph Game【LCA,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/CF235D 题目大意 给出一棵基环树&#xff0c;每次随机选择一个点让权值加上这个点的连通块大小然后删掉这个点。 求删光所有点时期望权值。 1≤n≤30001\leq n\leq 30001≤n≤3000 解题思路 先找到环&#xff0c;然后考虑暴…

YBTOJ:魔法数字(数位dp)

文章目录题目描述解析题目描述 解析 迷惑。。。 首先&#xff0c;比较容易想到用二进制状态压缩记录1-9是否在十进制中出现过 然后就是整除的问题 如果记录余数&#xff0c;它的模数又有9个 开九维余数直接爆炸。。。 怎么办嘞&#xff1f; 有一个结论&#xff1a; 若&#xf…

斯特林数

第一类斯特林数 咕咕咕 第二类斯特林数 定义&#xff1a;把 \(n\) 个不同的球放入 \(r\) 个相同的盒子的方案数(盒子不能为空&#xff0c;记为&#xff1a;\(S(n,r)\) 或 \(\begin{Bmatrix}n\\r\end{Bmatrix}\) 。 递推式&#xff1a; \[\begin{Bmatrix}n\\r\end{Bmatrix}\begi…

Prosjecni(构造)

Prosjecni 【题目摘要】 描述 Slavko很无聊&#xff0c;所以他把正整数填到N*N的方阵中。 如果他填出来的方阵满足以下条件&#xff0c;他会特别高兴&#xff1a; ●每行中的数字的平均值是一个位于同一行的整数。 ●每列中的数字的平均值是一个位于同一列的整数。 ●表中的所…