답안 #1094088

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1094088 2024-09-28T11:56:24 Z alexander707070 Global Warming (CEOI18_glo) C++14
15 / 100
2000 ms 262144 KB
#include<bits/stdc++.h>
#define MAXN 200007
using namespace std;

const int inf=1e9;

struct ST{
	struct node{
		int l,r,val;
	};

	node tree[30*MAXN];
	int num;
	
	void init(){
		num=1;
		tree[num]={0,0,0};
	}

	void addnode(){
		num++;
		tree[num]={0,0,0};
	}

	void check(int v){
		if(tree[v].l==0){
			addnode(); tree[v].l=num;
		}

		if(tree[v].r==0){
			addnode(); tree[v].r=num;
		}
	}

	void update(int v,long long l,long long r,int pos,int val){
		if(l==r){
			tree[v].val=max(tree[v].val,val);
		}else{
			long long tt=(l+r)/2;
			check(v);

			if(pos<=tt)update(tree[v].l,l,tt,pos,val);
			else update(tree[v].r,tt+1,r,pos,val);

			tree[v].val=max(tree[tree[v].l].val,tree[tree[v].r].val);
		}
	}

	int getmax(int v,long long l,long long r,long long ll,long long rr){
		if(ll>rr or v==0)return 0;
		if(l==ll and r==rr){
			return tree[v].val;
		}else{
			long long tt=(l+r)/2;
			return max( getmax(tree[v].l,l,tt,ll,min(tt,rr)) , getmax(tree[v].r,tt+1,r,max(tt+1,ll),rr) );
		}
	}
}seg[3];

int n,a[MAXN],ans,x,b[MAXN];
int dp[MAXN][3];

int solve(int d){
	seg[0].init();
	seg[1].init();
	seg[2].init();

	int res=0;

	for(int i=1;i<=n;i++){
		dp[i][0]=seg[0].getmax(1,0,2*inf,0,a[i]-1)+1;
		dp[i][1]=max(seg[1].getmax(1,0,2*inf,0,a[i]-1)+1 , seg[0].getmax(1,0,2*inf,0,a[i]+d-1)+1);
		dp[i][2]=max(seg[2].getmax(1,0,2*inf,0,a[i]-1)+1 , seg[1].getmax(1,0,2*inf,0,a[i]-d-1)+1);

		seg[0].update(1,0,2*inf,a[i],dp[i][0]);
		seg[1].update(1,0,2*inf,a[i],dp[i][1]);
		seg[2].update(1,0,2*inf,a[i],dp[i][2]);

		res=max(res,max(dp[i][0],max(dp[i][1],dp[i][2])));
	}

	return res;
}

int sol[2000007],pos;

int main(){

	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}

	long long l=-x,r=x,lt,rt;
	while(l+2<r){
		lt=l+(r-l+1)/3;
		rt=r-(r-l+1)/3;
 
		int ls=solve(lt);
		int rs=solve(rt);
 
		if(ls>rs)l=lt;
		else if(rs>ls)r=rt;
		else break;
	}
	
	sort(b+1,b+n+1);
	vector<int> w={0};

	for(int i=1;i<=n;i++){
		for(int f=i+1;f<=n;f++){
			if(b[i]-b[f]+1>=-x and b[i]-b[f]+1<=x){
				w.push_back(b[i]-b[f]+1);
			}else break;
		}

		for(int f=i-1;f>=1;f--){
			if(b[i]-b[f]+1>=-x and b[i]-b[f]+1<=x){
				w.push_back(b[i]-b[f]+1);
			}else break;
		}

		for(int f=i+1;f<=n;f++){
			if(b[i]-b[f]-1>=-x and b[i]-b[f]-1<=x){
				w.push_back(b[i]-b[f]-1);
			}else break;
		}

		for(int f=i-1;f>=1;f--){
			if(b[i]-b[f]-1>=-x and b[i]-b[f]-1<=x){
				w.push_back(b[i]-b[f]-1);
			}else break;
		}
	}

	for(int i=0;i<w.size();i+=max(1,int(w.size())/1000)){
		sol[i]=solve(w[i]);
		if(sol[i]>ans){
			ans=sol[i]; pos=i;
		}
	}

	for(int i=max(0,pos-500);i<=min(int(w.size())-1,pos+500);i++){
		ans=max(ans,solve(w[i]));
	}

	cout<<ans<<"\n";

    return 0;
}

Compilation message

glo.cpp: In function 'int main()':
glo.cpp:141:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |  for(int i=0;i<w.size();i+=max(1,int(w.size())/1000)){
      |              ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 348 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 2 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 2 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 4 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 348 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 2 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 2 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 4 ms 348 KB Output is correct
12 Correct 94 ms 348 KB Output is correct
13 Correct 10 ms 348 KB Output is correct
14 Correct 94 ms 532 KB Output is correct
15 Correct 135 ms 516 KB Output is correct
16 Correct 94 ms 348 KB Output is correct
17 Correct 3 ms 344 KB Output is correct
18 Correct 11 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 348 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 2 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 2 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 4 ms 348 KB Output is correct
12 Correct 94 ms 348 KB Output is correct
13 Correct 10 ms 348 KB Output is correct
14 Correct 94 ms 532 KB Output is correct
15 Correct 135 ms 516 KB Output is correct
16 Correct 94 ms 348 KB Output is correct
17 Correct 3 ms 344 KB Output is correct
18 Correct 11 ms 348 KB Output is correct
19 Correct 1950 ms 2988 KB Output is correct
20 Correct 50 ms 1880 KB Output is correct
21 Correct 6 ms 1884 KB Output is correct
22 Correct 3 ms 1952 KB Output is correct
23 Execution timed out 2094 ms 5048 KB Time limit exceeded
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2045 ms 179024 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2033 ms 52188 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 586 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 348 KB Output is correct
2 Correct 2 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 2 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 2 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 4 ms 348 KB Output is correct
12 Correct 94 ms 348 KB Output is correct
13 Correct 10 ms 348 KB Output is correct
14 Correct 94 ms 532 KB Output is correct
15 Correct 135 ms 516 KB Output is correct
16 Correct 94 ms 348 KB Output is correct
17 Correct 3 ms 344 KB Output is correct
18 Correct 11 ms 348 KB Output is correct
19 Correct 1950 ms 2988 KB Output is correct
20 Correct 50 ms 1880 KB Output is correct
21 Correct 6 ms 1884 KB Output is correct
22 Correct 3 ms 1952 KB Output is correct
23 Execution timed out 2094 ms 5048 KB Time limit exceeded
24 Halted 0 ms 0 KB -