問題 G 區間查詢

2021-09-26 05:55:38 字數 1694 閱讀 1189

食堂有n個打飯視窗,現在正到了午飯時間,每個視窗都排了很多的學生,而且每個視窗排隊的人數在不斷的變化。

現在問你第i個視窗到第j個視窗一共有多少人在排隊?

輸入的第一行是乙個整數t,表示有t組測試資料。

每組輸入的第一行是乙個正整數n(n<=30000),表示食堂有n個視窗。

接下來一行輸入n個正整數,第i個正整數ai表示第i個視窗最開始有ai個人排隊。(1<=ai<=50)

接下來每行有一條命令,命令有四種形式:

(1)add i j,i和j為正整數,表示第i個視窗增加j個人(j不超過30);

(2)sub i j,i和j為正整數,表示第i個視窗減少j個人(j不超過30);

(3)query i j,i和j為正整數,i<=j,表示詢問第i到第j個視窗的總人數;

(4)end 表示結束,這條命令在每組資料最後出現;

每組資料最多有40000條命令。

對於每組輸入,首先輸出樣例號,佔一行。

然後對於每個query詢問,輸出乙個整數,佔一行,表示詢問的段中的總人數,這個數保持在int以內。

1

101 2 3 4 5 6 7 8 9 10

query 1 3

add 3 6

query 2 7

sub 10 2

add 6 3

query 3 10

end

case 1:633

59

#include#define maxn 500005

#define ll long long

using namespace std;

ll a,b,c;

ll ans=0;

struct node

tree[maxn];

void down(int k)

void build (int k,int lt,int rr)

int mid=(lt+rr)/2;

build (k*2,lt,mid);

build (k*2+1,mid+1,rr);

tree[k].w=tree[k*2].w+tree[k*2+1].w;

}void add(int k)

if (tree[k].f) down(k);

int mid=(tree[k].l+tree[k].r)/2;

if (a<=mid) add(k*2);

if (b>mid) add(2*k+1);

tree[k].w=tree[k*2].w+tree[2*k+1].w;

}void sum(int k)

if (tree[k].f) down(k);

int mid=(tree[k].l+tree[k].r)/2;

if (a<=mid) sum(2*k);

if (b>mid) sum(2*k+1);

} int main ()

if (s[0]=='s')

if (s[0]=='q')

} }

return 0;

}

問題 G 區間權值

時間限制 1 sec 記憶體限制 128 mb 提交 112 解決 49 提交 狀態 討論版 命題人 admin 題目描述 小bo有n個正整數a1.an,以及乙個權值序列w1 wn,現在他定義 現在他想知道 你只需要輸出答案對109 7取模後的值 輸入第一行乙個正整數n 第二行n個正整數a1.an ...

Hbase Scan查詢左右區間開閉問題

剛開始用hbase,用scan進行資料查詢,以為類似於mysql的between and 但是發現查詢結果不對 table table connection.gettable tablename.valueof tablename scan scan new scan scan.setstartro...

RMQ問題(區間最值查詢)

有一類問題被稱作區間最值問題,描述的是,給定 n 個元素,需要查詢下標位於 p q 之間的最大 小值。首先確定,針對每一次查詢,肯定是不能動態求最值的,因為每次都要計算,可能造成比較多的時間耗費。有 一種比較好的解決辦法是,先得到所有結果,在查詢時直接取出結果。這樣,就需要一種資料結構,能夠覆蓋所有...