codeforces 766E 二進位制思想dp

2021-07-26 21:54:48 字數 921 閱讀 7195

官方題解看了半天硬是沒懂…最後自己琢磨出來了。 這題主要是二進位制的思想,因為異或是按位運算,可以把每個數按照二進位制拆成若干個0和1,對每個」位」建樹,然後用動態規劃的思想求和。

具體實現方法:

以1為根建dfs樹。想象從1到乙個葉節點的一條路,又有1到另乙個葉節點的一條路。假設我們暴力做,那答案裡肯定得分別把這兩個結果算出來加進去。那我們現在動態規劃,就是盡量找到這兩條路的公共部分,然後只算一次(就可以節約時間)。那麼怎麼找到這個公共部分呢?第一步是把複雜的路簡單化:先是用二進位制的方式把每個數按位拆開,這樣一條路就變成了logn條路,每條上面都只有0和1。第二步就是合併。就比方說剛才的那條路,是從1到2再到3。算它,那就得先算1到2的路(a^b^c=(a^b)^c),而1到2的路本來也是要算的。那我們就把它合併成個1到2的加上個2到3的。到底有幾個?找個遞推關係dp推一下就知道了唄。我的**裡dp[n][i][j]表示的是從第n個節點開始的,二進位制第i為的結果是j的路的總條數,當然也可以選擇別的。

以下是ac**。

#include

#include

#include

using

namespace

std;

const

int maxn=100010;

int n,s[maxn];

long

long dp[maxn][20][2],ans;

int nxt[maxn*2],to[maxn*2],fst[maxn],cnt;

void dfs(int now,int pre)

}}int main()

dfs(1,1);

printf("%i64d",ans);

return

0;}

Codeforces 766 個人總結

題目鏈結 a.mahmoud and longest uncommon subsequence 思維題。當且僅當a b時輸出 1 不然輸出a,b中最長的那個。可以這麼理解,如果a,b不相等,假設strlen a strlen b 那我將a作為乙個串去和b比較,一定是不同字串。b.mahmoud an...

CodeForces 551E 二分查詢

題目鏈結 題目大意 給乙個數量級為5 10 5的long long陣列,進行5 10 4次操作,操作分為兩種 1 令序號在 l,r 區間的數值增加x 2 找到陣列內等於y值的兩個數的最大距離 主要思想 分塊 二分查詢 每sqrt n 個數分一組 塊 include using namespace s...

Codeforces 976E 題解報告

1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...