zoukankan      html  css  js  c++  java
  • ABC 158 F

    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;
    }
    
  • 相关阅读:
    ZOJ
    FZU
    FZU 2231 平行四边形数
    [转载] java的动态代理机制详解
    [转载] 解读ClassLoader
    [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib
    MyBatis入门
    Spring入门
    Nginx入门
    Redis入门
  • 原文地址:https://www.cnblogs.com/chdy/p/12687218.html
Copyright © 2011-2022 走看看