BZOJ 4723: [POI2017]Flappy Bird
Description
从一个点到一条直线,每次纵坐标只能增加或减少1,有些位置有障碍,求最少增加步数.
Sol
贪心.
或许是贪心吧...反正在可到达的范围内,纵坐标尽量小...
做的时候维护一下两个端点,因为在这个区间内操作数单调递增,只需要取最下面的点就好.
Code
/************************************************************** Problem: 4723 User: BeiYu Language: C++ Result: Accepted Time:1884 ms Memory:1284 kb ****************************************************************/ #include <cstdio> #include <iostream> using namespace std; #define debug(a) cout<<#a<<"="<<a<<" " int n,m,ans; int X,L,R; int main(){ // freopen("in.in","r",stdin); ios::sync_with_stdio(false); cin>>n>>m; X=L=R=0; for(int i=1;i<=n;i++){ int x,l,r,t; cin>>x>>l>>r; l++,r--; t=(x-X); l=max(l,L-t); r=min(r,R+t); if((l-L+t)&1) l++; if((r-R+t)&1) r--; if(L<l-t) ans+=(l-t-L)>>1,L=l-t; if(R>r+t) R=r+t; if(L>R) return puts("NIE"),0; ans+=(l-L+t)>>1; // cout<<"-----------------"<<i<<"-------------------"<<endl; // debug(X),debug(L),debug(R)<<endl; // debug(x),debug(l),debug(r)<<endl; // debug(t),debug(((l-L+t)>>1))<<endl; L=l; R=r; X=x; if(L>R) return puts("NIE"),0; } cout<<ans<<endl; return 0; }