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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj 4552: [Tjoi2016Heoi2016]排序

發布時間:2023/11/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 4552: [Tjoi2016Heoi2016]排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

在2016年,佳媛姐姐喜歡上了數字序列。因而他經常研究關于序列的一些奇奇怪怪的問題,現在他在研究一個難題,需要你來幫助他。這個難題是這樣子的:給出一個1到n的全排列,現在對這個全排列序列進行m次局部排序,排序分為兩種:1:(0,l,r)表示將區間[l,r]的數字升序排序2:(1,l,r)表示將區間[l,r]的數字降序排序最后詢問第q位置上的數字。

solution

在看到二分答案這個標簽后就是SBT了
首先常規套路,如果值域較小,那么枚舉值域線段樹區間覆蓋
那么這題這么做這個轉換呢?直接二分答案,把小于的部分賦為0,大于等于部分1,這樣轉換過來了,注意線段樹只要存1就好,0直接可以相減得出

#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #define RG register #define il inline #define iter iterator #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; const int N=100005; #define ls (node<<1) #define rs (node<<1|1) int n,m,a[N],t[N<<2],L[N],R[N],op[N],mark[N<<2],P; void upd(int node){t[node]=t[ls]+t[rs];} il void pushdown(RG int node,int l,int r){if(mark[node]==-1)return ;int k=mark[node],mid=(l+r)>>1;t[ls]=k*(mid-l+1);t[rs]=k*(r-mid);mark[ls]=mark[rs]=k;mark[node]=-1; } il void build(int l,int r,RG int node,int li){mark[node]=-1;t[node]=0;if(l==r){t[node]=(a[l]>=li);return ;}int mid=(l+r)>>1;build(l,mid,ls,li);build(mid+1,r,rs,li);upd(node); } il int query(int l,int r,RG int node,int sa,int se){if(l>se || r<sa)return 0;if(sa<=l && r<=se)return t[node];pushdown(node,l,r);int mid=(l+r)>>1;int q1=query(l,mid,ls,sa,se);int q2=query(mid+1,r,rs,sa,se);return q1+q2; } il void updata(int l,int r,RG int node,int sa,int se,int i){if(l>se || r<sa)return ;if(sa<=l && r<=se){t[node]=i*(r-l+1);mark[node]=i;return ;}pushdown(node,l,r);int mid=(l+r)>>1;updata(l,mid,ls,sa,se,i);updata(mid+1,r,rs,sa,se,i);upd(node); } bool check(int mid){build(1,n,1,mid);int l,r,re[2];for(int i=1;i<=m;i++){l=L[i];r=R[i];re[1]=query(1,n,1,l,r);re[0]=r-l+1-re[1];if(op[i]){updata(1,n,1,l,l+re[1]-1,1);updata(1,n,1,l+re[1],r,0);}else{updata(1,n,1,l,l+re[0]-1,0);updata(1,n,1,l+re[0],r,1);}}return query(1,n,1,P,P); } void work() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++)scanf("%d%d%d",&op[i],&L[i],&R[i]);int l=1,r=n,mid,ans;scanf("%d",&P);while(l<=r){mid=(l+r)>>1;if(check(mid))ans=mid,l=mid+1;else r=mid-1;}printf("%d\n",ans); }int main() {work();return 0; }

轉載于:https://www.cnblogs.com/Yuzao/p/7663085.html

總結

以上是生活随笔為你收集整理的bzoj 4552: [Tjoi2016Heoi2016]排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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