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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

Bzoj 3343: 教主的魔法(分块+二分答案)

發(fā)布時(shí)間:2024/4/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bzoj 3343: 教主的魔法(分块+二分答案) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

3343: 教主的魔法
Time Limit: 10 Sec Memory Limit: 256 MB
Description
教主最近學(xué)會(huì)了一種神奇的魔法,能夠使人長(zhǎng)高。于是他準(zhǔn)備演示給XMYZ信息組每個(gè)英雄看。于是N個(gè)英雄們又一次聚集在了一起,這次他們排成了一列,被編號(hào)為1、2、……、N。
每個(gè)人的身高一開(kāi)始都是不超過(guò)1000的正整數(shù)。教主的魔法每次可以把閉區(qū)間[L, R](1≤L≤R≤N)內(nèi)的英雄的身高全部加上一個(gè)整數(shù)W。(雖然L=R時(shí)并不符合區(qū)間的書(shū)寫(xiě)規(guī)范,但我們可以認(rèn)為是單獨(dú)增加第L(R)個(gè)英雄的身高)
CYZ、光哥和ZJQ等人不信教主的邪,于是他們有時(shí)候會(huì)問(wèn)WD閉區(qū)間 [L, R] 內(nèi)有多少英雄身高大于等于C,以驗(yàn)證教主的魔法是否真的有效。
WD巨懶,于是他把這個(gè)回答的任務(wù)交給了你。
Input
第1行為兩個(gè)整數(shù)N、Q。Q為問(wèn)題數(shù)與教主的施法數(shù)總和。
第2行有N個(gè)正整數(shù),第i個(gè)數(shù)代表第i個(gè)英雄的身高。
第3到第Q+2行每行有一個(gè)操作:
(1) 若第一個(gè)字母為“M”,則緊接著有三個(gè)數(shù)字L、R、W。表示對(duì)閉區(qū)間 [L, R] 內(nèi)所有英雄的身高加上W。
(2) 若第一個(gè)字母為“A”,則緊接著有三個(gè)數(shù)字L、R、C。詢問(wèn)閉區(qū)間 [L, R] 內(nèi)有多少英雄的身高大于等于C。
Output
對(duì)每個(gè)“A”詢問(wèn)輸出一行,僅含一個(gè)整數(shù),表示閉區(qū)間 [L, R] 內(nèi)身高大于等于C的英雄數(shù)。
Sample Input
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
Sample Output
2
3
HINT
【輸入輸出樣例說(shuō)明】
原先5個(gè)英雄身高為1、2、3、4、5,此時(shí)[1, 5]間有2個(gè)英雄的身高大于等于4。教主施法后變?yōu)?、2、4、5、6,此時(shí)[1, 5]間有3個(gè)英雄的身高大于等于4。
【數(shù)據(jù)范圍】
對(duì)30%的數(shù)據(jù),N≤1000,Q≤1000。
對(duì)100%的數(shù)據(jù),N≤1000000,Q≤3000,1≤W≤1000,1≤C≤1,000,000,000。

/* 分塊+二分答案. 對(duì)于小塊,暴力搞. 對(duì)于整塊打標(biāo)記,二分查找. 復(fù)雜度O(q√nlogn). (這么簡(jiǎn)單的題怎么一開(kāi)始沒(méi)想到呢QWQ. */ #include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #define MAXN 1000001 using namespace std; int n,m,q,ans,belong[MAXN],a[MAXN],s[MAXN],tag[MAXN]; int read() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*f; } void pre(int x) {int l=(x-1)*m+1,r=min(x*m,n);for(int i=l;i<=r;i++) s[i]=a[i];sort(s+l,s+r+1);return ; } void change(int x,int y,int z) {for(int i=x;i<=min(belong[x]*m,y);i++) a[i]+=z;pre(belong[x]);if(belong[x]+1<belong[y])// 1 W.for(int i=belong[x]+1;i<=belong[y]-1;i++) tag[i]+=z;if(belong[x]!=belong[y]){for(int i=(belong[y]-1)*m+1;i<=y;i++) a[i]+=z;pre(belong[y]);} } int erfen(int x,int z) {int l=(x-1)*m+1,r=min(x*m,n);int p=lower_bound(s+l,s+r+1,z-tag[x])-s;return r-p+1; } void query(int x,int y,int z) {ans=0;for(int i=x;i<=min(belong[x]*m,y);i++)if(a[i]+tag[belong[i]]>=z) ans++;if(belong[x]+1<belong[y])for(int i=belong[x]+1;i<=belong[y]-1;i++) ans+=erfen(i,z);if(belong[x]!=belong[y]){for(int i=(belong[y]-1)*m+1;i<=y;i++)if(a[i]+tag[belong[i]]>=z) ans++;}printf("%d\n",ans); } int main() {int x,y,z;char ch[3];n=read(),q=read();m=sqrt(n);for(int i=1;i<=n;i++) a[i]=read();for(int i=1;i<=n;i++) belong[i]=(i-1)/m+1;for(int i=1;i<=belong[n];i++) pre(i);// 2 w.while(q--){scanf("%s",ch);x=read(),y=read(),z=read();if(ch[0]=='M') change(x,y,z);else query(x,y,z);}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/nancheng58/p/10067980.html

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Bzoj 3343: 教主的魔法(分块+二分答案)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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