2018牛客网暑期ACM多校训练营(第一场)J Different Integers(树状数组)
题意
给出一串数字以及q次查询,每次查询l,r],要求求出[1,l]和[r,n]的所有不相同的数字个数。
分析
先对数组进行倍增,变为两倍长,然后查询就变成一个完整的区间。离线处理,按r从小到大排序,数组从1到2n扫一遍,每次更新每种数最后出现的位置,用树状数组处理。把前一次出现位置在树状数组里面更新-1(由于r从小到大查询,为了正确求出[l,r]中的不同数字数,必须更新最新的同时把旧的删去,目的在于以最新的位置判断,避免重复),这次的位置更新+1,然后如果扫描到的i>=r则对查询区间进行求和查询。
- #include<iostream>
- #include<cmath>
- #include<cstring>
- #include<queue>
- #include<vector>
- #include<cstdio>
- #include<algorithm>
- #include<map>
- #include<set>
- #define rep(i,e) for(int i=0;i<(e);i++)
- #define rep1(i,e) for(int i=1;i<=(e);i++)
- #define repx(i,x,e) for(int i=(x);i<=(e);i++)
- #define X first
- #define Y second
- #define PB push_back
- #define MP make_pair
- #define mset(var,val) memset(var,val,sizeof(var))
- #define scd(a) scanf("%d",&a)
- #define scdd(a,b) scanf("%d%d",&a,&b)
- #define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
- #define pd(a) printf("%d\n",a)
- #define scl(a) scanf("%lld",&a)
- #define scll(a,b) scanf("%lld%lld",&a,&b)
- #define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
- #define IOS ios::sync_with_stdio(false);cin.tie(0)
- #define lc idx<<1
- #define rc idx<<1|1
- #define rson mid+1,r,rc
- #define lson l,mid,lc
- using namespace std;
- typedef long long ll;
- template <class T>
- void test(T a) {
- cout<<a<<endl;
- }
- template <class T,class T2>
- void test(T a,T2 b) {
- cout<<a<<" "<<b<<endl;
- }
- template <class T,class T2,class T3>
- void test(T a,T2 b,T3 c) {
- cout<<a<<" "<<b<<" "<<c<<endl;
- }
- const int inf = 0x3f3f3f3f;
- const ll INF = 0x3f3f3f3f3f3f3f3fll;
- const ll mod = 1e9+;
- int T;
- void testcase() {
- printf("Case %d: ",++T);
- }
- const int MAXN = 2e5+;
- const int MAXM = ;
- const double PI = acos(-1.0);
- const double eps = 1e-;
- struct node{
- int l,r,id;
- bool operator <(const node &b)const{
- return r<b.r;
- }
- }Q[MAXN];
- int n,q;
- int bit[MAXN],a[MAXN],ans[MAXN];
- int last[MAXN];
- int lowbit(int x){ return x&-x; }
- void update(int x,int d){
- while(x<=n){
- bit[x]+=d;
- x+=lowbit(x);
- }
- }
- int query(int x){
- int res=;
- while(x>){
- res+=bit[x];
- x-=lowbit(x);
- }
- return res;
- }
- int query(int l,int r){
- return query(r)-query(l-);
- }
- int main() {
- #ifdef LOCAL
- freopen("data.in","r",stdin);
- #endif // LOCAL
- while(~scdd(n,q)){
- for(int i=;i<=n;i++) scd(a[i]),a[i+n]=a[i];
- for(int i=;i<q;i++){
- scdd(Q[i].l,Q[i].r);
- Q[i].id=i;
- Q[i].l+=n;
- swap(Q[i].l,Q[i].r);
- }
- n<<=;
- sort(Q,Q+q);
- mset(last,);
- mset(bit,);
- int k=;
- for(int i=;i<=n&&k<q;i++){
- if(last[a[i]]) update(last[a[i]],-);
- last[a[i]]=i;
- update(last[a[i]],);
- while(k<q&&Q[k].r<=i){
- ans[Q[k].id]=query(Q[k].l,Q[k].r);
- k++;
- }
- }
- for(int i=;i<q;i++){
- printf("%d\n",ans[i]);
- }
- }
- return ;
- }
2018牛客网暑期ACM多校训练营(第一场)J Different Integers(树状数组)的更多相关文章
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
- 2018 牛客网暑期ACM多校训练营(第一场) E Removal (DP)
Removal 链接:https://ac.nowcoder.com/acm/contest/139/E来源:牛客网 题目描述 Bobo has a sequence of integers s1, ...
- 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...
- 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
链接:https://ac.nowcoder.com/acm/contest/148/J?&headNav=acm 来源:牛客网 Rikka with Nickname 时间限制:C/C++ ...
- 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)
题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...
- 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)
题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ...
- 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]
题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第二场) J - farm - [随机数哈希+二维树状数组]
题目链接:https://www.nowcoder.com/acm/contest/140/J 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第三场) A - PACM Team - [四维01背包][四约束01背包]
题目链接:https://www.nowcoder.com/acm/contest/141/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- MT【293】拐点处切线
(2018浙江高考压轴题)已知函数$f(x)=\sqrt{x}-\ln x.$(2)若$a\le 3-4\ln 2,$证明:对于任意$k>0$,直线$y=kx+a$ 与曲线$y=f(x)$有唯一 ...
- zabbix agent 自定义 UserParameter
有时候我们想让被监控端执行一个zabbix没有预定义的检测,zabbix的用户自定义参数功能提供了这个方法.我们可以在客户端配置文件zabbix_angentd.conf里面配置UserParamet ...
- 基数排序模板(基数排序,C++模板)
算法的理论学习可右转Creeper_LKF大佬的洛谷日报 一个优化算法理论时间复杂度的实例点这里 另一个实例点这里 时间复杂度\(O(n)\),算常数的话要乘位长. 蒟蒻参考了Creeper_LKF大 ...
- 本文之后都以Vol1来指代
本文参考文档是<64-ia-32-architectures-software-developer-vol-1-manual>(本文之后都以Vol1来指代),介绍了x86架构的基础.这些基 ...
- [SDOI2015]序列统计(多项式快速幂)
题目描述 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S.小C用这个生成器生成了许多这样的数列.但是小C有一个问 ...
- Nio再学习之NIO的buffer缓冲区
1. 缓冲区(Buffer): 介绍 我们知道在BIO(Block IO)中其是使用的流的形式进行读取,可以将数据直接写入或者将数据直接读取到Stream对象中,但是在NIO中所有的数据都是使用的换冲 ...
- firfox中"content-disposition", "attachment;filename=“+filename不能显示文件名字
一般要在浏览器中显示文件名,可以使用以下文件名 // 设置文件名的编码方式,使得文件的名字能够正常安全的显示. filename = URLEncoder.encode(filename, " ...
- postman 测试套件collection
测试套件collection就是为了跑一套case,整体的一套case,为了解决一个一个的case单独跑 1.点击小加号 2.填写套件的名字 3.右键增加folder,一个folder里面可以增加多个 ...
- C++ template一些体悟(3)
其实没啥体悟,因为还没有感受到这些例子的作用,记一下先 #include <iostream> using namespace std; class alloc { }; template ...
- python学习笔记:python异常的调用原理
因为错误是class,捕获一个错误就是捕获到该class的一个实例.因此,错误并不是凭空产生的,而是有意创建并抛出的.Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误. h ...