6.动态规划

动态规划

\(A\) CF510D Fox And Jumping

\(B\) CF459E Pashmak and Graph

\(C\) CF809C Find a car

\(D\) luogu P4099 [HEOI2013] SAO

\(E\) CF559E Gerald and Path

\(F\) luogu P4516 [JSOI2018] 潜入行动

\(G\) HDU6566 The Hanged Man

\(H\) UOJ 211. 【UER #6】逃跑

\(I\) CF613E Puzzle Lover

\(J\) [ABC201F] Insertion Sort

动态规划2

开题顺序: \(GFACBE\)

\(A\) BZOJ3329 Xorequ

\(B\) luogu P1912 [NOI2009] 诗人小G

\(C\) luogu P2254 [NOI2005] 瑰丽华尔兹

\(D\) CF809C Find a car

\(E\) CF161D Distance in Tree

\(F\) CF486D Valid Sets

  • 观察到 \(n,d \le 2000\) ,考虑钦定每个最大点是哪个点。

  • 但这样又会出现一个问题,当最大点不唯一时就会重复统计,那就同时钦定点的编号最大即可。

    点击查看代码
    struct node
    {
        ll nxt,to;
    }e[4001];
    ll head[4001],a[4001],f[4001],cnt=0;
    void add(ll u,ll v)
    {
        cnt++;
        e[cnt].nxt=head[u];
        e[cnt].to=v;
        head[u]=cnt;
    }
    void dfs(ll x,ll fa,ll rt,ll d)
    {
        f[x]=1;
        for(ll i=head[x];i!=0;i=e[i].nxt)
        {
            if(e[i].to!=fa)
            {
                if(a[rt]-a[e[i].to]<=d&&(a[rt]>a[e[i].to]||(a[rt]==a[e[i].to]&&e[i].to<rt)))
                {
                    dfs(e[i].to,x,rt,d);
                    f[x]=(f[x]+f[x]*f[e[i].to]%1000000007)%1000000007;
                }
            }
        }
    }
    int main()
    {
        ll d,n,i,u,v,ans=0;
        cin>>d>>n;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(i=1;i<=n-1;i++)
        {
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        for(i=1;i<=n;i++)
        {
            dfs(i,0,i,d);
            ans=(ans+f[i])%1000000007;
        }
        cout<<ans<<endl;
        return 0;
    }
    

\(G\) SP7739 BOI7SOU - Sound

  • 多倍经验: luogu P4392 [BOI2007] Sound 静音问题

  • 固定长度的 \(RMQ\) 板子。

    点击查看代码
    int a[5000000];
    struct SegmentTree
    {
        int l,r,maxx=0,minn=0x7f7f7f7f;
    }tree[5000000];
    int lson(int x)
    {
        return 2*x;
    }
    int rson(int x)
    {
        return 2*x+1;
    }
    void pushup(int rt)
    {
        tree[rt].maxx=max(tree[lson(rt)].maxx,tree[rson(rt)].maxx);
        tree[rt].minn=min(tree[lson(rt)].minn,tree[rson(rt)].minn);
    }
    void build(int rt,int l,int r)
    {
        tree[rt].l=l;
        tree[rt].r=r;
        if(l==r)
        {
            tree[rt].maxx=tree[rt].minn=a[l];
            return;
        }
        int mid=(l+r)/2;
        build(lson(rt),l,mid);
        build(rson(rt),mid+1,r);
        pushup(rt);
    }
    int querymax(int rt,int l,int r)
    {
        if(l<=tree[rt].l&&tree[rt].r<=r)
        {
            return tree[rt].maxx;
        }
        int mid=(tree[rt].l+tree[rt].r)/2,maxx=0;
        if(l<=mid)
        {
            maxx=max(maxx,querymax(lson(rt),l,r));
        }
        if(r>mid)
        {
            maxx=max(maxx,querymax(rson(rt),l,r));
        }
        return maxx;
    }
    int querymin(int rt,int l,int r)
    {
        if(l<=tree[rt].l&&tree[rt].r<=r)
        {
            return tree[rt].minn;
        }
        int mid=(tree[rt].l+tree[rt].r)/2,minn=0x7f7f7f7f;
        if(l<=mid)
        {
            minn=min(minn,querymin(lson(rt),l,r));
        }
        if(r>mid)
        {
            minn=min(minn,querymin(rson(rt),l,r));
        }
        return minn;
    }
    int main()
    {
        int n,m,c,i,flag=0;
        cin>>n>>m>>c;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        build(1,1,n);
        for(i=1;i+m-1<=n;i++)
        {
            if(querymax(1,i,i+m-1)-querymin(1,i,i+m-1)<=c)
            {
                flag=1;
                cout<<i<<endl;
            }
        }
        if(flag==0)
        {
            cout<<"NONE"<<endl;
        }
        return 0;
    }
    
posted @ 2024-10-30 11:46  hzoi_Shadow  阅读(281)  评论(1)    收藏  举报
扩大
缩小