欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码

程序员文章站 2022-03-13 10:46:23
...

ACM模版

这次抽周末打网络赛,两个半小时就溜了,只过了五道题,后边因为网吧电脑和键盘以及 HDU 的原因,被打自闭了,太难了。

由于不是我自己的电脑,所以整理题解有些麻烦了,现在先给出五道题的代码,如果有时间了,题解慢慢补吧……大概率是没有了吧!

1001 Buy and Resell

描述

HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码
HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码

代码

#include <cstdio>
#include <iostream>
#include <queue>

using namespace std;

typedef long long ll;

const int INF = 0x3f3f3f3f;
const int MAXN = 5e5 + 10;

int n;
int a[MAXN];

struct cmp_pq2
{
    bool operator () (const pair<int, int> &x, const pair<int, int> &y) const
    {
        return a[x.second] > a[y.second];
    }
};

struct cmp_pq1
{
    bool operator () (const int &x, const int &y)
    {
        return a[x] > a[y];
    }
};

int main()
{
    int T;
    cin >> T;

    while (T--)
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
        }

        priority_queue<int, vector<int>, cmp_pq1> pq1;
        priority_queue<pair<int, int>, vector<pair<int, int> >, cmp_pq2> pq2;

        for (int i = 1; i <= n; i++)
        {
            int p = 0, s = 0;
            if (!pq1.empty() && a[pq1.top()] < a[i])
            {
                p = a[i] - a[pq1.top()];
            }
            if (!pq2.empty() && a[pq2.top().second] < a[i])
            {
                s = a[i] - a[pq2.top().second];
            }

            if (!p && !s)
            {
                pq1.push(i);
            }
            else if (s >= p)
            {
                int fis =pq2.top().first, sec = pq2.top().second;
                pq2.pop();
                pq2.push({fis, i});
                pq1.push(sec);
            }
            else
            {
                pq2.push({pq1.top(), i});
                pq1.pop();
            }
        }

        ll res = 0, cnt = pq2.size() * 2;
        while (!pq2.empty())
        {
            res += a[pq2.top().second] - a[pq2.top().first];
            pq2.pop();
        }
        printf("%lld %lld\n", res, cnt);
    }

    return 0;
}

1003 Dream

描述

HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码
HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码

代码

#include <cstdio>
#include <iostream>

using namespace std;

int p;

int main()
{
    int T;
    cin >> T;

    while (T--)
    {
        scanf("%d", &p);
        for (int i = 0; i < p; i++)
        {
            for (int j = 0; j < p; j++)
            {
                printf("%d%c", (i + j) % p, j == p - 1 ? '\n' : ' ');
            }
        }

        for (int i = 0; i < p; i++)
        {
            for (int j = 0; j < p; j++)
            {
                 printf("%d%c", (i * j) % p, j == p - 1 ? '\n' : ' ');
            }
        }
    }

    return 0;
}

1004 Find Integer

描述

HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码

代码

#include <iostream>
#include <cstdio>

using namespace std;

long long n, a, b, c;

int main()
{
    int T;
    cin >> T;

    while (T--)
    {
        scanf("%d%d", &n, &a);

        if (n > 2)
        {
            printf("-1 -1\n");
        }
        else if (n == 1)
        {
            printf("%d %d\n", 1, a + 1);
        }
        else if (n == 0)
        {
            printf("-1 -1\n");
        }
        else
        {
            if (a > 1)
            {
                if (a & 1)
                {
                    long long n = a >> 1;
                    printf("%lld %lld\n", 2 * n * n + 2 * n, 2 * n * n + 2 * n + 1);
                }
            }

            if (a > 4)
            {
                if ((a & 1) == 0)
                {
                    long long n = a >> 1;
                    printf("%lld %lld\n", n * n - 1, n * n + 1);
                }
            }

            if (a == 1 || a == 2)
            {
                printf("-1 -1\n");
            }

            if (a == 4)
            {
                printf("3 5\n");
            }
        }
    }

    return 0;
}

1005 GuGu Convolution

描述

HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码
HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码

代码

#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long int
#define met(a) memset(a,0,sizeof(a))
#define fup(i,a,n,b) for(int i=a;i<n;i+=b)
#define fow(j,a,n,b) for(int j=a;j>0;j-=b)
#define MOD(x) (x)%mod
using namespace std;
const int maxn = 1e6+ 5;
ll r,p;
struct juz {
    ll x, y;
    juz() { x = 0; y = 0; }
    juz operator*(const juz &b) const{
        juz ans;
        ans.x = (x*b.x%p + y * b.y%p*r) % p;
        ans.y = (x*b.y%p + y * b.x) % p;
        return ans;
    }
    juz operator-(const juz &b) const {
        juz ans;
        ans.x = x - b.x;
        ans.y = y - b.y;
        return ans;
    }

}z1,z2,cot;
juz qpow(juz x, ll y) {
    juz z ;
    z.x = 1;
    z.y = 1;
    while (y) {
        if (y & 1)z =z*x;
        x=x*x;
        y /= 2;
    }
    return z;
}
int f[1000005];
void init() {
    ll i, j;
    for (i = 1; i*i <= maxn; i++)f[i*i] = i;
    for (i = 1; i <= maxn; i++)
        for (j = i + i; j <= maxn; j += i)f[j] = max(f[j], f[i]);
}
int main() {
    #ifdef LOCAL
    freopen("D:/input.txt", "r", stdin);
#endif
    ll i, j, a, b, n;
    init();
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%lld%lld%lld%lld", &a, &b, &n, &p);
        p *= 2;
        r = b;
        z1.x = a,z1.y = 1;
        z2.x = a, z2.y = p - 1;
        cot = qpow(z1, n) - qpow(z2, n);
        cot.y = (cot.y*f[b] % p + p) % p / 2;
        printf("1 %lld %lld\n", cot.y, b / (f[b] * f[b]));
    }

    return 0;
}

1009 Tree and Permutation

描述

HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码

代码

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

const int MAXN = 1e5 + 10;
const int MOD = 1e9 + 7;

struct TNode
{
    int v, w;
    TNode() {}
    TNode(int v, int w) : v(v), w(w) {}
};

int N;
long long ans;
long long sum[MAXN];
long long inv[MAXN];
vector<TNode> G[MAXN];

void dfs(int root, int pre)
{
    sum[root] = 1;
    for (int i = 0; i < G[root].size(); i++)
    {
        TNode &e = G[root][i];
        int s = e.v;
        if (s == pre)
        {
            continue;
        }

        dfs(s, root);

        sum[root] += sum[s];
        sum[root] %= MOD;
        ans += (long long)(sum[s] * (N - sum[s]) * e.w);
        ans %= MOD;
    }
}

void init()
{
    inv[0] = 1;
    for (int i = 1; i < MAXN; i++)
    {
        inv[i] = inv[i - 1] * i % MOD;
    }
}

int main()
{
    init();

    while (cin >> N)
    {
        ans = 0;
        memset(sum, 0, sizeof(sum));
        for (int i = 0; i <= N; i++)
        {
            G[i].clear();
        }

        int X, Y, L;
        for (int i = 1; i < N; i++)
        {
            scanf("%d%d%d", &X, &Y, &L);
                G[X].push_back(TNode(Y, L));
               G[Y].push_back(TNode(X, L));
        }

        dfs(1, 0);

        printf("%lld\n", ans * inv[N - 1] % MOD * 2 % MOD);
    }

    return 0;
}

1010 YJJ’s Salesman

描述

HDU-2018中国大学生程序设计竞赛-网络选拔赛-部分代码

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
int mx[4 * maxn];
int b[maxn];
struct Node
{
    int x;
    int y;
    int val;
    bool operator <(const Node &p)const
    {
        if(x == p.x)return y < p.y;
        return x < p.x;
    }
}a[maxn];
int ql, qr;
int query(int o, int l, int r)
{
    if(qr < ql)return 0;
    if(ql <= l && qr >= r)
    {
        return mx[o];
    }
    int m = l + (r - l) / 2;
    int ans = - 1;
    if(ql <= m)ans = max(ans, query(o * 2, l, m));
    if(qr > m)ans = max(ans, query(o * 2 + 1, m + 1, r));
    return ans; 
}
void update(int o, int l, int r, int pos, int val)
{
    if(l == r)
    {
        mx[o] = max(val, mx[o]) ;
        //cout << l << " "  << mx[o] << endl;
        return ;
    }
    int m = l + (r - l) / 2;
    if(pos <= m)update(o * 2, l, m, pos, val);
    else update(o * 2 + 1, m + 1, r, pos, val);
    mx[o] = max(mx[o * 2], mx[o * 2 + 1]);
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        int cnt = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].val);
            b[cnt++] = a[i].y;    
        }
        memset(mx, 0, sizeof(mx));
        sort(b, b + cnt);
        int m = 1;
        for(int i = 1; i < cnt; i++)
        {
            if(b[i] != b[i - 1])b[m++] = b[i];
        }
        sort(a, a + n);
        int res = -1;
        for(int i = 0; i < n; i++)
        {
            vector<pair<int, int> >cc;
            int mxx = -1;
            int j;
            for(j = i; j < n; j++)
            {
                if(a[j].x != a[i].x)break;
                int pos1 = lower_bound(b, b + m, a[j].y) - b;
                int pos2 = lower_bound(b, b + m, a[j].y - 1) - b;
                if(b[pos2] != a[j].y - 1)pos2 --;
                   ql = 0;qr = pos2;
                int ans = query(1, 0, m - 1);
                ql = pos1;
                qr = pos1;

                ans = max(ans + a[j].val, query(1, 0, m - 1));
                if(ans > mxx)
                {
                    mxx = ans;
                }
                else
                {
                    ans = mxx;
                }
                res = max(res, ans);
                cc.push_back(make_pair(pos1, ans));    
            }
            for(int k = 0; k < cc.size(); k++)
            {
                update(1, 0, m - 1, cc[k].first, cc[k].second);
            }
            i = j - 1;

        }
        cout << res << endl;
    }
    return 0;
}

啊啊啊啊,才发现竟然是六道题,昨天下午两点半我撤了以后,我队友明明去参加面试了,怎么面试完回来又 A 了一题,好强啊……从代码风格上可以区分出来哪些题是我写的,哪些不是,就这样把,懒得都格式化成我的习惯了。

有趣的是,网赛都打得好猛啊!!!感觉人均五题啊……不对,是队。尤其是我们河南,每次网络赛成绩都出奇的好,太牛逼了吧!!!

相关标签: HDU