1. 程式人生 > >BZOJ5286:[HNOI/AHOI2018]轉盤——題解

BZOJ5286:[HNOI/AHOI2018]轉盤——題解

for sdi type \n 作者 uil blank 處理 turn

https://www.lydsy.com/JudgeOnline/problem.php?id=5286

https://www.luogu.org/problemnew/show/P4425

https://loj.ac/problem/2495

題面見上面。

然後因為懶得寫公式了所以看這個人的博客吧:https://www.luogu.org/blog/ztzshiwo001219/solution-p4425

合並的原理如果看了那個博客還沒看懂的話,不妨看看下面這張圖:

技術分享圖片

我們要求的是最上面區間的答案,但顯然不能是tr[a]=min(tr[a<<1]],tr[a<<1|1]),因為中間的區間還需要合並。

因為參考博客已經證明了tr[a]表示的區間長度對答案沒有影響了所以我們就考慮所有的區間即可。

我們的suan函數的a是最上邊區間的左區間,mx和num就是當前區間的mx[a]。

顯然當mx>=num的時候a的左區間答案只受mx的影響,而右區間的靠右位置有可能不受mx的影響,因此遞歸處理。

當mx<num的時候a的右區間只受num的影響,取一個最小值為mid+1+num,再遞歸處理左區間即可(因為左區間的mx可能比num大)。

#include<cmath>
#include<queue>
#include<vector>
#include
<cstdio> #include<cctype> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=2e5+5; inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch==-;ch=getchar();} while(isdigit(ch))X=(X<<3
)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } int n,m,p,t[N],b[N],tr[N*4],mx[N*4]; int suan(int a,int l,int r,int num){ if(l==r)return l+max(mx[a],num); int mid=(l+r)>>1; if(mx[a<<1|1]>=num) return min(tr[a],suan(a<<1|1,mid+1,r,num)); else return min(suan(a<<1,l,mid,num),mid+1+num); } void upt(int a,int l,int r){ mx[a]=max(mx[a<<1],mx[a<<1|1]); tr[a]=suan(a<<1,l,(l+r)>>1,mx[a<<1|1]); } void build(int a,int l,int r){ if(l==r){ tr[a]=t[l];mx[a]=b[l]; return; } int mid=(l+r)>>1; build(a<<1,l,mid);build(a<<1|1,mid+1,r); upt(a,l,r); } void mdy(int a,int l,int r,int x){ if(l==r){ tr[a]=t[l];mx[a]=b[l]; return; } int mid=(l+r)>>1; if(x<=mid)mdy(a<<1,l,mid,x); else mdy(a<<1|1,mid+1,r,x); upt(a,l,r); } int main(){ n=read(),m=read(),p=read(); for(int i=1;i<=n;i++){ t[i]=t[i+n]=read(); b[i]=t[i]-i; b[i+n]=t[i+n]-i-n; } build(1,1,n<<1); int lastans=tr[1]+n-1;printf("%d\n",lastans); for(int i=1;i<=m;i++){ int x=read(),y=read(); if(p)x^=lastans,y^=lastans; t[x]=t[x+n]=y;b[x]=y-x;b[x+n]=y-x-n; mdy(1,1,n<<1,x);mdy(1,1,n<<1,x+n); lastans=tr[1]+n-1;printf("%d\n",lastans); } return 0; }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

BZOJ5286:[HNOI/AHOI2018]轉盤——題解