Submission #1251402

#TimeUsernameProblemLanguageResultExecution timeMemory
1251402CodeLakVNNekameleoni (COCI15_nekameleoni)C++20
28 / 140
527 ms43428 KiB
#include <bits/stdc++.h> using namespace std; #define task "main" #define F first #define S second #define ii pair<int, int> #define il pair<int, long long> #define li pair<long long, int> #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FOD(i, b, a) for(int i = (b); i >= (a); --i) #define MASK(x) (1 << (x)) #define BIT(mask, x) (((mask) >> (x)) & 1) template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } const int MAX_N = (int)1e5 + 3; const int INF = (int)1e9 + 1408; int n, k, q; int a[MAX_N]; int cnt[51]; struct IT { struct NODE { int len = INF; vector<ii> pre, suf; } tree[4 * MAX_N]; inline bool valid(long long &mask) { return mask == ((1 << k) - 1); } inline void onBit(long long &mask, int x) { cnt[x]++; mask |= MASK(x); } inline void offBit(long long &mask, int x) { cnt[x]--; if (cnt[x] == 0) mask ^= MASK(x); } string getMask(long long m) { string res = ""; FOR(i, 0, k - 1) res += (((m >> i) & 1) ? "1" : "0"); return res; } NODE combine(NODE &x, NODE &y) { NODE res; // init res.len = min(x.len, y.len); res.pre = x.pre, res.suf = y.suf; long long maskPre = 0, maskSuf = 0; for (ii p : res.pre) maskPre |= MASK(p.F); for (ii p : res.suf) maskSuf |= MASK(p.F); // cout << "X.SUF:\n"; // for (ii p : x.suf) cout << p.F << " " << p.S << "\n"; // cout << "Y.PRE:\n"; // for (ii p : y.pre) cout << p.F << " " << p.S << "\n"; // compute pre & suf for (ii p : y.pre) if (!BIT(maskPre, p.F)) { res.pre.push_back(p); maskPre |= MASK(p.F); } if (valid(maskPre)) minimize(res.len, res.pre.back().S - res.pre[0].S + 1); for (ii p : x.suf) if (!BIT(maskSuf, p.F)) { res.suf.push_back(p); maskSuf |= MASK(p.F); } if (valid(maskSuf)) minimize(res.len, res.suf[0].S - res.suf.back().S + 1); // compute new length: merge x.suf & y.pre int j = (int)y.pre.size() - 1, lenSuf = (int)x.suf.size(); FOR(i, 0, k) cnt[i] = 0; int cntNum = 0; for (ii p : y.pre) cntNum += (++cnt[p.F] == 1); FOR(i, 0, lenSuf - 1) { cntNum += (++cnt[x.suf[i].F] == 1); while (j >= 0 && cntNum == k && cnt[y.pre[j].F] > 1) { cnt[y.pre[j].F]--; j--; } if (cntNum == k) minimize(res.len, (j >= 0 ? y.pre[j].S : x.suf[0].S) - x.suf[i].S + 1); } return res; } void build(int id, int l, int r) { if (l == r) { if (k == 1) tree[id].len = 1; tree[id].pre.push_back({a[l], l}); tree[id].suf.push_back({a[l], l}); return; } int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); tree[id] = combine(tree[id << 1], tree[id << 1 | 1]); } void update(int id, int l, int r, int pos) { if (l == r) { if (k == 1) tree[id].len = 1; tree[id].pre[0] = {a[l], l}; tree[id].suf[0] = {a[l], l}; return; } int mid = (l + r) >> 1; if (pos <= mid) update(id << 1, l, mid, pos); else update(id << 1 | 1, mid + 1, r, pos); tree[id] = combine(tree[id << 1], tree[id << 1 | 1]); } } ans; void solve() { cin >> n >> k >> q; FOR(i, 1, n) cin >> a[i], a[i]--; ans.build(1, 1, n); // cout << "\n"; while (q--) { int type; cin >> type; if (type == 2) cout << (ans.tree[1].len < INF ? ans.tree[1].len : -1) << "\n"; else { int pos, val; cin >> pos >> val; a[pos] = val - 1; ans.update(1, 1, n, pos); } } } int32_t main() { if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); bool multitest = 0; int numTest = 1; if (multitest) cin >> numTest; while (numTest--) { solve(); } return 0; } /* Lak lu theo dieu nhac!!!! */

Compilation message (stderr)

nekameleoni.cpp: In function 'int32_t main()':
nekameleoni.cpp:162:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  162 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
nekameleoni.cpp:163:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  163 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...