Submission details
Task:Call a Cab
Sender:Game of Nolife
Submission time:2015-11-25 21:29:17 +0200
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.06 sdetails
#2ACCEPTED0.93 sdetails
#30.06 sdetails
#4ACCEPTED0.06 sdetails
#5ACCEPTED0.05 sdetails
#6ACCEPTED0.06 sdetails
#7ACCEPTED0.06 sdetails
#8ACCEPTED0.09 sdetails
#9ACCEPTED0.06 sdetails
#10ACCEPTED1.31 sdetails
#11ACCEPTED1.55 sdetails

Code

#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef long double ld;

ll dm[222];
ll hr[222];

ll d[101010];
ll h[101010];

const int mlg=19;

ll miq[100101][19];
ll maq[101010][19];
int lg[101010];

const ll inf=1e18;

ll getmin(int a, int b){
	int le=b-a+1;
	return min(miq[a][lg[le]], miq[b-(1<<lg[le])+1][lg[le]]);
}

ll getmax(int a, int b){
	int le=b-a+1;
	return max(maq[a][lg[le]], maq[b-(1<<lg[le])+1][lg[le]]);
}

const int N=1<<17;
int st[2*N];
void setmin(int a, int b, int v){
	a+=N;
	b+=N;
	while (a<=b){
		if (a%2){
			st[a]=min(st[a], v);
			a++;
		}
		if (!(b%2)){
			st[b]=min(st[b], v);
			b--;
		}
		a/=2;
		b/=2;
	}
}

const int inf2=1e9;

int getmin2(int i){
	int mi=inf2;
	for (i+=N;i;i/=2){
		mi=min(mi, st[i]);
	}
	return mi;
}

int dp[2*N];

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t,n;
	cin>>t>>n;
	for (int i=0;i<t;i++){
		cin>>dm[i]>>hr[i];
	}
	for (int i=1;i<n;i++){
		cin>>d[i]>>h[i];
		d[i]+=d[i-1];
		h[i]+=h[i-1];
		//cout<<h[i]<<endl;
	}
	for (int i=1;i<=n+10;i++){
		while ((1<<lg[i])*2<i) lg[i]++;
	}
	for (int k=0;k<mlg;k++){
		for (int i=0;i<n;i++){
			if (k==0){
				miq[i][k]=h[i];
				maq[i][k]=h[i];
			}
			else{
				miq[i][k]=miq[i][k-1];
				maq[i][k]=maq[i][k-1];
				if (i+(1<<(k-1))<n){
					miq[i][k]=min(miq[i][k], miq[i+(1<<(k-1))][k-1]);
					maq[i][k]=max(maq[i][k], maq[i+(1<<(k-1))][k-1]);
				}
			}
		}
	}
	for (int i=0;i<2*N;i++){
		st[i]=inf2;
	}
	setmin(0, 0, 0);
	for (int i=0;i<n-1;i++){
		dp[i]=getmin2(i);
		//cout<<i<<" "<<dp[i]<<endl;
		for (int j=0;j<t;j++){
			int mi=i+1;
			int ma=n-1;
			int v=n+1;
			while (mi<=ma){
				int mid=(mi+ma)/2;
				if (d[mid]-d[i]>=dm[j]){
					v=min(v, mid);
					ma=mid-1;
				}
				else{
					mi=mid+1;
				}
			}
			//cout<<j<<" v "<<v<<" "<<d[2]-d[1]<<" "<<dm[j]<<endl;
			if (v>n-1) continue;
			mi=v;
			ma=n-1;
			int v2=0;
			while (mi<=ma){
				int mid=(mi+ma)/2;
				ll mah=getmax(i+1, mid);
				ll mih=getmin(i+1, mid);
				if (mah-mih<hr[j]||mid==i+1){
					v2=max(v2, mid);
					mi=mid+1;
				}
				else{
					ma=mid-1;
				}
			}
			//cout<<j<<" "<<v<<" "<<v2<<endl;
			if (v2>i&&v<=v2){
				setmin(v, v2, dp[i]+1);
			}
		}
	}
	dp[n-1]=getmin2(n-1);
	if (dp[n-1]<inf2){
		cout<<dp[n-1]<<endl;
	}
	else{
		cout<<"IMPOSSIBLE"<<endl;
	}
}

Test details

Test 1

Verdict: ACCEPTED

input
100 400
791 14000
114 90000
315 24000
263 64000
...

correct output
38

user output
38

Test 2

Verdict: ACCEPTED

input
200 20000
8054 12000
5906 25000
694 10000
6154 33000
...

correct output
10

user output
10

Test 3

Verdict:

input
5 19999
29 310000
30 27000
15 24000
47 29000
...

correct output
329

user output
358

Test 4

Verdict: ACCEPTED

input
20 990
9 48000
12 12000
50 47000
32 43000
...

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 5

Verdict: ACCEPTED

input
2 7
4 6000
35 150000
2 2000
2 2000
...

correct output
2

user output
2

Test 6

Verdict: ACCEPTED

input
1 2
1000 359000
999 170000

correct output
IMPOSSIBLE

user output
IMPOSSIBLE

Test 7

Verdict: ACCEPTED

input
2 19225
4 6000
35 150000
2 2000
2 2000
...

correct output
7209

user output
7209

Test 8

Verdict: ACCEPTED

input
20 19994
64104 18485
76684 42914
9274 32600
62514 5429
...

correct output
7436

user output
7436

Test 9

Verdict: ACCEPTED

input
4 19991
44888 26641
8529 28990
32092 26053
3517 46793
...

correct output
6510

user output
6510

Test 10

Verdict: ACCEPTED

input
200 49982
53794 19371
61913 14454
27602 37952
95478 10677
...

correct output
15082

user output
15082

Test 11

Verdict: ACCEPTED

input
200 50000
11051 7334
85759 12058
95157 12080
87226 41381
...

correct output
49999

user output
49999