聯賽模擬測試18 A 施工未補

2022-01-12 07:20:06 字數 3728 閱讀 8251

非正解二維莫隊碾過

vegetable

#include #include #include #include #include #define int long long

using namespace std;

inline int read()

inline void write(register int x)

int s1, s2;

const int ss = 205;

struct node

}q[1000005];

int a[ss][ss], b[40005], cnt, s[40005], sum, ans[1000005];

inline int binary_search(register int x)

return l;

}inline void add1(register int u, register int l, register int r)

}inline void add2(register int u, register int l, register int r)

}inline void del1(register int u, register int l, register int r)

}inline void del2(register int u, register int l, register int r)

}signed main();

sort(q + 1, q + 1 + q);

register int lx = 1, ly = 1, rx = 1, ry = 1;

s[a[1][1]] = 1, sum = 1;

for(register int i = 1; i <= q; i++)

for(register int i = 1; i <= q; i++)

cout << ans[i] << '\n';

return 0;

}

真的寫吐了

改了四節課

昨天下午出了第乙個部分分的時候激動的差點哭了出來

草然後今天上午才把\(60pts\)完完整整碼完

滿分做法是\(o(n)\)處理樹及子樹的直徑

然而感覺實現有點困難

啊不是的確困難

寫不出來惹

回頭再說

leaque

/* cinput

41 2

2 33 4

*/#include #include #include #include #define min(a, b) (a) < (b) ? (a) : (b)

using namespace std;

inline int read()

inline void write(register int x)

const int ss = 300010;

struct nodeedge[ss << 1];

int head[ss], tot = 1;

inline void add(register int u, register int v)

bool vis[ss << 1];

int dis[ss], fa[ss], from, to, id, maxx, dep[ss];

inline void dfs(register int u, register int f)

}inline void diameter(register int u){}

inline int jump(register int u, register int d)

inline int getlen(register int id)

int a[ss], cnt;

signed main()

register int ans = 0x7fffffff;

for(register int i = 2; i <= tot; i += 2)

write(ans), puts("");

write(cnt), printf(" ");

for(register int i = 1; i <= cnt; i++)

write(a[i]), printf(" ");

puts("");

register int id = 2 * a[1];

register int u = edge[id].from;

register int v = edge[id].to;

write(u), printf(" "), write(v), printf(" ");

vis[id] = vis[id ^ 1] = 1;

memset(dis, 0, sizeof dis); to = 0;

maxx = -1; dfs(u, u);

from = to;

memset(dis, 0, sizeof dis);

maxx = -1, dfs(to, to);

register int getdis = dis[to];

register int depp = -1;

register int skip = 0;

if(depp < dep[from]) depp = dep[from], skip = from;

if(depp < dep[to]) depp = dep[to], skip = to;

write(jump(skip, getdis + 1 >> 1)), printf(" ");

memset(dis, 0, sizeof dis); to = 0;

maxx = -1, dfs(v, v);

from = to;

memset(dis, 0, sizeof dis);

maxx = -1, dfs(to, to);

getdis = dis[to];

depp = -1;

if(depp < dep[from]) depp = dep[from], skip = from;

if(depp < dep[to]) depp = dep[to], skip = to;

write(jump(skip, getdis + 1 >> 1)), printf(" ");

return 0;

}

最簡單的一道了吧。。。

然而考場只有可憐巴巴的\(40pts\)暴力分

尺取法每次詢問當中\(o(n)\)掃一遍

對左右端點進行擴充套件

drop

#include #include #include #include #define min(a, b) (a) < (b) ? (a) : (b)

using namespace std;

inline int read()

inline void write(register int x)

const int ss = 200005;

int d[ss], cnt[ss], kill[ss];

signed main()

register int l = 1, r = 1, tmp = 0;

while(l <= r && r <= n)

if(ans == 0x7fffffff) puts("destroy all");

else write(ans), puts("");

} return 0;

}

聯賽模擬18 聯盟

沒有用 o n 的做法,是 o nlogn 的線段樹維護直徑 o n 的需要維護的資訊我覺得又多又亂 將樹的節點按 dfs 序建線段樹維護聯通塊的直徑 列舉每一條邊,檢視刪掉它之後,剩餘的兩個聯通塊合併後的直徑 所能取到的 最小的最大值 即 最小的 len max frac 1 l 1和l 2 是兩...

聯賽模擬測試34

考場打表 rand 正解可以根據乙個倍數往上翻 如果乙個數b是a的n倍,那麼b可以由a貼上n次得到 開乙個佇列按照每個因數倍增幾次取最小即可 藍書原題 csp考試之前還看來著 然後考場假了 打了暴力滾粗 下來之後一點就透了 等比數列求和 對於唯一一組hack資料 是mod完階乘出0了 特判一次直接往...

聯賽模擬測試33

區間dp g i j 表示從第i位到第j位中間有多少不重複出現的數字 f i j 表示合併i到j能獲得的收益之和 特隊兒在寫的時候 正序遍歷掛成零分 原來是沒有學習經驗 還是要注意遍歷方法 眾所周知,乙個合格的oier不僅要會數奧,物奧,生奧 甚至還要會一點點美術 考試的時候畫了好久 打表拿到了 5...