首页 > 其他分享 >做题笔记

做题笔记

时间:2024-08-04 23:50:35浏览次数:11  
标签:cnt le 题目 int 可以 笔记 操作

Sort Left and Right

题目传送门

Sort Left and Right

题目大意

给定关于 \(N\) 的排列 \(P\),定义一个操作为选择一个 \(k(1\le k\le N)\),然后把 \([1,k-1]\) 和 \([k+1,N]\) 都按升序排序。求讲 \(P\) 变成一个从 \(1\) 到 \(N\) 的序列的最小操作次数。带多测。

\(\sum N\le 2\times10^5\)

思路

其实是一个小结论题,赛时智障写了 30min。

首先发现,如果 \(P\) 本身就是排好序的,那么输出 \(0\) 即可。

然后可以考虑遍历一下 \(P\),选取 \(k\),判断是否可以在 \(1\) 次操作内完成。如果可以的话就输出 \(1\)。

如果 \(1\) 次操作不行的话,那么考虑存在一种排列 \(\{a,b,\cdots,1\}\),显然我们可以先选取 \(k=1\),把 \([2,N]\) 排好序,然后在选取一个 \(k\) 满足 \(3\le k\le N\) 就可以在两步之内完成。由这个排列可以推广到几乎所有情况,那么最优解就是 \(2\)。

值得一提的是,当排列为 \(\{N,a,b,\cdots,1\}\) 时,最优解只能是 \(3\)。

时间复杂度 \(O(\sum N)\)。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,a[200001];
bool v[200001]={0};
int pos;

void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];

	pos=0;
	for(int i=1;i<=n;i++)
		v[i]=0;

	bool f=1;
	for(int i=1;i<=n;i++){
		if(a[i]!=i){
			f=0;
			break;
		}
	}

	if(f){
		cout<<0<<endl;
		return;
	}
	
	if(a[1]==n&&a[n]==1){
		cout<<3<<endl;
		return;
	}

	for(int i=1;i<=n;i++){
		while(v[pos+1]&&pos<n)
			pos++;

		if(a[i]==i){
			if(pos>=i-1){
				cout<<1<<endl;
				return;
			}
		}

		v[a[i]]=1;
	}

	cout<<2<<endl;
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);

	int t; cin>>t;
	while(t--) solve();

	return 0;
}

Distinct Characters Queries

题目传送门

Distinct Characters Queries

题目大意

给定一个字符串 \(s\),有两种操作。

  • 给出 \(i,c\),将 \(s_i\) 改成 \(c\)。

  • 给出 \(l,r\),求 \([l,r]\) 中不同字符的种类个数。

思路

其实挺水的,但是考场上不一定会写这种做法。

给出一个数组 \(cnt_{i,j}\) 满足 \(1\le i\le|s|,1\le j\le 26\) 表示前 \(i\) 位中拥有字符 \(j\) 的个数,可以 \(O(|s|)\) 预处理。

对于每一次更改,就是把 \(cnt_{i\text{~}|s|,s_i}\) 都减 \(1\),同样地,把 \(cnt_{i\text{~}|s|,c}\) 都加 \(1\)。

显然地,区间加单点查,线段树和树状数组都可以做。

这时肯定很多人就想这道题用数据结构肯定不是正解!一定有更优秀的解法。

其实不是的,这道题的正解就是数据结构。

代码

代码没写咕咕咕。

标签:cnt,le,题目,int,可以,笔记,操作
From: https://www.cnblogs.com/snapyust/p/18342423

相关文章

  • 【笔记】多项式全家桶
    【笔记】多项式全家桶https://www.cnblogs.com/Appleblue17/p/14360752.htmlWarning空间记得开两倍,因为有卷积,最后结果是两多项式长度之和。对于多项式\(F(x)\),Templatep.s.一般函数最开始是输出数组,后接输入数组,及其长度。namespaceNTT{ constintgen=3; intr......
  • SA 学习笔记
    SA的定义一个字符串有\(n\)个后缀,把\(n\)个后缀按字典序排序,得到数组\(sa\)。\(sa\)的每一个元素是每个后缀的第一个字符的index。\(rk\)数组代表了原先的每个后缀在排序后的位置。例如:eaabd,其后缀为eaabdaabdabdbdd,排序后为aabdabdbddeaabd,\(sa=\{2,3,4,......
  • day1-Django笔记
    1.手动创建Django项目(初学则推荐)创建一个python虚拟环境>=3.61.win+r进入终端2.condaenvlist#查看有哪些虚拟环境3.condacreate--namepy36_netpython==3.6#创建一个python环境4.activate虚拟环境名#激活虚拟环境5.condadeactivate#退出虚拟环境安装dja......
  • Python基础算法笔记
    整理自B站视频https://www.bilibili.com/video/BV1uA411N7c5递归1.汉诺塔问题#n个圆盘,从a经过b移动到cdefhanoi(n,a,b,c):ifn>0:#将n-1个圆盘从a经过c移动到bhanoi(n-1,a,c,b)#将最底层的圆盘从a移动到cprint("mov......
  • 优化蒙特卡洛算法笔记1
    fromkaiwu_agent.utils.common_funcimportcreate_cls,attachedSampleData=create_cls("SampleData",state=None,action=None,reward=None)ObsData=create_cls("ObsData",feature=None)ActData=create_cls("ActData",ac......
  • 学习笔记第十七天
    1.Shell基本语法    1.注释:以#符号开始,直到行末,用于解释代码或暂时禁用某行代码。    2.命令:如echo、ls等,用于执行系统命令或调用外部程序。    3.控制结构:包括if语句、for循环、while循环等,用于控制脚本的流程。2.创建和执行脚本    1.......
  • 《802.11无线网络权威指南-无线网络导论》-- 读书笔记1
    专业术语发射塔:celltower,指信号发射塔基站,接入点:accesspoint无线数据网络:wirelessdatanetwork基站:basestationauthorization:授权,认证serviceprovider:服务供应商hotspot:热点WAN:广域网络infraredlight:红外线频带:frequencyband带宽:bandwidth,即可供使用的频率......
  • KMP学习笔记
    KMP一种字符串单模匹配算法。原理当模式串\(s\)与文本串\(t\)进行匹配时,容易想到的一种朴素做法就是将模式串的第一位与文本串的每一位进行试配。但是这样效率过低,容易被数据卡成\(O(n^2)\)。KMP单模匹配算法引入了一个失配数组border。定义一个字符串的border为一......
  • QT 笔记
     HTTPSSSL配置下载配置子父对象QTimer*timer=newQTimer;//QTimerinheritsQObjecttimer->inherits("QTimer");//returnstruetimer->inherits("QObject");//returnstruetimer->inherits("QAbstractBut......
  • 【学习笔记】哈希
    【学习笔记】哈希Hash的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围。主要用来判重!如何辨别哈希题?大概就通过一句话:当需要用\(O(1)\)的时间快速比较两个\(O(n)\)的东西时。应该对大部分题目都生效。字符串哈希感觉这一块OI_wiki讲得比较清楚。通常我......