hdoj 4358 樹的線性化,樹狀陣列,離散化

2021-06-18 06:56:21 字數 1230 閱讀 9385

題目大意:給定乙個樹,每個節點都有乙個權值,給定乙個值k,有q次詢問,試求以節點x為根的子樹中每個節點的權值數相同恰好出現k次的數目。

組隊訓練的時候,鋼牛和冰姐都沒有研究這道題,我還看錯了一次,反正是比賽的時候沒有什麼思路的啊!

對於每次的詢問進行r從小到大進行排序,遍歷線性陣列,對於第i個數x,如果還沒有出現k次則不操作,若恰好出現k次,則對其第0出現所在的位置進行+1,更新操作,如果出現大於k次,假設出現了n次,則對其n-k-1進行-2的更新操作,因為乙個-1是為了抵消之前為k時加的1,還有乙個是為了當l小於次值時進行抵消的,然後對於n-k進行+1更新操作,對於每次詢問,結果為sum(r)-sum(l-1);

下面是**:

#pragma comment(linker, "/stack:102400000,102400000")

#include#include#include#include#include#include#includeusing namespace std;

#define rep(i,n) for(int i=0; i<(n); ++i)

#define repf(i,n,m) for(int i=(n); i<=(m); ++i)

#define repd(i,n,m) for(int i=(n); i>=(m); --i)

#define n 100005

int v[n];

int g[n];

vectorvec[n];

int n,m,len,q;

int lson[n],rson[n];

int b[n];

int dp[n];

int ans[n];

struct node;

node a[n];

void dfs(int s,int fa)//l和r分別指的是問的數的左右的

}bool cmp(const node a,const node b)

int main()

sort(a,a+q,cmp);

repf(i,0,n) vec[i].clear();

int l=0;

repf(i,1,n)

while(a[l].r==i && l

最近為區域賽做準備,已經開始組隊訓練,和鋼牛和冰姐組隊,鋼牛的能力很強,只不過最近狀態不是怎麼好啊!冰姐是樂天派,可以帶動氣氛,並且怎麼說都比我厲害,我本來就很想和他們兩個,貌似有點抱大腿哎!算了,廢話不多說,做好自己的就高興了,是不?

hdoj1540 線段樹的表示

大牛blog 這題的題解寫給自己看 總結 瞎扯一點 之前只會思考,len,sum,然後gg,如果只是sum和len的去用的話,就是在mid的時候會gg。然後這次也是參考大牛的寫法,其實還是蠻簡單的,寫完以後覺得。直接搞兩個左邊連續,右邊連續,然後區間最大,直接弄弄就好了,但是具體實現,如果沒有很多的...

HDOJ 1512 幾乎模板的左偏樹

題目大意 有n個猴子。每個猴子有乙個力量值,力量值越大表示這個猴子打架越厲害。如果2個猴子不認識,他們就會找他們認識的猴子中力量最大的出來單挑,單挑不論輸贏,單挑的2個猴子力量值減半,這2撥猴子就都認識了,不打不相識嘛。現在給m組詢問,如果2只猴子相互認識,輸出 1,否則他們各自找自己認識的最牛叉的...

hdoj2196(樹形dp,樹的直徑)

題意 給出一棵樹,求每個結點可以到達的最遠距離。思路 如果求得是樹上最長距離,兩次bfs就行。但這裡求的是所有點的最遠距離,樹形dp的經典題,想了乙個小時,還是dp做得太少。分析可得對任意結點u,它的最長距離要麼是向下延伸的最長距離,要不向上延伸的最長距離。我們用dp u 0 表示節點u向下 子結點...