bzoj1176: [Balkan2007]Mokia【cdq分治】
把询问搞成4个,cdq分治。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a;i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define mp make_pair
#define pb push_back
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//********************************** const int maxn = ; int c[], w;
struct Complex {
int flag;
int x, y, c;
int id, ans;
int pos, l;
inline bool operator < (const Complex &a) const {
return x < a.x ||
x == a.x && y < a.y ||
x == a.x && y == a.y && c < a.c;
}
} src[maxn], t[maxn]; inline void add(int x, int v) {
while (x <= w) {
c[x] += v;
x += x & -x;
}
}
inline int get(int x) {
int ret();
while (x > ) {
ret += c[x];
x -= x & -x;
}
return ret;
}
int ans[]; void cdq(int l, int r) {
if (l == r) return;
int mid = l + r >> , l1 = l, l2 = mid + ;
rep(i, l, r) {
if (src[i].id <= mid && !src[i].l) add(src[i].y, src[i].c);
if (src[i].id > mid && src[i].l) ans[src[i].pos] += src[i].l * get(src[i].y);
}
rep(i, l, r) if (src[i].id <= mid && !src[i].l) add(src[i].y, -src[i].c);
rep(i, l, r) if (src[i].id <= mid) t[l1++] = src[i]; else t[l2++] = src[i];
memcpy(src + l, t + l, (r - l + ) * sizeof(Complex));
cdq(l, mid); cdq(mid + , r);
} int main() {
int cnt(), n(), s;
scanf("%d%d", &s, &w);
int flag;
while (scanf("%d", &flag), flag ^ ) {
if (flag == ) {
++n;
src[n].id = n; src[n].l = ; src[n].pos = ;
scanf("%d%d%d", &src[n].x, &src[n].y, &src[n].c);
}
else {
int x, y, a, b; scanf("%d%d%d%d", &x, &y, &a, &b); ans[++cnt] = s * (a - x) * (b - y); ++n;
src[n].id = n; src[n].l = ; src[n].pos = cnt;
src[n].x = a, src[n].y = b, src[n].c = inf; ++n;
src[n].id = n; src[n].l = -; src[n].pos = cnt;
src[n].x = a, src[n].y = y - , src[n].c = inf; ++n;
src[n].id = n; src[n].l = -; src[n].pos = cnt;
src[n].x = x - , src[n].y = b, src[n].c = inf; ++n;
src[n].id = n; src[n].l = ; src[n].pos = cnt;
src[n].x = x - , src[n].y = y - , src[n].c = inf;
}
}
sort(src + , src + n + );
cdq(, n);
rep(i, , cnt) printf("%d\n", ans[i]);
return ;
}
bzoj1176: [Balkan2007]Mokia【cdq分治】的更多相关文章
- BZOJ1176: [Balkan2007]Mokia CDQ分治
最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 1176[Balkan2007]Mokia(CDQ分治)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3381 Solved: 1520[Submit][S ...
- [BZOJ1176][Balkan2007]Mokia cdq+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3134 Solved: 1395[Submit][S ...
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...
- BZOJ 1176 [Balkan2007]Mokia ——CDQ分治
[题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...
- bzoj1176: [Balkan2007]Mokia cdq
链接 bzoj 思路 cdq入门题,拆成4个矩阵,然后cdq. 代码 /************************************************************** P ...
- BZOJ1176 [Balkan2007]Mokia 【CDQ分治】
题目 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. 输入格式 ...
- [bzoj1176]Mokia[CDQ分治]
啃了一天论文,发现CDQ分治的原理其实很简单,大概就是这样的一类分治:将左右区间按一定规律排序后分开处理,递归到底时直接计算答案,对于一个区间,按照第二关键字split成两个区间,先处理左区间,之后因 ...
随机推荐
- POJ 2182/暴力/BIT/线段树
POJ 2182 暴力 /* 题意: 一个带有权值[1,n]的序列,给出每个数的前面比该数小的数的个数,当然比一个数前面比第一个数小的个数是0,省略不写,求真正的序列.(拗口) 首先想到的是从前到后暴 ...
- Java的动态加载及其安全性问题
1.什么是动态加载 Class Loaders是动态加载Java类与Resource的一种机制.它支持Laziness,type-safe linkage,user-defined extensibi ...
- C1 FlexGrid控件 Editor 冲突问题
当给C1FlexGrid控件加入 Checkbox后,添加新行时对新行的Editor 赋新控件时,会冲突如下图: 下面我们借助BeforeRowColChange 事件来解决这个问题: 我 ...
- android 在代码中使用 #ffffff 模式 设置背景色
differentsum.setBackgroundColor(Color.parseColor("#F3733F"));
- Gym 100518E Embedding Caterpillars
构造+DFS 很容易的可以构造两个,最后一个不会构造的话 DFS一下就可以了 #include<iostream> #include<string> #include< ...
- 仿360新闻的热搜图片,win8风格随机九宫格布局
360新闻地址:http://sh.qihoo.com/i/ 感觉这效果挺好的,随机九宫格,在不少地方可以用到,就研究了下他的源码,基本原理就是预先定义好几种布局模块,然后根据需要进行拼接,具体代码可 ...
- listview去掉条目间的分割线
未去掉前: 去掉后: java代码可以这么写: 1 listView.setDivider(null);//去掉条目间的分割线 PS:ListView的几个常用操作 listView ...
- BZOJ 1196 二分答案+并查集
http://www.lydsy.com/JudgeOnline/problem.php?id=1196 题目大意:n个城市,m-1条路,每条路有一级公路和二级公路之分,你要造n-1条路,一级公路至少 ...
- 转 如何使用V7包中ActionBar(Eclipse版)
http://blog.csdn.net/appte/article/details/11712591 以前3.0以前的版本要使用ActionBar,必须使用国外大牛写的ActionBarSherlo ...
- ida dump内存脚本
auto i,fp; fp = fopen("d:\\dump.dex","wb"); for(i=r0;i<r0+0x20;i++) fputc(Byt ...