当前位置: 首页 > 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.rkmt.cn/news/56406.html

相关文章:

  • Windows系统增强神器!PowerToys微软官方效率工具(实操v教程)!
  • Linux内核实验-ubuntu
  • 2025年11月四川自习室加盟市场分析与品牌推荐
  • Qt 实现“可点击跳转”的 QSlider
  • 我发现上大学虚构痛苦是件非常愚蠢的事
  • STM32项目分享:基于STM32的酒店送餐小车的设计与搭建
  • macos制作可以启动的iso引导文件
  • 676
  • 宜搭在线js上点击按钮实现打印div效果
  • Boost都有哪些功能
  • 【ESSC|连续三届检索】第四届教育科学与社会文化国际学术会议(ESSC 2025)
  • 2025年市场热门的河道护坡石笼网公司怎么选择,抗冲击抗腐蚀石笼网/柔韧抗压石笼网/双隔板石笼网河道护坡石笼网直销厂家有哪些
  • 2025年深圳废旧18650电池回收公司权威推荐榜单:动力18650电池回收/大量回收18650锂电池/18650电池组回收源头公司精选
  • gdb linux
  • 《从成本中心到价值创造:QMS系统的商业价值重构》‌
  • 浙江 GEO 企业 TOP4 榜单:解码 AI 时代的智能营销新势力
  • 视频汇聚平台EasyCVR进程启动后视频却无法播放的原因排查
  • 2025 最新雕塑厂家推荐榜:涵盖商业街 / 校园 / 公园 / 商场 / 广场雕塑等多场景优质雕塑企业权威推荐小区雕塑/广场雕塑/场景雕塑公司推荐
  • Day8:2025年9月29日,星期一,上班。
  • 电梯调度程序的三次作业分析
  • MySQL索引详解 - 指南
  • 2025年螺杆空压机制造企业权威推荐榜单:二手螺杆机/空压机配件/空压机维修供应商精选
  • 2025 年 北京VI 设计公司最新推荐榜:优质服务商全维度解析,助力品牌资产高效增长
  • Mounriver Studio设置为工程默认加载路径(Ⅰ代\Ⅱ代)
  • 基于回归分析法的光伏发电系统最大功率计算simulink建模与仿真
  • gcc下载 linux
  • 广州知名的产品认证办理流程,3A信用认证/ISO22000/产品测试报告/3C认证/CE认证/REA认证产品认证申请流程
  • 2025年国内PMS酒店管理系统公司综合实力排行榜TOP10
  • 2025 最新办公桌椅优质厂家推荐排行榜:专利加持 + 政企集采热门,广东办公座椅/广东办公桌/实木办公桌/现代办公桌/总裁办公桌公司推荐
  • 2025年PMS酒店管理系统公司全方位评测与推荐榜单