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】 简单题的更多相关文章

  1. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

  2. bzoj4066: 简单题 K-Dtree

    bzoj4066: 简单题 链接 bzoj 思路 强制在线.k-dtree. 卡常啊.空间开1e6就T了. 代码 #include <bits/stdc++.h> #define my_m ...

  3. Bzoj4066 简单题

    Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 2185  Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...

  4. BZOJ4066 简单题(KD-Tree)

    板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  5. 【kd-tree】bzoj4066 简单题

    同p1176. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ...

  6. BZOJ4066:简单题(K-D Tree)

    Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:   命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...

  7. 【BZOJ4066】简单题(KD-Tree)

    [BZOJ4066]简单题(KD-Tree) 题面 BZOJ 题解 如果这题不卡空间,并且不强制在线的话 显然可以用\(CDQ\)分治做 但是它又卡空间又强制在线,于是我们欢快的来用\(KD-Tree ...

  8. 【BZOJ4066】简单题 KDtree

    [BZOJ4066]简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...

  9. [bzoj4066/2683]简单题_KD-Tree

    简单题 bzoj-4066 题目大意:n*n的棋盘,开始为均为0,支持:单点加权值,查询矩阵权值和,强制在线. 注释:$1\le n\le 5\cdot 10^5$,$1\le m \le 2\cdo ...

  10. BZOJ 2683: 简单题

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 913  Solved: 379[Submit][Status][Discuss] ...

随机推荐

  1. 【LeetCode21】Merge Two Sorted Lists★

    1.题目描述: 2.解题思路: 本题是要合并两个已经有序的单链表,思路很简单,有两种方法:非递归和递归. 3.Java代码: (1)非递归: 为方便操作,定义一个辅助的头节点,然后比较原来两个链表的头 ...

  2. 2017-2018-2 20155224『网络对抗技术』Exp4:恶意代码分析

    原理与实践说明 实践目标 监控你自己系统的运行状态,看有没有可疑的程序在运行. 分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,systr ...

  3. Mybatis初步详细配置

    1.Mybatis所需包 下载地址:https://github.com/mybatis/mybatis-3/releases,其中log4j是日志包,mysql是数据库所需包,需自行下载 2.项目结 ...

  4. python 回溯法 子集树模板 系列 —— 10、m着色问题

    问题 图的m-着色判定问题 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色? 图的m-着色优化问题 若一个图最少 ...

  5. proftpd启动失败提示unable to determine IP address of “xxx.com”

    proftpd启动失败提示unable to determine IP address of “xxx.com”这种proftpd启动失败的原因是无法解析后面主机的IP地址,解决方法是在DNS列表中增 ...

  6. python中的and和or用法

    在python中and和or返回的值并不是True和false这么简单.虽然他们看上去和c++中的&&和||有些相似.在了解and和or之前,我们先要了解python中的True和Fa ...

  7. SSISDB5:使用TSQL脚本执行Package

    SSISDB 系列随笔汇总: SSISDB1:使用SSISDB管理Package SSISDB2:SSIS工程的操作实例 SSISDB3:Package的执行实例 SSISDB4:当前正在运行的Pac ...

  8. win10安装tensorflow-gpu

    1.安装anaconda (最好使用清华源下载) 2.打开cmd conda create -n tensorflow pip python=3.6 activate tensorflow pip i ...

  9. elasticsearch6.6.0安装配置及elasticsearch-head插件安装

    一.最小化安装centos7.6 cat /etc/redhat-release 二.配置网络,可以上外网 三.安装常用命令工具,修改系统时区,校对系统时间,关闭selinux,关闭firewalld ...

  10. mgo like的两种写法

    实际上都是围绕正则来写的,看大家喜欢那种写法 package main import ( "fmt" "labix.org/v2/mgo" "labi ...