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; }

浙公网安备 33010602011771号