# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
164868 | CaroLinda | 역사적 조사 (JOI14_historical) | C++14 | 2104 ms | 257016 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define lp(i,a,b) for(int i = a ; i < b ; i++ )
#define ff first
#define ss second
#define sz size()
#define ll long long
#define mk make_pair
#define pii pair<int,int>
#define pb push_back
#define debug
#define sq 317
#pragma GCC optmization("O3")
const int MAXN=1e5+10 ;
using namespace std ;
int n , q , qtdB ;
int a[MAXN] , b[MAXN] , ini[MAXN] , fim[MAXN] ;
ll freqTemp[MAXN] , compr[MAXN] ;
ll resp[sq][sq] ,freq[sq][MAXN] ;
map<int,int> mapa ;
int main()
{
scanf("%d%d", &n , &q) ;
lp(i,0,n) scanf("%d", &a[i]) ;
for(int i = 0 , j = 0 , k = 0 ; i < n ; i++ , j++ )
{
if( j == sq )
{
fim[k] = i-1 ;
ini[++k] = i ;
j = 0 ;
}
b[i] = k ;
if( i == n-1 ) fim[k] = n-1 , qtdB = k ;
}
lp(i,0,n) debug("%d " , b[i]) ;
debug("\n") ;
lp(i,0,qtdB+1) debug("%d %d\n" , ini[i] , fim[i]) ;
debug("\n") ;
lp(i,0,n) mapa[ a[i] ] = 0 ;
int Key = 1 ;
for(auto &p : mapa ) p.ss = Key ++ ;
lp(i,0,n) a[i] = mapa[a[i]] ;
for(auto &p : mapa ) compr[p.ss] = 1LL * p.ff ;
for(int i = 0 ; i <= qtdB ; i++ )
for(int j = ini[i] ; j < n ; j++ )
freq[i][ a[j] ] += compr[a[j]] ;
for(int i = 0 ; i <= qtdB ; i++ )
for(int j = i ; j <= qtdB ; j++ )
{
if( j-1 >= 0 )
resp[i][j] = resp[i][j-1] ;
for(int k = ini[j] ; k <= fim[j] ; k++ )
resp[i][j] = max( resp[i][j] , freq[i][ a[k] ] - freq[j+1][ a[k] ] ) ;
}
while(q--)
{
int l , r ;
scanf("%d%d", &l, &r ) ;
l -- , r -- ;
ll ans = 0LL ;
if( b[l] == b[r] || b[l] == b[r]-1 )
{
for(int i = l ; i <= r ; i++ )
freqTemp[a[i]] += compr[a[i]] ;
for(int i = l ; i <= r ; i++ )
{
ans = max(ans , freqTemp[a[i]]) ;
freqTemp[a[i]] = 0LL ;
}
}
else
{
ans = resp[ b[l]+1 ][ b[r]-1 ] ;
vector<int> aux ;
for(int i = l ; i <= fim[b[l]] ; i++ )
{
aux.pb( a[i] ) ;
freqTemp[a[i]] += compr[a[i]] ;
if( freqTemp[a[i]] + freq[b[l]+1][a[i]] - freq[b[r]][a[i]] > ans )
ans = freqTemp[a[i]] + freq[b[l]+1][a[i]] - freq[b[r]][a[i]] ;
}
for(int i = r ; i >= ini[b[r]] ; i-- )
{
aux.pb( a[i] ) ;
freqTemp[a[i]] += compr[a[i]] ;
if( freqTemp[a[i]] + freq[b[l]+1][a[i]] - freq[b[r]][a[i]] > ans )
ans = freqTemp[a[i]] + freq[b[l]+1][a[i]] - freq[b[r]][a[i]] ;
}
for(int i : aux ) freqTemp[i] = 0LL ;
}
printf("%lld\n" , ans ) ;
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |