2019.12.30考试总结

T1摆棋子
看到这么多的限制,第一直觉就是网络流,最小费用最大流不能做,因为把棋子代价看成1后最大流的条件并不好满足。
注意到每一行每一列都有一个最小限制,对应到网络流上就是流的下界,整体跑一个有下界的最小流就可以了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define LL long long
#define DB double
using namespace std;
int n, m, k, x, y, tot = 1, S, T, SS, TT, ans, flow;
const int N = 105, inf = 1 << 30;
int X[N], Y[N], vis[N][N], d[N * N], A[N * N];
int head[N * N];
struct bian
{
    int to, nt, cap;
} e[N * N * 4];
void add(int f, int t, int c)
{
    e[++tot] = (bian) {t, head[f], c};
    head[f] = tot;
}
void ADD(int f, int t, int c)
{
    add(f, t, c); add(t, f, 0);
}
inline int read()
{
    int res = 0; char ch = getchar(); bool XX = false;
    for (; !isdigit(ch); ch = getchar())(ch == '-') && (XX = true);
    for (; isdigit(ch); ch = getchar())res = (res << 3) + (res << 1) + (ch ^ 48);
    return XX ? -res : res;
}
queue<int>q;
int bfs(int S, int T)
{
    int x;
    memset(d, 0, sizeof(d));
    while (!q.empty())q.pop();
    q.push(S); d[S] = 1;
    while (!q.empty())
    {
        x = q.front(); q.pop();
        for (int i = head[x]; i; i = e[i].nt)
            if (e[i].cap && !d[e[i].to])
            {
                d[e[i].to] = d[x] + 1;
                q.push(e[i].to);
                if (e[i].to == T)return 1;
            }
    }
    return 0;
}
int dinic(int x, int flow, int T)
{
    if (x == T || !flow)return flow;
    int res = flow, k;
    for (int i = head[x]; i; i = e[i].nt)
        if (e[i].cap && d[e[i].to] == d[x] + 1)
        {
            k = dinic(e[i].to, min(e[i].cap, res), T);
            if (!k)d[e[i].to] = 0;
            e[i].cap -= k; e[i ^ 1].cap += k;
            res -= k;
        }
    return flow - res;
}
bool pan()
{
    int js;
    for (int i = 1; i <= n; ++i)
    {
        js = 0;
        for (int j = 1; j <= m; ++j)
            if (!vis[i][j])++js;
        if (js < X[i])return 1;
    }
    for (int j = 1; j <= m; ++j)
    {
        js = 0;
        for (int i = 1; i <= n; ++i)
            if (!vis[i][j])++js;
        if (js < Y[j])return 1;
    }
    return 0;
}
int main()
{
    freopen("chessman.in", "r", stdin);
    freopen("chessman.out", "w", stdout);
    cin >> n >> m >> k; S = n + m + 1, T = n + m + 2, SS = n + m + 3, TT = n + m + 4;
    for (int i = 1; i <= n; ++i)X[i] = read();
    for (int i = 1; i <= m; ++i)Y[i] = read();
    for (int i = 1; i <= k; ++i)
    {
        x = read(); y = read();
        vis[x][y] = 1;
    }
    if (pan())
    {
        puts("No Solution");
        fclose(stdin); fclose(stdout);
        return 0;
    }
    for (int i = 1; i <= n; ++i)
    {
        ADD(S, i, inf - X[i]);
        A[S] -= X[i]; A[i] += X[i];
    }
    for (int i = 1; i <= m; ++i)
    {
        ADD(n + i, T, inf - Y[i]);
        A[n + i] -= Y[i]; A[T] += Y[i];
    }
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            if (!vis[i][j])ADD(i, n + j, 1);
    for (int i = 1; i <= n + m + 2; ++i)
        if (A[i] > 0) {ADD(SS, i, A[i]);}
        else if (A[i])ADD(i, TT, -A[i]);
    while (bfs(SS, TT))while (flow = dinic(SS, inf, TT))ans += flow;
    ADD(T, S, inf);
    while (bfs(SS, TT))while (flow = dinic(SS, inf, TT))ans += flow;
    cout << e[tot].cap;
    fclose(stdin); fclose(stdout);
    return 0;
}

T2旅行路线
把度数看成一个字符,就变成了树上的不同子串个数问题。
一个序列的我们能解决,放到树上只需要把last改成fa的id就行了。

#include<iostream>
#include<cstdio>
#include<set>
#include<map>
#define LL long long
#define DB double
using namespace std;
int n, tot, x, y, cnt;
const int N = 1000010;
int head[N], du[N], id[N], len[N], fa[N];
map<int, int>tr[N];
struct bian {int to, nt;} e[N];
LL ans;
void add(int f, int t)
{
    e[++tot] = (bian) {t, head[f]};
    head[f] = tot;
}
inline int read()
{
    int res = 0; char ch = getchar(); bool XX = false;
    for (; !isdigit(ch); ch = getchar())(ch == '-') && (XX = true);
    for (; isdigit(ch); ch = getchar())res = (res << 3) + (res << 1) + (ch ^ 48);
    return XX ? -res : res;
}
void Insert(int x, int Q, int las)
{
    int np = ++cnt, p = las, q, nq;
    len[np] = len[p] + 1; id[Q] = cnt;
    for (; p && tr[p].find(x) == tr[p].end(); p = fa[p])tr[p][x] = np;
    if (!p)fa[np] = 1;
    else if (len[q = tr[p][x]] == len[p] + 1)fa[np] = q;
    else
    {
        len[nq = ++cnt] = len[p] + 1;
        fa[nq] = fa[q]; fa[q] = fa[np] = nq; tr[nq] = tr[q];
        for (; p; p = fa[p])
        {
            if (tr[p].find(x) == tr[p].end() || tr[p][x] != q)break;
            tr[p][x] = nq;
        }
    }
}
void dfs(int x, int fa)
{
    Insert(du[x], x, id[fa]);
    for (int i = head[x]; i; i = e[i].nt)
        if (e[i].to != fa)dfs(e[i].to, x);
}
int main()
{
    freopen("route.in", "r", stdin);
    freopen("route.out", "w", stdout);
    cnt = id[0] = 1; cin >> n;
    for (int i = 1; i < n; ++i)
    {
        x = read(); y = read();
        add(y, x); du[x]++; du[y]++;
    }
    dfs(1, 0);
    for (int i = 2; i <= cnt; ++i)ans += len[i] - len[fa[i]];
    cout << ans;
    fclose(stdin); fclose(stdout);
    return 0;
}

T3流浪者
总的方案数就是\(C_{n+m-2}^{n-1}\),因为体力减小的快,只有log种取值,所以总的体力是对每一种s乘上相应的方案数的和。
f[i][j] 表示从起点出发经过恰好 j 个特殊点到达第 i 个障碍点的方案,依然考虑容斥,枚举不合法路径上除 i 之外的第 j 个特殊点
\(\displaystyle f[i][j]=C_{x_i+y_i}^{x_i} - \sum_{k=1}^{i-1}f[k][j]·ways(k, i) - \sum_{k=1}^{j-1}f[i][k]\)
ways(i, j) 表示从第 i 个特殊点到第 j 个障碍点的方案
不懂的话可以吧右边的减号移到左边来。

#include<algorithm>
#include<iostream>
#include<cstdio>
#define int long long
#define LL long long
#define DB double
using namespace std;
int n, m, k, s, x, y, mx;
const int mod = 1e9 + 7, N = 200010, M = 2005;
int ex[M];
LL jc[N], inv[N], f[M][M], w[M][M], sum[M][M];
LL ans;
inline int read()
{
    int res = 0; char ch = getchar(); bool XX = false;
    for (; !isdigit(ch); ch = getchar())(ch == '-') && (XX = true);
    for (; isdigit(ch); ch = getchar())res = (res << 3) + (res << 1) + (ch ^ 48);
    return XX ? -res : res;
}
struct dian
{
    int x, y;
    friend bool operator <(const dian &a, const dian &b) {return a.x + a.y < b.x + b.y;}
} p[M];
LL ksm(LL a, LL b, LL mod)
{
    LL res = 1;
    for (; b; b >>= 1, a = a * a % mod)
        if (b & 1)res = res * a % mod;
    return res;
}
void YYCH()
{
    jc[0] = jc[1] = inv[0] = inv[1] = 1;
    for (int i = 2; i <= n + m; ++i)jc[i] = jc[i - 1] * i % mod;
    inv[n + m] = ksm(jc[n + m], mod - 2, mod);
    for (int i = n + m - 1; i >= 1; --i)inv[i] = inv[i + 1] * (i + 1) % mod;
}
LL C(LL n, LL m)
{
    if (n < m || n < 0 || m < 0)return 0;
    return jc[n] * inv[m] % mod * inv[n - m] % mod;
}
inline LL ni(LL x) {return ksm(x, mod - 2, mod);}
signed main()
{
    freopen("rover.in", "r", stdin);
    freopen("rover.out", "w", stdout);
    cin >> n >> m >> k >> s;
    YYCH();
    for (int i = 1; i <= k; ++i)
        p[i].x = read(), p[i].y = read();
    p[0] = (dian) {1, 1}; p[++k] = (dian) {n, m};
    sort(p, p + k + 1); ex[0] = s;
    for (int i = 1; i <= 20; ++i)
    {
        ex[i] = (ex[i - 1] + 1) >> 1;
        if (ex[i] == 1 && !mx)mx = i;
    }
    f[0][0] = 1;
    for (int i = 0; i <= k; ++i)
        for (int j = 0; j < i; ++j)
            w[i][j] = C(p[i].x - p[j].x + p[i].y - p[j].y, p[i].x - p[j].x);
    for (int i = 1; i <= k; ++i)
        for (int j = 0; j <= mx + 1; ++j)
        {
            f[i][j] = C(p[i].x + p[i].y - 2, p[i].x - 1);
            if (j)f[i][j] = (f[i][j] - sum[i][j - 1] + mod) % mod;
            for (int l = 0; l < i; ++l)
                f[i][j] = (f[i][j] - f[l][j] * w[i][l] % mod + mod) % mod;
            if (j)sum[i][j] = (sum[i][j - 1] + f[i][j]) % mod;
            else sum[i][j] = f[i][j];
        }
    for (int i = 1; i <= mx; ++i)
        (ans += f[k][i] * ni(C(n + m - 2, n - 1)) % mod * ex[i - 1] % mod) %= mod;
    ans = (ans + (C(n + m - 2, n - 1) - sum[k][mx] + mod) % mod * ni(C(n + m - 2, n - 1)) % mod) % mod;
    cout << ans;
    fclose(stdin); fclose(stdout);
    return 0;
}

原文地址:https://www.cnblogs.com/wljss/p/12121561.html

时间: 2024-10-08 21:20:46

2019.12.30考试总结的相关文章

2019.12.30日志

上午去学校上课 下午回来学习了fhq treap,我吹爆大fhq treap,然后写了一题板子 晚上去学校参加狂欢?然后T神去玩手机了,我在寒风中欣赏我大NFLS的篝火晚会(×),飘雪/冻死人晚会(√) 接着晚上去学OI,听了两题比较难的题的题解 回家肝口试稿子,3h写完 睡觉 今日小结 颓 1小时 写题 1题 [模板]普通平衡树 看题解 2题 原文地址:https://www.cnblogs.com/xxjAc/p/12127635.html

每日思考(2019/12/30)

题目概览 对<form>标签的enctype属性的理解 CSS的优先级是如何计算的 为什么 JavaScript 中 0.1 0.2 不等于 0.3 ? 题目解答 对<form>标签的enctype属性的理解 enctype的定义和用法:enctype属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded".就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为

项目管理者联盟PMP培训班招生简章(针对2014年12月考试)

PMP认证培训班招生简章(针对2014年12月考试) 主办单位:项目管理者联盟  开课城市:北京 开课时间:2014年10月12日 面向对象 各类科技与研发.IT软件与通信.工程与设计等项目导向型企业的各级管理人员与项目管理人员.项目经理与技术经理,有志于成长为项目经理的优秀工程师与技术骨干. 课程优势 l 十年美国项目管理学会全球教育合作伙伴(Global R.E.P. No. 3254),2003年开始PMP培训,课程质量业界认可,服务专业.专注. l 国内最强大的PMP专家团队.主讲老师具

【谜客帝国】第144届猫De梦年度收官谜会(2018.12.30)

[谜客帝国]第144届猫De梦年度收官谜会(2018.12.30) 主持:瓷  计分:小白 1.愿人生,有幸一起同行(3字中药名)天南星/猫De梦 2.分手不成聚难卜(4字谜会吐槽语)没离合谜/猫De梦 3.老做加法没益处(5字劝架结果描述)总算和好了/猫De梦 4.以前有给回扣(3字交通名词)往返点/猫De梦 5.几经流年终杳远(2字已故艺术家)朱旭/猫De梦 6.看来只好换工作了(3字口语二)顾不得,不更事/猫De梦 7.相较之下,这算挑到好的啦(4字考试答案判断语,卷帘)选正比对/猫De梦

【谜客帝国】第149届汝隅主擂谜会(2019.03.30)

[谜客帝国]第149届汝隅主擂谜会(2019.03.30) 主持:瓷    计分:雪宝 1.赞歌唱6.1(动漫人物•卷帘)哆啦美 [赞扣美,1和6唱出来是哆啦] 2.“枕前泪共阶前雨,隔着窗儿滴到明”(明人)戚继光 3.湘玉呼展堂,赶紧去上工(4字对酒介绍语,含酒名)叫老白干 4.留下雄信待聚会(金融词二)存单.通汇 5.五音未闻宫徵羽(国际事件•重门)贸易战 [注:先扣商角,重门出底] 6.殷功是否尚存生(对歌手到场情况询问语2+3)崔健在不在 [注:崔护,字殷功] 7.“孤与云长,誓同生死:

【谜客帝国】第146届千江雪主擂谜会(2019.01.30)

 [谜客帝国]第146届千江雪主擂谜会(2019.01.30) 主持:瓷   计分:雪宝 1. 几回驻马观潮起(对人评价语)没主见 2. “他年我若为青帝”(商品连价位2+2)花生一块 [注:面出黄巢<题菊花>,启下句 “报与桃花一处开”] 3. 看我横戈行天下(东北方言)大手 4. 寒梅凋谢扑满衣(对<红楼梦>人物态度)冷落花袭人 5. 挥手拢琴动凡心(诛仙小说人物)玲珑 6. “纵使相逢应不识”(3字猜不出谜原因)面太生 [面出苏轼<江城子 记梦>] 7. 松间小月

JS时间格式化出现2015-02-07 hh:12:30

1.问题背景 最近,做项目的过程中,遇到这样一个问题:利用JS对日期时间进行格式化时,页面出现了2015-02-07 hh:12:30,小时没有显示出数据:其中,hh换成HH时,有时小时位显示HH var dayTime = $("#endTime").val(); var dtime = new Date(dayTime); dtime.setTime(dtime.getTime()+365*100); var date = new Date(dtime.getTime()); $(

12.26~12.30工作日志

2016.12.26/27 1.writing-mode: vertical-rl;在电脑显示有效果,在手机端无效 解决办法:改为 -webkit-writing-mode: vertical-rl; 2.div设置inline-block之后,如果没有设置固定宽高,div内的内容将正常显示,div缩为一个点????????? 3.设置float的元素最好设置好宽度,便于控制 4.document.getElementsByClassName(classname)获取的是数组数组!!!!就算获取

2015.12.29~2015.12.30真题回顾!-- HTML5学堂

2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停哦! HTML5真题[2015.12.29]题目 学习JavaScript或应用JavaScript进行脚本开发,“变量”这是必须要学会使用的.什么是变量呢?又什么作用呢?ok,大家稍安勿躁哦,试体验体验这题目<HTML5真题[2015.12.29]题目>与 <HTML5真题[2015.12