<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      歸納(三):分塊

      何為分塊

      優雅的暴力

      思維難度低下,代碼難度低下,非常優秀的一種算法(?)。
      實現方法主要是塊與塊之間 \(O(1)*\sqrt{n}\) 查詢,邊角 \(O(\sqrt{n})\) 暴力查詢。
      總復雜度 \(O(\sqrt{n})\)。

      代碼實現

      首先需要塊的大小 \(block\) ,和每個下標歸屬于哪個塊 \(belong[i]\)
      如果需要塊內有序,可以使用 \(std::vector\) 。

      區間修改對于整塊使用lazy標記的思想,邊邊角角還是\(O(\sqrt{n})\)暴力。

      查詢同理。

      例題(一):教主的魔法

      可以說,這是分塊最最經典的一道題了。
      因為似乎沒有其他做法?

      鏈接:教主的魔法

      分好塊,用 \(std::vector<int> vc[maxn]\) 維護區間的高矮關系。
      \(std::lower_bound\) 進行查詢。

      修改就打標記。

      #include<cstdio>
      #include<vector>
      #include<cmath>
      #include<algorithm>
      
      const int maxn=1e6+5;
      
      class Divid_Block {
      
          private:
      
              int n,q,delta[maxn],a[maxn];
              int block,belong[maxn],num;
              std::vector<int> vc[maxn];
      
              void update(int x) {
                  vc[x].clear();
                  for(int i=(x-1)*block+1;i<=x*block;i++)
                      vc[x].push_back(a[i]);
                  std::sort(vc[x].begin(),vc[x].end());
              }
      
              void modify(int l,int r,int c) {
                  for(int i=l;i<=std::min(r,belong[l]*block);i++)
                      a[i]+=c;
                  update(belong[l]);
                  if(belong[l]!=belong[r]) {
                      for(int i=(belong[r]-1)*block+1;i<=r;i++)
                          a[i]+=c;
                      update(belong[r]);	
                  }
                  for(int i=belong[l]+1;i<belong[r];i++)
                      delta[i]+=c;
              }
      
              int query(int l,int r,int c) {
                  int ans=0;
                  for(int i=l;i<=std::min(r,belong[l]*block);i++)
                      if(a[i]+delta[belong[l]]>=c) ++ans;
                  if(belong[l]!=belong[r])
                      for(int i=(belong[r]-1)*block+1;i<=r;i++)
                          if(a[i]+delta[belong[r]]>=c) ++ans;
                  for(int i=belong[l]+1;i<belong[r];i++)
                      ans+=block-(std::lower_bound(vc[i].begin(),vc[i].end(),c-delta[i])-vc[i].begin());
                  return ans;
              }
      
          public:
      
              int work() {
                  scanf("%d%d",&n,&q);
                  block=sqrt((n+2)/3);
                  for(int i=1;i<=n;i++) {
                      scanf("%d",a+i);
                      belong[i]=(i-1)/block+1;
                      vc[belong[i]].push_back(a[i]);
                      if(i%block==1) ++num;
                  }
                  for(int i=1;i<=num;i++) std::sort(vc[i].begin(),vc[i].end());
                  while(q--) {
                      char opt=getchar();
                      while(opt!='A' && opt!='M') opt=getchar();
                      int lf,rg,c;scanf("%d%d%d",&lf,&rg,&c);
                      if(opt=='A') printf("%d\n",query(lf,rg,c));
                      else modify(lf,rg,c);
                  }
                  return 0;
              }
      }T;
      
      int main() {return T.work();}
      

      例題(二):彈飛綿羊

      其實,只要你沒學過CT,這道題還是很有希望做出來的。
      記錄兩個信息:
      \(tim[i]\)\(whe[i]\) 表示:需要跳幾次才能出這個塊,出了這個塊會到哪個點上。

      每一次修改彈力系數,最多只會影響本塊內會跳到這個點上的彈簧。

      所以每一次修改就重構塊。

      于是就歡樂的解決了這道題。

      (至今還沒寫對LCT的我就靠這個安慰自己)

      #include<bits/stdc++.h>
      
      const int maxn=2e5+5;
      
      class Divid_Block {
          private:
      
              int a[maxn];
              int belong[maxn],whe[maxn],tim[maxn];
              int block,n,m;
      
              inline int read() {
                  int x;char ch;while(!isdigit(ch=getchar()));
                  for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
                  return x;
              }
      
              void build() {
                  block=sqrt((n+2)/3);
                  for(int i=1;i<=n;i++)
                      belong[i]=(i-1)/block+1;
                  belong[n+1]=belong[n]+1;
                  for(int i=n;i;i--) {
                      whe[i]=i+a[i];
                      int r=block*belong[i]>n?n:block*belong[i];
                      if(whe[i]>r) tim[i]=1;
                      else tim[i]=tim[whe[i]]+1,whe[i]=whe[whe[i]];
                  }
                  return ;
              }
      
              void modify(int pos,int val) {
                  a[pos]=val;
                  for(int i=block*belong[pos];i>=block*(belong[pos]-1);i--) {
                      whe[i]=i+a[i];
                      if(whe[i]>block*belong[pos]) tim[i]=1;
                      else tim[i]=tim[whe[i]]+1,whe[i]=whe[whe[i]];
                  }
              }
      
              int query(int pos) {
                  int ans=0;
                  while(pos<=n) ans+=tim[pos],pos=whe[pos];
                  return ans;
              }
      
          public:
      
              int work() {
                  n=read();
                  for(int i=1;i<=n;i++) a[i]=read();
                  build();
                  m=read();
                  while(m--) {
                      int opt=read(),pos=read();
                      ++pos;
                      if(opt-1) {
                          int k=read();
                          modify(pos,k);
                      }
                      else printf("%d\n",query(pos));
                  }
                  return 0;
              }
      }T;
      
      int main() {return T.work();}
      
      

      注意事項

      關于塊的大小,可以參見初中dalao的博客(我的分塊他教的)

      關于分塊最優塊大小的思考

      還有他寫的那個上了洛咕日報的博客:

      淺談基礎根號算法——分塊

      lhy %%% 這個 \((A+C)/2\) 在我們機房里天天吊虐我。

      分塊適用范圍很廣,基本僅次于 \(n^{2}\) 暴力。

      走投無路時可以考慮哦。

      posted @ 2018-10-14 11:49  LoLiK  閱讀(236)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 真人无码作爱免费视频| 激情五月开心婷婷深爱| 毛多水多高潮高清视频| 国内少妇人妻偷人精品视频| 少妇激情一区二区三区视频| 成人免费亚洲av在线| 成人做爰www网站视频| 国产av不卡一区二区| 国产精品最新免费视频| 日韩熟妇中文色在线视频| 成人亚洲狠狠一二三四区| 欧美老少配性行为| 狂野欧美性猛交免费视频| 免费观看的av在线播放| 国产资源精品中文字幕| 成人网站免费观看永久视频下载| 漂亮人妻中文字幕丝袜| 中国xxx农村性视频| 国产精品播放一区二区三区 | 日本无产久久99精品久久| 欧美激情内射喷水高潮| 国内精品大秀视频日韩精品 | 成人av一区二区亚洲精| 亚洲情A成黄在线观看动漫尤物| 河津市| 午夜免费视频国产在线| 久久精品国产亚洲夜色av| 亚洲综合av永久无码精品一区二区 | 国产剧情91精品蜜臀一区 | 日本高清aⅴ毛片免费| 无遮高潮国产免费观看| 亚洲成在人线av无码| 亚洲日韩久热中文字幕| 偷拍久久大胆的黄片视频| 国内不卡一区二区三区| 一本一道av无码中文字幕﹣百度 | 国内精品久久久久影院蜜芽| 黑人巨大无码中文字幕无码| 性色av不卡一区二区三区| 久久天天躁狠狠躁夜夜婷| 日韩不卡二区三区三区四区|