bzoj2683: 简单题

CDQ分治,然而超过内存了

CDQ分治的思想还是很有趣的。

http://www.lydsy.com/JudgeOnline/problem.php?id=2683

/**************************************************************
    Problem: 2683
    User: 1349367067
    Language: C++
    Result: Accepted
    Time:7344 ms
    Memory:45028 kb
****************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 800011
using namespace std;
int n;
struct Node
{
       int x,y,belong,opt,no,a;
}q[N],nq[N];
int num=0,T=0;
bool cmp(Node a,Node b)
{
     if (a.x==b.x&&a.y==b.y) return a.opt<b.opt;
     if (a.x==b.x) return a.y<b.y;
     return a.x<b.x;
}
int c[N];
inline int lowbit(int x) {return x&(-x);}
int getsum(int x)
{
    int ret=0;
    while (x)
    {ret+=c[x];x-=lowbit(x);}
    return ret;
}
void update(int x,int a)
{
     while (x<=n)
     {c[x]+=a;x+=lowbit(x);}
}
int ans[N]={};
void sov(int l,int r)
{
     if (l==r) return;
     int mid=(l+r)/2,l1,l2;
     for (int i=l;i<=r;i++)
     {
         if (q[i].no<=mid&&q[i].opt==1) update(q[i].y,q[i].a);
         if (q[i].no>mid&&q[i].opt==2) ans[q[i].belong]+=q[i].a*getsum(q[i].y);
     }
     for (int i=l;i<=r;i++)
     {
         if (q[i].no<=mid&&q[i].opt==1) update(q[i].y,-q[i].a);
     }
     l1=l;l2=mid+1;
     for (int i=l;i<=r;i++)
     {
         if (q[i].no<=mid) nq[l1++]=q[i];
         else nq[l2++]=q[i];
     }
     for (int i=l;i<=r;i++)
         q[i]=nq[i];
     sov(l,mid);sov(mid+1,r);
}

int main()
{
    scanf("%d",&n);
    int tem;
    while (scanf("%d",&tem),tem!=3)
    {
          if (tem==1)
          {
             int x,y,a;scanf("%d%d%d",&x,&y,&a);
             num++;
             q[num].opt=tem;
             q[num].x=x;q[num].y=y;q[num].a=a;
             q[num].no=num;
          }
          else
          {
              int x1,y1,x2,y2;
              scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
              q[++num].opt=tem;q[num].x=x1-1;q[num].y=y1-1;q[num].a=1;q[num].no=num;q[num].belong=++T;
              q[++num].opt=tem;q[num].x=x1-1;q[num].y=y2;q[num].a=-1;q[num].no=num;q[num].belong=T;
              q[++num].opt=tem;q[num].x=x2;q[num].y=y1-1;q[num].a=-1;q[num].no=num;q[num].belong=T;
              q[++num].opt=tem;q[num].x=x2;q[num].y=y2;q[num].a=1;q[num].no=num;q[num].belong=T;
          }
    }

    sort(q+1,q+num+1,cmp);
    sov(1,num);
    for (int i=1;i<=T;i++)
        printf("%d\n",ans[i]);

    return 0;
}
        

时间: 2024-11-05 16:05:03

bzoj2683: 简单题的相关文章

BZOJ2683: 简单题(CDQ分治 + 树状数组)

BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ x\ y\ A\) \(1\le x,y \le N\),A是正整数 将格子\(x,y\)里的数字加上\(A\) \(2\ x1\ y1\ x2\ y2\) \(1\le x1\le x2\le N,1\le y1\le y2\le N\) 输出\(x1\ y1\ x2\ y2\)这个矩形内的数字

bzoj2683简单题

2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Submit: 738  Solved: 307 [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<

bzoj2683简单题 cdq分治

2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[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<

Bzoj2683 简单题 [CDQ分治]

Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 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这个矩形

【BZOJ2683】简单题 [分治][树状数组]

简单题 Time Limit: 50 Sec  Memory Limit: 128 MB[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

【BZOJ-1176&amp;2683】Mokia&amp;简单题 CDQ分治

1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][Status][Discuss] Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. Input 第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小

poj2105 IP Address(简单题)

题目链接:http://poj.org/problem?id=2105 Description Suppose you are reading byte streams from any device, representing IP addresses. Your task is to convert a 32 characters long sequence of '1s' and '0s' (bits) to a dotted decimal format. A dotted decima

poj 3270 Cow Sorting 置换群 简单题

假设初始状态为 a:2 3 1 5 4 6 则目标状态为 b:1 2 3 4 5 6且下标为初始状态中的3 1 2 4 5 6(a[3],a[1]...) 将置换群写成循环的形式 (2,3,1),(5,4),6就不用移动了. 移动方式2种 1:选循环内最小的数和其他len-1个数交换 2:选整个序列最小的数和循环内最小的数交换,转到1,再换回来. #include<cstdio> #include<queue> #include<algorithm> #include&

数论 --- 简单题

吃糖果 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 22376    Accepted Submission(s): 6396 Problem Description HOHO, 终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一 种,这样: