C140 线段树分治+01Trie P4585 [FJOI2015] 火星商店问题

news/2024/9/23 13:19:05

视频链接:C140 线段树分治+01Trie P4585 [FJOI2015] 火星商店问题_哔哩哔哩_bilibili

 

 

 

C09【模板】可持久化字典树(Trie) - 董晓 - 博客园 (cnblogs.com)

P4585 [FJOI2015] 火星商店问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

// 线段树分治 O(nlognlogn)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;#define N 100005
#define mid ((l+r)>>1)
#define rs ((u<<1)|1)
#define ls (u<<1)struct shop{int s,v,t; //商店编号,价格,时间
}p[N],p1[N],p2[N];
struct Q{int l,r,L,R,x; //商店区间,时间区间,密码
}q[N];
int n,m,idx,cnt,top;
int rt[N],ch[N*20][2],siz[N*20]; //01Trie
int s[N],ans[N];
vector<int> tr[N]; //节点bool cmp(shop &x,shop &y){return x.s<y.s;
}
void ins(int v){ //插入Triert[++idx]=++cnt;int x=rt[idx-1],y=rt[idx];for(int i=17;i>=0;i--){int j=v>>i&1;ch[y][!j]=ch[x][!j];   //异位继承ch[y][j]=++cnt;        //新位开点x=ch[x][j];y=ch[y][j]; //走位siz[y]=siz[x]+1;       //新位多1
  }
}
int query(int x,int y,int v){ //查询异或最值int ans=0;for(int i=17;i>=0;i--){int j=v>>i&1;if(siz[ch[y][!j]]>siz[ch[x][!j]])ans+=(1<<i),j=!j;x=ch[x][j]; y=ch[y][j];}return ans;
}
void solve(int u,int l,int r){// 重建当前区间的01Trie,查询区间异或最值top=idx=cnt=0;for(int i=l;i<=r;i++){s[++top]=p[i].s; //用栈记录商店编号ins(p[i].v);     //标价插入Trie
  }for(auto i:tr[u]){// 该区间商店编号有重复值,应该找靠右的编号int a=upper_bound(s+1,s+1+top,q[i].l-1)-s-1;int b=upper_bound(s+1,s+1+top,q[i].r)-s-1;ans[i]=max(ans[i],query(rt[a],rt[b],q[i].x));}if(l==r)return;// 时间小的修改扔到左边,时间大的修改扔到右边。// 分拣后,子区间依然是按商店编号有序的。int n1=0,n2=0;for(int i=l;i<=r;i++)p[i].t<=mid ? p1[++n1]=p[i] : p2[++n2]=p[i];for(int i=1;i<=n1;i++) p[i+l-1]=p1[i];for(int i=1;i<=n2;i++) p[i+mid]=p2[i];solve(ls,l,mid);solve(rs,mid+1,r);
}
void insert(int u,int l,int r,int L,int R,int x){if(L>r||R<l)return ;if(L<=l&&r<=R){tr[u].push_back(x);return;}insert(ls,l,mid,L,R,x);insert(rs,mid+1,r,L,R,x);
}
int main(){scanf("%d%d",&n,&m);for(int i=1,x;i<=n;i++)scanf("%d",&x), ins(x);int cnt=0,tot=0; //cnt天数,tot询问数for(int i=1,opt,s,v,l,r,x,d;i<=m;i++){scanf("%d",&opt);if(!opt){scanf("%d%d",&s,&v);p[++cnt]={s,v,cnt}; //修改
    }else{scanf("%d%d%d%d",&l,&r,&x,&d);q[++tot]={l,r,cnt-d+1,cnt,x}; //询问ans[tot]=query(rt[l-1],rt[r],x);}}for(int i=1;i<=tot;i++) //询问时间插入线段树insert(1,1,cnt,q[i].L,q[i].R,i);sort(p+1,p+1+cnt,cmp);  //按商店编号排序  solve(1,1,cnt);for(int i=1;i<=tot;i++)printf("%d\n",ans[i]);
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop电商日志数据分析(一)

项目要求 根据电商日志文件,分析: 1 . 统计页面浏览量(每行记录就是一次浏览) 2 . 统计各个省份的浏览量 (需要解析IP) 3 . 日志的ETL操作(ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程)为什么要ETL:没有必要解析出所有数据…

单运放的浮动供电电路的进一步解释讲解

有时候需要运算放大器输出高一些的电压,或者输入高一些的电压,又或者输入输出都高一些。最简单的办法就是使用钞能力,只要钱给够,加上允许的时间够长,那么总可以买到甚至定制到合适的运算放大器。如果使用数量不多,也可以自己搭建分立元件的运算放大器,达到需求的功能。…

LLM大模型: RAG的langchain+向量数据库实现和评估方案

LLM大模型的核心功能之一就是聊天对话(信息检索),RAG的使用必不可少!大致的流程是:用户的query先转成embedding,去向量数据库查询最接近的top K回答;然后这query + top K的回答 + 其他context一起进入LLM,让LLM整合上述所有的信息后给出最终的回复!为了简便、快速地实…

FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo

不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。 除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等…

PS

基本概念色彩格式RGB CMYK其他工具图层:文字图层 图像图层 智能对象栅格化:接触智能对象的像素保护蒙版普通蒙版 剪切蒙版 alt+两图层间单击混合选项图层文字部分右键 镂空、不透明度……图层混合小结:魔棒 色彩容差抠图 ctrl+J练习:bezier.method.ac小结:

Hadoop电商日志数据分析(二)

项目要求 根据电商日志文件,分析: 1 . 统计页面浏览量(每行记录就是一次浏览) 2 . 统计各个省份的浏览量 (需要解析IP) 3 . 日志的ETL操作(ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程)为什么要ETL:没有必要解析出所有数据…

s2-045漏洞还原

1.环境准备,本地server2003 环境对应网址http://192.168.116.112:8080/struts2-showcase/showcase.action 2.使用在线工具包扫描漏洞信息输入对应的url检测发现存在对应漏洞 选择对应漏洞,可执行对应系统命令 上传自带木马文件(复制tmp.jsp内容,上报到对应目录下C:\jspstud…

以opencv为例说明cmake中的findpackage()

大多数第三方库为了适配cmake都会提供XXXConfig.cmake文件,在opencv中是OpenCVConfig.cmakefindpackage()是在环境变量中的XXXConfig.cmake文件,在引用opencv时是在找OpenCVConfig.cmake,对应与引用opnecv时的 find_package(OpenCV REQUIRED) 注意大小写与OpenCVConfig.cmak…