題目大意:給定乙個樹,每個節點都有乙個權值,給定乙個值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向下 子結點...