当前位置: 首页 > news >正文

SCUT - G - 魔法项链 - 树状数组

https://scut.online/contest/30/G

很久以前做的一个东西,当时是对R排序之后树状数组暴力统计当前区间的前缀和。每有一个元素出现在R的范围内,就解除他的同样元素的影响,在他上一个同样元素曾经+1的位置给他-1。因为已经对R进行排序了,下一个询问一定会更容易包含后面出现的那一个。

今天又演了居然想尺取,做不到做不到,L是会不断变化的,不满足尺取的条件。

然后重写的时候发现

last[a[R]]=R++;

last[a[R]]=R;
++R;

并不等价。

看来会改变的同一个变量最好只在一句话中出现一次。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Query {
    int l, r, id;
} q[1000005];

bool cmp1(const Query& q1, const Query& q2) {
    return q1.r != q2.r ? q1.r < q2.r : q1.l < q2.l;
}

int ans[1000005];

int n, m, a[1000005];
int last[1000005], cnt;

int bit[1000005];

inline int Sum(int x) {
    int res = 0;
    for(; x; x -= x & -x)
        res += bit[x];
    return res;
}

inline void Add(int x, int v) {
    for(; x <= n; x += x & -x)
        bit[x] += v;
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    scanf("%d", &m);
    for(int i = 1; i <= m; ++i) {
        scanf("%d%d", &q[i].l, &q[i].r);
        q[i].id = i;
    }
    sort(q + 1, q + 1 + m, cmp1);
    int R = 1;
    for(int i = 1; i <= m; ++i) {
        while(R <= q[i].r) {
            if(last[a[R]])
                Add(last[a[R]], -1);
            Add(R, 1);
            last[a[R]] = R;
            ++R;
        }
        ans[q[i].id] = Sum(q[i].r) - Sum(q[i].l - 1);
    }
    for(int i = 1; i <= m; ++i)
        printf("%d\n", ans[i]);
    return 0;
}

在不引起混淆的情况下,使用运算符重载会比使用外部cmp快10%。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Query {
    int l, r, id;
    bool operator<(const Query& q2) {
        return r < q2.r;
    }
} q[1000005];

int ans[1000005];

int n, m, a[1000005];
int last[1000005], cnt;

int bit[1000005];

inline int Sum(int x) {
    int res = 0;
    for(; x; x -= x & -x)
        res += bit[x];
    return res;
}

inline void Add(int x, int v) {
    for(; x <= n; x += x & -x)
        bit[x] += v;
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    scanf("%d", &m);
    for(int i = 1; i <= m; ++i) {
        scanf("%d%d", &q[i].l, &q[i].r);
        q[i].id = i;
    }
    sort(q + 1, q + 1 + m);
    int R = 1;
    for(int i = 1; i <= m; ++i) {
        while(R <= q[i].r) {
            if(last[a[R]])
                Add(last[a[R]], -1);
            Add(R, 1);
            last[a[R]] = R;
            ++R;
        }
        ans[q[i].id] = Sum(q[i].r) - Sum(q[i].l - 1);
    }
    for(int i = 1; i <= m; ++i)
        printf("%d\n", ans[i]);
    return 0;
}

转载于:https://www.cnblogs.com/Yinku/p/11343038.html

相关文章:

  • SCUT - 482 - 生成树上的点 - Prufer
  • ACM算法相关资料
  • 洛谷 - P1462 - 通往奥格瑞玛的道路 - 二分 - Dijkstra
  • 洛谷 - P1522 - 牛的旅行 - Cow Tours - Floyd
  • wamp5环境配置基础教程
  • 模板 - Floyd
  • 这样的设计师,你们伤不起啊
  • 洛谷 - P1346 - 电车 - Dijkstra/01BFS
  • 图文解析五大外链误区
  • js中字符串操作函数
  • vsftpd每个虚拟用户的不同目录
  • 模板 - Prim
  • 关于网站从Window 2003移动到windows 2008
  • 模板 - 强连通分量 - Kosaraju
  • JavaScript 演练(5). 模拟类
  • ----------
  • 345-反转字符串中的元音字母
  • bootstrap创建登录注册页面
  • HTTP--网络协议分层,http历史(二)
  • JavaScript的使用你知道几种?(上)
  • Java反射-动态类加载和重新加载
  • leetcode-27. Remove Element
  • Nacos系列:Nacos的Java SDK使用
  • vuex 学习笔记 01
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 基于游标的分页接口实现
  • 解决iview多表头动态更改列元素发生的错误
  • 利用DataURL技术在网页上显示图片
  • 前端临床手札——文件上传
  • 终端用户监控:真实用户监控还是模拟监控?
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​水经微图Web1.5.0版即将上线
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2)nginx 安装、启停
  • (8)STL算法之替换
  • (arch)linux 转换文件编码格式
  • (C++17) std算法之执行策略 execution
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (超详细)语音信号处理之特征提取
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)JAVA使用POI操作excel
  • (二)windows配置JDK环境
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (理论篇)httpmoudle和httphandler一览
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 设置默认首页
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET多线程执行函数