CodeForces369C On Changing Tree
昨天的CF自己太挫了。一上來(lái)看到A題,就有思路,然后馬上敲,但是苦于自己很久沒(méi)有敲計(jì)數(shù)的題了,許多函數(shù)都稍微回憶了一陣子。A題的主要做法就是將每個(gè)數(shù)質(zhì)因數(shù)分解,統(tǒng)計(jì)每個(gè)質(zhì)因子的個(gè)數(shù),對(duì)于每個(gè)質(zhì)因子pi的個(gè)數(shù)k,等價(jià)于解一個(gè)方程x1+x2+...+xn=k的有多少個(gè)非負(fù)整數(shù)解,學(xué)過(guò)離散數(shù)學(xué)或者一些組合數(shù)學(xué)的就會(huì)知道,答案是C(k,n+k-1),但是由于n+k-1可能會(huì)很大,我一開(kāi)始考慮小了,貢獻(xiàn)了好多次RE,所以在算組合數(shù)的時(shí)候只能算出每個(gè)數(shù)的階乘以及對(duì)應(yīng)的逆元去算,然后將每個(gè)因子算出來(lái)的結(jié)果乘起來(lái)就可以了。
B的話寫(xiě)一下就會(huì)發(fā)現(xiàn)很明顯的能夠裂項(xiàng),所以問(wèn)題就轉(zhuǎn)換成求u(n),v(n),n的大小達(dá)到10^9,但是基于素?cái)?shù)的稠密性我們可以在有限的時(shí)間內(nèi)算出來(lái),10^11以?xún)?nèi)的相鄰素?cái)?shù)間隔貌似是在400多還是500多,每次判素?cái)?shù)的復(fù)雜度是根號(hào)n,所以大致找出u(n),v(n)的時(shí)間是在10^7以?xún)?nèi),這個(gè)在CF上絕對(duì)是可以算的,知道u,v后面的就是簡(jiǎn)單的計(jì)算一下。當(dāng)然為了加快速度,可以考慮素性測(cè)試。
C的話拿到的時(shí)候時(shí)間不多了,想了一下就有了思路,但是10分鐘真的打不出來(lái),于是就想想算了。今天才打出來(lái)的。在樹(shù)上對(duì)結(jié)點(diǎn)以及它的后代進(jìn)行更新自然是先把這棵樹(shù)搜成dfs序列,但是像題目這種,隔一層-k的怎么辦呢? 可以考慮建兩棵線段樹(shù),首先預(yù)處理出每棵樹(shù)的深度dep,每次更新的時(shí)候就在第一棵線段樹(shù)上每個(gè)結(jié)點(diǎn)加上x(chóng)+k*dep[v],然后再在第二棵線段樹(shù)上加上-k。 那么詢(xún)問(wèn)的時(shí)候怎么辦呢? 詢(xún)問(wèn)的時(shí)候的答案就是 該結(jié)點(diǎn)在第一棵線段樹(shù)上的值ans1,加上在第二棵線段樹(shù)上的值ans2乘上對(duì)應(yīng)結(jié)點(diǎn)的深度 即 ans1+ans2*dep[v]??梢?xún)?yōu)化的地方是其實(shí)并不需要建兩棵,只是一棵線段數(shù)維護(hù)兩個(gè)值而已,我寫(xiě)的這份代碼很慢,1.9s,差不多都超時(shí)了,不過(guò)也沒(méi)有辦法啦。
#pragma warning(disable:4996) #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cstdio> #include<vector> #include<cmath> #include<map> #define maxn 300500 #define ll long long #define mod 1000000007 using namespace std;struct Node {int l, r;ll add, sum; };struct SegmentTree {Node N[4 * maxn];void build(int i, int L, int R){N[i].l = L; N[i].r = R; N[i].sum = N[i].add = 0;if (L == R){return;}int M = (L + R) >> 1;build(i << 1, L, M);build(i << 1 | 1, M + 1, R);}void pushDown(int i){ll tt = N[i].add;if (N[i].l == N[i].r) return;if (tt != 0){(N[i << 1].add += tt) %= mod;(N[i << 1 | 1].add += tt) %= mod;(N[i << 1].sum += (N[i << 1].r - N[i << 1].l + 1)*tt%mod) %= mod;(N[i << 1 | 1].sum += (N[i << 1 | 1].r - N[i << 1 | 1].l + 1)*tt%mod) %= mod;N[i].add = 0;}}void pushUp(int i){N[i].sum = (N[i << 1].sum + N[i << 1 | 1].sum) % mod;}void add(int i, int L, int R, ll s){if (N[i].l == L&&N[i].r == R){(N[i].add += s) %= mod;(N[i].sum += (R - L + 1)*s) %= mod;return;}pushDown(i);int M = (N[i].l + N[i].r) >> 1;if (R <= M) add(i << 1, L, R, s);else if (L > M) add(i << 1 | 1, L, R, s);else add(i << 1, L, M, s), add(i << 1 | 1, M + 1, R, s);pushUp(i);}ll query(int i, int L, int R){if (N[i].l == L&&N[i].r == R){return N[i].sum;}pushDown(i);int M = (N[i].l + N[i].r) >> 1;if (R <= M) return query(i << 1, L, R);else if (L > M) return query(i << 1 | 1, L, R);else return query(i << 1, L, M) + query(i << 1 | 1, M + 1, R);//pushUp(i);} }st[2];int n; vector<int> G[maxn]; int dep[maxn]; int pre[maxn]; int post[maxn]; int dfs_clock;void dfs(int u, int fa,int d) {pre[u] = ++dfs_clock;dep[u] = d;for (int i = 0; i < G[u].size(); i++){int v = G[u][i];if (v == fa) continue;dfs(v, u, d + 1);}post[u] = dfs_clock; }int main() {while (cin >> n){for (int i = 0; i <= n; i++) G[i].clear();int vi;for (int i = 2; i <= n; i++){scanf("%d", &vi);G[vi].push_back(i);G[i].push_back(vi);}dfs_clock = 0;dfs(1, -1, 0);st[0].build(1, 1, n); st[1].build(1, 1, n);int q; scanf("%d", &q);ll vq, xq, kq;int tq;for (int i = 0; i < q; i++){scanf("%d", &tq);if (tq == 1){scanf("%I64d%I64d%I64d", &vq, &xq, &kq);st[0].add(1, pre[vq], post[vq], (xq + dep[vq] * kq)%mod);st[1].add(1, pre[vq], post[vq], -kq);}else{ll ans = 0; scanf("%d", &vq);ans = (ans + st[0].query(1, pre[vq], pre[vq])) % mod;ans = (ans + st[1].query(1, pre[vq], pre[vq])*dep[vq]) % mod;ans = (ans + mod) % mod;printf("%I64d\n", ans);}}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/chanme/p/3571783.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的CodeForces369C On Changing Tree的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OpenCV之图像归一化(normali
- 下一篇: HDU - 1723 - Distrib