【BZOJ2683】简单题

原创 2015年06月11日 18:07:32

同Mokia…就是数据范围改了改= =双倍经验…
2683: 简单题
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 284 Solved: 125
[Submit][Status][Discuss]
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。

Source

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 800010
#define SIZE 500010
#define lowbit(x) (x&(-x))
using namespace std;
int w;
int top,opt,L,R,l,r,delta,Top;
struct Query
{
    int op;
    int x,y,A;
    int t,id;
    bool operator <(const Query& a)const
    {
        if (x == a.x && y == a.y) return op < a.op;
        if (x == a.x) return y < a.y;
        return x < a.x;
    }
}que[MAXN],newq[MAXN];
long long ans[MAXN],c[SIZE];
inline void in(int &x)
{
    x=0;char ch = getchar();
    while (!(ch >= '0' && ch <= '9'))   ch = getchar();
    while (ch >= '0' && ch <= '9')  x = x * 10 + ch - '0',ch = getchar();
}
inline void add(int i,long long x)
{
    while (i && i <= w) c[i] += x,i += lowbit(i);
}
inline long long query(int i)
{
    long long ret = 0;
    while (i) ret += c[i],i -= lowbit(i);
    return ret;
}
inline void Solve(int l,int r)
{
    int mid = (l + r) >> 1,tp1 = l,tp2 = mid + 1;
    if (l == r) return;
    for (int i = l;i <= r;i++)
    {
        if (que[i].t <= mid && que[i].op == 1)  add(que[i].y,que[i].A);
        if (que[i].t > mid && que[i].op == 2)   ans[que[i].id] += query(que[i].y) * que[i].A;
    }
    for (int i = l;i <= r;i++)
        if (que[i].t <= mid && que[i].op == 1) add(que[i].y,-que[i].A);
    for (int i = l;i <= r;i++)
        if (que[i].t <= mid) newq[tp1++] = que[i];
        else newq[tp2++] = que[i];
    memcpy(que+l,newq+l,sizeof(Query)*(r - l + 1));
    Solve(l,mid);Solve(mid+1,r);
}
int main()
{
    in(w);
    while (1)
    {
        in(opt);
        if (opt == 3) break;
        switch (opt)
        {
            case 1:
                in(L);in(R);in(delta);
                que[++top].op = opt;que[top].x = L;que[top].y = R;que[top].A = delta;que[top].t = top;
                break;
            case 2:
                in(L);in(R);in(l);in(r);
                que[++top].op = opt;que[top].x = L - 1;que[top].y = R - 1;que[top].t = top;que[top].A = 1;que[top].id = ++Top;
                que[++top].op = opt;que[top].x = L - 1;que[top].y = r;que[top].t = top;que[top].A = -1;que[top].id = Top;
                que[++top].op = opt;que[top].x = l;que[top].y = R - 1;que[top].t = top;que[top].A = -1;que[top].id = Top;
                que[++top].op = opt;que[top].x = l;que[top].y = r;que[top].t = top;que[top].A = 1;que[top].id = Top;
                break;
        }
    }
    sort(que + 1,que + top + 1);
    Solve(1,top);
    for (int i = 1;i <= Top;i++)    printf("%lld\n",ans[i]);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CreationAugust/article/details/46460557

bzoj2683: 简单题

题目大意:给你一个N*N(N 思路:CDQ分治的第一题。前半部分和后半部分分别递归处理,然后处理前半部分的修改对后半部分询问的影响,这也是CDQ分治与一般的分治不同的地方。第一维排序,第二维用树状数...
  • thy_asdf
  • thy_asdf
  • 2015-06-23 15:27:31
  • 562

bzoj2683简单题

CDQ分治+树状数组
  • AaronGZK
  • AaronGZK
  • 2016-05-14 00:20:55
  • 4737

留着以后慢慢做的数据结构

BZOJ树上的维护:3282: Tree 连边、删边;单点点权修改;查询路径点权XOR和。 裸LCT。1984: 月下“毛景树” 单边边权修改;路径边权覆盖/加某常数;查询路径边权MAX。 双...
  • onepointo
  • onepointo
  • 2017-07-14 08:15:33
  • 214

bzoj2683 简单题

CDQ分治+树状数组
  • sdfzyhx
  • sdfzyhx
  • 2016-07-23 15:19:24
  • 319

BZOJ2683: 简单题 kdtree

题目大意:n*n矩阵,单点加,矩形查和 1
  • Mima_Reincarnation
  • Mima_Reincarnation
  • 2016-12-27 08:13:58
  • 238

BZOJ 2683 简单题 cdq分治+树状数组

BZOJ 2683 简单题 cdq分治+树状数组
  • wzq_QwQ
  • wzq_QwQ
  • 2015-07-22 09:29:11
  • 2393

一段程序的重构 TREE

这一个TREE的程序代码,但觉得找不到一个好的重构方法,去进行重构?ArrayList arrSalerModels = new Product().querySalerModels();      ...
  • wangluhy
  • wangluhy
  • 2008-04-28 16:33:00
  • 283

[BZOJ2683]=[BZOJ4066]简单题

Kdtree和平衡树有些类似,只不过维护的是高维向量.我们可以模仿平衡树的方法,维护Kdtree每颗子树所代表的点集包含的信息,然后这题就解决了. 在这一题里树会很不平衡,要插入若干次后重构整棵树,...
  • Zvezda_
  • Zvezda_
  • 2016-02-27 21:59:08
  • 315

BZOJ2683 简单题 [KD-tree]

2683: 简单题Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1635  Solved: 661[Submit][Status][Discuss]D...
  • lemonoil
  • lemonoil
  • 2017-10-10 17:38:02
  • 179

BZOJ 2683: 简单题 离线+CDQ分治

2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Submit: 381  Solved: 163 [Submit][Status][Disc...
  • csuhoward
  • csuhoward
  • 2015-10-08 23:02:37
  • 1442
收藏助手
不良信息举报
您举报文章:【BZOJ2683】简单题
举报原因:
原因补充:

(最多只允许输入30个字)