# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
996770 |
2024-06-11T07:41:57 Z |
lollipop |
Zoltan (COCI16_zoltan) |
C++17 |
|
296 ms |
34648 KB |
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define s second
#define f first
#define pf push_front
#define inf 100000000000000000
#define bitebi __builtin_popcountll
#define FOR( i , n ) for( int i = 0 ; i < n ; i ++ )
#define FOR( j , n ) for( int j = 0 ; j < n ; j ++ )
#define FOR( k , n ) for( int k = 0 ; k < n ; k ++ )
using namespace std ;
const int mod = 1000000007 ;
const int mod1 = 998244353 ;
const int N = 2e5 + 10 ;
map < int , int > ma , ma1 ;
//struct stu{
// int num ;
// int cnt ;
//};
#define stu pair < int , int >
#define num first
#define cnt second
stu node[ 4 * N ] ;
stu merge( stu a , stu b ){
stu c ;
c.cnt = 0 ;
c.num = max( a.num , b.num ) ;
long long bb ;
if( a.num == c.num ) bb += a.cnt ;
if( b.num == c.num ) bb += b.cnt ;
bb %= mod ;
c.cnt %= bb ;
return c ;
}
void update( int v , int vl , int vr , int pos , int numb , int cc ){
if( vl == vr ){
long long nw = node[ v ].cnt ;
if( node[ v ].num == numb ) nw += cc ;
else
nw = cc ;
nw %= mod ;
node[ v ].cnt = nw ;
node[ v ].num = numb ;
return ;
}
int vm = ( vl + vr ) / 2 ;
if( vm < pos ) update( v + v + 1 , vm + 1 , vr , pos , numb , cc ) ;
else update( v + v , vl , vm , pos , numb , cc ) ;
node[ v ] = merge( node[ v + v ] , node[ v + v + 1 ] ) ;
}
stu get( int v , int vl , int vr , int l , int r ){
if( l > r ) return { 0 , 0 } ;
if( vl == l && vr == r ){
return node[ v ] ;
}
int vm = ( vl + vr ) / 2 ;
return merge( get( v + v , vl , vm , l , min( r , vm ) )
, get( v + v + 1 , vm + 1 , vr , max( l , vm + 1 ) , r ) ) ;
}
stu node1[ 4 * N ] ;
// second seg tree
void update1( int v , int vl , int vr , int pos , int numb , int cc ){
if( vl == vr ){
long long nw = node1[ v ].cnt ;
if( node1[ v ].num == numb ) nw += cc ;
else
nw = cc ;
nw %= mod ;
node1[ v ].cnt = nw ;
node1[ v ].num = numb ;
return ;
}
int vm = ( vl + vr ) / 2 ;
if( vm < pos ) update1( v + v + 1 , vm + 1 , vr , pos , numb , cc) ;
else update1( v + v , vl , vm , pos , numb , cc ) ;
node1[ v ] = merge( node1[ v + v ] , node1[ v + v + 1 ] ) ;
}
stu get1( int v , int vl , int vr , int l , int r ){
if( l > r ) return { 0 , 0 } ;
if( vl == l && vr == r ){
return node1[ v ] ;
}
int vm = ( vl + vr ) / 2 ;
return merge( get1( v + v , vl , vm , l , min( r , vm ) )
, get1( v + v + 1 , vm + 1 , vr , max( l , vm + 1 ) , r ) ) ;
}
int ans[ 200005 ] ;
int xar[ 200005 ] ;
set < int > s ;
vector < int > v( N );
signed main(){
ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL);
int n ;
cin >> n ;
int st = 1 ;
FOR( i , n ){
cin >> v[ i ] ;
s.insert( v[ i ] ) ;
}
while( s.size() > 0 ){
int x = *s.begin() ;
ma[ x ] = st ;
st ++ ;
s.erase( s.begin() ) ;
}
st -- ;
int mx = 0 ;
xar[ 0 ] = 1 ;
for( int j = 1 ; j <= n ; j ++ ) xar[ j ] = xar[ j - 1 ] * 2LL % mod ;
FOR( i , n ) v[ i ] = ma[ v[ i ] ] ;
for( int j = n - 1 ; j >= 0 ; j -- ){
int x = v[ j ] ;
stu M , L ;
M = get( 1 , 1 , st , x + 1 , st ) ;
L = get1( 1 , 1 , st , 1 , x - 1 ) ;
int mxx = M.num + L.num + 1 ;
mx = max( mx , mxx ) ;
if( M.cnt == 0 ) M.cnt = 1 ;
if( L.cnt == 0 ) L.cnt = 1 ;
update( 1 , 1 , st , x , M.num + 1 , M.cnt ) ;
update1( 1 , 1 , st , x , L.num + 1 , L.cnt ) ;
long long aaa = M.cnt ;
long long xx = L.cnt ;
aaa = aaa * xx ;
long long kk = xar[ n - mx ] ;
aaa %= mod ; aaa = aaa * kk ;
aaa = aaa + ans[ mxx ] ;
aaa %= mod ;
ans[ mxx ] = aaa ;
}
long long aaa = ans[ mx ] ;
cout << mx << " " << aaa ;
}
Compilation message
zoltan.cpp:10: warning: "FOR" redefined
10 | #define FOR( j , n ) for( int j = 0 ; j < n ; j ++ )
|
zoltan.cpp:9: note: this is the location of the previous definition
9 | #define FOR( i , n ) for( int i = 0 ; i < n ; i ++ )
|
zoltan.cpp:11: warning: "FOR" redefined
11 | #define FOR( k , n ) for( int k = 0 ; k < n ; k ++ )
|
zoltan.cpp:10: note: this is the location of the previous definition
10 | #define FOR( j , n ) for( int j = 0 ; j < n ; j ++ )
|
zoltan.cpp: In function 'void update(long long int, long long int, long long int, long long int, long long int, long long int)':
zoltan.cpp:41:4: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
41 | else
| ^~~~
zoltan.cpp:43:4: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
43 | nw %= mod ;
| ^~
zoltan.cpp: In function 'void update1(long long int, long long int, long long int, long long int, long long int, long long int)':
zoltan.cpp:69:4: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
69 | else
| ^~~~
zoltan.cpp:71:4: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
71 | nw %= mod ;
| ^~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
1880 KB |
Output isn't correct |
2 |
Incorrect |
1 ms |
1884 KB |
Output isn't correct |
3 |
Incorrect |
1 ms |
1884 KB |
Output isn't correct |
4 |
Correct |
1 ms |
1884 KB |
Output is correct |
5 |
Correct |
1 ms |
1884 KB |
Output is correct |
6 |
Correct |
1 ms |
1884 KB |
Output is correct |
7 |
Incorrect |
1 ms |
2140 KB |
Output isn't correct |
8 |
Incorrect |
1 ms |
2140 KB |
Output isn't correct |
9 |
Incorrect |
2 ms |
2140 KB |
Output isn't correct |
10 |
Incorrect |
2 ms |
2136 KB |
Output isn't correct |
11 |
Incorrect |
178 ms |
31076 KB |
Output isn't correct |
12 |
Incorrect |
180 ms |
29720 KB |
Output isn't correct |
13 |
Incorrect |
138 ms |
20984 KB |
Output isn't correct |
14 |
Incorrect |
201 ms |
30548 KB |
Output isn't correct |
15 |
Runtime error |
275 ms |
32852 KB |
Memory limit exceeded |
16 |
Runtime error |
296 ms |
34648 KB |
Memory limit exceeded |
17 |
Runtime error |
205 ms |
33416 KB |
Memory limit exceeded |
18 |
Runtime error |
217 ms |
33360 KB |
Memory limit exceeded |
19 |
Runtime error |
185 ms |
33360 KB |
Memory limit exceeded |
20 |
Runtime error |
191 ms |
33360 KB |
Memory limit exceeded |