2019 12 12 C 點分治 去重

2021-10-01 15:00:16 字數 2181 閱讀 3852

記憶體限制:256 mib時間限制:1000 ms

題目描述

給定一棵有n個節點的無根樹,樹上的每個點有乙個非負整數點權。定義一條路徑的價值為路徑上的點權和-路徑上的點權最大值。 給定引數p,我!=們想知道,有多少不同的樹上簡單路徑,滿足它的價值恰好是p的倍數。 注意:單點算作一條路徑;u!=v時,(u,v)和(v,u)只算一次。

輸入格式

第一行包含兩個整數n,p,意義見題面描述。 接下來n-1行,每行兩個整數u,v,表示一條樹邊。 接下來一行n個整數,第i個整數vali表示點i的權值。

輸出格式

輸出包含一行乙個整數,表示答案。

樣例樣例輸入

5 2

1 21 3

2 43 5

1 3 3 1 2

樣例輸出

9
資料範圍與提示

滿足條件的路徑有(1,1),(2,2),(3,3),(4,4),(5,5),(1,4),(2,3),(2,5),(3,5)

評分方式

本題共有25個測試點,每個測試點滿分為4分,不設定部分分;

對每個測試點,如果你的程式答案正確,得滿分,否則得0分。

對所有測試點,我們有:

性質a:保證樹上不存在度數大於2的點。

性質b:樹的形態通過以某個點為根,其他點依次「隨機父親」生成。

資料有一定梯度。

上一次寫點分治是在5個月前。。。。學會了就丟掉了

慢慢地該把點分治的東西撿回來了。。。。

考場上只想到了序列分治+單調佇列,然後就沒有看那個p<=10^7的條件,於是寫了個map。。。

好好的乙個nlogn就變成了nlognlogn。。。

其實用乙個桶就可以了

先來講一下序列分治的做法吧。

乙個序列,按中點分治,兩邊分別做一次單調佇列,然後就像歸併排序一樣,看哪邊小就加哪邊的答案,依次遞增的加入點值

統計答案的時候就是計算另外一邊的滿足條件的數的個數,這個用兩個桶就可以了:

56分**:

#include#include#include#includeusing namespace std;

inline int gi()

return num****;

}#define n 100005

#define inf 0x3f3f3f3f

int n,mod;

int a[n],b[n],ct,d[n];

int s1[n],s2[n],top1,top2;

int mp1[10000005],mp2[10000005];

int fir[n],to[2*n],nxt[2*n],cnt;

long long ans;

void adde(int a,int b)

void force(int u,int ff,int sum,int mx)

}void dfs(int u,int ff)

void fz(int l,int r)

int mid=(l+r)>>1;

fz(l,mid);fz(mid+1,r);

top1=top2=0;

s1[++top1]=inf;s2[++top2]=inf;

for(int i=l;i<=mid;i++)

for(int i=r;i>mid;i--)

int sum1=0,sum2=0,l=mid,r=mid+1,mx;

while(top1&&top2)

int main()

return num****;

}#define n 100005

long long ans;

int a[n],siz[n],mi,rt;

int tmp[n],mx[n],sum[n],con[10000005],tot,mod;

int fir[n],to[2*n],nxt[2*n],cnt;

bool vis[n];

void adde(int a,int b)

void dfs1(int u,int ff,int all)

} tmx=max(tmx,all-siz[u]);

if(tmx這應該是乙個點分治裸題啊啊啊啊啊啊啊啊啊啊啊!!!!!

我太菜了,點分治忘完了。。。

20191212 C 簡單點分治

給定一棵有n個節點的無根樹,樹上的每個點有乙個非負整數點權。定義一條路徑的價值為路徑上的點權和 路徑上的點權最大值。給定引數p pp,我們想知道,有多少不同的樹上簡單路徑,滿足它的價值恰好是p pp的倍數。注意 單點算作一條路徑 u vu v u v 時,u,v u,v u,v 和 v,u v,u ...

C 陣列去重

比如我們有這樣乙個陣列 string array 去重後的陣列 array 方法名 delarraysame 功能 刪除陣列中重複的元素 所要檢查刪除的陣列 返回陣列 public string delarraysame string temparray string newstr string n...

c語言陣列去重

今天在做題的時候需要用的陣列去重的演算法,本人又太懶,在網上看到有標準庫函式來解決這個問題,今天和大家分享一下。這個神奇的函式就是unique函式,現在我們來介紹一下unique函式 unique函式 類屬性演算法unique的作用是從輸入序列中 刪除 所有相鄰的重複元素。該演算法刪除相鄰的重複元素...