链表


1 HDU 6058 Kanade's sum

 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 }
View Code

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 }
View Code
原文地址:https://www.cnblogs.com/zhaoyz/p/7278037.html