【BZOJ1500】[NOI2005]維修數列 Splay

【BZOJ1500】[NOI2005]維修數列

Description

Input

輸入的第1 行包含兩個數N 和M(M ≤20 000),N 表示初始時數列中數的個數,M表示要進行的操作數目。
第2行包含N個數字,描述初始時的數列。
以下M行,每行一條命令,格式參見問題描述中的表格。
任何時刻數列中最多含有500 000個數,數列中任何一個數字均在[-1 000, 1 000]內。
插入的數字總數不超過4 000 000個,輸入文件大小不超過20MBytes。

Output

對于輸入數據中的GET-SUM和MAX-SUM操作,向輸出文件依次打印結果,每個答案(數字)占一行。

Sample Input

9 8
2 -6 3 5 1 -5 -3 6 3
GET-SUM 5 4
MAX-SUM
INSERT 8 3 -5 7 2
DELETE 12 1
MAKE-SAME 3 3 2
REVERSE 3 6
GET-SUM 5 4
MAX-SUM

Sample Output

-1
10
1
10

HINT

題解:裸的Splay,只不過全是細節,我還是不夠細啊~

*要開滾動數組記錄有哪些空余的位置,防止MLE(但實測600000的數組就行)

*INSERT:直接一個一個往里加就行,加成一條鏈也無所謂,不會TLE

*DELETE:因為要釋放空間,所以必須一個一個刪除,遞歸即可

*MAKE_SAME:沒啥說的
*REVERSE:最好是先修改,再給兒子打標記(也就是說標記只對兒子起作用),這樣比較清晰

*GET_SUM:沒啥說的
*MAX_SUM:巨惡心的pushup和pushdown,看代碼就知道了

?

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
struct point
{int ch[2],fa,siz,tag,v,sv,sm,ls,rs,re;
}s[600010];
int n,m,root;
int num[500010];
char str[20];
queue<int> q;
void pushdown(int x)
{if(s[x].re){swap(s[s[x].ch[0]].ch[0],s[s[x].ch[0]].ch[1]);swap(s[s[x].ch[1]].ch[0],s[s[x].ch[1]].ch[1]);swap(s[s[x].ch[0]].ls,s[s[x].ch[0]].rs);swap(s[s[x].ch[1]].ls,s[s[x].ch[1]].rs);if(s[x].ch[0])	s[s[x].ch[0]].re^=1;if(s[x].ch[1])	s[s[x].ch[1]].re^=1;s[x].re=0;}if(s[x].tag!=1<<30){if(s[x].ch[0]){s[s[x].ch[0]].v=s[s[x].ch[0]].tag=s[x].tag;s[s[x].ch[0]].sv=s[x].tag*s[s[x].ch[0]].siz;s[s[x].ch[0]].ls=s[s[x].ch[0]].rs=max(s[s[x].ch[0]].sv,0);s[s[x].ch[0]].sm=max(s[s[x].ch[0]].sv,s[x].tag);}if(s[x].ch[1]){s[s[x].ch[1]].v=s[s[x].ch[1]].tag=s[x].tag;s[s[x].ch[1]].sv=s[x].tag*s[s[x].ch[1]].siz;s[s[x].ch[1]].ls=s[s[x].ch[1]].rs=max(s[s[x].ch[1]].sv,0);s[s[x].ch[1]].sm=max(s[s[x].ch[1]].sv,s[x].tag);}s[x].tag=1<<30;}
}
void pushup(int x)
{s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;s[x].ls=max(s[s[x].ch[0]].ls,s[s[x].ch[0]].sv+s[x].v+s[s[x].ch[1]].ls);s[x].rs=max(s[s[x].ch[1]].rs,s[s[x].ch[1]].sv+s[x].v+s[s[x].ch[0]].rs);s[x].sm=max(s[s[x].ch[0]].rs+s[x].v+s[s[x].ch[1]].ls,max(s[s[x].ch[0]].sm,s[s[x].ch[1]].sm));s[x].sv=s[s[x].ch[0]].sv+s[x].v+s[s[x].ch[1]].sv;
}
int readin()
{int ret=0,f=1;	char gc=getchar();while(gc<'0'||gc>'9'){if(gc=='-')f=-f;	gc=getchar();}while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
int rotate(int x,int &k)
{int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);if(z)	s[z].ch[y==s[z].ch[1]]=x;if(y==k)	k=x;s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];if(s[x].ch[d^1])	s[s[x].ch[d^1]].fa=y;s[x].ch[d^1]=y;pushup(y),pushup(x);
}
void splay(int x,int &k)
{while(x!=k){int y=s[x].fa,z=s[y].fa;if(y!=k){if((x==s[y].ch[1])^(y==s[z].ch[1]))	rotate(x,k);else	rotate(y,k);}rotate(x,k);}
}
void build(int l,int r,int last)
{if(l>r)	return ;int mid=l+r>>1;s[mid].fa=last,s[last].ch[mid>last]=mid;s[mid].v=num[mid];s[mid].tag=1<<30;build(l,mid-1,mid),build(mid+1,r,mid);pushup(mid);
}
int find(int x,int y)
{pushdown(x);if(s[s[x].ch[0]].siz+1==y)	return x;if(y<=s[s[x].ch[0]].siz)	return find(s[x].ch[0],y);return find(s[x].ch[1],y-s[s[x].ch[0]].siz-1);
}
void del(int &x)
{if(!x) return;q.push(x);del(s[x].ch[0]),del(s[x].ch[1]);x=0;
}
int main()
{n=readin(),m=readin();int i,j,a,b,c,t,u;s[0].sm=num[1]=num[n+2]=-1<<30;for(i=1;i<=n;i++)	num[i+1]=readin();n+=2,root=(n+1)/2;build(1,root-1,root),build(root+1,n,root);s[root].v=num[root];s[root].tag=1<<30;pushup(root);for(i=n+1;i<=600000;i++)	q.push(i);for(i=1;i<=m;i++){scanf("%s",str);switch(str[2]){case 'S':{a=readin()+1,b=readin();splay(find(root,a+1),root),splay(find(root,a),s[root].ch[0]);t=s[root].ch[0];for(j=1;j<=b;j++){c=readin();u=q.front(),q.pop();s[u].v=c;s[t].ch[1]=u,s[u].fa=t;s[u].re=0,s[u].tag=1<<30;t=u;}while(t!=root){pushup(t);t=s[t].fa;}break;}case 'L':{a=readin()+1,b=readin();splay(find(root,a-1),root),splay(find(root,a+b),s[root].ch[1]);del(s[s[root].ch[1]].ch[0]);pushup(s[root].ch[1]);break;}case 'K':{a=readin()+1,b=readin();splay(find(root,a-1),root),splay(find(root,a+b),s[root].ch[1]);c=s[s[root].ch[1]].ch[0];s[c].v=s[c].tag=readin();s[c].re=0;s[c].sv=s[c].siz*s[c].v;s[c].ls=s[c].rs=max(s[c].sv,0);s[c].sm=max(s[c].sv,s[c].v);break;}case 'V':{a=readin()+1,b=readin();splay(find(root,a-1),root),splay(find(root,a+b),s[root].ch[1]);c=s[s[root].ch[1]].ch[0];swap(s[c].ch[0],s[c].ch[1]);swap(s[c].ls,s[c].rs);s[c].re=1;break;}case 'T':{a=readin()+1,b=readin();splay(find(root,a-1),root),splay(find(root,a+b),s[root].ch[1]);printf("%d\n",s[s[s[root].ch[1]].ch[0]].sv);break;}case 'X':{printf("%d\n",s[root].sm);break;}}}return 0;
}

?

轉載于:https://www.cnblogs.com/CQzhangyu/p/6440275.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253319.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bzoj2588: Spoj 10628. Count on a tree(樹上第k大)(主席樹)

每個節點繼承父節點的樹&#xff0c;則答案為query(root[x]root[y]-root[lca(x,y)]-root[fa[lca(x,y)]]) #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> using namespace std; const int maxn1…

圖文詳解YUV420數據格式

YUV格式有兩大類&#xff1a;planar和packed。 對于planar的YUV格式&#xff0c;先連續存儲所有像素點的Y&#xff0c;緊接著存儲所有像素點的U&#xff0c;隨后是所有像素點的V。 對于packed的YUV格式&#xff0c;每個像素點的Y,U,V是連續交*存儲的。 YUV&#xff0c;分為三個…

USB通信接口介紹

1. 概述 Usb Universal Serial Bus全稱通用串行總線&#xff0c;是一種支持熱插拔的高速串行傳輸總線&#xff0c;使用差分信號來傳輸數據。 USB設備可以直接和host通信&#xff0c;或者通過hub和host通信。一個USB系統中僅有一個USB主機&#xff0c;設備包括功能設備和hub&…

關于java中BufferedReader的read()及readLine()方法的使用心得

BufferedReader的readLine()方法是阻塞式的, 如果到達流末尾, 就返回null, 但如果client的socket末經關閉就銷毀, 則會產生IO異常. 正常的方法就是使用socket.close()關閉不需要的socket. 從一個有若干行的文件中依次讀取各行&#xff0c;處理后輸出&#xff0c;如果用以下方法…

HDCVI——一種創新性的高清視頻傳輸方案

什么是HDCVI 2012年11月&#xff0c;大華技術股份有限公司發布了具有自主知識產權的同軸高清傳輸接口技術HDCVI。HDCVI技術是一種基于已有SYV75-3或SYV75-5同軸電纜的高清視頻傳輸方法&#xff0c;能夠在低成本和較低質量的同軸電纜上實現超長距離高清視頻信號的可靠傳輸。相比…

typedef struct 用法

如果在c程序中我們寫&#xff1a;    typedef struct     {    int num;    int age;    }aaa,bbb,ccc;    這算什么呢&#xff1f;    我個人觀察編譯器&#xff08;VC6&#xff09;的理解&#xff0c;這相當于    typedef struct     …

智能機器人品牌簡介

隨著科技的發展&#xff0c;硬件的計算速度和大數據支撐&#xff0c;越來越多的智能化設備和產品出現在我們的面前&#xff0c;為我們的生活帶來更多便利。其中包括智能機器人&#xff0c;這種產品是有自己的“大腦”&#xff0c;可以接收人為指令&#xff0c;為人服務&#xf…

轉 Java對日期Date類進行加減運算一二三

請移步&#xff0c;https://blog.csdn.net/hacker_lees/article/details/74351838 &#xff0c;感謝博主分享轉載于:https://www.cnblogs.com/bestxyl/p/9790088.html

誕生之日 隨筆

今天我誕生了&#xff0c;祝自己誕生日happy&#xff0c;happy&#xff0c;happy&#xff01; 轉載于:https://www.cnblogs.com/xiaohuihui-/p/7594406.html

智能音箱 之 麥克風參數介紹

1. 定義 麥克風&#xff0c;學名為傳聲器&#xff0c;是將聲音信號轉換為電信號的能量轉換器件&#xff1b;聲—電轉換。 與揚聲器正好相反&#xff08;電—聲轉換&#xff09;&#xff0c;構成電聲設備的兩個終端&#xff0c;俗稱咪頭&#xff0c;麥克等。 是電聲系統的入口&a…

大屏幕行業發展現狀以及趨勢深刻剖析

瀏覽數: 689 海康威視&#xff1a;葉志龍 中國投影網&#xff1a;大屏幕顯示作為安防領域重要一環&#xff0c;而海康威視作為安防領域的佼佼者&#xff0c;請介紹海康威視大屏顯示系統DLP/LCD這兩大產品線&#xff1f;與行業同類產品相比&#xff0c;海康威視大屏拼接單元產品…

架構師是大忽悠嗎?阿里技術大牛告訴你真相!

來源&#xff1a;阿里云 作者&#xff1a;林昊&#xff08;花名畢玄&#xff09;&#xff0c;阿里巴巴技術保障部研究員&#xff0c;曾任淘寶網平臺架構部架構師。個人的研究方向主要為Java模塊化、動態化系統的構建&#xff0c;以及高性能大型分布式Java系統構建&#xff0c;主…

動手動腦-Java重載

有以下例子&#xff1a; 例&#xff1a; Using overloaded methods public class MethodOverload { public static void main(String[] args) { System.out.println("The square of integer 7 is " square(7)); System.out.println("\nThe square of double 7.…

利用django框架,手把手教你搭建數據可視化系統(一)

如何使用django去構建數據可視化的 web,可視化的結果可以呈現在web上。 使用django的MTV模型搭建網站 基礎鋪墊—MTV模型 Created with Raphal 2.1.0Request服務器&#xff08;Djangoweb&#xff09;Response首先&#xff0c;要搞清楚我們去訪問服務器&#xff0c;服務器返回信…

智能音箱 之 揚聲器喇叭介紹

在全雙工語音交互的系統中&#xff0c;功放的質量是非常重要的&#xff0c;因為AEC回聲消除對信號失真 是非常敏感的。音頻通路的整體諧波失真需要控制在5%以內。 對于整個系統的諧波失真來說&#xff0c;揚聲器是最關鍵的因素&#xff0c;其次是功放&#xff0c;麥克風的很小…

關于拓撲排序的問題-P3116 [USACO15JAN]會議時間Meeting Time

https://www.luogu.org/problem/show?pid3116 這道題目很水啊&#xff0c;但是我沒有1A&#xff0c;而且wa了好多&#xff1b; 題目意思我就不講了&#xff1b; 反正就是一個拓撲序dp&#xff1b; 但是這道題目規定了起點是1&#xff1b; 所以我一開始直接把1放進隊列里然…

HD-SDI DVR發展與應用剖析

自2010年以來&#xff0c;視頻監控已經進入“高清”監控時代&#xff1b;隨著高清的發展&#xff0c;HD-SDI高清數字系統開始進入人們的視線&#xff0c;在大、小展會上均可以輕松找到“數字高清”的產品和解決方案。作為HD-SDI系統中編碼、存儲部分的HD-SDI高清數字硬盤錄像機…

UML學習——類圖(三)

1.類圖 UML類圖是用來描述類、接口、協作及它們之間的關系的圖。用來顯示系統中各個類的靜態結構。 2.類圖的組成元素 類圖由以下六種元素組成&#xff1a;類&#xff0c;接口&#xff0c;泛化關系&#xff0c;關聯關系&#xff0c;依賴關系&#xff0c;實現關系。 3.類圖的繪制…

傳錘子科技解散成都分公司 才搬遷一年羅永浩就頂不住了

雷帝網 樂天 10月16日報道今日有網友爆料&#xff0c;錘子科技解散成都分公司。有網友指出&#xff0c;爆料的人是錘子科技早期員工王前闖。網友爆料錘子成都研發中心解散網友爆料錘子成都研發中心解散2016年&#xff0c;錘子科技虧損4億元&#xff0c;一直徘徊在破產的邊緣&am…

智能音箱 之 功放與揚聲器(喇叭)的匹配關系

1. 功放的概念   功率放大器簡稱功放&#xff0c;俗稱 “擴音機”&#xff0c;是音響系統中最基本的設備&#xff0c;它的任務是把來自信號源&#xff08;專業音響系統中則是來自調音臺&#xff09;的微弱電信號進行放大以驅動揚聲器發出聲音。 2. 功放的分類 功率放大器分…