Submission #76724


Source Code Expand

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
#define REP(i,m) for(int i=0;i<m;++i)
#define REPN(i,m,in) for(int i=in;i<m;++i)
#define ALL(t) (t).begin(),(t).end()
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
#define dump(x)  cerr << #x << " = " << (x) << endl
#define prl cerr<<"called:"<< __LINE__<<endl
using namespace std;
static const int INF =500000000; 
template<class T> void debug(T a,T b){ for(;a!=b;++a) cerr<<*a<<' ';cerr<<endl;}
typedef long long int lint;
typedef pair<int,int> pi;
int n;
int a[1100005];
pi res[1100005];
bool judge(const pi& a){
	return a.fr==-1;
}
struct RMQ{
	int mini[18][60005],maxi[18][60005];
	int loga[60005],powe[60005];
	void init(){
		REP(i,n) mini[0][i]=maxi[0][i]=a[i];
		REP(i,17) REP(j,n){
			if(j+(1<<i)>=n){
				mini[i+1][j]=mini[i][j];
				maxi[i+1][j]=maxi[i][j];
			}else{
				mini[i+1][j]=min(mini[i][j],mini[i][j+(1<<i)]);
				maxi[i+1][j]=max(maxi[i][j],maxi[i][j+(1<<i)]);
			}
		}
		REP(i,60005){
			loga[i]=0;
			while((1<<loga[i])*2<=i) ++loga[i];
			powe[i]=(1<<loga[i]);
		}
	}
	int query_min(int a,int b){//[a,b)
		int len=b-a;
		return min(mini[loga[len]][a],mini[loga[len]][b-powe[len]]);
	}
	int query_max(int a,int b){
		int len=b-a;
		return max(maxi[loga[len]][a],maxi[loga[len]][b-powe[len]]);
	}
};
RMQ rmq;
int rev[1100005];

int main(){
	scanf("%d",&n);
	REP(i,n) scanf("%d",&a[i]),rev[a[i]]=i;
	int m=0;
	if(n<=3000){

		REP(i,n) {
			int mini=a[i],maxi=a[i];
			REPN(j,n,i){
				mini=min(mini,a[j]);
				maxi=max(maxi,a[j]);
				if(i!=j && maxi==a[j] && mini==a[i] && maxi-mini==j-i){
					res[m++]=mp(i,j);
					break;
				}
				if(mini<a[i]) break;
			}
		}
	}else{
		rmq.init();
		REP(i,n) {
			int mini=a[i],maxi=a[i];
			int j=i+1;
			while(j<n){
				mini=rmq.query_min(i,j+1);
				maxi=rmq.query_max(i,j+1);
				if(mini<a[i]) break;
				if(maxi==a[j] && maxi-mini==j-i){
					res[m++]=mp(i,j);
					break;
				}
				if(maxi+1>=n) break;
				j=rev[maxi+1];
			}
		}
	}
	reverse(res,res+m);
	int mini=INF;
	REP(i,m){
		if(mini<=res[i].sc) res[i]=mp(-1,-1);
		else mini=min(mini,res[i].sc);
	}
	reverse(res,res+m);
	m=remove_if(res,res+m,judge)-res;


	printf("%d\n",m);
	REP(i,m) printf("%d %d\n",res[i].fr+1,res[i].sc+1);

	return 0;
}


Submission Info

Submission Time
Task 15 - Empodia
User hogloid
Language C++ (G++ 4.6.4)
Score 95
Code Size 2403 Byte
Status TLE
Exec Time 1111 ms
Memory 26352 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:59:16: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
./Main.cpp:60:40: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]

Judge Result

Set Name Set01 Set02 Set03 Set04 Set05 Set06 Set07 Set08 Set09 Set10 Set11 Set12 Set13 Set14 Set15 Set16 Set17 Set18 Set19 Set20
Score / Max Score 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 5 / 5 0 / 5
Status
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
AC × 1
TLE × 1
Set Name Test Cases
Set01 01
Set02 02
Set03 03
Set04 04
Set05 05
Set06 06
Set07 07
Set08 08
Set09 09
Set10 10
Set11 11
Set12 12
Set13 13
Set14 14
Set15 15
Set16 16
Set17 17
Set18 18
Set19 19
Set20 20
Case Name Status Exec Time Memory
01 AC 237 ms 9452 KB
02 AC 41 ms 9488 KB
03 AC 41 ms 9484 KB
04 AC 37 ms 9480 KB
05 AC 37 ms 9456 KB
06 AC 37 ms 9452 KB
07 AC 40 ms 9464 KB
08 AC 40 ms 9492 KB
09 AC 40 ms 9460 KB
10 AC 39 ms 9460 KB
11 AC 66 ms 17540 KB
12 AC 69 ms 17520 KB
13 AC 67 ms 17540 KB
14 AC 68 ms 17548 KB
15 AC 74 ms 17540 KB
16 AC 71 ms 17544 KB
17 AC 67 ms 17552 KB
18 AC 66 ms 15236 KB
19 AC 67 ms 16860 KB
20 TLE 1111 ms 26352 KB