官方題解看了半天硬是沒懂…最後自己琢磨出來了。 這題主要是二進位制的思想,因為異或是按位運算,可以把每個數按照二進位制拆成若干個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...