Plants Watering(ECPC2019)

考虑相邻的两个树的高度

算出相邻两个树高度满足题意的时间区间

最后对每个时间区间取并 如果交集不为0 则取交集最小的 如果交集为0 则不成立

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=1e5+5;
ll a[maxn],g[maxn];
int n;
ll L=0,R=1e9;
ll maxl(ll aa,ll bb){
	if(aa>bb)return aa;
	return bb;
}
ll minl (ll aa,ll bb){
	if(aa>bb)return bb;
	return aa;
}
int main(){
	freopen("plants.in","r",stdin);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>g[i];
	for(int i=1;i<n;i++){
		if(g[i]==g[i+1]){
			if(a[i]<=a[i+1]){
				L=maxl(L,0);
				R=minl(R,1e9);
			}
			else{
				cout<<-1<<endl;
				return 0;
			}
		}
		else if(g[i]<g[i+1]){
			if(a[i]<=a[i+1]){
				L=maxl(L,0);
				R=minl(R,1e9);
			}
			else {
				ll t=(a[i]-a[i+1])/(g[i+1]-g[i]);
				if((a[i]-a[i+1])%(g[i+1]-g[i]))t++;
				L=max(L,t); 
			}
		}else if(g[i]>g[i+1]){
			if(a[i]>a[i+1]){
				cout<<-1<<endl;
				return 0;
			}
			else {
				ll t=(a[i+1]-a[i])/(g[i]-g[i+1]);
				if((a[i+1]-a[i])%(g[i]-g[i+1]))t++;
				R=minl(R,t);
			}
		}
		}
		if(L<=R)cout<<L<<endl;
		else cout<<-1<<endl;
	 
     return 0;
}
posted @ 2022-04-18 09:45  wzx_believer  阅读(38)  评论(0)    收藏  举报