2019 杭电多校 第三场

2019 Multi-University Training Contest 3

补题链接:2019 Multi-University Training Contest 3

1002 Blow up the city (HDU-6604)

题意

给定 \(n\) 个点和 \(m\) 条边的有向无环图,给出 \(q\) 次询问,每个询问给出 \(a\) 和 \(b\),求有多少个点,满足该点删去后 \(a\) 和 \(b\) 中至少一个点不能到达出度为 \(0\) 的点。

题解

支配树/灭绝树 拓扑排序 最近公共祖先

1006 Fansblog (HDU-6608)

题意

给定素数\(\ P(1e^9\leq P\leq 1e^{14})\),试找出小于\(P\)的最大素数\(\ Q\),求出\(\ Q! \ mod \ P\)。

题解

威尔逊定理 逆元 质数的密度分布 Miller-Rabin素数测试

威尔逊定理:当且仅当 \(P\) 为素数时:\((P - 1)!\equiv -1\ mod\ P\)

即 \((P-1)!\equiv(P-1)\ mod\ P\),由于 \((P - 1)! = (Q!) * (Q + 1) * (Q + 2) * ... * (P - 1)\),可得 \(Q!\ mod\ P=\frac {(P - 1)}{(Q + 1) * (Q + 2) * ... * (P - 1)}\ mod\ P=\frac {1}{(Q + 1) * (Q + 2) * ... * (P - 2)}\ mod\ P\)

可以使用 \(Miller-Rabin\) 素数测试判断素数,也可直接使用试除法。
素数间的间隔不超过 \(600\) (素数间的大间隔(Large gaps between primes)),因此可直接从 \(P - 1\) 开始查找 \(Q\)。
注意数很大,需要使用快速乘。(WA了好几发)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;

ll mulmod(ll a, ll b, ll m) {
    ll ans = 0;
    while (b) {
        if (b & 1) ans = (ans + a) % m;
        a = (a << 1) % m;
        b >>= 1;
    }
    return ans % m;
}

ll qmod(ll a, ll b, ll m) {
    if(!b) return 1 % m;
    ll ans = 1;
    while (b) {
        if (b & 1) ans = mulmod(ans, a, m);
        a = mulmod(a, a, m);
        b >>= 1;
    }
    return ans % m;
}

bool Miller_Rabbin(ll n, ll a) {
    ll d = n - 1, s = 0, i;
    while (!(d & 1)) {
        d >>= 1;
        s++;
    }
    ll t = qmod(a, d, n);
    if (t == 1 || t == -1)
        return 1;
    for (i = 0; i < s; i++) {
        if (t == n - 1)
            return 1;
        t = mulmod(t, t, n);
    }
    return 0;
}

bool is_prime(ll n) {
    ll i, tab[4] = {3, 4, 7, 11};
    for (i = 0; i < 4; i++) {
        if (n == tab[i])
            return 1;
        if (!n % tab[i])
            return 0;
        if (n > tab[i] && !Miller_Rabbin(n, tab[i]))
            return 0;
    }
    return 1;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        ll n;
        scanf("%lld", &n);
        for (ll i = n - 1;; --i) {
            if (is_prime(i)) {
                ll ans = 1;
                for (ll j = i + 1; j <= n - 2; ++j) {
                    ans = mulmod(ans, qmod(j, n - 2, n), n);
                }
                ans = (ans + n) % n;
                printf("%lld\n", ans);
                break;
            }
        }
    }
    return 0;
}

1007 Find the answer (HDU-6609)

题意

给定 \(n\) 个整数 \(W_i(1\leq i\leq n)\) 和一个整数 \(m\),对于每个\(\ i(1\leq i \leq n)\),求至少需要删除多少个 \(W_k(1\leq k < i)\),使得\(\sum_{j=1}^iW_j\leq m\)。其中 \(1\leq W_i\leq m(1\leq i\leq n)\)

题解

multiset STL

神仙做法

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;

multiset<int> s;
ll a[maxn];

int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        int n; ll m;
        s.clear();
        scanf("%d %lld", &n, &m);
        for(int i = 1; i <= n; ++i) {
            scanf("%lld", &a[i]);
        }
        ll sum = 0;
        int res = 0;
        for(int i = 1; i <= n; ++i) {
            int cnt = 0;
            ll tmp = sum;
            if(tmp + a[i] > m) {
                auto it = s.end();
                while(tmp + a[i] > m) {
                   --it;
                   tmp -= *it;
                   ++cnt;
                }
            }
            printf("%d ",cnt + res);
            s.insert(a[i]);
            sum += a[i];
            auto it = s.end();
            while(sum > m) {
                --it;
                sum -= *it;
                s.erase(s.find(*it));
                ++res;
            }
        }
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wulitaotao/p/11428294.html

时间: 2024-08-30 10:56:05

2019 杭电多校 第三场的相关文章

2019杭电多校第三场 1004 Distribution of books

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 考虑二分答案,我们二分一个值\(x\),那么要怎么来验证这个答案是否可行,考虑dp求解,设\(dp[i]\)为前i个在答案为\(x\)的情况下划分最最多组数,那么若\(dp[n] \geq k\) 则这个x可行, 很显然可以看出\(x\)是单调的,所以二分. \[dp[i] = max(dp[j]) + 1 (sum[i] - sum[j-1] \leq x)\] 如果直接采用暴力枚举的话复杂

2019杭电多校第三场 1008 K-th Closest Distance

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6621 考虑主席树,我们先将所有值离散化之后建主席树.对于每个查询\(s,t,p,k\) 我们考虑二分一个值\(mid\),考虑当前区间内,\([p-mid, p+mid]\)的值有多少个,很显然这是符合单调性的,那么我们只需要每次判断即可.时间复杂度\(O(nlog^2n)\) #include <bits/stdc++.h> #define pii pair<int, int> #d

2019 杭电多校 第五场

2019 Multi-University Training Contest 5 补题链接:2019 Multi-University Training Contest 5 罚时爆炸 自闭场 1004 equation (HDU 6627) 题意: 给定一个整数 \(C\) 和 \(N\) 组 \(a_i,b_i\),求 \(∑_{i=1}^N|a_i\cdot x + b_i| = C\) 的所有解,如果有无穷多个解就输出 -1. 思路 分类讨论 分类讨论去绝对值.根据 \(b_i / a_i

2019年杭电多校第三场 1011题Squrirrel(HDU6613+树DP)

题目链接 传送门 题意 给你一棵无根树,要你寻找一个根节点使得在将一条边权变为\(0\)后,离树根最远的点到根节点的距离最小. 思路 本题和求树的直径很像,不过要记得的东西有点多,且状态也很多. \(fi[u][0]\)表示在\(u\)这个结点不删边沿着子树方向能到达的最远距离,\(se[u][0]\)为第二远,\(th[u][0]\)为第三远,\(fa[u][0]\)表示沿着父亲方向能到达的最远距离,第二维为\(1\)表示删一条边能到达的距离. 不删边的转移和求树的直径转移方程基本上是一样的,

2018 Multi-University Training Contest 3 杭电多校第三场

躺了几天 终于记得来填坑了 1001 Ascending Rating   (hdoj 6319) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6319 单调队列 具体有点类似双端队列滑动窗口 题意:在一个队列中 每次都给定一个固定长度的区间 从i=1开始向后移动 每次在这个区间中进行a[i]和a[j]的比较 若a[i]<a[j] count++ 最大值更新为a[j] ,每个区间的最大值和count都分别异或i 求出分别的和 求区间最大值可以比较容易

2019 杭电多校 第八场

2019 Multi-University Training Contest 8 补题链接:2019 Multi-University Training Contest 8 1003 Acesrc and Good Numbers HDU 6659 题意 定义 \(f(d, n)\) 为十进制下 \(1\) 到 \(n\) 所有数的数位中数字 \(d\) 出现的次数.给定 \(x\),找出最大的 \(n(n \le x)\) 满足 \(f(d, n) = n\). 题解 看到了一个神仙做法. 显

2019 杭电多校 第七场

2019 Multi-University Training Contest 7 补题链接:2019 Multi-University Training Contest 7 1001 A + B = C 题意: 给出 \(a, b, c\),求 \(x, y, z\) 满足 \(a\cdot 10^x + b\cdot 10^y = c\cdot 10^z\).\(a, b, c \le 10^{100000}\). 题解: 补零到 \(a, b, c\) 长度相等之后,可能的情况只有四种: \

2019 杭电多校 第六场

2019 Multi-University Training Contest 6 补题链接:2019 Multi-University Training Contest 6 1002 Nonsense Time (HDU 6635) 题意 给定包含 \(n\) 个不同数字的排列 \(p\).一开始所有数字都冻住.再给出一个长度为 \(n\) 的数组 \(k\),\(k[i]\) 表示 \(p[k[i]]\) 在第 \(i\) 时刻解冻.输出 \(n\) 个数,表示第 \(i\) 个时刻数组 \(

2019 杭电多校 第四场

2019 Multi-University Training Contest 4 补题链接:2019 Multi-University Training Contest 4 1001 AND Minimum Spanning Tree (HDU 6614) 题意 给定一个有 \(N\) 个结点的完全图,编号从 \(1\) 到 \(N\).结点 \(x\) 与结点 \(y\) \((1\leq x, y\leq N, x \neq y)\) 的边的权值为 \(x\) 与 \(y\) 按位与的值,求