非正解二維莫隊碾過
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...