光榮爆0
題目大意 :
show code
題目大意 : 每在後面添乙個字母就求一下每個子串在字尾自動機的parent樹上到跟的所有點的深度和,允許離線
show code
#include #include #define ls (rt << 1)
#define rs (rt << 1 | 1)
using namespace std;
const int n = 4e5 + 5, m = 1e9 + 7;
struct edge e[n];
int h[n], edc;
void add(int x, int y) ; h[x] = edc;
}int n, fa[n], t[n][26], len[n], lt, trc, ans, sum, a[n];
int sz[n], son[n], tp[n], dep[n], dfn[n], dfc, b[n], s[n], w[n*4], tag[n*4];
char c[n];
void dfs(int x)
}void dfs(int x, int top)
int cal(int l, int r)
int ask(int rt, int l, int r, int x, int y)
int mid = l + r >> 1, ans = 0;
if (tag[rt])
if (x <= mid) ans = ask(ls, l, mid, x, y);
if (y > mid) ans += ask(rs, mid+1, r, x, y);
if ((w[rt] = w[ls] + w[rs]) >= m) w[rt] -= m;
return ans >= m ? ans - m : ans;
}int main()
a[i] = lt;
}for (int i = 2; i <= trc; ++i) add(fa[i], i);
dfs(1); dfs(1, 1);
for (int i = 1; i <= trc; ++i)
if ((s[i] += (1ll * s[i-1] + len[b[i]] - len[fa[b[i]]] + m) % m) >= m) s[i] -= m;
for (int i = 1; i <= n; ++i)
return 0;
}
題目大意 : 乙個只由0,1,2組成的序列,每次選大於 1 的數,給他減 2,兩邊的同時加 1,知道所有數都小於 2,問最後序列是什麼樣的
show code
#include #include #include using namespace std;
const int n = 2e7 + 5;
char c[n];
int n, a[n], stk[n], tp;
int main()
else tp--, a[i] -= 2, a[i+1]++;
}if (!a[i]) stk[++tp] = i;
a[i] = 1;
}while (tp) a[stk[tp--]] = 0;
for (int i = 1; i <= n; ++i)
putchar(a[i] + '0');
return 0;
}
省選測試21
設 f i 為上一次參加的比賽是第 i 場的最大愉悅值 則 f i max f i f j frac a i j 對於隨機的資料,把列舉的範圍卡到 3000 即可 容易發現,如果沒有 a j leq a i 的限制,那麼就是乙個裸的斜率優化 dp 把 f i frac frac 看做 y 把 i 看...
省選測試9
這個名次已經是倒數了 感覺整場考試不是很在狀態,正解想不到,暴力分也沒有打滿 其實前兩道題仔細推一下還是能想出來的 t1 2 sat 有一段時間沒有打了 優化建圖的方式和之前的某道題挺像的,但是當時那道題沒改 這次算是補了乙個鍋 t2 的資料範圍折半列舉也不難想,實現時注意一下細節就行了 t3 有一...
省選測試28
題目大意 給乙個排列,翻轉k次,問最終逆序對個數的期望值 然後在用兩個字首和分別優化這3種轉移就好了 show code include define mod x using namespace std const int n 505,m 1e9 7 int n,k,a n f n n s1 n n...