bzoj3573 Hnoi2014 公尺特運輸

2022-05-15 05:53:30 字數 2785 閱讀 4646

好吧,雖然這是day1最後一題,但卻是最水的一題。。。。(前提:看懂題目)

仔細看題!

仔細看題!

仔細看題!

看懂題後就知道設第$i$個點的兒子節點的個數為$degree[i]$,容量為$a[i]$,我們要修改最少的點的容量,使得每個點$i$的兒子的容量均為$\frac$

我們發現如果乙個點的容量是確定的,那麼整個樹的容量都是確定的

我們記第$i$個點的所有祖先的$degree$的乘積為$p[i]$,如果第$i$個點無需修改,那麼根結點的容量應該為$p[i]*a[i]$

我們要找到最多的點使得$p[i]*a[i]$相同即可

用乙個map維護即可

但是$p[i]$有可能非常大,我們雜湊一下即可

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include適用於cf,uoj,但不適用於poj

using

namespace

std;

typedef

long

long

ll;typedef

double

db;typedef pair

pii;

typedef pair

pdd;

typedef complex

cp;typedef vector

vi;#define mmst(a,v) memset(a,v,sizeof(a))

#define mmcy(a,b) memcpy(a,b,sizeof(a))

#define fill(a,l,r,v) fill(a+l,a+r+1,v)

#define re(i,a,b) for(i=(a);i<=(b);i++)

#define red(i,a,b) for(i=(a);i>=(b);i--)

#define fi first

#define se second

#define mp(a,b) make_pair(a,b)

#define pb(a) push_back(a)

#define sf scanf

#define pf printf

#define two(k) (1<

#define sz(x) (int(x.size()))

#define all(x) (x).begin(),(x).end()

#define ire(i,v,x) for(i=0,v=itemplate

inline t sqr(t x)

template

inline void upmin(t &t,t tmp)

template

inline void upmax(t &t,t tmp)

inline

int sgn(db x)

const db pi=acos(-1.0

);int

gint()

for(;z!=eof && isdigit(z);res=res*10+z-'

0',z=getchar());

return (neg)?-res:res;

}ll gll()

for(;z!=eof && isdigit(z);res=res*10+z-'

0',z=getchar());

return (neg)?-res:res;

}const

int maxn=501000

;const ll mod=;

typedef map

,ll>,int>mlll;

intn;

inta[maxn];

ll p[maxn][3];

mlll s;

intnow,info[maxn];

struct tedgeedge[2*maxn];

intdegree[maxn];

intfa[maxn],head,tail,que[maxn];

void addedge(int u,int v);info[u]=now;}

intmain()

re(i,

2,n)degree[i]--;

que[head=tail=1]=1

; re(j,

0,2)p[1][j]=1

;

while(head<=tail)

}re(i,

1,n)re(j,0,2)p[i][j]=p[i][j]*ll(a[i])%mod[j];

re(i,

1,n)s[mp(mp(p[i][0],p[i][1]),p[i][2])]++;

int ans=0

;

for(mlll::iterator it=s.begin();it!=s.end();it++)upmax(ans,it->se);

ans=n-ans;

cout

return0;

}

view code

bzoj 3573 Hnoi2014 公尺特運輸

題目好難懂。簡述題意 給出一棵樹,要求滿足兩個要求 1.每個節點的子節點權值相等。2.每個節點的權值和是這個節點的權值。然後就出最小修改點的數量來滿足這個要求。那麼顯而易見只要確定乙個節點就可以確定群圖節點權值。這樣列舉是 通過這個結論我們發現只要確定1就可以確定全圖,所以可以通過讓每乙個節點權值不...

BZOJ 3573 Hnoi2014 公尺特運輸

bzoj 3573 hnoi2014 公尺特運輸 樹形dp hash 題意 給你一棵樹每個點有乙個權值,要求修改最少的權值,使得每個節點的權值等於其兒子的權值和且兒子的權值都相等。分析 首先我們發現在樹中如果確定乙個點的權值,那麼整顆樹的方案就能夠確定 問題轉化成求哪個方案包含的點最多 如何求包含這...

BZOJ3573 Hnoi2014 公尺特運輸

作者部落格 正解 排序 分析 解題報告 題目給出的各項約束條件,其實就是想告訴我們乙個這樣的模型 每個點的權值 父親節點的權值 父親節點的兒子節點個數,修改盡量少的點權使得滿足要求。然後可以發現,只要確定了乙個點填什麼,整棵樹的點權其實就唯一確定了 考慮兩個點 u v 令 dis x x走到根需要乘...