线段树TLE求助
查看原帖
线段树TLE求助
419144
chenjunxiu楼主2021/8/28 14:23

和题解区差不多的代码不知为什么TLE了。

#include<bits/stdc++.h>
#define ll long long
#define pl p<<1
#define pr p<<1|1
using namespace std;
long long read(){
	long long x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(long long x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
const int N=1e5+10;
const ll inf=1e18;
int n,pos,lst[N],l1=1,z[N],t;
ll w[N],h[N],l,dp[N],sum;
struct Tree{
	int l,r;
	ll f,mx,tag;
}a[N*4];
void pushup(int p){
	a[p].f=min(a[pl].f,a[pr].f);
	a[p].mx=min(a[pl].mx,a[pr].mx);
}
void pushdown(int p){
	if(a[p].tag){
		a[pl].tag=a[pr].tag=a[p].tag;
		a[pl].mx=a[pl].f+a[pl].tag;
		a[pr].mx=a[pr].f+a[pr].tag;
		a[p].tag=0;
	}
}
void build(int p,int l,int r){
	a[p].l=l;a[p].r=r;
	a[p].mx=a[p].f=inf;
	a[p].tag=0;
	if(l==r)
		return;
	int mid=(l+r)>>1;
	build(pl,l,mid);
	build(pr,mid+1,r);
}
void change1(int p,int l,int r,ll v){
	if(l<=a[p].l&&a[p].r<=r){
		a[p].mx=a[p].f+v;
		a[p].tag=v;
		return;
	}
	pushdown(p);
	int mid=(a[p].l+a[p].r)>>1;
	if(l<=mid)
		change1(pl,l,r,v);
	if(r>mid)
		change1(pr,l,r,v);
	pushup(p);
}
void change2(int p,int x){
	if(a[p].l==a[p].r){
		a[p].mx=inf;
		a[p].f=dp[x-1];
		return;
	}
	pushdown(p);
	int mid=(a[p].l+a[p].r)>>1;
	if(x<=mid)
		change2(pl,x);
	else
		change2(pr,x);
	pushup(p);
}
ll ask(int p,int l,int r){
	if(a[p].l==a[p].r)
		return a[p].mx;
	pushdown(p);
	int mid=(a[p].l+a[p].r)>>1;
	ll ans=inf;
	if(l<=mid)
		ans=min(ans,ask(pl,l,r));
	if(r>mid)
		ans=min(ans,ask(pr,l,r));
	return ans;
}
int main(){
    n=read();l=read();
    for(int i=1;i<=n;i++){
    	h[i]=read();
    	w[i]=read();
	}
	z[++t]=1;
	for(int i=2;i<=n;i++){
		while(t&&h[i]>h[z[t]])
			t--;
		lst[i]=z[t];
		z[++t]=i;
	}
	build(1,1,n);
	for(int i=1;i<=n;i++){
		sum+=w[i];
		while(l1<=i&&sum>l)
			sum-=w[l1++];
		pos=l1;
		change2(1,i);
		if(lst[i]+1<=i)
			change1(1,lst[i]+1,i,h[i]);
		dp[i]=ask(1,pos,i);
	}
	write(dp[n]);
	return 0;
}
2021/8/28 14:23
加载中...