首页 > 其他分享 >P10225 [COCI 2023/2024 #3] Milano C.le 题解

P10225 [COCI 2023/2024 #3] Milano C.le 题解

时间:2024-05-12 20:42:14浏览次数:18  
标签:小于 le int 题解 P10225 栈顶 序列 define

P10225 [COCI 2023/2024 #3] Milano C.le 题解


知识点

栈,贪心,树状数组。


题意分析

求最小的栈的数量使得出入栈能够合法。


思路分析

我们为了方便,其实可以先按照到达车站的顺序(入栈顺序)给火车重新编号。编号后,就十分简单了。

分析样例:

5
3 5 2 4 1
3 2 5 1 4

编号后,就变成了:

5
1 2 3 4 5
4 5 3 1 2

然后我们对 4 5 3 1 2 的出栈序列进行倒推,就又变成了一个入栈序列,且我们获得了很多的限制条件。

在倒推序列时,假设现在加入 \(i\),它必须接在一个小于它且已经进入序列并作为栈顶的数后面,或者独立成栈。

实例:2 5 4 1 3 的出栈序列。

  1. 3,先独立成栈;
  2. 1,没有小于它的数,独立成栈;
  3. 4,有两个小于它的栈顶,分别是 1 3。考虑贪心,尽量选大的那个,然后就可以为后面的留下小的。这里选 3
  4. 5,有两个小于它的栈顶,分别是 1 4。依照前文,这里选 4
  5. 3,有1个小于它的栈顶,是 1。注意到如果之前没有留下栈顶 1,这里就要再多成立一个栈了。

那么共成了两个栈,答案也就是 2

我们找小于一个数的最大值,可以用树状数组倍增,时间复杂度 \(O(n\log_2{n})\)。

(记得在栈中加入一个数后,要把原本的栈顶删除。)


CODE

#include<bits/stdc++.h>
#define RCL(a,b,c,d) memset((a),(b),sizeof(c)*(d))
#define FOR(i,a,b) for(register int i=(a);i<=(b);++i)
#define DOR(i,a,b) for(register int i=(a);i>=(b);--i)
#define main Main();signed main(){ios::sync_with_stdio(0);cin.tie(0);return Main();}signed Main
using namespace std;
constexpr int N=2e5+10;
int n,ans;
int a[N],b[N];
struct BIT{
#define lowbit(a) ((a)&-(a))
	int c[N];
	void Update(int x,int d){
		for(int i=x;i<=n;i+=lowbit(i))c[i]+=d;
	}
	int Query(int x){
		int res=0;
		for(int i=x;i;i^=lowbit(i))res+=c[i];
		return res;
	}
	int Bound(int x){
		int ans=0,sum=0;
		DOR(i,18,0)if(ans+(1<<i)<=n&&sum+c[ans+(1<<i)]<x)ans+=1<<i,sum+=c[ans];
		return ans+1;
	}
#undef lowbit
}B;
signed main(){
	cin>>n;
	FOR(i,1,n)cin>>a[i];
	FOR(i,1,n)cin>>b[a[i]];
	FOR(i,1,n)cout<<b[i]<<" ";cout<<endl;
	DOR(i,n,1){
		int ret=B.Query(b[i]);
		if(!ret)++ans;
		else B.Update(B.Bound(ret),-1);
		B.Update(b[i],1);
	}
	cout<<ans<<endl;
	return 0;
}

标签:小于,le,int,题解,P10225,栈顶,序列,define
From: https://www.cnblogs.com/Cat-litter/p/18188148

相关文章

  • P10232 [COCI 2023/2024 #4] Roboti 题解
    P10232[COCI2023/2024#4]Roboti题解知识点简单环,DFS。题意分析在\(n\)行,\(m\)列的网格里,给定\(k\)个转弯点,再给定\(Q\)个询问,问每次从某个坐标到另一个坐标的最少转弯次数,或者判断不可能到达。思路分析我们发现在一个点坐标与方向确定的时候,到达的下一个点的......
  • P10231 [COCI 2023/2024 #4] Putovanje 题解
    P10231[COCI2023/2024#4]Putovanje题解知识点多源BFS,bitset。题意分析在一个图上,每个点有一个权值,求满足到每个点的距离都为其权值的点(权值为\(-1\)的点除外)。思路分析Subtask1我们可以发现,这个子任务的图一定是一个有序的链,那么转换成序列问题,直接根据坐标进......
  • CF1967D Long Way to be Non-decreasing 题解
    CF1967DLongWaytobeNon-decreasing题解知识点二分答案,基环树。题意分析给定一个包含\(n\)个元素的数组\(\{a_i\}\)和一个\(m\)个元素的数组\(\{b_i\}\)。定义每次操作为:在\(\{a_i\}\)中选择任意个数,假设某个选的数为\(a_i\),那么将其变为\(b_{a_i}\)......
  • P10227 [COCI 2023/2024 #3] Slučajna Cesta 题解
    P10227[COCI2023/2024#3]SlučajnaCesta题解知识点期望DP,树形(换根)DP,组合数学。题意分析一棵树,每个点都有点权,每一条边的方向分布都是等概率的,问从每个点出发,有路走就一直走的情况下,所途径的点的权值总和的期望值。思路分析这明显是一个树形DP,且需要变成换根DP......
  • 【TransmittableThreadLocal】TransmittableThreadLocal的实现机制和原理
    1 前言前面我看过了 ThreadLocal的实现机制和原理 以及 InheritableThreadLocal的实现机制和原理 两种类型的ThreadLocal,前者是普通的,后者是在前者的基础上套了一层父子线程关系,当使用后者的时候,会在线程创建的时候,浅拷贝一份父线程的变量值。那么今天空了,我来看看另外一......
  • kombu & celery:如何在Python中舒适地使用消息队列
    Kombu和Celery是Python中的两个库,它们可分开或结合起来使用,以实现基于分布式消息传递的异步任务队列。KombuKombu是一个Python消息库,它为多种消息队列提供了抽象和统一的使用方式。它支持AMQP协议的消息队列服务,如RabbitMQ和Redis,以及其他一些通过插件实现的传输方......
  • [ABC261E] Many Operations 题解
    [ABC261E]ManyOperations题解思路解析首先可以发现,如果直接跑肯定会炸,于是考虑优化。首先发现操作有很多重复的,所以可以考虑把每一个数经过所有操作后的值都预处理下来,但这样显然空间也会炸。然后我们又想到可以不需要求下每个数经过操作后的值,可以把每一位二进制上在开始前......
  • Full-Duplex Communication for ISAC Joint Beamforming and Power Optimization-1
    Z.He,W.Xu,H.Shen,D.W.K.Ng,Y.C.EldarandX.You,"Full-DuplexCommunicationforISAC:JointBeamformingandPowerOptimization,"inIEEEJournalonSelectedAreasinCommunications,vol.41,no.9,pp.2920-2936,Sept.2023,doi:10.1......
  • beagle软件的安装以及基因型填充
     001、beagle软件官网:https://faculty.washington.edu/browning/beagle/beagle.html 002、下载最新版本: 003、赋予执行权限,并测试[root@pc1beagle]#lsbeagle.01Mar24.d36.jar[root@pc1beagle]#chmod+xbeagle.01Mar24.d36.jar[root@pc1beagle]#lsbeagle.01M......
  • 策略梯度玩 cartpole 游戏,强化学习代替PID算法控制平衡杆
     cartpole游戏,车上顶着一个自由摆动的杆子,实现杆子的平衡,杆子每次倒向一端车就开始移动让杆子保持动态直立的状态,策略函数使用一个两层的简单神经网络,输入状态有4个,车位置,车速度,杆角度,杆速度,输出action为左移动或右移动,输入状态发现至少要给3个才能稳定一会儿,给2个完全学不明白,......