ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

The 2019 China Collegiate Programming Contest Harbin Site

2021-10-24 10:35:05  阅读:176  来源: 互联网

标签:typedef ch Contest int Programming Site HashTable 哈希 using


感觉这场好简单,去年场上做的CCPC都好难,嘤嘤嘤

这场的题目都挺卡的。

L. LRU Algorithm

只能说这个时间非常的卡。

写了哈希和散列表T掉了,然后改成暴力for询问判断,这下时间正常了,然后一直wa。最后发现询问全\(0\)的时候也要输出\(\text{Yes}\),是不是有一点点坑。

哈希需要注意:

  • 哈希是将字符串看成\(n\)进制数,选取的\(base\)必须\(\geq\)字符集大小。

  • 散列表这东西就是看上去很快,真正卡常的时候是不是应该看作一个\(\log\)。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair <int, int> pin;
typedef pair <ll, ll> pll;

#ifndef ONLINE_JUDGE
bool MEMORY_ST;
#endif

const int N = 5005;

int T, n, qn, a[N], s[N], hq1[N], hq2[N], pos[N];
bool ans[N];
vector <int> q[N];

inline void inc(int &x, int y, int P) {
    if (!(y >= 0 && y < P)) y = (y % P + P) % P;
    x += y;
    if (x >= P) x -= P;
}

namespace HashTable {
    int b1 = 8209, b2 = 7307, P1 = 999749, P2 = 10001659;
}
using HashTable::b1;
using HashTable::b2;
using HashTable::P1;
using HashTable::P2;

namespace Fread {
    const int L = 1 << 15;
    
    char buffer[L], *S, *T;
    
    inline char Getchar() {
        if(S == T) {
            T = (S = buffer) + fread(buffer, 1, L, stdin);
            if(S == T) return EOF;
        }
        return *S++;
    }
    
    template <class T> 
    inline void read(T &X) {
        char ch; T op = 1;
        for(ch = Getchar(); ch > '9' || ch < '0'; ch = Getchar())
            if(ch == '-') op = -1;
        for(X = 0; ch >= '0' && ch <= '9'; ch = Getchar()) 
            X = (X << 1) + (X << 3) + ch - '0'; 
        X *= op;
    }
    
} using Fread::read;   

#ifndef ONLINE_JUDGE
bool MEMORY_ED;
#endif

int main() {
#ifndef ONLINE_JUDGE
    freopen("sample.in", "r", stdin);
    freopen("test.out", "w", stdout);
    clock_t st_clock = clock();
#endif

    read(T);
    for (; T--; ) {
        read(n), read(qn);
        for (int i = 1; i <= n; i++) {
            read(a[i]);
            s[i] = pos[i] = 0;
        } 
        for (int i = 1; i <= qn; i++) ans[i] = 0;
        for (int m, i = 1; i <= qn; i++) {
            read(m);
            int cur1 = 0, cur2 = 0;
            for (int ix, j = 1; j <= m; j++) {
                read(ix);
                cur1 = 1LL * cur1 * b1 % P1;
                inc(cur1, ix, P1);
                cur2 = 1LL * cur2 * b2 % P2;
                inc(cur2, ix, P2);
            } 
            q[m].emplace_back(i);
            hq1[i] = cur1, hq2[i] = cur2;
            if (cur1 == 0 && cur2 == 0) ans[i] = 1;
        }
        for (int i = 1; i <= n; i++) {
            int p = pos[a[i]];
            if (!p) {
                for (int j = n - 1; j >= 1; j--) s[j + 1] = s[j];
            } else {
                for (int j = p - 1; j >= 1; j--) s[j + 1] = s[j];
            }
            s[1] = a[i];
            int cur1 = 0, cur2 = 0;
            for (int j = 1; j <= n; j++) {
                if (s[j] != 0) pos[s[j]] = j;
                cur1 = 1LL * cur1 * b1 % P1;
                inc(cur1, s[j], P1);
                cur2 = 1LL * cur2 * b2 % P2;
                inc(cur2, s[j], P2);
                for (int k = 0; k < q[j].size(); k++) {
                    int id = q[j][k];
                    if (hq1[id] == cur1 && hq2[id] == cur2) {
                        ans[id] = 1;
                    }
                }
            }
            // for (int j = 1; j <= n; j++)
            //     printf("%d%c", s[j], " \n"[j == n]);
        }
        for (int i = 1; i <= qn; i++) puts(ans[i] ? "Yes" : "No");
        for (int i = 1; i <= n; i++) q[i].clear();
    }

#ifndef ONLINE_JUDGE
    clock_t ed_clock = clock();
    printf("time = %f ms\n", (double)(ed_clock - st_clock) / CLOCKS_PER_SEC * 1000);
    printf("memory = %.2f MB\n", (&MEMORY_ED - &MEMORY_ST) / 1024.0 / 1024.0);
#endif
    return 0;
}

标签:typedef,ch,Contest,int,Programming,Site,HashTable,哈希,using
来源: https://www.cnblogs.com/CzxingcHen/p/15450357.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有