記憶體限制: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的作用是從輸入序列中 刪除 所有相鄰的重複元素。該演算法刪除相鄰的重複元素...