ABC 158 F - Removing Robots dp 单调栈

LINK:Removing Robots

没想到 自闭。

考虑了一个容斥 发现不合法方案难以计算。

就算可以计算也几乎是n^2的做法。

考虑dp 左边会对右边产生影响 所以考虑先dp右边的再考虑左边的。

至于dp 自然是f[i]表示这个i~n这么多点的方案数。

设 i向右第一个影响不到的点为w 那么 有转移 f[i]+=f[i+1]+f[w].

这样从左到右dp就可以算出所有的方案了。

const ll MAXN=200010;
ll n,ans,top;
ll f[MAXN],g[MAXN],s[MAXN];
struct wy
{
	ll x,y;
	inline ll friend operator <(wy a,wy b){return a.x<b.x;}
}t[MAXN];
int main()
{
	freopen("1.in","r",stdin);
	get(n);
	rep(1,n,i)
	{
		ll get(x);ll get(y);
		t[i]=(wy){x,x+y-1};
	}
	sort(t+1,t+1+n);
	g[n+1]=1;
	fep(n,1,i)
	{
		f[i]=i;
		while(top&&t[i].y>=t[s[top]].x)
		{
			f[i]=max(f[i],f[s[top]]);
			--top;
		}
		s[++top]=i;
		g[i]=(g[i+1]+g[f[i]+1])%mod;
	}
	putl(g[1]);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/chdy/p/12687218.html