【bzoj4066】 简单题
http://www.lydsy.com/JudgeOnline/problem.php?id=4066 (题目链接)
题意
维护一个矩阵,两个操作,给某一个元素加上A,求其中一个子矩阵的元素之和。强制在线。
Solution
KDtree,其它的就是跟平衡树的维护差不多。
//然而我现在还是TLE啊T_T,但是正确性拍过没问题,求大佬帮忙看看哪里挂了T_T
UPD 2016.1.9:终于是卡着时限过去了→_→
细节
注意重新构树的时候,叶子节点的左右儿子要重新赋为0,因为最初它们的左右儿子并不是0。
注意重新构树update的时候,mn和mx要重新赋值。
代码
// bzoj4066
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#define LL long long
#define inf 1<<30
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline int gi() {
int x=0,f=1;char ch=getchar();
while (ch<'0' || ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=200010;
int n,K,sz,rt;
LL ans; struct KDtree {
int val,l,r,v[2],mx[2],mn[2];
LL sum;
friend bool operator < (const KDtree a,const KDtree b) {
return a.v[K]<b.v[K];
}
}tr[maxn],t[maxn],S; void update(int k) {
for (int i=0;i<=1;i++) {
tr[k].mn[i]=tr[k].mx[i]=tr[k].v[i]; //important
if (tr[k].l) {
tr[k].mn[i]=min(tr[tr[k].l].mn[i],tr[k].mn[i]);
tr[k].mx[i]=max(tr[tr[k].l].mx[i],tr[k].mx[i]);
}
if (tr[k].r) {
tr[k].mn[i]=min(tr[tr[k].r].mn[i],tr[k].mn[i]);
tr[k].mx[i]=max(tr[tr[k].r].mx[i],tr[k].mx[i]);
}
}
tr[k].sum=tr[k].val+tr[tr[k].l].sum+tr[tr[k].r].sum;
}
void insert(int &k,int p) {
K=p;
if (!k) {tr[k=++sz]=S;return;}
if (S.v[0]==tr[k].v[0] && S.v[1]==tr[k].v[1]) {
tr[k].val+=S.val,tr[k].sum+=S.val;
return;
}
if (S<tr[k]) insert(tr[k].l,p^1);
else insert(tr[k].r,p^1);
update(k);
}
bool in(int x1,int y1,int X1,int Y1,int x2,int y2,int X2,int Y2) {
return x1>=x2 && X1<=X2 && y1>=y2 && Y1<=Y2;
}
bool out(int x1,int y1,int X1,int Y1,int x2,int y2,int X2,int Y2) {
return X1<x2 || x1>X2 || Y1<y2 || y1>Y2;
}
LL query(int k,int x,int y,int X,int Y) {
if (!k) return 0;
LL tmp=0;
if (in(tr[k].mn[0],tr[k].mn[1],tr[k].mx[0],tr[k].mx[1],x,y,X,Y)) return tr[k].sum;
if (out(tr[k].mn[0],tr[k].mn[1],tr[k].mx[0],tr[k].mx[1],x,y,X,Y)) return 0;
if (in(tr[k].v[0],tr[k].v[1],tr[k].v[0],tr[k].v[1],x,y,X,Y)) tmp+=tr[k].val;
tmp+=query(tr[k].l,x,y,X,Y)+query(tr[k].r,x,y,X,Y);
return tmp;
}
int rebuild(int l,int r,int p) {
K=p;
int mid=(l+r)>>1;
nth_element(t+l,t+mid,t+r+1);
tr[mid]=t[mid];
tr[mid].l=l<mid ? rebuild(l,mid-1,p^1) : 0; //如果不赋值为0的话之后查询或插入时就会RE
tr[mid].r=r>mid ? rebuild(mid+1,r,p^1) : 0;
update(mid);
return mid;
}
int main() {
n=gi();
ans=0;
for (int op,x1,y1,x2,y2,A,m=10000;1;) {
op=gi();if (op==3) break;
x1=gi()^ans,y1=gi()^ans;
if (op==1) {
A=gi()^ans;
S.v[0]=x1;S.v[1]=y1;S.sum=S.val=A;
S.mx[0]=S.mn[0]=x1;S.mx[1]=S.mn[1]=y1;
insert(rt,0);
if (sz==m) {
for (int i=1;i<=m;i++) t[i]=tr[i];
rt=rebuild(1,m,0);m+=10000;
}
}
else {
x2=gi()^ans,y2=gi()^ans;
ans=query(rt,x1,y1,x2,y2);
printf("%lld\n",ans);
}
}
return 0;
}
【bzoj4066】 简单题的更多相关文章
- [BZOJ2683][BZOJ4066]简单题
[BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...
- bzoj4066: 简单题 K-Dtree
bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...
- Bzoj4066 简单题
Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...
- BZOJ4066 简单题(KD-Tree)
板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- 【kd-tree】bzoj4066 简单题
同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...
- BZOJ4066:简单题(K-D Tree)
Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...
- 【BZOJ4066】简单题(KD-Tree)
[BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...
- 【BZOJ4066】简单题 KDtree
[BZOJ4066]简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...
- [bzoj4066/2683]简单题_KD-Tree
简单题 bzoj-4066 题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线. 注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdo ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
随机推荐
- MySQL学习笔记04 插入中文时出现ERROR 1366 (HY000)
1 环境: MySQL Server 6.0 命令行工具 2 问题 : 插入中文字符数据出现如下错误: ERROR 1366 (HY000): Incorrect string value: '\ ...
- 【实战】verilog中`define的使用记录
背景: 在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数. 若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题: 1.代码长度增加, ...
- 20155316 Exp1 PC平台逆向破解(5)M
前绪 实验收获与感想 初步从三个途径了解了什么是缓冲区溢出以及如何简单实现它,对汇编与反汇编有更直观的了解. 什么是漏洞?漏洞有什么危害? 漏洞是指机器体制设计时所没有顾及到的.可以被利用的bug,放 ...
- Python基础(条件判断和循环) if elif else for while break continue;
条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if age >= ...
- C标准库string.h中几个常用函数的使用详解
strlen 计算字符串长度 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符. 函数实现: int Strlen(cons ...
- opengl学习记录1——矩形绘制
#include <windows.h> #include <gl/GL.h> #include <gl/GLU.h> #include <glut.h> ...
- Microsoft Dynamics CRM 增删改子表汇总子表的某个字段到主表的某个字段(通用插件)
背景 经常有某个汇总子表的数量到主表的总数量,或者汇总子表的总价到主表的总价这种需求. 传统的做法: 1.就是为每个子表实体单独写成一个插件,但是这样不好复用. 2.主表的汇总字段是汇总货币类型,但是 ...
- Seay源代码审计系统的配置和安装
2014年7月31日 Seay源代码审计系统2.1 时隔刚好一年之久,源代码审计系统再次更新,这次主要优化审计体验,优化了漏洞规则,算是小幅更新,原来使用者打开程序会提示自动更新. 1.优化原有规则, ...
- 用10分钟,搭建图像处理编程环境,0失败!(python语言,windows系统)
以前,你可能看过很多的文章,开始搭建一个图像处理的编程环境. 结果,按照教程一步一步做的时候,总是出现各种各样的问题. 就算成功了,后续开发过程中要用到不同版本的opencv,不同版本python,更 ...
- ats 安全
Controlling Access ats可以配置为仅允许某些客户端使用代理缓存. 1. 为ip_allow.config添加一行,以获取允许访问ats的每个IP地址或IP地址范围; 2. traf ...