Submission #181626


Source Code Expand

#include <stdio.h>
#include <algorithm>
#include <vector>
#include <iostream>

using namespace std;

int n;
int x[60005];
vector<int>pos[120005];
int nxt[60005];
int f[60005];

#define s (1<<17)

int seg[s];
void update(int k,int a){
	k+=s/2-1; seg[k]=a;
	while(k>0){
		k=(k-1)/2;
		seg[k]=max(seg[k*2+1],seg[k*2+2]);
	}
}
int query(int a,int b,int k,int l,int r){
	if(r<a || b<l) return 0;
	if(a<=l && r<=b) return seg[k];
	else{
		int vl=query(a,b,k*2+1,l,(l+r)/2);
		int vr=query(a,b,k*2+2,(l+r)/2+1,r);
		return max(vl,vr);
	}
}
int seg2[s];
void update2(int k,int a){
	k+=s/2-1; seg2[k]=a;
	while(k>0){
		k=(k-1)/2;
		seg2[k]=min(seg2[k*2+1],seg2[k*2+2]);
	}
}
int query2(int a,int b,int k,int l,int r){
	if(r<a || b<l) return 1e9;
	if(a<=l && r<=b) return seg2[k];
	else{
		int vl=query2(a,b,k*2+1,l,(l+r)/2);
		int vr=query2(a,b,k*2+2,(l+r)/2+1,r);
		return min(vl,vr);
	}
}

bool cmp(const int& a,const int& b)
{
	if(nxt[a] != nxt[b]) return nxt[a] < nxt[b];
	return a > b;
}
int main()
{
	scanf("%d",&n);
	if(n > 60000) return 0;

	fill(seg2,seg2+(1<<17),1e9);
	
	for(int i=0;i<n;i++)
	{
		scanf("%d",&x[i]); update(i,x[i]); update2(i,x[i]);
		pos[x[i]-i+60000].push_back(i); f[i] = i;
	}
	fill(nxt,nxt+n,1e9);
	
	for(int i=0;i<=120000;i++)
	{
		if(pos[i].size()<=1) continue;
		
		for(int j=0;j<pos[i].size();j++)
		{
			for(int k=j+1;k<pos[i].size();k++)
			{
				int maxv = query(pos[i][j],pos[i][k],0,0,(1<<16)-1);
				int minv = query2(pos[i][j],pos[i][k],0,0,(1<<16)-1);
				if(maxv == x[pos[i][k]] && minv == x[pos[i][j]])
				{
					nxt[pos[i][j]] = pos[i][k];
					break;
				}
				if(minv != x[pos[i][j]) break;
			}
		}
	}
	sort(f,f+n,cmp);
	pair<int,int> las = make_pair(-1,-1);
	vector<pair<int,int> >res;
	
	for(int i=0;i<n;i++)
	{
		int x = f[i];
		if(nxt[x] == 1e9) break;
		if(las == make_pair(-1,-1))
		{
			res.push_back(make_pair(x,nxt[x]));
			las = make_pair(x,nxt[x]);
		}
		else if(min(nxt[x],las.second)-max(x,las.first) <= 2)
		{
			res.push_back(make_pair(x,nxt[x]));
			las = make_pair(x,nxt[x]);
		}
	}
	
	printf("%d\n",res.size());
	for(int i=0;i<res.size();i++) printf("%d %d\n",++res[i].first,++res[i].second);
}

Submission Info

Submission Time
Task 15 - Empodia
User IH19980412
Language C++ (G++ 4.6.4)
Score 0
Code Size 2263 Byte
Status CE

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:85:27: error: expected ‘]’ before ‘)’ token
./Main.cpp:109:26: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘std::vector<std::pair<int, int> >::size_type {aka long unsigned int}’ [-Wformat]
./Main.cpp:58:16: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
./Main.cpp:65:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]