답안 #607389

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
607389 2022-07-26T16:17:37 Z kawaii Martian DNA (BOI18_dna) C++14
0 / 100
77 ms 11316 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second

int t, n, m, k, b, q, r, a[1000005], num[1000005], dem[1000005], mod = 1e9 + 7;
string s;
mt19937_64 rng;
bool flag[1000005];
int mul(int x, int y){
    if(y == 0) return 1;
    int ans = mul(x, y / 2);
    if(y % 2 == 0) return (ans * ans) % mod;
    else return (((ans * ans) % mod) * x) % mod;
}

void solve(){
    while(r--){
        cin >> b >> q;
        num[b] = q;
    }
    int l = 0; r = n + 1;
    while(r - l > 0){
        int mid = l + r >> 1, ans = 0, answer = 0; 
        memset(dem, 0, sizeof(dem));
        memset(flag, 0, sizeof(flag));
        int cnt = 0;
        // cout << mid << "\n";
        for(int i = 1; i <= n; i++){
            dem[a[i]]++;
            if(dem[a[i]] >= num[a[i]] && num[a[i]]){
                if(!flag[a[i]]) flag[a[i]] = 1, ans++;
            }
            if(i > mid){
                if(dem[a[i - mid]] == num[a[i - mid]] && num[a[i]]){
                    if(flag[a[i - mid]]) flag[a[i - mid]] = 0, ans--;
                }
                dem[a[i - mid]]--;
            }
            answer = max(answer, ans);
            // cout << ans <<" ";
        }
        for(int i = 0; i < k; i++){
            if(!num[i]) answer++;
        }
        // cout << "\n";
        if(answer < k) l = mid + 1;
        else r = mid;
    }
    if(r == n + 1) cout << "impossible";
    else cout << r;
}

signed main(){
    ios_base::sync_with_stdio(NULL); cin.tie(nullptr); cout.tie(nullptr);
    rng.seed((int)main ^ time(0));
    #ifdef Kawaii
        auto starttime = chrono::high_resolution_clock::now();
    #endif

    cin >> n >> k >> r;
    for(int i = 1; i <= n; i++) cin >> a[i];
    solve();

    #ifdef Kawaii
        auto endtime = chrono::high_resolution_clock::now();
        auto duration = chrono::duration_cast<chrono::milliseconds>(endtime - starttime).count(); 
        cout << "\n=====" << "\nUsed: " << duration << " ms\n";
    #endif
}

Compilation message

dna.cpp: In function 'void solve()':
dna.cpp:25:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   25 |         int mid = l + r >> 1, ans = 0, answer = 0;
      |                   ~~^~~
dna.cpp:28:13: warning: unused variable 'cnt' [-Wunused-variable]
   28 |         int cnt = 0;
      |             ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 9044 KB Output is correct
2 Incorrect 10 ms 9044 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 9172 KB Output is correct
2 Correct 12 ms 9172 KB Output is correct
3 Incorrect 14 ms 9172 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 50 ms 10708 KB Output is correct
2 Correct 51 ms 10708 KB Output is correct
3 Correct 53 ms 10692 KB Output is correct
4 Correct 46 ms 10580 KB Output is correct
5 Incorrect 56 ms 10736 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 70 ms 11316 KB Output is correct
2 Correct 72 ms 11092 KB Output is correct
3 Incorrect 77 ms 11156 KB Output isn't correct
4 Halted 0 ms 0 KB -