AGC047 簡要題解

2022-05-11 14:05:36 字數 2530 閱讀 4968

注意精度問題即可

建顆 trie 樹搞一搞即可

考慮用原根解決此問題,乘法變為了加法,因此用桶記錄一下 fft 即可

觀察題目性質容易發現樹高事 \(\log n\) 的,即使是暴力列舉第一棵樹最淺的點複雜度也正確。

因此就暴力列舉,那麼一條合法的路徑肯定是分別走向兩個兒子的,考慮從左兒子走到第二棵樹每個節點的貢獻,然後再走右兒子找交集即可,注意在更深處有了交集要把父親的貢獻減掉。

好題!用兩個簡單運算構建起更複雜到操作!

首先你只能有 加 和 比較 兩種運算,實現乘法運算。

首先造出 1,\(1 = 0 < (a+b)\) 如果 \(a = b = 0\) 顯然陣列所有的數都是 0,沒有影響的。

計算機是怎樣的系統?二進位制!所以考慮二進位制下的一些運算,有些函式可能與本題無關

a & b = 1 < (a + b)

a | b = 0 < (a + b)

(a < b) + (b < a)

a[0] = 1;

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

add(a[0], a[0], 0)

\(ans = (x>0)<

倒著列舉最高位,如果當前數 \(x\) 比 \(2^i\) 大,那麼讓 \(x -= 2^i\)。

減法顯然可以移過去變成加法,然後就是乙個整次冪乘 0/1 的問題。

先將 a,b 二進位制拆分,然後直接乘就行了。

for(int k = 58; k >= 0; k--) }}

這樣這道題就已經做完了,我們想想其他的操作。

顯然我們不可能得出負數,所以實際得出的是 \(\max(0,x-y)\)

將 \(x-y\) 二進位制拆分式的列舉,然後就是二的整次冪乘 0/1

還是二進位制拆分式的列舉即可

也是 nb 題

按照題解的說法,我們分三步走

先按 x 排序,對於乙個點來說,顯然能走到的區域是乙個區間 \([l,r]\),考慮區間 dp,首先列舉位置 t,\(dp[l][r][0/1]\) 表示從位置 t 開始,已經走過區間 \([l,r]\),目前在左右端點的最小代價是多少,轉移顯然。

容易發現從乙個位置有大量的走不到區間,且兩個位置有大量的公共區間。考慮倒著 dp,設 \(dp[l][r][0/1]\) 表示從 \([l, r]\) 開始,已經解決了 \([1,l)\cup(r,n]\) 這部分能到的地方的最小代價。這樣就是 \(\theta(n^2)\) 的了。

從任意一點出發,顯然只有兩種情況,走到最右邊再回來和走到最左邊再回來。

從中間那個舉行出發,只有這兩種情況是合法的,手玩一下可以發現其他的情況都會被擋住,這樣就轉化為了內部是 \(subtask2\),整體做 \(subtask1\) 了

看**會清楚些

const int n = 200500, m = 1000050;

int t[m], x[n], y[n], tx[n], ty[n];

int lt[n], rt[n], n;

void rankit(int *x)

struct node

}p[n];

#include map, ll> f[2];

inline int abs(int x)

inline int dis(int a, int b)

const ll inf = 1e18;

ll ans[n];

ll dp(int u, int d, int l, int r, int k)

if (r < n && (p[r+1].y == d - 1 || p[r+1].y == u + 1))

return f[k][mp(l, r)] = (ans == inf ? l - r : ans);

}int main() ;

sort(p + 1, p + n + 1);

lt[1] = 1, rt[n] = n;

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

lt[i] = abs(p[i].y - p[i-1].y) == 1 ? lt[i-1] : i;

for (int i = n - 1; i; i--)

rt[i] = abs(p[i+1].y - p[i].y) == 1 ? rt[i+1] : i;

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

ans[p[i].id] = dp(p[i].y, p[i].y, i, i, 0);

for (int i = 1;i <= n; i++) write(ans[i]);

return 0;

}

AGC025簡要題解

b rgb coloring 一道簡單題,列舉即可。c interval game 考慮可以進行的操作只有兩種,即左拉和右拉,連續進行兩次相同的操作是沒有用的。左拉時肯定會選擇右端點盡量小的,右拉選擇左端點盡量大的,所以排序之後貪心即可。d choosing points 首先證明對於所有 d 假設...

AGC044 簡要題解(部分)

乍一看資料範圍非常唬人,但是仔細思考一下就可以發現這樣乙個事實 從 x 逆著執行操作回到 0 的時候,除了最後一次連續執行若干次 1 操作直至 0 之外,其餘的時候,每兩次除法之間,用 pm1 造成的增量只會在 2,2 之間。實際上,如果下一次除數是 2 或 3 那麼增量只會在 1,1 之間。證明只...

AGC 049 部分簡要題解

nmd 差1分鐘過 e,真就老年選手不配進第一頁 ll 計算每個點的貢獻,做完了 includeusing namespace std typedef long long ll const int n 110 string s n int n bitsettow n int main int s n...