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個,第二棵...