日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CF1580C Train Maintenance(分块)

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 itj(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(分块)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。