답안 #202503

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
202503 2020-02-16T15:03:26 Z Kalam Nekameleoni (COCI15_nekameleoni) C++11
140 / 140
1461 ms 108808 KB
// KALAM
# include<bits/stdc++.h>
# define lc (id << 1)
# define rc (lc ^ 1)
# define md ((l + r) >> 1)
using namespace std;

const int N = 100000 + 77 , K = 52;
int n , k , q , a[N] , P[K];
int L[N << 2][K] , R[N << 2][K] , dp[N << 2];

inline void Merge(int id) {
   for(int i = 1;i <= k;++ i)
      L[id][i] = min(L[lc][i] , L[rc][i]) , R[id][i] = max(R[lc][i] , R[rc][i]);
   dp[id] = min(dp[lc] , dp[rc]);
   for(int i = 1;i <= k;++ i)
      if(L[id][i] < 1 || L[id][i] > n)
         return ;
   sort(P + 1 , P + 1 + k , [&](int x , int y) { return R[lc][x] < R[lc][y];} );
   int nowr = -N;
   for(int i = 1;i < k;++ i) {
      nowr = max(nowr , L[rc][P[i]]);
      if(L[rc][P[i]] < 1 || L[rc][P[i]] > n)
         break ;
      if(R[lc][P[i + 1]] > n || R[lc][P[i + 1]] < 1)
         continue ;
      dp[id] = min(dp[id] , nowr - R[lc][P[i + 1]] + 1);
   }
}

void Update(int x , int l = 1 , int r = n + 1 , int id = 1) {
   dp[id] = N;
   if(r - l < 2) {
      for(int i = 1;i <= k;++ i)
         R[id][i] = -N , L[id][i] = N;
      L[id][a[l]] = R[id][a[l]] = l;
      if(k == 1)
         dp[id] = 1;
      return ;
   }
   if(x < md)
      Update(x , l , md , lc);
   else
      Update(x , md , r , rc);
   Merge(id);
}
void Build(int l = 1 , int r = n + 1 , int id = 1) {
   dp[id] = N;
   if(r - l < 2) {
      for(int i = 1;i <= k;++ i)
         R[id][i] = -N , L[id][i] = N;
      L[id][a[l]] = R[id][a[l]] = l;
      if(k == 1)
         dp[id] = 1;
      return ;
   }
   Build(l , md , lc);
   Build(md , r , rc);
   Merge(id);
}
int main() {
   scanf("%d %d %d" , & n , & k , & q);
   iota(P + 1 , P + 1 + k , 1);
   for(int i = 1;i <= n;++ i)
      scanf("%d" , a + i);
   Build();
   while(q --) {
      int tp , x , y;
      scanf("%d" , & tp);
      if(tp == 2)
         printf("%d\n" , dp[1] > n ? -1 : dp[1]);
      else
         scanf("%d %d" , & x , & y) , a[x] = y , Update(x);
   }
   return 0;
}
/*
4 3 1
1 3 3 2
2
*/

Compilation message

nekameleoni.cpp: In function 'int main()':
nekameleoni.cpp:62:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d %d %d" , & n , & k , & q);
    ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nekameleoni.cpp:65:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d" , a + i);
       ~~~~~^~~~~~~~~~~~~~
nekameleoni.cpp:69:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d" , & tp);
       ~~~~~^~~~~~~~~~~~~
nekameleoni.cpp:73:48: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
          scanf("%d %d" , & x , & y) , a[x] = y , Update(x);
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 3704 KB Output is correct
2 Correct 9 ms 3704 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 5496 KB Output is correct
2 Correct 13 ms 5496 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 7160 KB Output is correct
2 Correct 19 ms 7288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 445 ms 27512 KB Output is correct
2 Correct 343 ms 92412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 721 ms 54648 KB Output is correct
2 Correct 343 ms 108408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 946 ms 54672 KB Output is correct
2 Correct 392 ms 108664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1190 ms 54776 KB Output is correct
2 Correct 362 ms 108548 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1166 ms 54776 KB Output is correct
2 Correct 366 ms 108512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1461 ms 108808 KB Output is correct
2 Correct 360 ms 108536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1447 ms 108664 KB Output is correct
2 Correct 369 ms 108632 KB Output is correct