首页 > 代码库 > CDOJ 1324 卿学姐与公主 分块
CDOJ 1324 卿学姐与公主 分块
题目地址
分块模板
1 #include<cstdio> 2 #include<algorithm> 3 #include<math.h> 4 using namespace std; 5 const int Nmax=100005; 6 int num,block,l[Nmax],r[Nmax],n,q,belong[Nmax]; 7 long long Max[Nmax],a[Nmax]; 8 9 void build()10 {11 block=sqrt(n);12 num=n/block; 13 if(n%block) num++;14 for(int i=1;i<=n;i++)15 {16 l[i]=(i-1)*block+1;17 r[i]=i*block;18 belong[i]=(i-1)/block+1;19 }20 r[num]=n;21 22 for(int i=1;i<=n;i++)23 a[i]=0;24 25 for(int i=1;i<=num;i++)26 for(int j=l[i];j<=r[i];j++)27 Max[j]=max(Max[j],a[j]);28 }29 30 void update(int x,int data)31 {32 a[x]+=data;33 Max[belong[x]]=max(Max[belong[x]],a[x]);34 }35 36 long long ask(int x,int y)37 {38 long long ans=0;39 if(belong[x]==belong[y])40 {41 for(int i=x;i<=y;i++)42 {43 ans=max(ans,a[i]);44 }45 return ans;46 }47 for(int i=x;i<=r[x];i++)48 ans=max(ans,a[i]);49 for(int i=belong[x]+1;i<belong[y];i++)50 ans=max(ans,Max[i]);51 for(int i=l[y];i<=y;i++)52 ans=max(ans,a[i]);53 return ans;54 }55 56 int main()57 {58 scanf("%d%d",&n,&q);59 while(q--)60 {61 int c,x,y;62 scanf("%d%d%d",&c,&x,&y);63 if(c==1)64 update(x,y);65 else66 printf("%lld\n",ask(x,y));67 }68 return 0;69 }
CDOJ 1324 卿学姐与公主 分块
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。