Task: | Call a Cab |
Sender: | Game of Nolife |
Submission time: | 2015-11-25 21:29:17 +0200 |
Language: | C++ |
Status: | READY |
Result: | WRONG ANSWER |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.06 s | details |
#2 | ACCEPTED | 0.93 s | details |
#3 | WRONG ANSWER | 0.06 s | details |
#4 | ACCEPTED | 0.06 s | details |
#5 | ACCEPTED | 0.05 s | details |
#6 | ACCEPTED | 0.06 s | details |
#7 | ACCEPTED | 0.06 s | details |
#8 | ACCEPTED | 0.09 s | details |
#9 | ACCEPTED | 0.06 s | details |
#10 | ACCEPTED | 1.31 s | details |
#11 | ACCEPTED | 1.55 s | details |
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: WRONG ANSWER
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 |