牛客网多校联合训练1 J Different Integers(可持久化线段树/莫队)
题意:给你一个L,R区间,让你求1-L和R-n中有多少个数
思路:最美不过夕阳红,一直没想到拼接起来,之前想到拼接,但想的是每次都进行拼接,所以是一个n2lg的操作,最后想到了拼接全部,然后就是一个经典的求区间有几个数的问题,然后果断主席树搞了一发,T50%,然后写一发莫队,同T50%,心态爆炸。校内讲题的时候,有人告诉我莫队加输入挂可以过,加了读入挂,果断过,然后又有人说,改变分块大小也可以过,改了大小以后也过了,然后看了其他人的主席树,发现只是在最后加了一下对于LR的判断,改了以后也Al ,还是没想到啊。
下面附上主席树和莫队的代码:
莫队
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include<bits/stdc++.h> using namespace std; const int N=3e5+7; int block,cnt[1000007],a[N],res[N],ans;struct node{int l,r,id; }q[N]; bool cmp(node a,node b) {return a.l/block!=b.l/block?a.l/block<b.l/block:a.r<b.r; } void update(int p,int val) {cnt[a[p]]+=val;if(cnt[a[p]]==1&&val==1)ans++;if(cnt[a[p]]==0&&val==-1)ans--; // printf("fuck %d %d %d\n",cnt[a[p]],ans,val); } //int main() //{ // // return 0; //} int main() {int n,m;while(~scanf("%d%d",&n,&m)){block=1000;memset(cnt,0,sizeof(cnt));memset(res,0,sizeof(res));for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[i+n]=a[i];}for(int i=1;i<=m;i++){int A,B;scanf("%d%d",&A,&B);q[i].l=B;q[i].r=A+n; // printf("test %d %d\n",q[i].l,q[i].r);q[i].id=i;}n*=2;sort(q+1,q+1+m,cmp);ans=0;// printf("test\n");for(int i=1,l=1,r=0;i<=m;i++){for(;r<q[i].r;r++)update(r+1,1);for(;r>q[i].r;r--)update(r,-1);for(;l<q[i].l;l++)update(l,-1);for(;l>q[i].l;l--)update(l-1,1);// printf("test %d %d ans === %d\n",q[i].l,q[i].r,ans);res[q[i].id]=ans;}for(int i=1;i<=m;i++){printf("%d\n",res[i]);}} }
主席树
#include <bits/stdc++.h> using namespace std; #define met(a,b) memset(a,b,sizeof a)const int N=2e5+50; struct node {int lson,rson;int cnt; }; node T[N*40]; int root[N],tot; int sa[N];int arr[N]; int last_pos[N]; inline void init() {met(root,0);met(last_pos,0);tot=0;T[0].cnt=T[0].lson=T[0].rson=0; } inline void update(int &cur,int ori,int l,int r,int pos,int flag) {cur=++tot;T[cur]=T[ori];T[cur].cnt+=flag;if(l==r)return ;int mid=(l+r)/2;if(pos<=mid)update(T[cur].lson,T[ori].lson,l,mid,pos,flag);elseupdate(T[cur].rson,T[ori].rson,mid+1,r,pos,flag); } inline int query(int S,int E,int l,int r,int x,int y) {if(x<=l&&r<=y)return T[E].cnt-T[S].cnt;else {int mid=(l+r)>>1;if(y<=mid)return query(T[S].lson,T[E].lson,l,mid,x,y);else if(x>mid)return query(T[S].rson,T[E].rson,mid+1,r,x,y);elsereturn query(T[S].lson,T[E].lson,l,mid,x,mid)+query(T[S].rson,T[E].rson,mid+1,r,mid+1,y);} }int main() {int n,q;while(~scanf("%d%d",&n,&q)){init();vector<int>pos;for(int i=1; i<=n; ++i) {scanf("%d",&arr[i]);arr[i+n]=arr[i];pos.push_back(arr[i]); // sa[i]=arr[i];sa[i+n]=arr[i+n]; }n*=2; // printf("test %d\n",n); sort(pos.begin(),pos.end());pos.erase(unique(pos.begin(),pos.end()),pos.end());int temp_rt=0;for(int i=1;i<=n;++i){arr[i]=lower_bound(pos.begin(),pos.end(),arr[i])-pos.begin()+1; // arr[i]=getid(arr[i]); // printf("test %d\n",last_pos[arr[i]]);if(!last_pos[arr[i]]) {update(root[i],root[i-1],1,n,i,1);last_pos[arr[i]]=i;}else{update(temp_rt,root[i-1],1,n,last_pos[arr[i]],-1);update(root[i],temp_rt,1,n,i,1); // update(root[i],root[i-1],1,n,i,1);last_pos[arr[i]]=i;}}while(q--){int A,B;scanf("%d%d",&A,&B);if(A<B){int l=B,r=A+n/2;printf("%d\n",query(root[l-1],root[r],1,n,l,r));}else{printf("%d\n",query(root[0],root[n],1,n,1,n));} // printf("test sum:%d l1:%d l2:%d r-1==%d l-1==%d l==%d r==%d\n",sum,l1,l2,query(1,r-1),query(1,l-1),query(l,n),query(r,n)); // printf("%d\n",ans); }}return 0; }
转载于:https://www.cnblogs.com/lalalatianlalu/p/9337467.html
牛客网多校联合训练1 J Different Integers(可持久化线段树/莫队)相关推荐
- 牛客网 编程初学者入门训练 BC133 KiKi说祝福语
题目来源:牛客网 编程初学者入门训练 BC133 KiKi说祝福语 import java.util.Scanner; public class Main {public static void ma ...
- 牛客网 编程初学者入门训练 BC37 网购 Java
题目来源:牛客网 编程初学者入门训练 BC37 网购 import java.util.Scanner; public class Main {public static void main(Stri ...
- 牛客网 编程初学者入门训练 BC3 有容乃大 Java
题目来源:牛客网 编程初学者入门训练 BC3 有容乃大 public class Main {public static void main(String[] args) {System.out.pr ...
- 【牛客网多校】19-7-25-H题 Magic Line
链接:https://ac.nowcoder.com/acm/contest/883/H 来源:牛客网 题目描述 There are always some problems that seem si ...
- 2022牛客暑期多校训练营训练日志
2022牛客暑期多校训练营1 G - Lexicographical Maximum 签到题. A - Villages: Landlines 简化题意:给你 nnn 条线段,问你把这些线段铺到数轴上 ...
- 【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)
题干: 链接:https://ac.nowcoder.com/acm/contest/157/C 来源:牛客网 题目描述 PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性. HtBest有 ...
- 牛客网多校训练第一场 B - Symmetric Matrix(dp)
链接: https://www.nowcoder.com/acm/contest/139/B 题意: 求满足以下条件的n*n矩阵A的数量模m: A(i,j) ∈ {0,1,2}, 1≤i,j≤n. A ...
- 牛客网多校训练 德玛西亚万岁
题目描述 来源 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意识形态,这里的人民为此感到强烈自豪. 有一天他们想去制裁邪恶的比尔吉沃特,于是派遣 ...
- 牛客网编程初学者入门训练讲解(C语言)
以十进制显示数字,使用%d:以八进制 显示数字,使用%o:以十六进制显示数字,使用%x.另外,要显示各进制数的前缀0.0x和0X,必须使用%#o.%#x.%#X. --<C Primier Pl ...
最新文章
- KubeVela:标准化的云原生平台构建引擎
- c++错误之map的find()返回值类型
- python字符串命名_python-字符串及其常用方法
- 小鹏汽车首批量产车下线,未来将进军L4级别自动驾驶
- java char 比较,为什么我在Java中使用char和int进行比较?
- Python密码存储器
- 裴礼文《数学分析中的典型问题与方法》P61~90
- 一个例子搞懂单纯形法大M法和两阶段法
- 快速搭建pgadmin4环境
- python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)...
- ffmpeg 推流 m3u8 播放 EasyDarwin 存储录像和播放
- 多线程爬取图片(生产者-消费者模式)
- 信息提取(Information Extraction)
- ADIDAS的完整形式是什么?
- 把自己做的网站进行app封包
- 论文笔记——News Recommendation with Topic-Enriched Knowledge Graphs
- SQL基础编程——介绍及基本语法了解
- python批量删除图片和空文件夹
- Javascript循环删除数组中元素的3种方法
- 怎么在linux上添加网络打印机,Ubuntu下安装安装hp网络打印机图解
热门文章
- 【图像处理】一种低光照图像的亮度提升方法(Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images)
- leetcode —— 19. 删除链表的倒数第N个节点
- 改善深层神经网络:超参数调整、正则化以及优化 —— 3.1调试处理
- leetcode - 303.区域和检索-数组不可变(动态规划)
- Spring Boot的启动器Starter详解
- edu汇编语言——实训课程
- 最长公共子序列LCS(动态规划)—详解
- B. Who‘s Opposite?
- mysql 属性函数_4-MySQL函数(字段处理函数条件判断函数)
- pb 应用 迁移 linux_塑料包装袋中添加剂迁移到食品和药品中危害健康