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
  • 相关阅读:
    java中过滤器和拦截器的区别
    Java中内部类和静态内部类的区别
    SpringBoot启动的时候切换配置文件命令
    centos7安装Subversion
    关于curl_setopt参数的记录
    Linux Samba文件共享服务,安装与案例配置
    CentOS7源码安装Redis5.0.4非关系型数据库
    Centos7部署LAMP平台之架构之路
    Centos7安装及配置DHCP服务
    CentOS 7源码安装MYSQL-5.6
  • 原文地址:https://www.cnblogs.com/zhaoyz/p/7278037.html
Copyright © 2011-2022 走看看