時間限制: 2.0 秒
空間限制: 512 mb
skydec和yjqqqaq都是yazid的好朋友。他們都非常喜歡吃火鍋。有一天,他們聚在一起,享受一場火鍋盛宴。
在這場火鍋盛宴中,有乙個麻辣濃湯鍋底的火鍋和n
種食物,每種食物數量都是無限的。我們用1
至n將這些食材編號。
每種食物煮熟所需要的時間不同,第i
種食物煮熟需要si
單位時間。這表示如果你在第t
個時刻將乙個食物i
下到火鍋裡,那麼它會在第t+si
個時刻被煮熟,並且此後一直會延續被煮熟的狀態,直到它被拿走為止。
yazid和yjqqqaq的口味不同:yjqqqaq覺得所有食物的好吃程度都是相同的;而yazid則覺得沒有兩種食材的好吃程度是相同的,並且,巧合的是,編號越小的食物yazid越喜歡吃。可憐的skydec由於不能吃辣,所以只能幫yazid和yjqqqaq煮食物。
整個火鍋盛宴持續109
單位時間。在整個盛宴中,三位好朋友除了談笑風生之外,最重要的事當然就是吃東西了。在任意整數時刻,都有可能發生下列4
種事件中的任意一種,我們用0
至3之間的整數op
描述事件型別:
整個火鍋晚宴中共發生了q
個事件,且沒有任意兩個事件在同一時刻發生。
他們的好朋友flvze想知道這場火鍋晚宴中發生的所有事,所以請你告訴她。
從標準輸入讀入資料。
本題包含多組資料,輸入的第一行為乙個正整數t
,表示資料組數。接下來依次描述每組資料,對於每組資料:
第一行乙個正整數n
,表示食物的種類數。
第二行n
個用空格隔開的正整數s1,s2,…,sn
,描述每種食物煮熟需要的時間。
第三行乙個正整數q
,表示事件的數目。
接下來q
行,每行若干個用空格隔開的非負整數,描述乙個事件。先是兩個整數t,op
,分別表示發生事件的時間以及事件的型別。如果op=0
或op=2
,則接下來1
個正整數id
,意義見題目描述
;如果op=1
,則接下來沒有其他數;如果op=3
,則接下來2
個正整數l,r
,意義見題目描述
。
我們保證t
按輸入順序嚴格遞增。
我們保證1≤t≤109
,0≤op≤3
,1≤id≤n
,1≤l≤r≤n
。對於每個op≠0
的操作,輸出一行表示答案。對於不同的op
,需要輸出的內容如下:
輸出到標準輸出。
1
21 100
101 0 2
2 0 1
3 2 1
4 2 2
5 2 1
200 0 1
201 3 1 2
202 1
203 1
204 1
測試點編號succeeded!
97yjqqqaq is angry.21
2yazid is angry.
n≤q≤
特殊約定
測試點分值
1500
1000無8
2-310
300,000無6
4-5100,000
所有si=1
86-7
所有si
都相同11
8-9op≠3
710-11無12
12-13
500,000
2對於所有資料,保證t≤4
,保證n≤100,000
,q≤500,000
,1≤si≤108
。大意:有n種食物,編號越小越好吃,三個操作:(1)往火鍋裡放食物(2)查詢最喜歡的而且熟了的食物(3)輸出編號在[l,r]之間的熟的食物的數量
大意只是大意,題目要求還有好多細節,請移步題目描述和輸出格式。
題解:這題確實是乙個很有意思的資料結構題,考場上想開n+1個set搞一搞,但是沒有時間寫這題了。
當然,大多數人寫的是三個set的方法
後來出題人說三個set能過,因為他沒有卡。
正解是先將食物按照熟的時間從小到大排序,這樣在列舉時間的時候就方便找到該下鍋的食物或者此時剛熟的食物了。
樹狀陣列+鍊錶。
在按時間順序列舉事件的時候,用樹狀陣列維護前 k 種食物中熟的個數,用鍊錶維護已經放下但是沒有熟的食物。
乙個食物下鍋後先放入鍊錶,發現煉表表頭的食物熟了,就取出表頭,更新樹狀陣列,查詢和拿出食物的時候在樹狀陣列裡操作就行了。
值得一提的是樹狀陣列的upper_bound(v)操作:找出 最小的 大於v的字首和,也是o(logn)的時間複雜度。詳見**。
貼乙份高仿某位大神的**(我幾乎背下來的)
/*welcome hacking
wish you high rating
*/#include#include#include#include#include#include#include#includeusing namespace std;
int read()
while(ch>='0'&&ch<='9')
return xx*ff;
}const int maxn=100010,maxm=500010;
int n,q,s[maxn],arg1[maxm],arg2[maxm],t[maxm],op[maxm];
int id[maxm],cnt,head[maxn],tail[maxn];
struct bit
void clear()
void upd(int x,int v)
int query(int x)
int upper_bound(int v)
}bit;
bool mycmp(int xx,int yy)
struct nodenode[maxm];
int node_cnt;
void add(int x,int val)
node[node_cnt].data=val;
}void remove(int x)
int main()
sort(id+1,id+1+cnt,mycmp);
int q=1;
for(int i=1;i<=q;i++)
if(op[i]==0)
add(arg1[i],t[i]+s[arg1[i]]);
else if(op[i]==1)
}else if(op[i]==2)
else if(head[arg1[i]])
printf("%d\n",node[head[arg1[i]]].data-t[i]);
else
printf("yjqqqaq is angry.\n");
}else
printf("%d\n",bit.query(arg2[i])-bit.query(arg1[i]-1));}}
return 0;
}
buct12月月賽總結
好久沒寫部落格了。這次是大學後第一次部落格,用來總結12月月賽。8道a了6道。ab等補充。題目描述 有編號1 n的n個格仔,機械人從1號格仔順序向後走,一直走到n號格仔,並需要從n號格仔走出去。機械人有乙個初始能量,每個格仔對應乙個整數a i 表示這個格仔的能量值。如果a i 0,機械人走到這個格仔...
安恆杯12月月賽
這次的月賽可以說非常適合我這種菜雞做了請求包中發現乙個user base64 解碼得到user,構造admin 然後base64提交 發現跳轉到後台admin.php 試了乙個ls發現有回顯,應該是個命令執行漏洞 構造 cmd ls ifs 成功回顯 然後讀取flag cmd cat ifs ffl...
程式設計俱樂部12月月賽總結
題目背景 今天是冬至日,是時候吃餃子了。今天中午,某學校大發善心說請所有同學在教學樓下集合,排成一橫隊,會免費發放餃子。當所有準備領取餃子的同學在樓下排好的時候,一位有強迫症的老師請所有的男同學站在所有女生的右邊。我們已知每秒鐘所有排在左邊的男生會與他相鄰的並且在右邊的女生交換位置。問多少秒鐘之後所...