題解向 正睿Round435

2022-03-13 08:48:17 字數 3050 閱讀 9669

10.14

link

唔,這一場打得不好。獲得了\(\rm 75pts/300pts\)的得分,但是居然可以獲得\(\rm 27/69\)的名次,也不至於不滿意……畢竟是真不會233

大概就是字典序那個地方比較**……

於是就考慮奇數開頭和偶數開頭分開做,對於每種情況調整成乙個合法最小代價序列。這個地方有乙個貪心,原來在前面的依舊會在前面,在後面的也還會在後面,掃一遍就做完了。

這個貪心裡面蘊含著乙個性質。\(now_i,即「同向換」,那一定比交叉換代價更小。所以最優的答案會是一段一段相同方向的交換。那麼考慮直接列舉對於一段相同方向的、相同奇偶性箭頭,換一下彼此的順序是不會影響結果的。所以就考慮對於同一塊進行重排,方法(借鑑的std)大概就是用乙個set去維護一下。

int ans[2][maxn], now[maxn] ; set s ;

int n, id[maxn], base[maxn], cnt[maxn], up[maxn], cnt1 ;

void print(int *ans)

int solve(int zt, int* res)

// print(res) ;

for (int bg = 1 ; bg <= 2 ; ++ bg)

} else

}} }

// print(res) ;

for (int i = 1 ; i <= n ; ++ i) ret += abs(id[res[i]] - i) ; return ret ;

}bool comp(int * a, int * b)

int main()

return 0 ;

}

嘖,根號分治,沒怎麼做過qaq。

首先就是\(nq\)暴力比較好寫,但是自我感覺我寫的暴力複雜度應該是優於普通暴力的,均攤下來或許在\(o(q\cdot \frac)\)的亞子,但是似乎並沒有這一檔部分分,(;'⌒')。

然後就是正解。有乙個求連通塊的性質,就是當圖\(\rm \\)是一棵森林的時候,有\(\rm s=v-e\),其中\(\rm s\)即連通塊個數。所以只需要考慮怎麼維護邊數就好。

考慮根號分治。即對於\(occur[i]\leq \sqrt n\)的顏色直接暴力修改,然後對於與這些塊相鄰的點,如果也是小顏色就不管,如果是大顏色就打上乙個標記,意思是如果這個大顏色修改了的話,會如何影響這個小顏色的貢獻。考慮假設\(i,i+1\)這個狀態是\((1,1)\),那麼修改之後變成\((1,0)\),\(~\text \),但是當時\(i\)變化(\(0\to 1\))的時候是\(\text\)。大概這麼分類討論幾波實際上就是抄的std就會發現規律。

然後對於大顏色,每次先算上打的標記(小顏色),然後考慮預處理出相鄰大顏色點之間的邊,詢問時暴力\(\sqrt n\)掃過每乙個大顏色計算貢獻。

唔,然後就是\(q\sqrt n\)的複雜度了。

int ans1, ans2, e[maxf][maxf] ;

int n, m, k, base[maxn], zt[maxn], num[maxn], id[maxn], cnt ;

int buc[maxn], nxt[maxn], tag[maxn], s[maxn], frx[maxn], lans, bk[maxn], big[maxn] ;

void pre_links()

void pre_blocks()

buc[base[i]] ++ ;

} for (int i = 1 ; i <= k ; ++ i) s[i] = buc[i] ;

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

if (buc[i] <= maxs) num[i] = 1 ;

else num[i] = 2, big[++ cnt] = i, id[i] = cnt ;

}int main()

while (m --)

for (int i = frx[x] ; i <= n ; i = nxt[i])

} else

printf("%d\n", ans1 - ans2) ; zt[x] ^= 1 ;

} return 0 ;

}

大概是一道小清新題,暴力很好寫,然後就是考慮真正地設計狀態:

令\(f_\)表示前\(i\)個人選出\(j\)個人的集合的概率。

於是有兩種轉移(以下用\(p_1\)表示小標號贏的概率,\(p_2=1-p_1\)表示大標號贏的概率):

理解嘛…大概就是考慮每次是把當前更大的選進來還是更小的選進來。

然後就是比較神仙的點:聯立!聯立上面兩個式子就會得到:

\[f_\cdot p_2^+f_\cdot p_1^=f_\cdot p_1^+f_\cdot p_2^

\]移項

\[f_=\frac-p_2^}\cdot f_

\]然後發現就跟\(i\)這一維無關了

#include #include #include #define ll long long

#define maxn 1500100

#define mod 998244353

using namespace std ; ll ans ;

int stk[60], buc[30], cnt = 0, po[maxn] ;

int n, m, a, b, p1, p2, len[maxn], dp[maxn], f[maxn] ;

int expow(int a, int b)

return res ;

}int main()

dp[i] = p ;

} for (i = 1 ; i < m ; ++ i) f[len[i]] = (f[len[i]] + dp[i]) % mod ;

for (i = 1 ; i < n ; ++ i) (ans += 1ll * f[i] * po[i]) %= mod ; cout << ans << endl ; return 0 ;

}

正睿2018 9 1提高2

對於二次函式提出乙個x 對於剩下的直線維護乙個 我們需要求出最大值上輪廓 單調棧求上凸殼就好了 include includeinline int read while c 9 c 0 x x 10 c 0 c getchar return x f const int maxn 500007 int...

2019暑假正睿集訓8 10day7題解及總結

50pts 80pts 這道題直接暴力搜尋,每次在三個符號中任選乙個,按題意合併數。當合併了還剩兩個數的時候,就判斷它們選哪種符號最終能為1,找到一種ans 1 100pts 優化1 位運算。把輸 串按照fft初始化 法 樣bitrev 下就可以 位運算優化。優化2 四 當串 之後16的時候預處理。...

2019暑假正睿集訓8 5day2題解及總結

題目分析 一張圖里兩棵樹,每個人選擇乙個點集,兩個人選的點集不想交,求最大權值 8 21pts 直接暴力列舉 兩個節點不想交 47 65pts 只考慮兩棵樹完全一樣的情況 樹形dp 揹包 dp i j j k dp i j j k dp i j j k 表示以i為跟的子樹,在第一棵樹上選j個,第二棵...