SDOI2018 榮譽稱號(樹形dp)
題目大意
給定一棵完全二叉樹,要求任意一條不拐彎長度為的鏈(即從某個點不斷往上跳次),滿足鏈上所有點的和是的倍數。
題解
考慮兩條相鄰的鏈與,由於他們的和都是的倍數,則顯然有。
也就是說我們最後只需要考慮編號的那些點。但是我們需要預處理表示點及所有需要和點相等的點,全部改成所需要的最小代價。
如果暴力的話,也就是暴力列舉再暴力列舉所有點,複雜度是的。但是我們可以把權值相同的點一起處理,具體的,令表示點及所有需要和點相等的點中,權值的所有點的單次修改代價之和。
於是我們把問題轉化為了個點,暴力列舉次,這樣就可以在的時間內解決了。當然字首和優化一下可以做到,但我懶。
然後我們就可以在只有個節點上的樹進行dp了。表示所有葉節點到的權值和均為的最小修改代價,暴力列舉當前點上的值轉移即可,複雜度。
於是整道題的複雜度就是了。
#include <bits/stdc++.h>
namespace IOStream {
const int MAXR = 1 << 23;
char _READ_[MAXR], _PRINT_[MAXR];
int _READ_POS_, _PRINT_POS_, _READ_LEN_;
inline char readc() {
#ifndef ONLINE_JUDGE
return getchar();
#endif
if (!_READ_POS_) _READ_LEN_ = fread(_READ_, 1, MAXR, stdin);
char c = _READ_[_READ_POS_++];
if (_READ_POS_ == MAXR) _READ_POS_ = 0;
if (_READ_POS_ > _READ_LEN_) return 0;
return c;
}
template<typename T> inline void read(T &x) {
x = 0; register int flag = 1, c;
while (((c = readc()) < '0' || c > '9') && c != '-');
if (c == '-') flag = -1; else x = c - '0';
while ((c = readc()) >= '0' && c <= '9') x = x * 10 + c - '0';
x *= flag;
}
template<typename T1, typename ...T2> inline void read(T1 &a, T2 &...x) {
read(a), read(x...);
}
inline int reads(char *s) {
register int len = 0, c;
while (isspace(c = readc()) || !c);
s[len++] = c;
while (!isspace(c = readc()) && c) s[len++] = c;
s[len] = 0;
return len;
}
inline void ioflush() {
fwrite(_PRINT_, 1, _PRINT_POS_, stdout), _PRINT_POS_ = 0;
fflush(stdout);
}
inline void printc(char c) {
_PRINT_[_PRINT_POS_++] = c;
if (_PRINT_POS_ == MAXR) ioflush();
}
inline void prints(char *s) {
for (int i = 0; s[i]; i++) printc(s[i]);
}
template<typename T> inline void print(T x, char c = '\n') {
if (x < 0) printc('-'), x = -x;
if (x) {
static char sta[20];
register int tp = 0;
for (; x; x /= 10) sta[tp++] = x % 10 + '0';
while (tp > 0) printc(sta[--tp]);
} else printc('0');
printc(c);
}
template<typename T1, typename ...T2> inline void print(T1 x, T2... y) {
print(x, ' '), print(y...);
}
}
using namespace IOStream;
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
#define cls(a) memset(a, 0, sizeof(a))
const int MAXN = 10000005, MAXK = 2050, MAXM = 205;
ll f[MAXK][MAXM], g[MAXK][MAXM], all[MAXK][MAXM];
int bel[MAXN], T, n, m, K, Q;
unsigned int SA, SB, SC; int pp, A, B;
unsigned int rng61(){
SA ^= SA << 16;
SA ^= SA >> 5;
SA ^= SA << 1;
unsigned int t = SA;
SA = SB;
SB = SC;
SC ^= t ^ SA;
return SC;
}
void gen(){
cls(g), cls(all), memset(f, 0x3f, sizeof(f));
read(n, K, m, pp, SA, SB, SC, A, B);
Q = (1 << (++K)) - 1;
for (int i = 1; i <= Q; i++) bel[i] = i;
for (int i = Q + 1; i <= n; i++) bel[i] = bel[i >> K];
for (int i = 1; i <= pp; i++) {
int a, b; read(a, b);
all[bel[i]][a % m] += b;
}
for (int i = pp + 1; i <= n; i++){
int a = rng61() % A + 1;
int b = rng61() % B + 1;
all[bel[i]][a % m] += b;
}
for (int i = 1; i <= Q; i++) {
for (int j = 0; j < m; j++) {
for (int k = 0; k <= j; k++) g[i][j] += all[i][k] * (j - k);
for (int k = j + 1; k < m; k++) g[i][j] += all[i][k] * (j + m - k);
}
}
}
inline void upd(ll &x, ll y) { x = min(x, y); }
int main() {
for (read(T); T--;) {
gen();
for (int i = Q; i > 0; i--) {
int ls = i << 1, rs = i << 1 | 1;
if (ls > Q) for (int j = 0; j < m; j++) f[i][j] = g[i][j];
else if (rs > Q) {
for (int j = 0; j < m; j++)
for (int k = 0; k < m; k++)
upd(f[i][(j + k) % m], f[ls][k] + g[i][j]);
} else {
for (int j = 0; j < m; j++)
for (int k = 0; k < m; k++)
upd(f[i][(j + k) % m], f[ls][k] + f[rs][k] + g[i][j]);
}
}
printf("%lld\n", f[1][0]);
}
return 0;
}
相關文章
- SDOI2018:榮譽稱號
- 樹形DP
- 樹形DP!
- 樹上染色(樹形dp)
- [筆記]樹形dp筆記
- 樹形DP二三知識
- 樹上的等差數列 [樹形dp]
- [樹形dp][HAOI2015]樹上染色
- HDU 6035 Colorful Tree(樹形DP)
- CF1039D You Are Given a Tree (樹形 dp + 貪心 + 根號分治)
- 熟練剖分(tree) 樹形DP
- UVA 1220 Party at Hali-Bula (樹形DP)
- cf633F. The Chocolate Spree(樹形dp)
- BZOJ 4726 [POI2017]Sabota?:樹形dp
- CCF之網路延時(樹形dp)
- 真實力好口碑!Fortinet又雙叒叕獲評Gartner“客戶之選”榮譽稱號
- 【BZOJ3743】[Coci2015]Kamp 樹形DP
- 【動態規劃】樹形DP完全詳解!動態規劃
- ZROJ#398. 【18提高7】隨機遊走(期望dp 樹形dp)隨機
- E73 樹形DP P3177 [HAOI2015] 樹上染色
- Luogu P3177 樹上染色 [ 藍 ] [ 樹形 dp ] [ 貢獻思維 ]
- SDOI2018 原題識別(主席樹)
- CF 1029E Tree with Small Distances 樹形DP or 貪心
- bzoj1060: [ZJOI2007]時態同步(樹形Dp)
- vxe-table 樹形表格序號的使用
- NOIP2024集訓Day23 DP常見模型4 - 樹形模型
- 樹:基本樹形
- E62 樹形DP P8677 [藍橋杯 2018 國 A] 採油
- bzoj2427: [HAOI2010]軟體安裝(強聯通+樹形Dp)
- 喜報 | 北京智和信通喜獲中國網路安全產業聯盟“2021 年度先進會員單位”榮譽稱號產業
- 雷霆遊戲代理《榮譽指揮官》 ,不限號測試4月27日開啟遊戲
- 二叉搜尋樹 [四邊形不等式優化區間dp]優化
- Luogu P11363 NOIP2024 樹的遍歷 題解 [ 紫 ] [ 樹形 dp ] [ 組合計數 ] [ adhoc ]
- 榮譽 | 為2020年的榮耀加冕,開啟2021年新篇章!
- [推薦]看雪勳章及榮譽體系
- 中科三方榮獲2021年“海淀區誠信單位”稱號
- 樹形結構
- 這項國家級榮譽緣何花落寧波