P1545 [USACO04DEC] Dividing the Path G

 

 

 

:::只有偶数坐标才能 符合要求 因为 2*r  全覆盖

:::s+1~e-1 是保证连续性

:::e=s+1 则保留

 

 

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=1e6+10;
const int inf=0x3f3f3f3f;

struct tree{
    int l,r;
    ll minn;
}st[maxn<<2];

int vis[maxn],dp[maxn];
int n,l,a,b;

void build(int k,int l,int r)//
{
    st[k].l=l,st[k].r=r,st[k].minn=inf;
    if(st[k].l==st[k].r) return;
    int mid=st[k].l+st[k].r>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    st[k].minn=min(st[k<<1].minn,st[k<<1|1].minn);
}

void change(int k,int pos,int val)
{
    if(st[k].l>pos||st[k].r<pos) return;
    if(st[k].l==st[k].r&&st[k].l==pos)
    {
        st[k].minn=val;
        return;
    }
    int mid=st[k].l+st[k].r>>1;
    change(k<<1,pos,val);
    change(k<<1|1,pos,val);
    st[k].minn=min(st[k<<1].minn,st[k<<1|1].minn);
} 
ll query(int k,int x,int y)
{
    if(st[k].l>y||st[k].r<x) return inf;
    if(x<=st[k].l&&st[k].r<=y) return st[k].minn;
    int mid=st[k].l+st[k].r>>1; ll res=inf;
    if(x<=mid) res=min(res,query(k<<1,x,y));
    if(mid<=y) res=min(res,query(k<<1|1,x,y));
    return res;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    //memset(dp,inf,sizeof(dp));
    
    cin>>n>>l>>a>>b;
    for(int i=1;i<=n;i++){
        int s,e; cin>>s>>e;
        for(int j=s+1;j<=e-1;j++) vis[j]=1;
    }
    build(1,0,l);
    change(1,0,0);////!!!!!!!!!!!! 数据结构只是 辅助结构 dp[]问题 st 辅助 
    
    for(int i=2*a;i<=l;i+=2)//因为固定长度 a~b 
    {
        if(vis[i]) continue;
        int x=max(0,i-2*b),y=i-2*a;
        dp[i]=query(1,x,y)+1;
        //cout<<x<<" "<<y<<" "<<dp[i]<<endl;
        
        change(1,i,dp[i]);
    }
//    cout<<dp[l]<<endl;
    if(dp[l]>=inf) dp[l]=-1;
    cout<<dp[l]<<'\n';
    
    return 0;
}
View Code

 

 
posted @ 2023-08-10 14:29  JMXZ  阅读(23)  评论(0)    收藏  举报