problem description
一天,乙隻住在 501 實驗室的皮卡丘決定發奮學習,成為像 leiq 一樣的巨巨,於是他向鎮上的賢者金桔請教如何才能進化成乙隻雷丘。
金桔告訴他需要進化石才能進化,並給了他乙個地圖,地圖上有 n 個小鎮,他需要從這些小鎮中收集進化石。
接下來他會進行 q 次操作,可能是打聽進化石的資訊,也可能是向你詢問第 l 個小鎮到第 r 個小鎮之間的進化石種類。
如果是打聽資訊,則皮卡丘會得到乙個小鎮的進化石變化資訊,可能是引入了新的進化石,也可能是失去了全部的某種進化石。
如果是向你詢問,你需要回答他第 l 個小鎮到第 r 個小鎮之間的進化石種類。
input
首先輸入乙個整數 t (1 <= t <= 10),代表有 t 組資料。
每組資料的第一行輸入乙個整數 n (1 <= n <= 100000) 和乙個整數 q (1 <= q <= 100000),分別代表有 n 個小鎮,表皮卡丘有 q 次操作。
接下來輸入 q 行,對於每次操作,先輸入操作型別,然後根據操作型別讀入:
output
對於每組輸入,首先輸出一行 "case t:",表示當前是第幾組資料。
對於每組資料中的每次 3 操作,在一行中按編號公升序輸出所有可收集的進化石。如果沒有進化石可收集,則輸出乙個 meik 的百分號 "%"(不包括引號)。
example input
110 10
3 1 10
1 1 50
3 1 5
1 2 20
3 1 1
3 1 2
2 1 50
2 2 20
3 1 2
3 1 10
example output
case 1:%505020 50
%%
思路:種類的範圍不超過60,所以為樹上每個節點加乙個longlong值表示狀態即可,之後再統計種類。
(不用狀壓也能過)
code:
#include #define ll long long
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
const int maxn = 100005;
ll c[maxn<<2], ans;
int n, q, opt[65];
void pushup(int rt)
void update(int cz, int key, int cur, int l, int r, int rt)
void query(int l, int r, int l, int r, int rt)
int m = (l+r)>>1;
if(l <= m) query(l, r, lson);
if(r > m) query(l, r, rson);
}int main()
{ int t, q1, q2, q3, count = 0;
scanf("%d", &t);
while(t--)
{ scanf("%d %d", &n, &q);
printf("case %d:\n", ++count);
memset(c, 0, sizeof c);
for(int i = 1; i <= q; ++i)
{ scanf("%d %d %d", &q1, &q2, &q3);
if(q1 == 1) update(q3, 1, q2, 1, n, 1);
if(q1 == 2) update(q3, 0, q2, 1, n, 1);
if(q1 == 3)
{ans = 0;
query(q2, q3, 1, n, 1);
int tot = 0;
for(int i = 1; i <= 60; ++i)
if((1ll《繼續加油~
線段樹 狀態壓縮
n個桶按順序排列,我們用1 n給桶標號。有兩種操作 1 l r c 區間 l,r 中的每個桶中都放入乙個顏色為c的球 1 l,r n,l r,0 c 60 2 l r 查詢區間 l,r 的桶中有多少種不同顏色的球 1 l,r n,l r 有多組資料,對於每組資料 第一行有兩個整數n,m 1 n,m ...
Apple Tree(樹狀陣列 線段樹)
description 3 1 2 1 3 3 q 1 c 2 q 1 sample output 3 2 題目大意 一棵樹上長了蘋果,每乙個樹枝節點上有長蘋果和不長蘋果兩種狀態,兩種操作,一種操作能夠改變樹枝上蘋果的狀態,另一種操作詢問某一樹枝節點一下的所有的蘋果有多少。樹狀陣列版 include...
線段樹 樹狀陣列 總結
前言在對這三個資料結構進行了粗淺的學習之後,博主發現資料結構的世界是多麼的美妙。然後在博主的專業作死技能加持之下,三個資料結構的大戰一觸即發 對於某些題目 如,單點更新並且查詢區間和 那麼這個時候,我們會發現用樹狀陣列也十分吃香,畢竟這正是樹狀陣列所擅長的!它的時間複雜度均為o log n 相比於線...