
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <queue> 7 #include <vector> 8 #include <stack> 9 #include <map> 10 #include <set> 11 #include <cmath> 12 #include <cctype> 13 #include <ctime> 14 15 using namespace std; 16 17 #define REP(i, n) for (int i = 0; i < (n); ++i) 18 #define eps 1e-9 19 20 typedef long long ll; 21 typedef pair<int, int> pii; 22 23 const int INF = 0x7fffffff; 24 const int maxn = 5e5 + 10; 25 int pre[maxn], Next[maxn], a[maxn], pos[maxn], key1[maxn], key2[maxn]; 26 int T, n, k, cnt1 ,cnt2; 27 28 inline void erase(int x) { 29 Next[pre[x]] = Next[x]; pre[Next[x]] = pre[x]; 30 } 31 32 int main() { 33 #ifdef __AiR_H 34 freopen("in.txt", "r", stdin); 35 // freopen("out.txt", "w", stdout); 36 #endif // __AiR_H 37 scanf("%d", &T); 38 while (T--) { 39 scanf("%d %d", &n, &k); 40 for (int i = 1; i <= n; ++i) { 41 scanf("%d", &a[i]); pos[a[i]] = i; 42 } 43 for (int i = 1; i <= n; ++i) { pre[i] = i - 1; Next[i] = i + 1; } 44 ll ans = 0; 45 for (int i = 1; i <= n; ++i) { 46 cnt1 = cnt2 = 0; 47 for (int j = pos[i]; cnt1 <= k && j; j = pre[j]) { 48 key1[cnt1++] = j; 49 } 50 for (int j = pos[i]; cnt2 <= k && j != n + 1; j = Next[j]) { 51 key2[cnt2++] = j; 52 } 53 erase(pos[i]); 54 key1[cnt1++] = 0; key2[cnt2++] = n + 1; 55 for (int j = 0; j < cnt1 - 1; ++j) { 56 if (k - j < cnt2 && k - j >= 1) { 57 ans += 1ll * i * (key1[j] - key1[j + 1]) * (key2[k - j] - key2[k - j - 1]); 58 } 59 } 60 } 61 printf("%I64d ", ans); 62 } 63 #ifdef __AiR_H 64 printf("Time used = %.2fs ", (double)clock() / CLOCKS_PER_SEC); 65 #endif // __AiR_H 66 return 0; 67 }
1 Codeforces 899E Segments Removal

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <queue> 7 #include <vector> 8 #include <stack> 9 #include <map> 10 #include <set> 11 #include <cmath> 12 #include <cctype> 13 #include <ctime> 14 #include <bitset> 15 16 using namespace std; 17 18 #define x first 19 #define y second 20 21 typedef long long ll; 22 typedef pair<int, int> pii; 23 const int maxn = 2e5 + 10; 24 int n, Size, ans = 0; 25 int a[maxn]; 26 vector<pii> v; 27 set<pii> s; 28 set<pii>::iterator itr; 29 map<pii, pii> pre, last; 30 31 void cal() { 32 int t = 1; 33 for (int i = 2; i <= n; ++i) { 34 if (a[i] == a[i - 1]) { ++t; continue; } 35 v.push_back(make_pair(t, n + 2 - i)); t = 1; 36 } 37 v.push_back(make_pair(t, 1)); Size = v.size(); 38 for (int i = 0; i < Size; ++i) { 39 s.insert(v[i]); 40 if (i == 0) { pre[v[i]] = make_pair(0, n + 1); } else { pre[v[i]] = v[i - 1]; } 41 if (i == Size - 1) { last[v[i]] = make_pair(0, 0); } else { last[v[i]] = v[i + 1]; } 42 } 43 } 44 45 int main() { 46 #ifdef __AiR_H 47 freopen("E.in", "r", stdin); 48 freopen("out.txt", "w", stdout); 49 #endif // __AiR_H 50 scanf("%d", &n); 51 for (int i = 1; i <= n; ++i) { scanf("%d", &a[i]); } 52 cal(); pii t, t1, t2, t3; 53 while (!s.empty()) { 54 ++ans; t = *(--s.end()); s.erase(t); t1 = pre[t]; t2 = last[t]; 55 if (!t1.x || !t2.x || a[n + 1 - t1.y] != a[n + 1 - t2.y]) { 56 last[t1] = t2; pre[t2] = t1; continue; 57 } 58 t3 = make_pair(t1.x + t2.x, t2.y); s.erase(t1); s.erase(t2); s.insert(t3); 59 pre[t3] = pre[t1]; last[t3] = last[t2]; last[pre[t1]] = t3; pre[last[t2]] = t3; 60 } 61 printf("%d ", ans); 62 return 0; 63 }