답안 #1031847

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1031847 2024-07-23T08:02:24 Z kym Shortcut (IOI16_shortcut) C++14
0 / 100
1 ms 456 KB
#ifndef LOCAL
#include "shortcut.h"
#endif
#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int maxn=3005;
int X[maxn];
vector<int32_t> L, D;
int C;
int n;
const int oo = 1'000'000'000'000'000'000ll;
typedef pair<int,int>pi;
int c1[maxn],c2[maxn];
struct node{
	int tree[4*maxn];
	void update(int node, int s, int e, int x, int nval){
		if(s==e){
			tree[node]=nval;
			return;
		}
		int m=(s+e)/2;
		if(x<=m)update(node<<1,s,m,x,nval);
		else update(node<<1|1,m+1,e,x,nval);
		tree[node]=max(tree[node<<1],tree[node<<1|1]);
	}
	int query(int node, int s, int e, int x, int y){
		if(s==x&&e==y)return tree[node];
		int m=(s+e)/2;
		if(x>m)return query(node<<1|1,m+1,e,x,y);
		else if(y<=m)return query(node<<1,s,m,x,y);
		else return max(query(node<<1,s,m,x,m),query(node<<1|1,m+1,e,m+1,y));
	}
} seg1,seg2;
int get(int L, int R){
	int dl=0,dr=0;
	for(int i=0;i<=L;i++)dl=max(dl,-X[i]+D[i]);
	for(int i=R;i<n;i++)dr=max(dr,X[i]+D[i]);
	int ans=0;
	ans=max(ans,dl+dr+min(X[R]-X[L],C)+X[L]-X[R]);
 
	int m1=0;
	for(int i=L+1;i<=R;i++){
		m1=max(m1,D[i] + min(X[i]-X[L], X[R]-X[i]+C));
	}
	ans=max(ans,m1 + dl+X[L]);
	int m2=0;
	for(int i=L;i<R;i++){
		m2=max(m2,D[i] + min(X[R]-X[i], X[i]-X[L]+C));
	}
	ans=max(ans,m2+dr-X[R]);
	int bet=0;
	int idx=L;
	
	for(int i=L;i<=R;i++){
		c1[i]=-X[i]+D[i];
		c2[i]=X[i]+D[i];
		seg1.update(1,0,n,i,c1[i]);
		seg2.update(1,0,n,i,c2[i]);
	}
	for(int i=L+1;i<=R;i++){
		int lo = L-1, hi=i;
		while(lo<hi-1){
			int mi=(lo+hi)/2;
			int c1= D[i] + D[mi] + X[i] - X[mi]; // walk
			int c2 = D[i] + D[mi] + C + X[mi] - X[L] + X[R] - X[i]; // teleport
			if(c2<=c1){
				lo=mi;
			} else{
				hi=mi;
			}
		}
		//[lo,i] teleport
		//[lo+1,i] walk
		if(L<=lo){
			int wst=seg2.query(1,0,n,L,lo);
			bet=max(bet,D[i] - X[i] - X[L] + X[R]);
			
		}
		if(lo+1<=i){
			int wst=seg1.query(1,0,n,lo+1,i);
			bet=max(bet,D[i] + X[i] + wst);
		}
	}
	ans=max(ans,bet);
	
	for(int i=L;i<=R;i++){
		for(int j=i+1;j<=R;j++){
			bet=max(bet,D[i]+D[j]+min(X[j]-X[i],C+X[i]-X[L]+X[R]-X[j]));
		}
	}
	ans=max(ans,bet);
	
 
	vector<pi> vm1,vm2;
	for(int i=0;i<=L;i++){
		vm1.push_back({X[i]+D[i],i});
		vm2.push_back({-X[i]+D[i],i});
 
 
	}
	sort(vm1.begin(),vm1.end(),greater<pi>());
	sort(vm2.begin(),vm2.end(),greater<pi>());
	for(int i=0;i<=min(1ll,(int)vm1.size()-1);i++){
		for(int j=0;j<=min(1ll,(int)vm2.size()-1);j++){
			if(vm1[i].second != vm2[j].second){
				ans=max(ans,vm1[i].first+vm2[j].first);
			}
		}
	}
 
	vm1.clear();
	vm2.clear();
	for(int i=R;i<n;i++){
		vm1.push_back({X[i]+D[i],i});
		vm2.push_back({-X[i]+D[i],i});
 
 
	}
	sort(vm1.begin(),vm1.end(),greater<pi>());
	sort(vm2.begin(),vm2.end(),greater<pi>());
	for(int i=0;i<=min(1ll,(int)vm1.size()-1);i++){
		for(int j=0;j<=min(1ll,(int)vm2.size()-1);j++){
			if(vm1[i].second != vm2[j].second){
				ans=max(ans,vm1[i].first+vm2[j].first);
			}
		}
	}
	return ans;
}
long long find_shortcut(int32_t n, vector<int32_t> l, vector<int32_t> d, int32_t c)
{
	L=l;D=d;C=c;
	::n=n;
	for(int i=1;i<n;i++){
		X[i]=X[i-1]+l[i-1];
	}  
	int ans=oo;
	for(int i=0;i<n;i++){
		vector<int> vec;
		for(int j=i+1;j<n;j++){
			int res=get(i,j);
			vec.push_back(res);
			ans=min(ans,res);
		}
 
		int stage=0;
		for(int k=0;k<(int)vec.size()-1;k++){
			
			if(vec[k] == vec[k+1])continue;
			if(vec[k] > vec[k+1]){
				assert(stage==0);
			} else{
				stage=1;
			}
		}
	}
 
	return ans;
}
#ifdef LOCAL

int32_t main()
{
    int32_t n, c;
    assert(2 == scanf("%d%d", &n, &c));
    
    std::vector<int32_t> l(n - 1);
    std::vector<int32_t> d(n);
    for (int i = 0; i < n - 1; i++)
        assert(1 == scanf("%d", &l[i]));
    for (int i = 0; i < n; i++)
        assert(1 == scanf("%d", &d[i]));
        
    long long t = find_shortcut(n, l, d, c);
    
    
    printf("%lld\n", t);
    
    return 0;
}

#endif

Compilation message

shortcut.cpp: In function 'long long int get(long long int, long long int)':
shortcut.cpp:76:8: warning: unused variable 'wst' [-Wunused-variable]
   76 |    int wst=seg2.query(1,0,n,L,lo);
      |        ^~~
shortcut.cpp:53:6: warning: unused variable 'idx' [-Wunused-variable]
   53 |  int idx=L;
      |      ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB n = 4, 80 is a correct answer
2 Correct 0 ms 348 KB n = 9, 110 is a correct answer
3 Correct 0 ms 348 KB n = 4, 21 is a correct answer
4 Correct 0 ms 348 KB n = 3, 4 is a correct answer
5 Correct 0 ms 456 KB n = 2, 62 is a correct answer
6 Correct 0 ms 348 KB n = 2, 3 is a correct answer
7 Correct 0 ms 452 KB n = 3, 29 is a correct answer
8 Correct 0 ms 348 KB n = 2, 3 is a correct answer
9 Correct 0 ms 348 KB n = 2, 3 is a correct answer
10 Correct 0 ms 348 KB n = 2, 2000000001 is a correct answer
11 Correct 0 ms 348 KB n = 2, 3000000000 is a correct answer
12 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
13 Correct 0 ms 348 KB n = 3, 3000000000 is a correct answer
14 Correct 0 ms 348 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 352 KB n = 4, 4000000000 is a correct answer
16 Correct 0 ms 348 KB n = 5, 4000000000 is a correct answer
17 Incorrect 0 ms 348 KB n = 10, incorrect answer: jury 1000000343 vs contestant 1000000358
18 Halted 0 ms 0 KB -