1126考試總結

2022-05-07 17:27:14 字數 3042 閱讀 8724

​ 題目大意 :

​ 給定乙個\(n * n\)的矩形, 有\(m\)次操作\((r, c, l, s)\), 表示給左上端點為\((r, c)\), 右下端點為\((r + l - 1, c + l - 1)\), 左下端點為\((r + l - 1, c)\)的等腰直角三角形內所有的格仔都加上\(s\).求最後所有格仔的異或和.每個格仔一開始都是0;

​ \(n <= 1000, m <= 300000, s <= 1e9\)

​ 差分 + 二維字首和.

​ 暴力加肯定是不行的, 我們考慮差分.

​ 我們分別用\(a, b\)表示縱向的和斜著的差分陣列. 對於乙個操作\((r,c,l,s)\) :

​ \(a[r][c] += s\ \ \ a[r + l][c] -= s\)

​ \(b[r][c + 1] += s\ \ \ b[r + l][c + l + 1] -= s\)

​ 然後字首和一下, 只不過\(b\)比較特殊:\(b[i][j] += b[i- 1][j- 1]\)

​ 最後統計答案的時候 : \(sum[i][j] += sum[i][j - 1] + a[i][j] - b[i][j]\).(好吧我還不透徹)

#include using namespace std;

char buf[1 << 20 | 1] , *f1 = buf, *f2 = buf, pbuf[1 << 24 | 1], *f3 = pbuf, sta[1 << 10 | 1];

#define getchar() ((f1 == f2) && (f2 = (f1 = buf) + fread(buf, 1, sizeof buf, stdin), f1 == f2) ? eof : *f1 ++)

inline long long read()

const int n = 1003;

long long a[n][n], b[n][n], sum[n][n];

int main()

for(register int j = 1;j <= n; ++ j)

for(register int i = 1;i <= n; ++ i) a[i][j] += a[i - 1][j];

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

for(register int j = 1;j <= n; ++ j) b[i][j] += b[i - 1][j - 1];

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

for(register int j = 1;j <= n; ++ j) sum[i][j] += sum[i][j - 1] + a[i][j] - b[i][j];

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

for(register int j = 1;j <= n; j++) ans ^= sum[i][j];

printf("%lld\n", ans);

return 0;

}

​ 題目大意 :

​ 有一顆\(n\)個節點的樹, 一開始所有點都是白點, 每個點都有乙個權值\(val_i\). 有兩種操作(共有\(m\)次):

​ modify x : 把\(x\)改為黑點.

​ query x : 查詢點\(x\)與其他黑點的lca的最大權值是多少.

​ \(n <= 1e5, m <= 2e5\)

​ dfs序 + 線段樹.

​ 假設當前把\(x\)從白色變到黑色, 很明顯, \(x\)的子樹內的所有節點的答案都可以是\(x\)(\(x\)與子樹內的點的lca為\(x\)), 讓子樹內的所有節點的答案都與\(val_x\)取\(max\)就好了.

​ 然後我們考慮這個點還可以對那些點有貢獻. 答案是它祖先的別的子樹裡的點.假設\(fa\)是\(x\)的乙個祖先, 其中的乙個子樹包含節點\(x\), 那麼\(x\)與\(fa\)其他子樹內的點的lca就是\(fa\), 那麼其他子樹內的點的答案可以與\(val_\)取\(max\).

​ 然後我們可以知道每個點作為lca取更新其他點的機會最多只有1次, 再多就沒用啦.所以這裡可以大大減少複雜度.

​ 具體思路就是這樣, 我們還需要用dfs把更新一顆子樹變成區間操作, 然後用線段樹維護一下答案就可以了.

#include #define ls(o) (o << 1)

#define rs(o) (o << 1 | 1)

#define mid ((l + r) >> 1)

using namespace std;

inline long long read()

const int n = 1e5 + 5;

int n, m, cnt, tot;

char s[10];

int a[n], fa[n], siz[n], dfn[n], vis[n], tag[n << 2], max[n << 2], head[n];

struct edge e[n << 1];

void add(int x, int y)

void get_tree(int x, int fa)

}void build(int o, int l, int r)

void modify(int o, int val)

void down(int o)

void change(int o, int l, int r, int x, int y, int val)

down(o);

if(x <= mid) change(ls(o), l, mid, x, y, val);

if(y > mid) change(rs(o), mid + 1, r, x, y, val);

}void change(int x, int y, int v)

void change(int x)

}int query(int o, int l, int r, int x)

int main()

return 0;

}

考試總結 CQOI2017 考試總結

再奮鬥一年,爭取ak noip2016 cqoi2017 這是去年我立的flag。看考場,電腦挺快,而且配置和評測機一樣,可以放心的在自己的電腦上卡常測試啦,好評。碼了一道fft的題,沒網只好拷著回家交,鍵盤蜜汁小,enter佔據了兩行,旁邊還有關機按鈕。座位安排奧妙重重,和巴蜀dyf大神坐在一起。...

MBA考試總結

終於考完了 mba入學統考,兩年來參加了兩次,感覺還是挺辛苦和有壓力的。第一年沒有通過是因為之前了解太遲,大概準備了 20天左右,最後還是功成垂敗。09年其實也一直沒有心情複習的,逼到最後的 20天,狠了一把勁,還是狠狠的複習了幾天,貌似今年應該可以通過了。總結經驗如下 1 如果你決定去做一件事,請...

2016 7 14考試總結。

今天的考試,總的來說不難,但是考得很差,簡直 從中暴露出對知識的掌握不牢固,練習不夠等問題。1.求 方程x1 2x2 nxn m的所有非負整數解 x1,x2,xn 的個數。這個題目在加上取餘運算後就是乙個貨幣系統的問題。也就是揹包。難以接受自己連這是個揹包問題都沒看出來。3 2.其實邪狼王的貪婪也很...