小 c 的兔子不是雪白的,而是五彩繽紛的。每只兔子都有一種顏色,不同的兔子可能有 相同的顏色。小 c 把她標號從 1 到 nn 的 nn 只兔子排成長長的一排,來給他們喂胡蘿蔔吃。 排列完成後,第 ii 只兔子的顏色是 a_iai。
俗話說得好,「蘿蔔青菜,各有所愛」。小 c 發現,不同顏色的兔子可能有對胡蘿蔔的 不同偏好。比如,銀色的兔子最喜歡吃金色的胡蘿蔔,金色的兔子更喜歡吃胡蘿蔔葉子,而 綠色的兔子卻喜歡吃酸一點的胡蘿蔔……為了滿足兔子們的要求,小 c 十分苦惱。所以,為 了使得胡蘿蔔喂得更加準確,小 c 想知道在區間 [l_j,r_j][lj,rj] 裡有多少只顏色為 c_jcj的兔子。
不過,因為小 c 的兔子們都十分地活躍,它們不是很願意待在乙個固定的位置;與此同 時,小 c 也在根據她知道的資訊來給兔子們調整位置。所以,有時編號為 x_jxj和 x_j+1xj+1 的兩 只兔子會交換位置。 小 c 被這一系列麻煩事給難住了。你能幫幫她嗎?
從標準輸入中讀入資料。 輸入第 1 行兩個正整數 nn,mm。
輸入第 2 行 nn 個正整數,第 ii 個數表示第 ii 只兔子的顏色 a_iai。
輸入接下來 mm 行,每行為以下兩種中的一種:
輸出到標準輸出中。
對於每個 1 操作,輸出一行乙個正整數,表示你對於這個詢問的答案。
輸入 #1複製
6 5輸出 #1複製1 2 3 2 3 3
1 1 3 2
1 4 6 3
2 3
1 1 3 2
1 4 6 3
12 2
3 旅遊的簡化版 水題
資料結構學傻了 其實二分就過了
//view codeluogu-judger-enable-o2
#includeusing
namespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define see(x) (cerr<
#define inf 0x3f3f3f3f
#define clr(a,v) memset(a,v,sizeof a)typedef pair
pii;
/////////////////////////////////
/const
int n=2e6+10
;int t[n<<5],ncnt,t[n<<5],lson[n<<5],rson[n<<5
],a[n];
void upnode(int x,int v,int l,int r,int&pos)
int m=(l+r)>>1
;
if(x<=m)upnode(x,v,l,m,lson[pos]);
else upnode(x,v,m+1
,r,rson[pos]);
t[pos]=t[lson[pos]]+t[rson[pos]];
}int qsum(int l,int r,int l,int r,int
pos)
intmain()
else
}return0;
}
洛谷P3939 數顏色
題目大意 有n個物品,每個物品有乙個顏色。現在有兩種操作 1.查詢l r內有多少顏色為c的物品並輸出。2.將第x個物品和第x 1個交換。現在讓你實現這些操作。解題思路 首先一共有300000種顏色,最多只有300000個物品,但如果直接開陣列,結果可想而知。所以考慮用vector儲存每種顏色的編號。...
動態開點線段樹
前置芝士 眾所周知,普通線段樹空間複雜度是 o n 4 所以當n很大的時候,如果正常的去建一顆線段樹,開4倍n空間顯然會炸記憶體 怎麼辦呢?這個時候,動態開點線段樹出現了。概念 動態開點線段樹是一類特殊的線段樹,與普通的線段樹不同的是,每乙個節點的左右兒子不是該點編號的兩倍和兩倍加一,而是現加出來的...
學習筆記 動態開點線段樹
通過只開需要使用的結點以節省空間。實現過程就是把點乙個乙個往樹裡面插。建樹時遞迴進入當前結點的子結點後,若該結點為 0 即不存在,就開點。所謂開點即為把當前結點的編號設定為 tot 這樣處理下來,每個結點的編號顯然是亂序的。可以 l son 和 r son 分別記錄左右子結點的編號,然後讓它們代替普...