2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组
时间:2019-09-13
本文章向大家介绍2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,主要包括2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
TMD。。。这题卡内存卡的真优秀。。。
所以以后还是别用主席树的写法。。。不然怎么死的都不知道。。。
树套树中,主席树方法开权值线段树。。。会造成空间的浪费。。。这道题内存卡的很紧。。。
由于树套树已经不需要持久化了,直接动态开点就完事了。。。用主席树方法开过不去,要么超内存,要么越界。。。
大概思路。。。留坑。。。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxx = 2e5+6; struct node{ int l,r; int cnt; }tree[maxx*220]; int cnt,n,cnt1,cnt2; int root[maxx],a[maxx],trl[maxx],trr[maxx]; void inserts(int &now,int l,int r,int pos,int w){ if(!now)now=++cnt; tree[now].cnt+=w; if (l==r){ return ; } int mid=(l+r)>>1; if (pos<=mid){ inserts(tree[now].l,l,mid,pos,w); }else{ inserts(tree[now].r,mid+1,r,pos,w); } } int lowbit(int x){ return x&(-x); } void add(int x,int w){ for(int i=x;i<=n;i+=lowbit(i)){ inserts(root[i],1,n,a[x],w); } } int query(int l,int r,int ql,int qr){ if (r<ql || l>qr){ return 0; } int tmpl[1000],tmpr[1000]; int s=0,mid=(l+r)>>1,sum=0; for(int i=1;i<=cnt1;i++)s-=tree[trl[i]].cnt,tmpl[i]=trl[i]; for(int i=1;i<=cnt2;i++)s+=tree[trr[i]].cnt,tmpr[i]=trr[i]; if (ql<=l && r<=qr){ return s; } if (mid>=ql){ for (int i=1;i<=cnt1;i++){ trl[i]=tree[tmpl[i]].l; } for (int i=1;i<=cnt2;i++){ trr[i]=tree[tmpr[i]].l; } sum+=query(l,mid,ql,qr); } if (mid<qr){ for (int i=1;i<=cnt1;i++){ trl[i]=tree[tmpl[i]].r; } for (int i=1;i<=cnt2;i++){ trr[i]=tree[tmpr[i]].r; } sum+=query(mid+1,r,ql,qr); } return sum; } int main(){ int m; scanf("%d%d",&n,&m); cnt=cnt1=cnt2=0; for (int i=1;i<=n;i++){ scanf("%d",&a[i]); if (a[i]!=a[i-1])add(i,1); } int op; int pos,v,l,r,x,y; while(m--){ scanf("%d",&op); if(op==1){ scanf("%d%d",&pos,&v); if (a[pos]==v)continue; if(a[pos]!=a[pos-1]){ add(pos,-1); } if(a[pos]==a[pos+1]){ add(pos+1,1); }else if (a[pos+1]==v){ add(pos+1,-1); } a[pos]=v; if (a[pos]!=a[pos-1]){ add(pos,1); } }else { scanf("%d%d%d%d",&l,&r,&x,&y); cnt1=cnt2=0; int f=0; for (int i=l;i;i-=lowbit(i)){ trl[++cnt1]=root[i]; } for (int i=r;i;i-=lowbit(i)){ trr[++cnt2]=root[i]; } if (a[l]>=x && a[l]<=y)f++; printf("%d\n",query(1,n,x,y)+f); } } return 0; }
原文地址:https://www.cnblogs.com/bluefly-hrbust/p/11516694.html
- 转--Golang图像处理工具库,图像相似度计算,图像二值化
- HDUOJ----湫湫系列故事——减肥记I
- HDUOJ----Eddy's research I
- 【亚马逊加盟对抗谷歌联盟ONNX】微软Facebook深度学习开源联盟再添盟友
- HDUOJ--8球胜负
- HDUOJ--点球大战
- Golang语言社区--使用百度API获取经纬度
- HDUOJ---The number of divisors(约数) about Humble Numbers
- HDUOJ----最少拦截系统
- Go语言截取字符串函数用法
- HDUOJ -----免费馅饼
- HDUOJ----Super Jumping! Jumping! Jumping!
- HDUOJ----数塔
- Golang语言-并发支持
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 从零开始学习华为路由交换 | OSPF修改计时器
- 【没落的985/211】Python爬取知乎8万字回答进行高校分析
- LinkedBlockingQueue源码学习
- 三歪吐血总结了各个中间件是如何实现持久化的
- ThreadPoolExecutor源码学习
- Docker六脉神剑(四) 使用Docker-Compose进行服务编排搭建lnmp环境
- 干的想喝水,一篇文章带你读懂硬盘工作原理!
- 微信小程序开发实战(11):滚动组件(picker)
- Docker六脉神剑 (五) Docker Swarm集群搭建及基础服务部署
- 思科模拟器GNS3将路由器变成交换机的方法
- docker安装nginx并配置https
- Docker Swarm集群部署lnmp+redis
- Maven快速入门
- TomCat安装及快速部署
- SpringCloud+MyBatis分页处理(前后端分离)