玄学ce求调教
查看原帖
玄学ce求调教
754502
_AyachiNene楼主2024/7/12 17:00

rt,交一样的代码有一定概率会ce,把线段树里的初值改成1e18一定ce

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO
{
	char buff[1<<21],*p1=buff,*p2=buff;
	char getch(){return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;}
	template<typename T>void read(T &x){char ch=getch();int fl=1;x=0;while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}x*=fl;}
	template<typename T>void read_s(T &x){char ch=getch();while(ch<'A'||ch>'Z')ch=getch();while(ch>='A'&&ch<='Z'){x+=ch;ch=getch();}}
	template<typename T,typename ...Args>void read(T &x,Args& ...args){read(x);read(args...);}
	char obuf[1<<21],*p3=obuf;
	void putch(char ch) {if(p3-obuf<(1<<21))*p3++=ch;else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;}
	char ch[100];
	template<typename T>void write(T x) {if(!x)return putch('0');if(x<0)putch('-'),x*=-1;int top=0;while(x)ch[++top]=x%10+48,x/=10;while(top)putch(ch[top]),top--;}
	template<typename T,typename ...Args>void write(T x,Args ...args) {write(x);write(args...);}
	void put(string s){for(int i=0;i<s.size();i++)putch(s[i]);}
	void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
int n,m;
int w[114514],h[114514];
namespace Elaina
{
	struct segt
	{
		int val=1e9,tag=1e9;
	}t[114514<<2];
	#define ls (root<<1)
	#define rs (root<<1|1)
	#define mid (l+r>>1)
	void update(int root){t[root].val=min(t[ls].val,t[rs].val);}
	void down(int root)
	{
		if(t[root].tag==1e9) return;
		t[ls].tag=min(t[root].tag,t[ls].tag);
		t[rs].tag=min(t[root].tag,t[rs].tag);
		t[ls].val=min(t[root].tag,t[ls].val);
		t[rs].val=min(t[root].tag,t[rs].val);
		t[root].tag=1e9;
	}
	void cov(int x,int y,int v,int l=0,int r=n,int root=1)
	{
		if(l>=x&&r<=y)
		{
			t[root].val=min(t[root].val,v);
			t[root].tag=min(t[root].tag,v);
			return;
		}
		down(root);
		if(x<=mid) cov(x,y,v,l,mid,ls);
		if(y>mid) cov(x,y,v,mid+1,r,rs);
		update(root);
	}
	int query(int x,int y,int l=0,int r=n,int root=1)
	{
		if(l>=x&&r<=y) return t[root].val;
		down(root);
		int res=1e9;
		if(x<=mid) res=min(res,query(x,y,l,mid,ls));
		if(y>mid) res=min(res,query(x,y,mid+1,r,rs));
		return res;
	}
	#undef ls
	#undef rs
	#undef mid
}
namespace ldnn
{
	int st[114514][20],lg[114514];
	inline void bld()
	{
		for(int i=1;i<=n;i++) st[i][0]=i;
		for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
		for(int j=1;j<20;j++)
			for(int i=1;i+(1<<j)-1<=n;i++)
				st[i][j]=h[st[i][j-1]]>h[st[i+(1<<(j-1))][j-1]]?st[i][j-1]:st[i+(1<<(j-1))][j-1];
	}
	inline int query(int l,int r)
	{
		int k=lg[r-l+1];
		return h[st[l][k]]>h[st[r-(1<<k)+1][k]]?st[l][k]:st[r-(1<<k)+1][k];
	}
}
#define seg Elaina
#define st ldnn
int sum[114514];
void solve(int l,int r)
{
	if(l>r) return;
	if(l==r)
	{
		seg::cov(l,l,seg::query(l-1,l-1)+h[l]);
		return;
	}
	int pos=st::query(l,r);
	solve(l,pos-1);
	if(pos-l<=r-pos)
	{
		int cur=pos;
		for(int i=l;i<=pos;i++)
		{
			while(cur<r&&sum[cur+1]-sum[i-1]<=m) ++cur;
			if(sum[cur]-sum[i-1]>m) continue;
			seg::cov(pos,cur,seg::query(i-1,i-1)+h[pos]);
		}
	}
	else
	{
		int cur=pos;
		for(int i=r;i>=pos;i--)
		{
			while(cur>l&&sum[i]-sum[cur-2]<=m) --cur;
			if(sum[i]-sum[cur-1]>m) continue;
			seg::cov(i,i,seg::query(cur-1,pos)+h[pos]);
		}
	}
	solve(pos+1,r);
}
signed main()
{
	read(n,m);
	for(int i=1;i<=n;i++) read(h[i],w[i]);
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+w[i];
	st::bld();
	seg::cov(0,0,0);
	solve(1,n);
	write(seg::query(n,n));
	flush();
}
2024/7/12 17:00
加载中...