abc411_d求助(玄关)
  • 板块题目总版
  • 楼主liyuan2023
  • 当前回复13
  • 已保存回复13
  • 发布时间2025/6/21 21:58
  • 上次更新2025/6/22 17:37:06
查看原帖
abc411_d求助(玄关)
1188691
liyuan2023楼主2025/6/21 21:58

https://atcoder.jp/contests/abc411/tasks/abc411_d

为什么n*log(n)不能过?

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q,l[4],op[N],p[N],cnt;
string ss[N],anss;
vector<int> a3,a[N];
void f3(int s,int t),f12(int s,int t,int id);
void f12(int s,int t,int id){
	if(s>t){
		return ;
	}
	int l=0,r=a[id].size()-1,ans=-1;
	while(l<=r){
		int mid=(l+r)/2;
		if(a[id][mid]>=s&&a[id][mid]<=t){
			ans=mid;
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	if(ans==-1){
		return ;
	}
	int i=a[id][ans];
	if(op[i]==1){
		f3(1,i);
	}
	else if(op[i]==2){
		anss=ss[i]+anss;
		f12(1,i-1,id);
	}
}
void f3(int s,int t){
	int l=0,r=a3.size()-1,ans=-1;
	while(l<=r){
		int mid=(l+r)/2;
		if(a3[mid]>=s&&a3[mid]<=t){
			ans=mid;
			l=mid+1;
		}
		else{
			r=mid-1;
		}
	}
	if(ans==-1){
		return ;
	}
	else{
		int i=a3[ans];
		f12(1,i-1,p[i]);
	}
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=q;i++){
		cin>>op[i]>>p[i];
		if(op[i]==1){
			a[p[i]].push_back(i);
		}
		else if(op[i]==2){
			cin>>ss[i];
			a[p[i]].push_back(i);
		}
		else{
			a3.push_back(i);
		}
	}
	f3(1,q);
	cout<<anss;
	return 0;
}
2025/6/21 21:58
加载中...