Splay 晚練整隊

2022-04-30 19:54:09 字數 1636 閱讀 3158

晚練整隊

input:exercise.in output:exercise.out

題目背景

小z的體育非常好,因此他非常不願意參加體育老師組織的晚練。體育老師何等聰明,他利用激將法把小z引了下來。

體育老師思考了一段時間,考慮到小z的體育的確已經很好了,所以他不用晚練。但是體育老師不願讓小z這麼快走,因此讓他幫忙整理晚練的隊形。

題目描述

隊形是乙個n個人的數列,位於第i個位置上的人都有自己的體魄強度a[i]。

體育老師有q個操作:

1、識別符為「r」,後接兩個正整數l,r,表示你要反轉區間[l,r]

舉例:序列為 1 2 3 4 5 6,要反轉3 6,得

1 2 6 5 4 3

2、識別符為「q」,後接兩個正整數l,r,表示輸出第l列到第r列的最大值(資料滿足x1≤x2)

3、識別符為「c」,後接兩個正整數x,k,表示把第x個人的體魄強度修改為k

輸入描述

第一行乙個正整數n

接下來一行共n個正整數表示ai

接下來一行僅乙個正整數q

接下來q行每行乙個字元表示識別符,後接操作所需的引數

輸出描述

若干行,輸出所有對q識別符的答案

輸入樣例

1 2 3

r 2 3

q 1 2

c 3 8

q 2 3

輸出樣例

資料範圍

對於30%的資料,1≤n≤10^2,1≤q≤10^3

對於另外40%的資料,沒有r操作

對於100%的資料,1≤n≤10^5,1≤q≤10^5,1≤a≤2*10^7

splay還不會的就先放棄這道題吧

區間翻轉我們只需要像線段樹一樣打乙個懶惰標記(而且因為翻轉可以互相抵消所以可以用 rev^=1 計算)

然後每次要改變有懶標記節點的位置(即旋轉或查詢)時下傳一下即可

(重點還是要會打splay啦)

然後最大值就隨便做

要注意用splay進行區間操作,可以將(舉例區間[l,r]),可以把l-1節點旋至根節點,r+1節點旋至根節點的兒子處,然後r+1節點的左子樹就是要處理的區間啦 l-1

#include #include 

using

namespace

std;

const

int n=1e5+10

;struct

node t[n];

intcnt,rt;

inta[n],n,q;

void update(int

x) void pushdown(int

x) bool witch(int x)

void rotate(int

x) void splay(int x,int

goal)

void build(int &x,int l,int

r) int get(int x,int

y) }

void reverse(int l,int

r) void change(int x,int

k) int query(int l,int

r) int

main()

}

view code

演算法調整隊形

來自 2017 年網易春招筆試題三 在幼兒園有 n個小朋友排列為乙個隊伍,從左到右乙個挨著乙個編號為 0 n 1 其中有一些是男生,有一些是女生,男生用 b 表示,女生用 g 表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情...

調整隊形 TJOI2007

給定乙個初始的序列以及四種操作,問最少操作多少次可以是序列變為回文序列。操作如下 在隊伍左側或右側新增乙個數 在隊伍中插入乙個數 刪除乙個數 改變乙個數的值 看到給定的序列和改數的操作 其實還是因為詢問是最少操作次數 可以想到區間dp。設子狀態 dp i j 表示將區間 i,j 變為回文序列的最少操...

網易面試題 調整隊形

在幼兒園有n個小朋友排列為乙個隊伍,從左到右乙個挨著乙個編號為 0 n 1 其中有一些是男生,有一些是女生,男生用 b 表示,女生用 g 表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情況最少。你只能在原隊形上進行調整,每次...