ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线段树 区间离散化

2021-08-07 19:34:20  阅读:195  来源: 互联网

标签:include co int 线段 tr 离散 区间 加点


/*
离散化思路 和一般的离散化不同 多了个中间加点操作
具体为啥要加点
1-10 1-4 6-10
这三个区间离散化后 5 这个点会丢掉。
加点防止丢点。。。。。。。hhhh




总结 排序 去重 中间加点 再排序


*/


2528 -- Mayor's posters (poj.org)

#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn = 1e6 + 10; #define ls (u<<1) #define rs (u<<1|1) struct node { int l, r; }e[maxn]; struct sgt { int l, r; int co; }tr[maxn*20]; int a[maxn], la; int find(int x) { return lower_bound(a + 1, a + 1 + la, x) - a; } int t, n, m; bool vis[maxn]; void build(int u, int l, int r) { tr[u].l=l;tr[u].r=r;tr[u].co=0; if (l == r)return; int mid = (l + r) / 2; build(ls, l, mid); build(rs, mid + 1, r); } void pushdown(int u) { if (tr[u].co > 0) { tr[ls].co = tr[rs].co = tr[u].co; tr[u].co = 0; } } void modify(int u, int ql, int qr,int v) { if (ql <= tr[u].l && tr[u].r <= qr) { tr[u].co = v; return; } pushdown(u); int mid = (tr[u].l + tr[u].r) / 2; if (ql <= mid)modify(ls, ql, qr, v); if (mid < qr)modify(rs, ql, qr, v); } void ask(int u, int& ans) { if (tr[u].co != 0 && vis[tr[u].co] == false)ans++, vis[tr[u].co] = true; if (tr[u].l == tr[u].r)return; pushdown(u); int mid = (tr[u].l + tr[u].r) / 2; ask(ls, ans); ask(rs, ans); } void solve() { la = 0; scanf("%d", &n); for (int i = 1; i <= n; i++)scanf("%d%d", &e[i].l, &e[i].r), a[++la] = e[i].l, a[++la] = e[i].r; sort(a + 1, a + 1 + la);//排序 la = unique(a + 1, a + 1 + la) - a - 1;//去重 for (int i = la; i > 1; i--)if (a[i] - a[i - 1] > 1)a[++la] = a[i-1] +1;//中间加点 sort(a + 1, a + 1 + la);//排序 build(1, 1, la); memset(vis, 0, sizeof vis); for (int i = 1; i <= n; i++) { int l = find(e[i].l), r = find(e[i].r); modify(1, l, r, i); } int ans = 0; ask(1, ans); printf("%d\n", ans); } int main() { scanf("%d", &t); while (t--)solve(); return 0; }

 

标签:include,co,int,线段,tr,离散,区间,加点
来源: https://www.cnblogs.com/dabaizai/p/15112839.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有