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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj29894170: 数列

發(fā)布時(shí)間:2025/5/22 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj29894170: 数列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

給定一個(gè)長度為n的正整數(shù)數(shù)列a[i]。 定義2個(gè)位置的graze值為兩者位置差與數(shù)值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]|。 2種操作(k都是正整數(shù)): 1.Modify x k:將第x個(gè)數(shù)的值修改為k。 2.Query x k:詢問有幾個(gè)i滿足graze(x,i)<=k。因?yàn)榭沙志没瘮?shù)據(jù)結(jié)構(gòu)的流行,詢問不僅要考慮當(dāng)前數(shù)列,還要考慮任意歷史版本,即統(tǒng)計(jì)任意位置上出現(xiàn)過的任意數(shù)值當(dāng)前的a[x]的graze值<=k的對(duì)數(shù)。(某位置多次修改為同樣的數(shù)值,按多次統(tǒng)計(jì))

Input

第1行兩個(gè)整數(shù)n,q。分別表示數(shù)列長度和操作數(shù)。 第2行n個(gè)正整數(shù),代表初始數(shù)列。 第3--q+2行每行一個(gè)操作。

Output

????對(duì)于每次詢問操作,輸出一個(gè)非負(fù)整數(shù)表示答案。

Sample Input

3 5
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1

Sample Output

2
3
3

HINT

N<=60000?修改操作數(shù)<=40000?詢問<=10000?Max{a[i]}含修改<=100000

思路:考場(chǎng)上打了個(gè)暴力,竟然有70分....

CDQ分治,先把坐標(biāo)(x,y)轉(zhuǎn)換成(x-y,x+y),然后就是正放著的矩形了,詢問就是矩形中點(diǎn)的個(gè)數(shù)。

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=60010,maxm=260010,maxq=500010; int n,q,a[maxn],ans[maxq],cnt,lim; bool que[maxq];char op[10]; struct node{int num,id,op,x,y,t;}li[maxq],tmp[maxq]; struct Bit{int val[maxq]; void change(int x,int v){for (;x<=lim;x+=x&-x) val[x]+=v;}int query(int x){int res=0;for (;x;x-=x&-x) res+=val[x];return res;} }T;void add(int op,int id,int x,int y,int k){int xx=x-y,yy=x+y;if (!op) lim=max(lim,xx),lim=max(lim,yy),li[++cnt]=(node){cnt,id,op,xx,yy,0};else{int x1=xx-k,y1=yy-k,x2=xx+k,y2=yy+k;if (y1>0) li[++cnt]=(node){cnt,id,op,x1-1,y1-1,1};li[++cnt]=(node){cnt,id,op,x1-1,y2,-1};if (y1>0) li[++cnt]=(node){cnt,id,op,x2,y1-1,-1};li[++cnt]=(node){cnt,id,op,x2,y2,1};lim=max(lim,x2),lim=max(lim,y2);} }void solve(int l,int r){if (l==r) return;int mid=(l+r)>>1;solve(l,mid),solve(mid+1,r);for (int i=l,a=l,b=mid+1;i<=r;i++){node p;if (a<=mid&&(b>r||li[a].x<=li[b].x)) p=li[a++];else p=li[b++];if (p.num<=mid&&!p.op) T.change(p.y,1);if (p.num>mid&&p.op) ans[p.id]+=T.query(p.y)*p.t;tmp[i]=p;}for (int i=l;i<=r;i++) li[i]=tmp[i];for (int i=l;i<=r;i++) if (li[i].num<=mid&&!li[i].op) T.change(li[i].y,-1); }int main(){scanf("%d%d",&n,&q);for (int i=1;i<=n;i++) scanf("%d",&a[i]),add(0,i,i,a[i],0);for (int i=n+1,x,k;i<=n+q;i++){scanf("%s%d%d",op,&x,&k);if (op[0]=='M') a[x]=k,add(0,i,x,a[x],0);else que[i]=1,add(1,i,x,a[x],k);}n+=q,lim++,solve(1,cnt);for (int i=1;i<=cnt;i++) if (que[i]) printf("%d\n",ans[i]);return 0; }

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

總結(jié)

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

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