CF1010D Mars Over 位運算性質

2022-05-01 20:12:07 字數 1593 閱讀 7884

題目鏈結

資料範圍:略。

題解

因為每次只改乙個,改完之後改回去,這個性質很重要。

發現有些葉子更改了之後,整體的答案是不變的,因為會出現:他的父親是$\&$操作但是另乙個兒子是$0$這種...

故此,我們先算出乙個節點都不更改時,每個節點的值。

之後我們通過位運算,對每乙個節點維護乙個$tag$表示這個節點更改會不會影響到根節點。

遍歷即可,細節可以看**。

**

#include #define n 1000010 

#define setio(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)

using namespace std;

char s[10];

int opt[n], val[n], ch[n][2];

bool tag[n];

char *p1, *p2, buf[100000];

#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? eof : *p1 ++ )

int rd()

while (c >= '0' && c <= '9')

return x * f;

}void dfs(int p)

else if (opt[p] == 2)

else if (opt[p] == 3)

else if (opt[p] == 4)

else

}void dfs2(int p)

if (rs)

} else

else if (opt[p] == 2)

else if (opt[p] == 3)

else if (opt[p] == 5)

else

} if (ls)

if (rs)

}int main()

if (c == 'i')

else if (c == 'n')

else if (c == 'x')

else if (c == 'a')

else

} // for (int i = 1; i <= n; i ++ )

// puts("");

dfs(1);

// for (int i = 1; i <= n; i ++ )

// puts("");

dfs2(1);

// for (int i = 1; i <= n; i ++ )

// else

// }

for (int i = 1; i <= n; i ++ )

else

} }fclose(stdin), fclose(stdout);

return 0;

}

CF 427D 字尾陣列

題意 求兩串字串的公共最短子串,且這個子串只在任意一串中出現一次 首先明確字尾陣列將所有的字尾 也可以視為第i個點開始的子串 字典序排列,將最近似的子串集合在一起。lcp求的是附近兩個子串的最長公共字首 如果某乙個子串當且僅當出現兩次,則必須是lcp i 是區域性最大。該子串最大長度為lcp i 最...

cf669d 觀察規律

jibancanyang author jibancanyang created time 一 4 25 01 45 31 2016 file name cf669d.cpp problem 觀察規律 get 有規律奇數偶數總是相互間隔,且奇數同奇數相對位置不變,偶數同偶數相對位置不變。說以還是要多...

CF915D 解題報告

此題目洛谷評分錯誤,根本沒有紫題難度。最開始的想法 列舉刪除的每一條邊,做一遍拓撲排序,最後直接暴力得出答案。但是,仔細分析時間複雜度 o m n m 根本過不去,所以想優化。我們可以發現,當有 x 條邊是指向 u 時,我們在上面的演算法流程中就會把每一條邊都列舉一次,列舉 x 次。但仔細想想,對於...