zoukankan      html  css  js  c++  java
  • BZOJ2683简单题

    Description

    你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:
    命令

    参数限制

    内容

    1 x y A

    1<=x,y<=N,A是正整数

    将格子x,y里的数字加上A

    2 x1 y1 x2 y2

    1<=x1<= x2<=N

    1<=y1<= y2<=N

    输出x1 y1 x2 y2这个矩形内的数字和

    3

    终止程序

    Input

    输入文件第一行一个正整数N。
    接下来每行一个操作。
    Output

    对于每个2操作,输出一个对应的答案。
    Sample Input

    4
    1 2 3 3
    2 1 1 3 3
    1 2 2 2
    2 2 2 3 4
    3
    Sample Output

    3
    5
    HINT

    1<=N<=500000,操作数不超过200000个,内存限制20M。
    对于100%的数据,操作1中的A不超过2000。


    CDQ分治模板题
    首先把一个询问操作,拆成4个..++–;

    然后我们所有操作进行排序,按x维排序;

    然后对y维建立树状数组,这里我们可以发现,如果按x从小到大的处理的话,一次询问,相当于是对y维取前缀和;

    然后CDQ(l,r),枚举这些操作,如果修改操作序号<=mid,那么就修改;如果查询操作序号>mid那么就计算答案。这样按x进行的排序和输入顺序就不矛盾了,可以得到正确答案

    然后还要还原,然后递归分治即可

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    inline int read()
    {
        int x=0; char ch=getchar();
        while (ch<‘0‘ || ch>‘9‘) {ch=getchar();}
        while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
        return x;
    }
    #define MAXQ 200010
    #define MAXN 500010
    int S,W,ans[MAXQ];
    namespace BIT
    {
        int tree[MAXN];
        inline int lowbit(int x) {return x&-x;}
        inline void Change(int pos,int D) {for (int i=pos; i<=W; i+=lowbit(i)) tree[i]+=D;}
        inline int Query(int pos) {int re=0; for (int i=pos; i; i-=lowbit(i)) re+=tree[i]; return re;}
    }
    using namespace BIT;
    struct AskNode
    {
        int id,x,y,opt,del,ID;
        bool operator < (const AskNode & A) const
            {
                return (x==A.x && y==A.y)? opt<A.opt: ((x==A.x)? y<A.y:x<A.x);
            }
    }q[MAXQ<<2],tmp[MAXQ<<2];
    void CDQ(int l,int r)
    {
        if (l==r) return;
        int mid=(l+r)>>1,z1=l,z2=mid+1;
        for (int i=l; i<=r; i++)
            { 
                if (q[i].opt==1 && q[i].id<=mid) BIT::Change(q[i].y,q[i].del);
                if (q[i].opt==2 && q[i].id>mid) ans[q[i].ID]+=BIT::Query(q[i].y)*q[i].del;
            }
        for (int i=l; i<=r; i++) if (q[i].opt==1 && q[i].id<=mid) BIT::Change(q[i].y,-q[i].del);
        for (int i=l; i<=r; i++) if (q[i].id<=mid) tmp[z1++]=q[i]; else tmp[z2++]=q[i];
        for (int i=l; i<=r; i++) q[i]=tmp[i];
        CDQ(l,mid); CDQ(mid+1,r);
    }
    int z,t;
    void PreWork(int x1,int y1,int x2,int y2)
    {
        z++;
        t++; q[t].id=t; q[t].ID=z; q[t].x=x1-1; q[t].y=y1-1; q[t].del=1; q[t].opt=2;
        t++; q[t].id=t; q[t].ID=z; q[t].x=x2; q[t].y=y2; q[t].del=1; q[t].opt=2;
        t++; q[t].id=t; q[t].ID=z; q[t].x=x1-1; q[t].y=y2; q[t].del=-1; q[t].opt=2;
        t++; q[t].id=t; q[t].ID=z; q[t].x=x2; q[t].y=y1-1; q[t].del=-1; q[t].opt=2;
    }
    int main()
    {
        W=read();
        t=0; z=0;
        while (1)
            {
                int opt=read(); if (opt==3) break;
                if (opt==1) {t++; q[t].x=read(),q[t].y=read(),q[t].del=read(),q[t].id=t,q[t].opt=1;}
                if (opt==2) {int x1=read(),y1=read(),x2=read(),y2=read(); PreWork(x1,y1,x2,y2);}
            }
        sort(q+1,q+t+1);
    //    for (int i=1; i<=t; i++) printf("%d %d %d %d %d
    ",q[i].id,q[i].opt,q[i].del,q[i].x,q[i].y);
        CDQ(1,t);
        for (int i=1; i<=z; i++) printf("%d
    ",ans[i]);
        return 0;
    } 
  • 相关阅读:
    mybatis-day1
    java基础
    pytest进阶之html测试报告
    pycharm在github上clone项目
    selenium中的显示等待WebDriverWait与条件判断expected_conditions举例
    pytest-html报告中添加报错截图
    Fiddler抓包工具如何设置过滤域名
    os.system运行cmd命令时,命令中嵌套了引号
    Pytest之模块之间共享skipif标记
    Pycharm出现同一目录的py文件不能相互调用的问题
  • 原文地址:https://www.cnblogs.com/ZeonfaiHo/p/6402836.html
Copyright © 2011-2022 走看看