1500 NOI2005 維修數列

2022-05-12 09:24:07 字數 2404 閱讀 3298

輸入的第1 行包含兩個數n 和m(m ≤20 000),n 表示初始時數列中數的個數,m表示要進行的運算元目。

第2行包含n個數字,描述初始時的數列。

以下m行,每行一條命令,格式參見問題描述中的**。

任何時刻數列中最多含有500 000個數,數列中任何乙個數字均在[-1 000, 1 000]內。

插入的數字總數不超過4 000 000個,輸入檔案大小不超過20mbytes。

對於輸入資料中的get-sum和max-sum操作,向輸出檔案依次列印結果,每個答案(數字)佔一行。

9 82 -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

-110110

模板題。。。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include11 #include

12#define inf 1000000000

13#define maxn 1000000+5

14#define maxm 10000+5

15#define eps 1e-10

16#define ll long long

17#define for0(i,n) for(int i=0;i<=(n);i++)

18#define for1(i,n) for(int i=1;i<=(n);i++)

19#define for2(i,x,y) for(int i=(x);i<=(y);i++)

20#define for3(i,x,y) for(int i=(x);i>=(y);i--)

21#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)

22using

namespace

std;

23int

read()

26while(ch>='

0'&&ch<='9')

27return x*f;28}

29int

n,m,rt,cnt;

30int a[maxn],id[maxn],fa[maxn],c[maxn][2

];31

intsum[maxn],s[maxn],v[maxn],mx[maxn],lx[maxn],rx[maxn];

32bool

tag[maxn],rev[maxn];

33 queueq;

34void update(int

x)42

void pushdown(int

x)52

else56}

57if

(rev[x])62}

63void rotate(int x,int &k)

71void splay(int x,int &k)

78else

rotate(x,k);79}

80}81int find(int x,int

rk)88

void rec(int

x)95

int split(int k,int

tot)

100void query(int k,int

tot)

104void modify(int k,int tot,int

val)

111void rever(int k,int

tot)

119}

120void erase(int k,int

tot)

125void build(int l,int r,int

f)134

else build(l,mid-1,mid),build(mid+1

,r,mid);

135 v[now]=a[mid];fa[now]=last;update(now);

136 c[last][mid>=f]=now;

137}

138void insert(int k,int

tot)

150int

main()

170if(ch[0]=='r'

)rever(k,tot);

171if(ch[0]=='g'

)query(k,tot);

172}

173return0;

174 }

view code

1500 NOI2005 維修數列

題目思路 splay 包括區間插入,區間刪除,記憶體,區間反轉,區間和,區間最大子段,成段更新等操作。include include include include include include include include include include includeusing namesp...

BZOJ1500 NOI2005 維修數列

description input 輸入檔案的第1行包含兩個數n和m,n表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的 output 對於輸入資料中的get sum和max sum操作,向輸出檔案依次列印結果,每個...

bzoj1500 NOI2005 維修數列

splay鼻祖級的題目?霧。insert 把第pos個數 有哨兵節點 轉到root,把第pos 1個數轉到root的右兒子,然後對c建樹然後把這棵樹插到root右兒子的左兒子處 delete 把第pos個數轉到root,把第pos tot 1個數轉到root右兒子,刪掉root右兒子的左兒子 變成0...