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
2013-03-30 19:45:16+0900
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
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