晚練整隊
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 #includeview codeusing
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()
}
演算法調整隊形
來自 2017 年網易春招筆試題三 在幼兒園有 n個小朋友排列為乙個隊伍,從左到右乙個挨著乙個編號為 0 n 1 其中有一些是男生,有一些是女生,男生用 b 表示,女生用 g 表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情...
調整隊形 TJOI2007
給定乙個初始的序列以及四種操作,問最少操作多少次可以是序列變為回文序列。操作如下 在隊伍左側或右側新增乙個數 在隊伍中插入乙個數 刪除乙個數 改變乙個數的值 看到給定的序列和改數的操作 其實還是因為詢問是最少操作次數 可以想到區間dp。設子狀態 dp i j 表示將區間 i,j 變為回文序列的最少操...
網易面試題 調整隊形
在幼兒園有n個小朋友排列為乙個隊伍,從左到右乙個挨著乙個編號為 0 n 1 其中有一些是男生,有一些是女生,男生用 b 表示,女生用 g 表示。小朋友們都很頑皮,當乙個男生挨著的是女生的時候就會發生矛盾。作為幼兒園的老師,你需要讓男生挨著女生或者女生挨著男生的情況最少。你只能在原隊形上進行調整,每次...