The 14th Zhejiang Provincial Collegiate Programming Contest (待续)

来源:互联网 发布:淘宝卖衣服规则 编辑:程序博客网 时间:2024/05/17 00:59

期中考啊啊啊啊啊= =

待续。

 

A.Cooking Competition

#include <bits/stdc++.h>using namespace std;int main(){    int T;    scanf("%d", &T);    while(T--)    {        int n;        scanf("%d", &n);        int ans = 0;        while(n--)        {            int x;            scanf("%d", &x);            if(x == 1)  ans+=1;            else if(x == 2) ans -=1;        }        if(ans > 0)        {            puts("Kobayashi");        }        else if(ans < 0)        {            puts("Tohru");        }        else puts("Draw");    }    return 0;}



B.Problem Preparation


#include <bits/stdc++.h>using namespace std;const int maxn = 1e4 + 5;int T, n;int a[maxn];bool solve(){    if(n < 10 || n > 13)    return false;    if(a[1] != 1 || a[2] != 1)  return false;    int hardest = a[n];    for(int i = 3; i <= n; i++)    {        if(a[i] == hardest)  continue;        if(a[i] - a[i - 1] > 2) return false;    }    return true;}int main(){    scanf("%d", &T);    while(T--)    {        scanf("%d", &n);        for(int i = 1; i <= n; i++)        {            scanf("%d", &a[i]);        }        sort(a + 1, a + 1 + n);        if(solve()) puts("Yes");        else puts("No");    }    return 0;}


C.What Kind of Friends Are You?

#include <bits/stdc++.h>using namespace std;int has[(1 << 21) + 5];int main(){    int T;    scanf("%d", &T);    while(T--)    {        int n, q;        scanf("%d%d", &n, &q);        int c;        scanf("%d", &c);        map<string, int>ma;        map<int, string>rever;        for(int i = 1; i <= c; i++)        {            string name;            cin >> name;            ma[name] = i;            rever[i] = name;        }        memset(has, 0, sizeof(has));        for(int i = 1; i <= q; i++)        {            int num;            scanf("%d", &num);            while(num--)            {                string s;                cin >> s;                int id = ma[s];                has[id] += (1 << i);            }        }        map<int, vector<string>>vec;        for(int i = 1; i <= c; i++)        {            vec[has[i]].push_back(rever[i]);        }        for(int i = 1; i <= n; i++)        {            int temp = 0;            for(int i = 1; i <= q; i++)            {                int x;                scanf("%d", &x);                if(x)   temp += (1 << i);            }            if(vec[temp].size() == 1)            {                cout << vec[temp][0] << "\n";            }            else puts("Let's go to the library!!");        }    }    return 0;}




D.Let's Chat

#include <bits/stdc++.h>using namespace std;int sorted[410];bool isAL[410], isBL[410], isAR[410], isBR[410];pair<int, int> a[110], b[110];int main(){    int t;    scanf("%d", &t);    while (t--)    {        int n, m, x, y, l, r;        int cnt = 0;        scanf("%d%d%d%d", &n, &m, &x, &y);        for (int i = 0; i < x; i++)        {            scanf("%d%d", &l, &r);            sorted[cnt++] = l;            sorted[cnt++] = r;            a[i] = {l, r};        }        for (int i = 0; i < y; i++)        {            scanf("%d%d", &l, &r);            sorted[cnt++] = l;            sorted[cnt++] = r;            b[i] = {l, r};        }        sort(sorted, sorted + cnt);        cnt = unique(sorted, sorted + cnt) - sorted;        memset(isAL, false, sizeof(isAL));        memset(isBL, false, sizeof(isBL));        memset(isAR, false, sizeof(isAR));        memset(isBR, false, sizeof(isBR));        for (int i = 0; i < x; i++)        {            a[i].first = lower_bound(sorted, sorted + cnt, a[i].first) - sorted;            a[i].second = lower_bound(sorted, sorted + cnt, a[i].second) - sorted;            isAL[a[i].first] = true;            isAR[a[i].second] = true;        }        for (int i = 0; i < y; i++)        {            b[i].first = lower_bound(sorted, sorted + cnt, b[i].first) - sorted;            b[i].second = lower_bound(sorted, sorted + cnt, b[i].second) - sorted;            isBL[b[i].first] = true;            isBR[b[i].second] = true;        }        int c = 0;        int st = -1;        long long ans = 0;        for (int i = 0; i < cnt; i++)        {            if (isAL[i]) c++;            if (isBL[i]) c++;            if (c == 2 && st == -1)                st = i;            if (isAR[i]) c--;            if (isBR[i]) c--;            if (c != 2 && st != -1)            {                int len = sorted[i] - sorted[st] + 1;                if (len >= m)                    ans += len - m + 1;                st = -1;            }        }        printf("%lld\n", ans);    }    return 0;}



E.Seven Segment Display

#include <bits/stdc++.h>using namespace std;const long long mx = (1LL << 32) - 1;int cost[128];int v[128];void init(){    cost[0] = 6;    cost[1] = 2;    cost[2] = 5;    cost[3] = 5;    cost[4] = 4;    cost[5] = 5;    cost[6] = 6;    cost[7] = 3;    cost[8] = 7;    cost[9] = 6;    cost[10] = 6;    cost[11] = 5;    cost[12] = 4;    cost[13] = 5;    cost[14] = 5;    cost[15] = 4;    for (int i = '0'; i <= '9'; i++)        v[i] = i - '0';    for (int i = 'A'; i <= 'F'; i++)        v[i] = i - 'A' + 10;}long long trans(const string hex){    long long ans = 0;    for (int i = 0; i < hex.length(); i++)        ans = ans * 16 + v[hex[i]];    return ans;}string rtrans(long long x){    string ans;    while (x)    {        int d = x % 16;        if (d < 10)            ans += '0' + d;        else            ans += 'A' + d - 10;        x /= 16;    }    reverse(ans.begin(), ans.end());    while (ans.length() < 8)        ans = "0" + ans;    return ans;}long long calc(string x){    long long cnt[16];    memset(cnt, 0, sizeof(cnt));    for (int i = 0; i < x.length(); i++)    {        long long a, b, c;        a = trans(x.substr(0, i));        b = trans(x.substr(i + 1));        string r = "";        for (int k = i + 1; k < x.length(); k++)            r += "F";        c = trans(r);        for (int j = 0; j < 16; j++)        {            if (j < v[x[i]])                cnt[j] += (a + 1) * (c + 1);            else if (j == v[x[i]])            {                cnt[j] += a * (c + 1);                cnt[j] += b + 1;            }            else                cnt[j] += a * (c + 1);        }    }    long long ans = 0;    for (int i = 0; i < 16; i++)        ans += cost[i] * cnt[i];    return ans;}int main(){    init();    int t;    scanf("%d", &t);    while (t--)    {        int n;        char s[16];        scanf("%d%s", &n, s);        string st;        st.assign(s);        long long nst = trans(st);        long long ned = nst + n - 1;        if (ned <= mx)        {            if (nst == 0)                printf("%lld\n", calc(rtrans(ned)));            else                printf("%lld\n", calc(rtrans(ned)) - calc(rtrans(nst - 1)));        }        else        {            long long ans = 0;            ans += calc("FFFFFFFF") - calc(rtrans(nst - 1));            ned -= mx + 1;            ans += calc(rtrans(ned));            printf("%lld\n", ans);        }    }    return 0;}



F.Heap Partition

#include <bits/stdc++.h>using namespace std;int fa[100005];int deg[100005];vector<int> tree[100005];set<int> ids;bool vis[100005];void dfs(int cur){    vis[cur] = true;    ids.insert(cur);    for (auto o : tree[cur])        dfs(o);}int main(){    int t;    scanf("%d", &t);    while (t--)    {        int n, v;        scanf("%d", &n);        set<pair<int, int>> ms;        for (int i = 1; i <= n; i++)        {            tree[i].clear();            deg[i] = fa[i] = vis[i] = 0;        }        int ans = 0;        for (int i = 1; i <= n; i++)        {            scanf("%d", &v);            set<pair<int, int>>::iterator it = ms.upper_bound({v, i});            if (it == ms.begin())                ms.insert({v, i}), ans++;            else            {                it--;                fa[i] = it->second;                deg[it->second]++;                ms.insert({v, i});                if (deg[it->second] == 2)                    ms.erase(it);            }        }        for (int i = 1; i <= n; i++)            if (fa[i] != 0)                tree[fa[i]].push_back(i);        printf("%d\n", ans);        for (int i = 1; i <= n; i++)        {            if (!vis[i])            {                ids.clear();                dfs(i);                printf("%d", ids.size());                for (auto o : ids)                    printf(" %d", o);                puts("");            }        }    }    return 0;}





0 0