CodeForces369C On Changing Tree

昨天的CF自己太挫了。一上來看到A題,就有思路,然后馬上敲,但是苦于自己很久沒有敲計數的題了,許多函數都稍微回憶了一陣子。A題的主要做法就是將每個數質因數分解,統計每個質因子的個數,對于每個質因子pi的個數k,等價于解一個方程x1+x2+...+xn=k的有多少個非負整數解,學過離散數學或者一些組合數學的就會知道,答案是C(k,n+k-1),但是由于n+k-1可能會很大,我一開始考慮小了,貢獻了好多次RE,所以在算組合數的時候只能算出每個數的階乘以及對應的逆元去算,然后將每個因子算出來的結果乘起來就可以了。

B的話寫一下就會發現很明顯的能夠裂項,所以問題就轉換成求u(n),v(n),n的大小達到10^9,但是基于素數的稠密性我們可以在有限的時間內算出來,10^11以內的相鄰素數間隔貌似是在400多還是500多,每次判素數的復雜度是根號n,所以大致找出u(n),v(n)的時間是在10^7以內,這個在CF上絕對是可以算的,知道u,v后面的就是簡單的計算一下。當然為了加快速度,可以考慮素性測試。

C的話拿到的時候時間不多了,想了一下就有了思路,但是10分鐘真的打不出來,于是就想想算了。今天才打出來的。在樹上對結點以及它的后代進行更新自然是先把這棵樹搜成dfs序列,但是像題目這種,隔一層-k的怎么辦呢? 可以考慮建兩棵線段樹,首先預處理出每棵樹的深度dep,每次更新的時候就在第一棵線段樹上每個結點加上x+k*dep[v],然后再在第二棵線段樹上加上-k。 那么詢問的時候怎么辦呢? 詢問的時候的答案就是 該結點在第一棵線段樹上的值ans1,加上在第二棵線段樹上的值ans2乘上對應結點的深度 即 ans1+ans2*dep[v]。可以優化的地方是其實并不需要建兩棵,只是一棵線段數維護兩個值而已,我寫的這份代碼很慢,1.9s,差不多都超時了,不過也沒有辦法啦。

#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;
}

?

轉載于:https://www.cnblogs.com/chanme/p/3571783.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260797.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260797.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260797.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ES6之const命令

一直以來以ecma為核心的js始終沒有常量的概念&#xff0c;es6則彌補了這一個缺陷&#xff1b; const foofoo;foobar;//TypeError: Assignment to constant variable.上例聲明了一個基本類型的常量&#xff0c;如過試圖修改初始值則會報錯&#xff1b;如果是引用類型的值同樣適用…

C++和Rust_后端程序員一定要看的語言大比拼:Java vs. Go vs. Rust

這是Java&#xff0c;Go和Rust之間的比較。這不是基準測試&#xff0c;更多是對可執行文件大小、內存使用率、CPU使用率、運行時要求等的比較&#xff0c;當然還有一個小的基準測試&#xff0c;可以看到每秒處理的請求數量&#xff0c;我將嘗試對這些數字進行有意義的解讀。為了…

Hdu 2015 偶數求和

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2040。水題。CODE&#xff1a;1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #include <math.h>5 using namespace std;6 7 const int maxn 102;8 9 int save[ma…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波11 - 直方圖處理 - 使用直方圖統計量增強圖像

使用直方圖統計量增強圖像 全局均值和方差 μn∑i0L?1(ri?m)np(ri)(3.24)\mu_{n} \sum_{i0}^{L-1} (r_{i} - m)^{n} p(r_{i}) \tag{3.24}μn?i0∑L?1?(ri??m)np(ri?)(3.24) m∑i0L?1rip(ri)(3.25)m \sum_{i0}^{L-1} r_{i} p(r_{i}) \tag{3.25}mi0∑L?1?ri?p(ri?…

數據結構 --- 堆

to be continued轉載于:https://www.cnblogs.com/zhongzhiqiang/p/5808564.html

HDU - 1723 - Distribute Message

先上題目&#xff1a; Distribute Message Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1186 Accepted Submission(s): 547 Problem DescriptionThe contest’s message distribution is a big thing in pre…

nodejs 圖片處理模塊 rotate_學會Pillow再也不用PS啦——Python圖像處理庫Pillow入門!...

你在用什么軟件進行圖像處理呢&#xff1f;厭倦了鼠標和手指的拖拖點點&#xff0c;想不想用程序和代碼進行圖像的高效處理&#xff0c;Python作為簡單高效又很強大的一門編程語言&#xff0c;對于圖像的處理自然也是輕松拿下&#xff0c;聽起來是不是很酷很極客&#xff0c;那…

創建一個追蹤攝像機(2)

為了生成曲線&#xff0c;函數需要通過4個在沿著重量值在0和1之間的路徑上連貫的位置。由于重量在這些2個值之間增加&#xff0c;曲線返回在更遠的路徑上的坐標。 當所提供的重量值為0&#xff0c;曲線將返回正確的坐標在第二個輸入坐標。當所提供的重量值為1&#xff0c;曲線將…

Xcodebuild自動打包

#! /bin/bash #firtoken 29b441056e1e17c984cb32fadadsdddd shell_dirdirname $0 TARGET_NAME"SmartLock" DIR_PATH/Users/用戶名/Desktop/SmartLock SIGN"iPhone Distribution:******" PROFILE"66d127d6-7963-4c20-ac8b-47e4f0fe8742" TEMP_DIR…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波12 - 空間域濾波基礎 - 卷積運算(numpy 實現的三種卷積運算)

這篇文章比較長&#xff0c;請耐心看空間域濾波基礎線性濾波可分離濾波器核空間域濾波和頻率域濾波的一些重要比較如何構建空間濾波器第一種卷積方法&#xff08;公式法&#xff09;第二種卷積的方法&#xff08;可分離核&#xff09;第三種方法&#xff08;img2col)這是分離核…

hdu_1861_游船出租_201402282130

游船出租 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7238 Accepted Submission(s): 2411 Problem Description 現有公園游船租賃處請你編寫一個租船管理系統。當游客租船時&#xff0c;管理員輸入船號并按…

acer清理工具 clear下載_SolidWorks綠色版下載-SolidWorks完全清理工具v1.0免費版

SolidWorks完全清理工具(SWCleanUninstall)是一款綠色免費的SolidWorks完全卸載工具。很多SolidWorks安裝不成功都是因為之前安裝錯誤做成軟件殘留。這款工具可以完全清理很多SolidWorks留下的注冊表垃圾。軟件核心功能1、SWCleanUninstall可以直接刪除電腦上的SolidWorks軟件2…

ZOJ1221 Risk 圖形的遍歷

一開始做圖形遍歷的題都是用鏈表做的&#xff0c;這次用數組體會到了方便但就是有點浪費。 不過題目給的內存限制已經足夠了。 View Code 1 #include<cstdio>2 #include<cstdlib>3 #include<cstring>4 #include<queue>5 #include<iostream>6 7 …

Android 從AndroidManifest獲取meta-data

語法如下&#xff1a; <meta-data android:name"string"android:resource"resource specification"android:value"string" /><meta-data>標簽可以作為子標簽&#xff0c;可以被包含在<activity>、<application> 、<s…

trim()函數

參數string&#xff1a;string類型&#xff0c;指定要刪除首部和尾部空格的字符串返回值String。 函數執行成功時返回刪除了string字符串首部和尾部空格的字符串&#xff0c;發生錯誤時 返回空字符串&#xff08;""&#xff09;。 如果參數值為null時&#xff0c;會拋…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波13 - 平滑低通濾波器 -盒式濾波器核

這里寫目錄標題平滑&#xff08;低通&#xff09;空間濾波器盒式濾波器核平滑&#xff08;低通&#xff09;空間濾波器 平滑&#xff08;也稱平均&#xff09;空間濾波器用于降低灰度的急劇過渡 在圖像重取樣之前平滑圖像以減少混淆用于減少圖像中無關細節平滑因灰度級數量不…

python中str用法_python數據類型之str用法

1、首字母大寫 語法&#xff1a;S.capitalize() ->str title "today is a good day"title_catitle.capitalize() print(title_ca) 結果&#xff1a;today is a good day 2、大寫轉小寫 1 語法&#xff1a;S.casefold() ->str2 3 title "TODAY is a GOOD …

WPF 窗體設置

WPF 當窗體最大化時控件位置的大小調整&#xff1a; View Code 1 <Window x:Class"WpfApplication1.MainWindow"2 xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"3 xmlns:x"http://schemas.microsoft.com/wi…

Git實踐

Git是什么自不必說。Git和gitlab安裝和實踐在后邊的倆篇中會寫。本篇僅重點寫Git自動部署。Git同樣有Hooks,可以用于各種需求。可以控制提交commit名稱&#xff0c;可以控制代碼規范&#xff0c;也當然包含以下要介紹的自動部署&#xff0c;也不僅包含這些。Git自動部署簡單的思…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波14 - 平滑低通濾波器 -高斯濾波器核的生成方法

目錄平滑&#xff08;低通&#xff09;空間濾波器低通高斯濾波器核統計排序&#xff08;非線性&#xff09;濾波器平滑&#xff08;低通&#xff09;空間濾波器 平滑&#xff08;也稱平均&#xff09;空間濾波器用于降低灰度的急劇過渡 在圖像重取樣之前平滑圖像以減少混淆用…