省選模擬賽[SHOI2017] Day2

比賽過程

17:50

  cccc來晚了來晚了gggggg….. 看了一遍題, woc今年的省選??? 感覺要gg. 怎麼一道題都沒有見過啊, 今天又要爆零啦…. 看了一遍t1, 好長啊? 所以看完了還要數據分治? 看第二題… 期望? 省選級別的期望都不簡單啊, 跪了跪了跪了…. 看第三題? dp? 100數據範圍感覺可以亂搞啊?

20:00

  想了三道題無果, 開始t1數據分治, 感覺能拿84pts? 這也不差了吧… 但是實在寫的太煩躁了決定冷靜一下, 寫完懶得編譯, 先去做其他題(千萬不要學我). 第三題看了樣例還有負數? 再看了一下數據範圍100… 這不最大權閉合子圖嗎? 這玩意沒敲過啊, 但是大概建圖我知道. 於是開始碼碼碼碼… 還是挺好寫的? 感覺建邊方式有點多啊, 有點虛? 調了一遍樣例, 死了? 檢查一下發現bfs沒pop, 老毛病了? 還死? 檢查了一下讀優發現沒判負數. 怎麼還死? 突然發現沒死原來是還可以輸入… 檢查了一下讀入發現有個地方寫錯了, 改了一下所有樣例瞬間全部過完了, 心中舒暢…dinic就是好寫啊.

21:30

  重新看t2, 感覺還是不會做, 也就沒有看部分分的數據保證(事實證明這是今日最後悔的事情). 看t1去了. 繼續修改了t1的暴力, 發現到了22:00沒調出來? 十分鐘狂飆手速一波改成低級暴力… 發現還是過不了? 心中慌.

22:10

  t1棄療, 估分100+, 考試結束.

賽後

  t3 a了, 爽歪歪. tm t1真沒分??? 我寫了那麼久的數據分治啊… 太貪心了想去拿84pts. 早知道寫個最樸素的暴力把他寫正確也很不錯啊. t2居然有n==k的時候???? 那不是倒着for一遍就有分? 瞬間敲完暴力上去發現有80pts??? woc怎麼沒有去看t2的部分數據啊我好蠢啊…

反思

  1.無論多虛都要看一下部分數據保證, 說不定能騙很多分.
  2. 寫哪道題一定要想清楚了寫, 寫就一定要寫的能得分, 要不然等於白費時間, 即使是暴力也要想清楚了再寫.

題解

分手是祝願

題解

#include<bits/stdc++.h>
using namespace std;
typedef long long lnt;
const int mod = 1e5 + 3;
const int maxn = 1e5 + 5;
int n, k, num, a[maxn];
lnt inv[maxn], b[maxn], ans;
int main() {
    inv[1] = 1;
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; ++ i) scanf("%d", &a[i]);
    for (int i = 2; i <= n; ++ i)
        inv[i] = (-(mod / i) * inv[mod % i] % mod + mod) % mod;
    for (int i = n; i; -- i)
        if (a[i]) {
            ++ num;
            for (int j = 1; j * j <= i; ++ j)
                if (i % j == 0) {
                    a[j] ^= 1;
                    if (j * j != i) a[i / j] ^= 1;
                }
        }
    for (int i = n; i; -- i) b[i] = ((n - i) * b[i + 1] % mod + n) * inv[i] % mod;
    if (k >= num) ans = num;
    else {
        b[k] = k;
        for (int i = k; i <= num; ++ i)
            ans = (ans + b[i]) % mod;
    }
    for (int i = 2; i <= n; ++ i)
        ans = ans * i % mod;
    printf("%lld\n", ans);
    return 0;
} 

壽司

#include<bits/stdc++.h>
#define deeper(a) memset(a, -1, sizeof(a))
using namespace std;
const int inf = 1e9;
const int maxm = 2e6;
const int maxn = 4e4;
queue<int> q;
long long ans;
bool vis[1005];
int n, num, S, T, cnt, m;
int h[maxn], dis[maxn], a[maxn], id[105][105], d[105][105];
struct edge {
    int nxt, v, c;
}e[maxm];
inline void add(int u, int v, int w) {
    e[++ num].v = v, e[num].nxt = h[u], e[num].c = w, h[u] = num;
    e[++ num].v = u, e[num].nxt = h[v], e[num].c = 0, h[v] = num;
}
inline const int read() {
    register int x = 0, f = 1;
    register char ch = getchar();
    while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return f * x;
}
inline bool bfs() {
    deeper(dis);
    dis[S] = 0, q.push(S);
    while (!q.empty()) {
        int u = q.front(); q.pop();
        for (int i = h[u]; i; i = e[i].nxt) {
            int v = e[i].v;
            if (dis[v] == -1 && e[i].c)
                dis[v] = dis[u] + 1, q.push(v);
        }
    }
    return dis[T] != -1;
}
inline int dfs(int u, int a) {
    if (u == T) return a;
    int f, flow = 0;
    for (int i = h[u]; i; i = e[i].nxt) {
        int v = e[i].v;
        if (dis[v] == dis[u] + 1 && e[i].c) {
            f = dfs(v, min(e[i].c, a));
            e[i].c -= f, e[i ^ 1].c += f;
            a -= f, flow += f;
            if (!a) return flow;
        }
    }
    if (!flow) dis[u] = -1;
    return flow;
}
int main() {
    freopen("sushi.in", "r", stdin);
    freopen("sushi.out", "w", stdout);
    n = read(), m = read();
    for (int i = 1; i <= n; ++ i)
        a[i] = read(), vis[a[i]] = true;
    T = cnt = 1001, num = 1;
    for (int i = 1; i <= 1000; ++ i)
        if (vis[i]) add(i, T, m * i * i);
    for (int i = 1; i <= n; ++ i)
        for (int j = i; j <= n; ++ j) d[i][j] = read(), id[i][j] = ++ cnt;
    for (int i = 1; i <= n; ++ i)
        for (int j = 1; j <= n; ++ j) {
            if (i == j)
                d[i][j] -= a[i], add(id[i][j], a[i], inf);
            if (d[i][j] > 0) {
                ans += d[i][j];
                add(S, id[i][j], d[i][j]);
            }
            if (d[i][j] < 0) add(id[i][j], T, -d[i][j]);
            if (i != j) {
                add(id[i][j], id[i + 1][j], inf);
                add(id[i][j], id[i][j - 1], inf);
            }
        }
    while (bfs()) ans -= dfs(S, inf);
    printf("%lld\n", ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章