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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ 3740. 【TJOI2014】电源插排

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 3740. 【TJOI2014】电源插排 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

Input

Output

Sample Input

7 10

1

2

3

0 1 2

0 4 7

0 2 5

20

0 6 6

99

0 4 6

Sample Output

1

2

2

1

3

Data Constraint

對于30%的數據,N<=10^5,Q<=1000

對于100%的數據,N<=10^9,Q<=10^5

Solution

  • 這題顯然是一道線段樹的題啦!不過卻有許多細節要注意。

  • 首先,將一個人的占據視為阻隔,那么一個區間需要維護幾個值:

  • 此區間內最大區間的長度
  • 此區間內最大區間的起始位置
  • 從左向右擴展的最大長度
  • 從右向左擴展的最大長度
  • 此區間內被占據的個數
  • 那么,合并區間的方法就顯而易見了,人的進入就相當于單點修改。

  • 但由于區間有 109 那么大,所以必須動態開點,以編號為下標儲存。

  • 另外每個人的坐標無序,用 Hash 處理即可。

  • 一個人插入的位置就是當前根節點的②值、加上①值除以2,

  • 同時用一個數組記錄,以便其離開時查找。

  • 那么總時間復雜度就是優美的 O(QlogN) 。

Code

#include<cstdio> using namespace std; const int N=100001,mo=1e6+7; struct data {int l,r,ls,rs,ml,mx,n; }f[N*33]; int tot,ans; int h[mo],g[mo]; bool b[mo]; inline int read() {int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data; } inline int hash(int x) {int y=x%mo;while(h[y] && h[y]!=x) y=(y+1)%mo;return y; } inline void add(int v,int l,int r) {f[v].ml=l;f[v].l=f[v].r=f[v].mx=r-l+1; } inline void find(int v,int l,int r,int x,int y) {if(l==x && r==y){ans+=f[v].n;return;}int mid=(l+r)>>1;if(!f[v].ls) add(f[v].ls=++tot,l,mid);if(!f[v].rs) add(f[v].rs=++tot,mid+1,r);if(y<=mid) find(f[v].ls,l,mid,x,y); elseif(x>mid) find(f[v].rs,mid+1,r,x,y); else{find(f[v].ls,l,mid,x,mid);find(f[v].rs,mid+1,r,mid+1,y);} } inline void change(int v,int l,int r,int x,int y) {if(l==r){f[v].n+=y;if(y>0) f[v].l=f[v].r=f[v].ml=f[v].mx=0; else{f[v].ml=l;f[v].l=f[v].r=f[v].mx=1;}return;}int mid=(l+r)>>1;if(!f[v].ls) add(f[v].ls=++tot,l,mid);if(!f[v].rs) add(f[v].rs=++tot,mid+1,r);int ls=f[v].ls,rs=f[v].rs;if(x<=mid) change(ls,l,mid,x,y); else change(rs,mid+1,r,x,y);f[v].n=f[ls].n+f[rs].n;f[v].l=f[ls].l;if(f[v].l==mid-l+1) f[v].l+=f[rs].l;f[v].r=f[rs].r;if(f[v].r==r-mid) f[v].r+=f[ls].r;if(f[ls].mx>f[rs].mx){f[v].mx=f[ls].mx;f[v].ml=f[ls].ml;}else{f[v].mx=f[rs].mx;f[v].ml=f[rs].ml;}if(f[ls].r+f[rs].l>f[v].mx || f[ls].r+f[rs].l==f[v].mx && mid-f[ls].r+1>f[v].ml){f[v].mx=f[ls].r+f[rs].l;f[v].ml=mid-f[ls].r+1;} } int main() {int n=read(),q=read();add(tot=1,1,n);while(q--){int p=read();if(!p){int l=read(),r=read();ans=0;find(1,1,n,l,r);printf("%d\n",ans);continue;}int k=hash(p);if(!h[k]) h[k]=p;if(!b[k]){b[k]=true;change(1,1,n,g[k]=f[1].ml+f[1].mx/2,1);}else{change(1,1,n,g[k],-1);b[k]=g[k]=0;}}return 0; }

總結

以上是生活随笔為你收集整理的BZOJ 3740. 【TJOI2014】电源插排的全部內容,希望文章能夠幫你解決所遇到的問題。

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