1176: [Balkan2007]Mokia

Time Limit: 30 Sec   Memory Limit: 162 MB

Submit: 185  
Solved: 94

[
Submit][
Status]

Description

维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值。 修改操作数M<=160000,询问数Q<=10000,W<=2000000。

Input

 

Output

 

Sample Input

0 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

Input file Output file Meaning
0 4 Table size is , filled with zeroes.

1 2 3 3 Add 3 customers at (2, 3).
2 1 1 3 3 Query sum of rectangle , .

3 Answer.
1 2 2 2 Add 2 customers at (2, 2).
2 2 2 3 4 Query sum of rectangle , .

5 Answer
3 Exit your program.


裸CDQ...1A

注意几个关键部分的写法

步骤:

1.读入询问,按x排序

2.将[L,R]中的数分为前部分操作,后部分操作(各部分仍保持X升序)

3.将前面对后面的影响记录ans

4.复原影响

5.递归[L,M],[M+1,R]

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define F (1000000009)
#define MAXM (640000+10)
#define MAXQ (10000+10)
#define MAXN (2000000+10)
typedef long long ll;
int n,m,q;
ll ans[MAXQ];
struct comm
{
int no,x,y,v,q,type;
comm():no(0),x(0),y(0),v(0),q(0),type(0){}
comm(int _no,int _x,int _y,int _v,int _q,int _type):no(_no),x(_x),y(_y),v(_v),q(_q),type(_type){}
friend bool operator<(comm a,comm b){return a.x<b.x;}
}ask[MAXM];
struct arr_tree
{
ll a[MAXN];
arr_tree(){memset(a,0,sizeof(a));}
void add(int x,ll c)
{
for(int i=x;i<=n;i+=i&(-i)) a[i]+=c;
}
int qur(int x)
{
ll ans=0;
for(int i=x;i;i-=i&(-i)) ans+=a[i];
return ans;
}
void clear()
{
memset(a,0,sizeof(a));
}
}T;
comm tmp[MAXM];
void solve(int l,int r)
{
if (l==r) return;
int m=l+r>>1;
int s1=l-1,s2=m;
Fork(i,l,r) tmp[ask[i].no<=m?++s1:++s2]= ask[i];
memcpy(ask+l,tmp+l,sizeof(comm)*(r-l+1));
int now=l;
Fork(i,m+1,r) //遍历询问
{
if (ask[i].type==2)
{
while (ask[now].x<=ask[i].x&&now<=m)
{
if (ask[now].type==1) T.add(ask[now].y,ask[now].v);
now++;
}
ans[ask[i].q]+=ask[i].v*T.qur(ask[i].y);
}
}
now--;
while (l<=now) {if (ask[now].type==1) T.add(ask[now].y,-ask[now].v);now--;}
solve(l,m),solve(m+1,r);
}
bool work()
{
scanf("%d",&n);
int type,no=0,x,y,x1,y1,x2,y2,v,q=0;
memset(ans,0,sizeof(ans));T.clear();
while (scanf("%d",&type))
{
if (type==0||type==3) break;
else if (type==1)
{
scanf("%d%d%d",&x,&y,&v);
no++;ask[no]=comm(no,x,y,v,0,1);
}
else if (type==2)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);q++;
no++;ask[no]=comm(no,x1-1,y1-1,1,q,2);
no++;ask[no]=comm(no,x2,y2,1,q,2);
no++;ask[no]=comm(no,x1-1,y2,-1,q,2);
no++;ask[no]=comm(no,x2,y1-1,-1,q,2);
}
}
sort(ask+1,ask+1+no);
solve(1,no);
For(i,q) cout<<ans[i]<<endl;
return type==0;
}
int main()
{
//freopen("bzoj1176.in","r",stdin);
int type;
scanf("%d",&type);if (type==3) return 0;
while (work());
//cout<<"END"<<endl;while (1);
return 0;
}

BZOJ 1176([Balkan2007]Mokia-CDQ分治-分治询问)的更多相关文章

  1. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  2. BZOJ 1176[Balkan2007]Mokia(CDQ分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3381  Solved: 1520[Submit][S ...

  3. BZOJ 1176: [Balkan2007]Mokia [CDQ分治]

    题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...

  4. BZOJ 1176 [Balkan2007]Mokia ——CDQ分治

    [题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...

  5. BZOJ 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 2012  Solved: 896[Submit][St ...

  6. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  7. bzoj 1176 [Balkan2007]Mokia 【CDQ分治】

    W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...

  8. BZOJ 1176: [Balkan2007]Mokia KDtree

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...

  9. 1176: [Balkan2007]Mokia

    1176: [Balkan2007]Mokia 链接 分析 三维偏序问题,CDQ分治论文题. 代码 #include<bits/stdc++.h> using namespace std; ...

随机推荐

  1. 来推荐个免费的PPT演示工具--ZohoShowTime

    事实上这个不算新产品了,这次是做了一些大的改进.上次在Zoho的全球用户大会上,全程演讲都是用的这个工具.Zoho这点非常好啊.自己的产品自己带头用.个人认为它最大的用处就是.离得远的观众能够在自己的 ...

  2. 最短路径A*算法原理及java代码实现(看不懂是我的失败)

    算法仅仅要懂原理了,代码都是小问题,先看以下理论,尤其是红色标注的(要源代码请留下邮箱,有測试用例,直接执行就可以) A*算法 百度上的解释: A*[1](A-Star)算法是一种静态路网中求解最短路 ...

  3. linux shell脚本:在脚本中实现读取键盘输入,根据输入判断下一步的分支

    echo please input “runbip” to run bip. variableName="null" while [ $variableName != " ...

  4. Qt4_VS10 程序打包发布

    源地址:http://www.2cto.com/kf/201306/217205.html 目录结构如下: ---------------------------------------------- ...

  5. Winfrom 表格单元格格式化事件(DataGridView - CellFormatting)

    格式化 14,15列将编码显示为编码值 this.dgv_prescription.CellFormatting += (object sen, DataGridViewCellFormattingE ...

  6. Inverse Quadratic Interpolation (website)

    Inverse Quadratic Interpolation:  https://www.youtube.com/watch?v=0H7mVPTLF7Q : https://www.youtube. ...

  7. 发掘ListBox的潜力(一):自动调整横向滚动条宽度

    <自绘ListBox的两种效果>一文帖出之后,从反馈信息来看,大家对这种小技巧还是很认同.接下来我将继续围绕ListBox写一系列的文章,进一步发掘ListBox的潜力,其中包括:自动调整 ...

  8. JSTL解析——005——core标签库04

    直接入主题,标签讲解 1.<c:import>标签 JSP里面有<% file include="XX"%> 与<jsp:include>,JS ...

  9. android在其他线程中访问UI线程的方法

    1.Activity.runOnUiThread( Runnable ) 2.View.post( Runnable ) 3.View.postDelayed( Runnable, long ) 4. ...

  10. ie 64bit调用activex控件

    1,首先,这是可能的.不要被网上一堆ie64调不了activex控件的文章误导了.flash就是一个现成的例子,flash支持ie64. 2,ie64只能调用64bit的activex控件.网上那些说 ...