当前位置: 首页 > news >正文

P4148 简单题 模板题分析

供自己复习使用,因此只贴代码。

题目链接:https://www.luogu.com.cn/problem/P4148。

代码

时间复杂度 \(\mathcal{O}(n\sqrt n)\)

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 200005
#define isdigit(ch) ('0' <= ch && ch <= '9')
using namespace std;
template<typename T>
void read(T&x) {x = 0;int f = 1;char ch = getchar();for (;!isdigit(ch);ch = getchar()) f = (ch == '-' ? -1 : f);for (;isdigit(ch);ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);x *= f;
}
const double alpha = 0.75;
struct node{int lson,rson;int d[2],mnd[2],mxd[2];int val,sum,sz;
}tr[N];
#define ls(x) (tr[x].lson)
#define rs(x) (tr[x].rson)
int root,cnt;
int g[N],tot;
void pushup(int x) {tr[x].sz = tr[ls(x)].sz + tr[rs(x)].sz + 1;tr[x].sum = tr[ls(x)].sum + tr[rs(x)].sum + tr[x].val;for (int i = 0;i < 2;i ++) {tr[x].mnd[i] = tr[x].mxd[i] = tr[x].d[i];tr[x].mnd[i] = min(min(tr[x].mnd[i],tr[ls(x)].mnd[i]),tr[rs(x)].mnd[i]);tr[x].mxd[i] = max(max(tr[x].mxd[i],tr[ls(x)].mxd[i]),tr[rs(x)].mxd[i]);}
}
void flatten(int cur) {if (!cur) return;flatten(ls(cur));g[++tot] = cur;flatten(rs(cur));
}
int build(int l,int r,int k) {if (l > r) return 0;int mid = l + r >> 1;nth_element(g + l,g + mid,g + r + 1,[k](int x,int y) {return tr[x].d[k] < tr[y].d[k];});int now = g[mid];tr[now].lson = build(l,mid - 1,k ^ 1),tr[now].rson = build(mid + 1,r,k ^ 1);pushup(now);return now;
}
void insert(int &now,int x,int y,int val,int k) {if (!now) {now = ++cnt;tr[now].lson = tr[now].rson = 0;tr[now].d[0] = x,tr[now].d[1] = y;tr[now].val = tr[now].sum = val;tr[now].sz = 1;tr[now].mnd[0] = tr[now].mxd[0] = x;tr[now].mnd[1] = tr[now].mxd[1] = y;return;}if (tr[now].d[0] == x && tr[now].d[1] == y) {tr[now].val += val;tr[now].sum += val;return ;}if ((k == 0 && x < tr[now].d[0]) || (k == 1 && y < tr[now].d[1])) insert(ls(now),x,y,val,k ^ 1);else insert(rs(now),x,y,val,k ^ 1);pushup(now);if (tr[ls(now)].sz > 1.0 * tr[now].sz * alpha || tr[rs(now)].sz > 1.0 * tr[now].sz * alpha) {tot = 0;flatten(now);now = build(1,tot,k);}
}
int query(int now,int x1,int y1,int x2,int y2) {if (!now) return 0;if (tr[now].mnd[0] >= x1 && tr[now].mxd[0] <= x2 && tr[now].mnd[1] >= y1 && tr[now].mxd[1] <= y2) return tr[now].sum;if (tr[now].mxd[0] < x1 || tr[now].mnd[0] > x2 || tr[now].mxd[1] < y1 || tr[now].mnd[1] > y2) return 0;int res = 0;if (tr[now].d[0] >= x1 && tr[now].d[0] <= x2 && tr[now].d[1] >= y1 && tr[now].d[1] <= y2) res += tr[now].val;return res + query(ls(now),x1,y1,x2,y2) + query(rs(now),x1,y1,x2,y2);
}
signed main(){tr[0].mnd[0] = tr[0].mnd[1] = 1e9;tr[0].mxd[0] = tr[0].mxd[1] = -1e9;int n;cin >> n;for (int lst = 0;1;) {int op,x,y,a,x2,y2;read(op);if (op == 1) {read(x),read(y),read(a);x ^= lst,y ^= lst,a ^= lst;insert(root,x,y,a,0);}else if (op == 2) {read(x),read(y),read(x2),read(y2);x ^= lst,y ^=lst,x2 ^= lst,y2 ^= lst;lst = query(root,x,y,x2,y2);printf("%lld\n",lst);}else return 0;}return 0;
}
http://www.jsqmd.com/news/46717/

相关文章:

  • 【压测数据分享】VictoriaLogs 中的参数 `inmemoryDataFlushInterval` 对写入性能的影响
  • Windows系统增强神器!PowerToys微软官方效率工具(实操v教程)!
  • Linux内核实验-ubuntu
  • 2025年11月四川自习室加盟市场分析与品牌推荐
  • 2025年电极生产厂家权威推荐榜单:航空插头/马达壳/插针源头厂家精选
  • 2025 最新推荐装盒机厂家权威排行榜:全自动 / 食品 / 纸巾 / 卫生巾装盒机技术创新与整线配套能力测评
  • P9433 [NAPC-#1] Stage5 - Conveyors 分析
  • 我发现上大学虚构痛苦是件非常愚蠢的事
  • Qt 实现“可点击跳转”的 QSlider
  • 技术架构进化论:从“独栋别墅”到“智慧城市”
  • STM32项目分享:基于STM32的酒店送餐小车的设计与搭建
  • 2025 年最新推荐套袋机厂家权威榜单:聚焦技术创新与专利优势,覆盖多品类设备选型指南M 型袋套袋机/预制袋套袋机/袋中袋套袋机/食品套袋机/八边封套袋机公司推荐
  • Galera Cluster部署 - 详解
  • 模拟机问题
  • UBUNTU22.04,配置wine中调用cuda
  • macos制作可以启动的iso引导文件
  • MySQL 8.0.12 时区设置和修改
  • 676
  • 2025年主流学习机品牌差异化分析与选购指南
  • 6667
  • 2025年铁基络合剂源头厂家权威推荐榜单:铁基催化剂/络合铁脱硫催化剂/高效脱硫剂源头厂家精选
  • 记录双系统笔记本系统损坏恢复步骤
  • 学习差的孩子适合用学习机吗?有推荐的品牌吗?​ 2025年学困生专用AI学习机评估与推荐
  • 2025年AI学习机与线下补课效果对比分析
  • 写给0-1岁的初创公司合伙人(48):运气与概率——区分“赌博”与“投资”
  • 2025年PET收缩机源头厂家权威推荐榜单:PET自动收缩机/PP收缩机/PE收缩机源头厂家精选
  • FCN全卷积网络 (Fully Convolutional Network)——第一个成功地将深度学习应用于语义分割
  • 中电金信与中国金融科技的共振之路
  • 【Ai自习室创业靠谱吗,有推荐的加盟/代理品牌吗?】2025年智适应自习室创业投资深度解析
  • 成都恒利泰国产H3-TCP-2-10+ 功分器替代Mini-CircuitsTCP-2-10+