有没有人帮忙看一下这个代码的时间复杂度?
查看原帖
有没有人帮忙看一下这个代码的时间复杂度?
737158
yszkddzyh楼主2023/2/3 13:21

rt,万分感谢!

#include <iostream>
#define inf 1145141919
#define pii pair<int,int>
#define rr register
#define mp make_pair
#define Min(a,b) ((a.first<b.first)?(a):(b))
using namespace std;
const int maxn=1e5+1;
struct node{
	int val,index;
}t[maxn<<2];
int n,R,ans[maxn],s[maxn],a[maxn],pre[maxn],nxt[maxn];
inline void del(int id){
	pre[nxt[id]]=pre[id];
	nxt[pre[id]]=nxt[id];
	return;
}
inline void pushup(int id){
	if(t[id<<1].val<t[id<<1|1].val) t[id].val=t[id<<1].val,t[id].index=t[id<<1].index;
	else t[id].val=t[id<<1|1].val,t[id].index=t[id<<1|1].index;
	return;
}
inline void build(int id,int l,int r){
	if(l==r){
		t[id].val=a[l];
		t[id].index=l;
		return;
	}
	int mid=(r-l>>1)+l;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	pushup(id);
	return;
}
inline void change(int id,int l,int r,int x,int k){
	if(l==r&&l==x){
		t[id].val=k;
		return;
	}
	int mid=(r-l>>1)+l;
	if(x<=mid) change(id<<1,l,mid,x,k);
	else change(id<<1|1,mid+1,r,x,k);
	pushup(id);
	return;
}
inline pii sch(int id,int l,int r,int p,int q){
	if(l>=p&&r<=q) return mp(t[id].val,t[id].index);
	pii c=mp(inf,inf);
	int mid=(r-l>>1)+l;
	if(p<=mid) c=Min(c,sch(id<<1,l,mid,p,q));
	if(q>mid) c=Min(c,sch(id<<1|1,mid+1,r,p,q));
	return c;
}
int getint(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57){
		if(ch==45) f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return f*x;
}
void putint(int x){
	if(x<0) x=-x,putchar(45);
	if(x>9) putint(x/10);
	putchar(x%10+48);
	return;
}
int main(){
    n=getint();
	for(rr int i=1;i<=n;i++) s[i]=getint();
	for(rr int i=1;i<=n;i++) a[i]=getint(),ans[n]+=a[i],pre[i]=i-1,nxt[i]=i+1;
	build(1,1,n),ans[n]+=(s[n]<<1),R=n;
	for(rr int i=n-1;i;i--){
		pii tt=sch(1,1,n,1,R-1);
		int t1=ans[i+1]-tt.first,t2=ans[i+1]-(s[R]<<1)-a[R]+(s[pre[R]]<<1);
		if(t2>t1){
			int tmp=R;
			R=pre[R];
			ans[i]=t2;
			del(tmp);
		}
		else{
			del(tt.second);
			change(1,1,n,tt.second,inf);
			ans[i]=t1;
		}
	}
	for(rr int i=1;i<=n;i++) putint(ans[i]),putchar(10);
	return 0;
}
2023/2/3 13:21
加载中...