CDOJ 1324 (分块样例)

来源:互联网 发布:海口数据共享交换平台 编辑:程序博客网 时间:2024/04/30 18:49

简化题意:
单点更新某个值,区间查询最大值

分块:首先将序列分成sqrt(n)块,每个块中有sqrt(n)个元素,更新O1,查询O(sqrt(n))

#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#include<algorithm>#include<map>#include<cstdlib>#include<cmath>#include<vector>//#pragma comment(linker, "/STACK:1024000000,1024000000");using namespace std;#define INF 0x3f3f3f3f#define maxn 100005int n,q;int block,num,belong[maxn],l[maxn],r[maxn];long long val[maxn],mx[maxn];void init(){    block=sqrt(n);    num=n/block;    if(n%block) num++;    for(int i=1;i<=n;i++)    {        belong[i]=(i-1)/block+1;    }    for(int i=1;i<=num;i++)    {        l[i]=(i-1)*block+1;        r[i]=i*block;    }}void update(int x,int add){    mx[belong[x]]=max(mx[belong[x]],val[x]+=add);}long long query(int x,int y){    long long ans=0;    if(belong[x]==belong[y])    {        for(int i=x;i<=y;i++)        {            ans=max(ans,val[i]);        }        return ans;    }    for(int i=x;i<l[belong[x]+1];i++) ans=max(val[i],ans);    for(int i=l[belong[y]];i<=y;i++) ans=max(val[i],ans);    for(int i=belong[x]+1;i<belong[y];i++) ans=max(mx[i],ans);    return ans;}int main(){    scanf("%d%d",&n,&q);    init();    for(int i=0;i<q;i++)    {        int op,l,r;        scanf("%d%d%d",&op,&l,&r);        if(op==1) update(l,r);        else printf("%lld\n",query(l,r));    }    return 0;}
0 0
原创粉丝点击