zoukankan      html  css  js  c++  java
  • 链表


    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
  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/zhaoyz/p/7278037.html
Copyright © 2011-2022 走看看