51Nod-1571-最近等对
来源:互联网 发布:2017最新网络灰色项目 编辑:程序博客网 时间:2024/05/21 00:20
ACM模版
描述
题解
挺常见的一种线段树问题,首先对
区间更新,区间查询,注意延迟标记。
代码
#include <iostream>#include <cstdio>#include <algorithm>#define lson rt << 1#define rson rt << 1 | 1using namespace std;const int MAXN = 5e5 + 10;const int INF = 0x3f3f3f3f;struct node{ int l, r, id;} q[MAXN]; // 查询int n, m;int a[MAXN];int b[MAXN];int pre[MAXN];int ans[MAXN];int minv[MAXN << 2];int lazy[MAXN << 2];int cmp(node a, node b){ return a.r < b.r;}void build(int rt, int l, int r){ minv[rt] = n, lazy[rt] = INF; if (l == r) { return ; } int m = (l + r) >> 1; build(lson, l, m); build(rson, m + 1, r);}void pushup(int rt){ minv[rt] = min(minv[lson], minv[rson]);}void pushdown(int rt){ if (lazy[rt] != INF) { minv[lson] = min(minv[lson], lazy[rt]); minv[rson] = min(minv[rson], lazy[rt]); lazy[lson] = min(lazy[lson], lazy[rt]); lazy[rson] = min(lazy[rson], lazy[rt]); lazy[rt] = INF; }}void update(int rt, int l, int r, int l_, int r_, int v){ if (l_ <= l && r_ >= r) { minv[rt] = min(minv[rt], v); lazy[rt] = min(lazy[rt], v); return ; } pushdown(rt); int m = (l + r) >> 1; if (l_ <= m) { update(lson, l, m, l_, r_, v); } if (r_ > m) { update(rson, m + 1, r, l_, r_, v); } pushup(rt);}int query(int rt, int l, int r, int l_, int r_){ if (l_ <= l && r_ >= r) { return minv[rt]; } pushdown(rt); int ans = INF, m = (l + r) >> 1; if (l_ <= m) { ans = min(ans, query(lson, l, m, l_, r_)); } if (r_ > m) { ans = min(ans, query(rson, m + 1, r, l_, r_)); } pushup(rt); return ans;}void slove(){ build(1, 1, n); for (int i = 1; i <= n; i++) { pre[i] = n; } for (int i = 1, j = 1; i <= n && j <= m; i++) { if (pre[a[i]] == n) // 记录离散化后的 a[i] 的前一个位置 { pre[a[i]] = i; } else { update(1, 1, n, 1, pre[a[i]], i - pre[a[i]]); pre[a[i]] = i; } while (j <= m && q[j].r == i) { ans[q[j].id] = query(1, 1, n, q[j].l, n); j++; } }}template <class T>inline bool scan_d(T &ret){ char c; int sgn; if (c = getchar(), c == EOF) { return 0; //EOF } while (c != '-' && (c < '0' || c > '9')) { c = getchar(); } sgn = (c == '-') ? -1 : 1; ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0' && c <= '9') { ret = ret * 10 + (c - '0'); } ret *= sgn; return 1;}
阅读全文
0 0
- 51Nod-1571-最近等对
- 51Nod-1398-等公交
- 51nod 1107 逆序对
- 51nod 1622 集合对
- 51Nod-1622-集合对
- 51Nod-1473-等幂映射
- 51nod 1473 等幂映射
- 【概率DP】51Nod 1398 等公交
- 51nod 1398 等公交【概率DP】
- 【51NOD 1622】【51NOD 算法马拉松19】集合对
- 51Nod-1779-逆序对统计
- 【乱搞】51Nod 1622 集合对
- 51Nod 1874 字符串排序 逆序对
- 51nod 1473-等幂映射(循环节)
- 最近对DocBook感兴趣
- 最近点对算法
- 最近点对
- 最近点对问题
- 第一章 理解网络编程和套接字
- 大学必须掌握的软件基础课程
- 获取文件属性的文件系统相关函数
- 萌新的linux之旅12
- 大学里应该掌握的两个能力
- 51Nod-1571-最近等对
- bzoj 3631: [JLOI2014]松鼠的新家(LCA+树上差分)
- Redis集群概述
- Redis单机多节点集群实验
- HDU 1724 Ellipse (自适应辛普森积分)
- MySQL的下载、安装、配置
- centos7 firewall 防火墙 命令
- 一起学android之如何获取手机程序列表以及程序相关信息并启动指定程序 (26)
- 二叉搜索树(BST树)