题意:给你一个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(可持久化线段树/莫队)相关推荐

  1. 牛客网 编程初学者入门训练 BC133 KiKi说祝福语

    题目来源:牛客网 编程初学者入门训练 BC133 KiKi说祝福语 import java.util.Scanner; public class Main {public static void ma ...

  2. 牛客网 编程初学者入门训练 BC37 网购 Java

    题目来源:牛客网 编程初学者入门训练 BC37 网购 import java.util.Scanner; public class Main {public static void main(Stri ...

  3. 牛客网 编程初学者入门训练 BC3 有容乃大 Java

    题目来源:牛客网 编程初学者入门训练 BC3 有容乃大 public class Main {public static void main(String[] args) {System.out.pr ...

  4. 【牛客网多校】19-7-25-H题 Magic Line

    链接:https://ac.nowcoder.com/acm/contest/883/H 来源:牛客网 题目描述 There are always some problems that seem si ...

  5. 2022牛客暑期多校训练营训练日志

    2022牛客暑期多校训练营1 G - Lexicographical Maximum 签到题. A - Villages: Landlines 简化题意:给你 nnn 条线段,问你把这些线段铺到数轴上 ...

  6. 【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/C 来源:牛客网 题目描述 PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性. HtBest有 ...

  7. 牛客网多校训练第一场 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 ...

  8. 牛客网多校训练 德玛西亚万岁

    题目描述   来源 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意识形态,这里的人民为此感到强烈自豪. 有一天他们想去制裁邪恶的比尔吉沃特,于是派遣 ...

  9. 牛客网编程初学者入门训练讲解(C语言)

    以十进制显示数字,使用%d:以八进制 显示数字,使用%o:以十六进制显示数字,使用%x.另外,要显示各进制数的前缀0.0x和0X,必须使用%#o.%#x.%#X. --<C Primier Pl ...

最新文章

  1. KubeVela:标准化的云原生平台构建引擎
  2. c++错误之map的find()返回值类型
  3. python字符串命名_python-字符串及其常用方法
  4. 小鹏汽车首批量产车下线,未来将进军L4级别自动驾驶
  5. java char 比较,为什么我在Java中使用char和int进行比较?
  6. Python密码存储器
  7. 裴礼文《数学分析中的典型问题与方法》P61~90
  8. 一个例子搞懂单纯形法大M法和两阶段法
  9. 快速搭建pgadmin4环境
  10. python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)...
  11. ffmpeg 推流 m3u8 播放 EasyDarwin 存储录像和播放
  12. 多线程爬取图片(生产者-消费者模式)
  13. 信息提取(Information Extraction)
  14. ADIDAS的完整形式是什么?
  15. 把自己做的网站进行app封包
  16. 论文笔记——News Recommendation with Topic-Enriched Knowledge Graphs
  17. SQL基础编程——介绍及基本语法了解
  18. python批量删除图片和空文件夹
  19. Javascript循环删除数组中元素的3种方法
  20. 怎么在linux上添加网络打印机,Ubuntu下安装安装hp网络打印机图解

热门文章

  1. 【图像处理】一种低光照图像的亮度提升方法(Adaptive Local Tone Mapping Based on Retinex for High Dynamic Range Images)
  2. leetcode —— 19. 删除链表的倒数第N个节点
  3. 改善深层神经网络:超参数调整、正则化以及优化 —— 3.1调试处理
  4. leetcode - 303.区域和检索-数组不可变(动态规划)
  5. Spring Boot的启动器Starter详解
  6. edu汇编语言——实训课程
  7. 最长公共子序列LCS(动态规划)—详解
  8. B. Who‘s Opposite?
  9. mysql 属性函数_4-MySQL函数(字段处理函数条件判断函数)
  10. pb 应用 迁移 linux_塑料包装袋中添加剂迁移到食品和药品中危害健康