CF1580C Train Maintenance(分块)
生活随笔
收集整理的這篇文章主要介紹了
CF1580C Train Maintenance(分块)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CF1580C Train Maintenance
- description
- solution
- code
description
題目鏈接
solution
這是一種利用根號平衡時間復雜度的套路
分α\alphaα【操作參數】與n\sqrt{n}n?的關系,一半采取暴力,一半利用工具特殊處理
對于本題,假設第iii輛車的加入時間為tit_iti?,那么在nownownow時刻第iii輛車在維修的條件為:(now?ti)%(xi+yi)≥xi(now-t_i)\%(x_i+y_i)\ge x_i(now?ti?)%(xi?+yi?)≥xi?
-
當xi+yi≥mx_i+y_i\ge\sqrt{m}xi?+yi?≥m?的時候
“工作,維修”的周期不會超過m\sqrt{m}m?,可以差分在每個周期上暴力修改
-
當xi+yi<mx_i+y_i<\sqrt{m}xi?+yi?<m?的時候
實時維護一個gi,jg_{i,j}gi,j?數組,表示第t≡j(modi)t\equiv j\pmod it≡j(modi)天時,有gi,jg_{i,j}gi,j?輛x+y=ix+y=ix+y=i的車正在維修
對于加入/丟掉的火車,將gi,(x+tk)mod?i±1g_{i,(x+t_k)\text{mod}\ i}±1gi,(x+tk?)mod?i?±1
直接查詢∑gi,nowmod?i\sum g_{i,now\ \text{mod}\ i}∑gi,now?mod?i?
code
#include <cmath> #include <cstdio> #include <iostream> using namespace std; #define maxn 200005 #define maxB 1000 int n, m; int x[maxn], y[maxn], t[maxn], f[maxn]; int g[maxB][maxB];void modify( int i, int j ) {if( i > m ) return;else f[i] += j; }int main() {scanf( "%d %d", &n, &m );int sqt = sqrt( m );for( int i = 1;i <= n;i ++ ) scanf( "%d %d", &x[i], &y[i] );for( int i = 1, op, k, lst = 0;i <= m;i ++ ) {scanf( "%d %d", &op, &k );int v = op & 1 ? 1 : -1;if( op & 1 ) t[k] = i;if( x[k] + y[k] >= sqt ) {for( int j = t[k] + x[k];j <= m;j += x[k] + y[k] )modify( max( j, i ), v ), modify( max( j + y[k], i ), -v );}else {for( int j = t[k] + x[k];j < t[k] + x[k] + y[k];j ++ )g[x[k] + y[k]][j % ( x[k] + y[k] )] += v;}int ans = lst + f[i];lst = ans; //差分數組的輔助for( int j = 1;j < sqt;j ++ ) ans += g[j][i % j];printf( "%d\n", ans );}return 0; }總結
以上是生活随笔為你收集整理的CF1580C Train Maintenance(分块)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF1592E Bored Bakry(
- 下一篇: 1MORE舒适豆降噪版评测:2021年上