題目大意 :
給定乙個\(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.其實邪狼王的貪婪也很...