博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 522D Closest Equals 树状数组
阅读量:4326 次
发布时间:2019-06-06

本文共 1727 字,大约阅读时间需要 5 分钟。

题意:

给出一个序列\(A\),有若干询问。

每次询问某个区间中值相等且距离最短的两个数,输出该距离,没有则输出-1.

分析:

\(pre_i = max\{j| A_j = A_i, j < i\}\),也就是前一个与\(A_i\)相等的数字的下标。

这个可以通过对序列排序,数值相等按照下标排序来计算。
将询问离线,按照询问区间的右端点从左到右排序。
从左到右扫描,向树状数组中在位置\(pre_i\)插入\(i - pre_i\),并维护一个后缀最小值。

查询的时候直接查即可。

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define REP(i, a, b) for(int i = a; i < b; i++)#define PER(i, a, b) for(int i = b - 1; i >= a; i--)#define SZ(a) ((int)a.size())#define MP make_pair#define PB push_back#define EB emplace_back#define ALL(a) a.begin(), a.end()typedef long long LL;typedef pair
PII;const int maxn = 500000 + 10;const int INF = 0x3f3f3f3f;int n, m;inline int lowbit(int x) { return x&(-x); }int C[maxn];void upd(int& a, int b) { if(a > b) a = b; }void update(int x, int v) { while(x) { upd(C[x], v); x -= lowbit(x); }}int query(int x) { int ans = INF; while(x <= n) { upd(ans, C[x]); x += lowbit(x); } if(INF == ans) ans = -1; return ans;}struct Query{ int l, r, id; bool operator < (const Query& t) const { return r < t.r; }};PII a[maxn];int ans[maxn], pre[maxn];Query q[maxn];int main() { scanf("%d%d", &n, &m); memset(C, 0x3f, sizeof(C)); REP(i, 1, n + 1) { scanf("%d", &a[i].first); a[i].second = i; } sort(a + 1, a + 1 + n); REP(i, 2, n + 1) { if(a[i].first == a[i-1].first) pre[a[i].second] = a[i-1].second; } REP(i, 0, m) { scanf("%d%d", &q[i].l, &q[i].r); q[i].id = i; } sort(q, q + m); int p = 1; REP(i, 0, m) { for( ;p <= q[i].r; p++) { if(pre[p]) update(pre[p], p - pre[p]); } ans[q[i].id] = query(q[i].l); } REP(i, 0, m) printf("%d\n", ans[i]); return 0;}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/6945679.html

你可能感兴趣的文章
POJ 3267 The Cow Lexicon(动态规划)
查看>>
设计原理+设计模式
查看>>
音视频处理
查看>>
tomcat 7服务器跨域问题解决
查看>>
前台实现ajax 需注意的地方
查看>>
Jenkins安装配置
查看>>
个人工作总结05(第二阶段)
查看>>
Java clone() 浅拷贝 深拷贝
查看>>
深入理解Java虚拟机&运行时数据区
查看>>
02-环境搭建
查看>>
spring第二冲刺阶段第七天
查看>>
搜索框键盘抬起事件2
查看>>
阿里百川SDK初始化失败 错误码是203
查看>>
透析Java本质-谁创建了对象,this是什么
查看>>
BFS和DFS的java实现
查看>>
关于jquery中prev()和next()的用法
查看>>
一、 kettle开发、上线常见问题以及防错规范步骤
查看>>
eclipse没有server选项
查看>>
CRC码计算及校验原理的最通俗诠释
查看>>
QTcpSocket的连续发送数据和连续接收数据
查看>>