日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj4631

發(fā)布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj4631 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

4631: 踩氣球

Time Limit:?10 Sec??Memory Limit:?256 MB
Submit:?260??Solved:?133
[Submit][Status][Discuss]

Description

六一兒童節(jié)到了, SHUXK 被迫陪著M個熊孩子玩一個無聊的游戲:有N個盒子從左到右排成一排,第i個盒子里裝著Ai個氣球。 SHUXK 要進行Q次操作,每次從某一個盒子里拿出一個沒被踩爆的氣球,然后熊孩子們就會立刻把它踩爆。 這M個熊孩子每個人都指定了一個盒子區(qū)間[Li, Ri]。 如果某一個時刻,一個熊孩子發(fā)現(xiàn)自己選定的盒子區(qū)間[Li, Ri]中的所 有氣球都已經(jīng)被踩爆了,他就會非常高興(顯然之后他一直會很高興)。 為了不辜負(fù)將自己的任務(wù)強行塞給 SHUXK 的那個人的期望, SHUXK 想向你詢問:? 他每次操作過后會有多少個熊孩子很高興。

?

Input

第一行包含兩個正整數(shù)N和M,分別表示盒子和熊孩子的個數(shù)。 第二行包含N個正整數(shù)Ai( 1 < = Ai < = 10^5),表示每個盒子里氣球的數(shù)量。 以下M行每行包含兩個正整數(shù)Li, Ri( 1 < = Li < = Ri < = N),分別表示每一個熊孩子指定的區(qū)間。 以下一行包含一個正整數(shù)Q,表示 SHUXK 操作的次數(shù)。 以下Q行每行包含一個正整數(shù)X,表示這次操作是從第X個盒子里拿氣球。為 了體現(xiàn)在線,我們對輸入的X進行了加密。 假設(shè)輸入的正整數(shù)是x',那么真正的X = (x' + Lastans ? 1)Mod N + 1。其 中Lastans為上一次詢問的答案。對于第一個詢問, Lastans = 0。 輸入數(shù)據(jù)保證1 < = x' < = 10^9, 且第X個盒子中有尚未被踩爆的氣球。 N < = 10^5 ,M < = 10^5 �,Q < = 10^5

?

Output

包含Q行,每行輸出一個整數(shù),表示 SHUXK 一次操作后詢問的 答案。答案的順序應(yīng)與輸入數(shù)據(jù)的順序保持一致。

?

Sample Input

5 3
1 1 1 1 1
5 5
2 2
1 3
5
4
2
5
2
3

Sample Output

0
1
1
2
3
【樣例說明】
實際上每次操作的盒子是: 4 2 1 3 5
在第二次操作后,第二個熊孩子會高興 (區(qū)間[2,2]中的氣球已經(jīng)全部被踩爆)。
在第四次操作后,第三個熊孩子會高興(區(qū)間[1,3]中的氣球已經(jīng)全部被踩爆)。
在第五次操作后,第一個熊孩子會高興(區(qū)間[5,5]中的氣球已經(jīng)全部被踩爆)。

HINT

Source

按r排序,每次詢問二分查找r的位置,線段樹上查找最大值就可以了(我仍然想不出來)

#include<bits/stdc++.h> using namespace std; typedef pair<int,int> PII; #define N 200010 struct query {int l,r; }q[N]; int n,m,Q,cnt,ans,lastans; int pre[N],nxt[N],a[N]; PII tree[N<<1]; bool cp(query x,query y) {if(x.r!=y.r) return x.r<y.r;return x.l>y.l; } void update(int l,int r,int x,int pos,int num) {if(l==r){tree[x].first=num;tree[x].second=l;return;}int mid=(l+r)>>1;if(pos<=mid) update(l,mid,x<<1,pos,num);else update(mid+1,r,x<<1|1,pos,num);if(tree[x<<1].first>tree[x<<1|1].first) tree[x]=tree[x<<1];else tree[x]=tree[x<<1|1]; } PII query(int l,int r,int x,int a,int b) {if(l>b||r<a) return make_pair(0,0);if(l>=a&&r<=b) return tree[x];int mid=(l+r)>>1;PII t1=query(l,mid,x<<1,a,b),t2=query(mid+1,r,x<<1|1,a,b);if(t1.first>t2.first) return t1; else return t2; } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){scanf("%d",&a[i]);pre[i]=i-1; nxt[i]=i+1;}for(int i=1;i<=m;++i) scanf("%d%d",&q[i].l,&q[i].r);sort(q+1,q+m+1,cp);for(int i=1;i<=m;++i) update(1,m,1,i,q[i].l);scanf("%d",&Q);while(Q--){int x; scanf("%d",&x);x=(x+lastans-1)%n+1;a[x]--;if(a[x]){printf("%d\n",ans);continue;}int pos1=n,pos2=n,left=pre[x]+1,right=nxt[x]-1;int l=0,r=n+1;while(r-l>1){int mid=(l+r)>>1;if(q[mid].r>=left) r=pos1=mid; else l=mid; }l=0; r=n+1;while(r-l>1){int mid=(l+r)>>1;if(q[mid].r<=right) l=pos2=mid; else r=mid;} /* if(q[pos1].r>right) pos1--;if(q[pos2].r>right) pos2--;if(pre[x]==0) pos1=1; */ // printf("x=%d\n",x); // printf("left=%d right=%d\n",left,right); // printf("pos1=%d pos2=%d\n",pos1,pos2);while(1){PII t=query(1,m,1,pos1,pos2); // printf("query=%d\n",t.first);if(t.first>=left&&t.first<=right&&t.first!=0) {ans++;update(1,m,1,t.second,0);} else break;}nxt[pre[x]]=nxt[x];pre[nxt[x]]=pre[x];lastans=ans;printf("%d\n",ans); }return 0; } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/19992147orz/p/6481766.html

總結(jié)

以上是生活随笔為你收集整理的bzoj4631的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。