【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] ...
随机推荐
- 大数据入门第二十天——scala入门(一)入门与配置
一.概述 1.什么是scala Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序. ...
- Spring + SpringMVC配置
代码结构如下 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...
- 20155318 《网络攻防》Exp6 信息搜集与漏洞扫描
20155318 <网络攻防>Exp6 信息搜集与漏洞扫描 基础问题 哪些组织负责DNS,IP的管理. 互联网名称与数字地址分配机构,ICANN机构.其下有三个支持机构,其中地址支持组织( ...
- # RocEDU.课程设计2018 第三周进展 博客补交
RocEDU.课程设计2018 第三周进展 博客补交 本周计划完成的任务 (1).本周计划完成在平板电脑上实现程序的功能,跟第二周计划完成任务基本相似. 本周实际完成情况 (1).实际完成情况还差最后 ...
- 3、class文件加载过程
1.加载2.链接(检验/准备/解析) 1/检验过程:检验class的数据格式.2/准备过程:创建静态域,并将这些域设为默认值.3/解析过程:在一个Java类中会包含对其它.类或接口的形式引用,包括它的 ...
- HTML-JS 循环 函数 递归
[循环结构的执行步骤] 1.声明循环变量 2.判断循环条件 3.执行循环体操作 4.更新循环变量 然后,循环执行2-4,直到条件不成立时,跳出循环. while循环()中的表达式,运算结果可以是各种类 ...
- git 报错git-upload-pack 解决方法
报错如下: bash: git-upload-pack: command not foundfatal: The remote end hung up unexpectedly 原因:原来代码服务器上 ...
- Python读取ini配置文件封装方法
读取配置文件 ----rw_ini.py from configparser import ConfigParser def read_config(config_file_path:str): &q ...
- 腾讯 深圳 25928-PHP开发工程师(深圳)
工作地点:深圳 职位类别:技术类 招聘人数:1人 工作职责: 负责游戏研运体系流程工具及相关产品的开发.维护: 参与支撑系统的需求分析.设计.编码: 承担外包开发成员技术导师,解决技术难点,把控开发质 ...
- PAT甲题题解-1037. Magic Coupon (25)-贪心,水
题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积. 将两个序列的正和负数分开,排个序,然后分别将正1和正2前面的相乘,负1和负2前面的相乘,累加和即可. #include ...