bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列

详见vfleaking在discuss里的题解.

收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过.

暴力:

 1 /**************************************************************
 2     Problem: 1171
 3     User: idy002
 4     Language: C++
 5     Result: Accepted
 6     Time:1908 ms
 7     Memory:6732 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <cstring>
12 #define min(a,b) ((a)<(b)?(a):(b))
13 #define max(a,b) ((a)>(b)?(a):(b))
14 #define oo 0x3f3f3f3f
15 #define N 250010
16
17 int n, L;
18 int x[N], y[N], d[N];
19 int dp[N], fa[N], qu[N], bg, ed;
20
21 int find( int i ) {
22     return i==fa[i] ? i : fa[i]=find(fa[i]);
23 }
24 int main() {
25     scanf( "%d%d", &n, &L );
26     d[1] = 0;
27     x[1] = 0;
28     y[1] = 2000000000;
29     for( int i=2; i<=n; i++ )
30         scanf( "%d%d%d", x+i, y+i, d+i );
31     for( int i=1; i<=n; i++ )
32         fa[i] = i;
33     memset( dp, 0x3f, sizeof(dp) );
34
35     dp[1] = 0;
36     qu[bg=ed=1] = 1;
37     while( bg<=ed ) {
38         int i=qu[bg++];
39         for( int j=find(i)+1; j<=n && d[j]-d[i]<=L; j=find(j)+1 ) {
40             if( dp[j]!=oo ) continue;
41             int xx = max( x[i], x[j] );
42             int yy = min( y[i], y[j] );
43             if( xx<=yy ) {
44                 dp[j] = dp[i]+1;
45                 qu[++ed] = j;
46                 if( dp[j-1]!=oo ) fa[j-1]=j;
47                 if( dp[j+1]!=oo ) fa[j]=j+1;
48             }
49         }
50     }
51     for( int i=2; i<=n; i++ )
52         printf( "%d\n", dp[i]==oo ? -1 : dp[i] );
53 }

时间: 2024-10-12 14:10:48

bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列的相关文章

洛谷P3402 【模板】可持久化并查集(可持久化线段树,线段树)

orz TPLY 巨佬,题解讲的挺好的. 这里重点梳理一下思路,做一个小小的补充吧. 写可持久化线段树,叶子节点维护每个位置的fa,利用每次只更新一个节点的特性,每次插入\(logN\)个节点,这一部分思路还是很轻松.关于此部分的其它问题可以参考下我的可持久化线段树总结 一开始,写惯了常规并查集.用惯了路径压缩的我,以为在这一题里也要这么搞.我对我的naive真是太感动了 试想一下,因为路径压缩时,再次调用getf后,是要更新一部分值的.在数组上搞这些操作倒是挺快,然而在可持久化线段树里呢?每次

ZOJ 3632 Watermelon Full of Water(dp+线段树或单调队列优化)

Watermelon Full of Water Time Limit: 3 Seconds      Memory Limit: 65536 KB Watermelon is very popular in the hot summer. Students in ZJU-ICPC Team also love watermelon very much and they hope that they can have watermelon to eat every day during the

BZOJ 1012 线段树或单调队列

1012: [JSOI2008]最大数maxnumber 题意:两种操作:1.查询当前数列中末尾L个数中的最大的数:2.当前数列末尾插入一个数. tags:水题 线段树 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define FF(i,a,b) for (int i=a;i<=b;i++) #define F(i

bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查询k在区间内的后继(后继定义为大于x,且最小的数) Input 第一行两个数 n,

POJ 1456——Supermarket——————【贪心+并查集优化】

Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1456 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx

并查集优化连边

很多题目均可用并查集优化连边, 跳过一些已经访问过的点 比方说, 对[L,R]范围进行一定更新可以这样写 for (int i=Find(L); i<=R; i=Find(i)) { //do something fa[i] = i+1; } 这样操作过后[L,R]的fa均指向R+1, 下一次会直接跳到R+1, 相当于每个点值只更新一次 例题 1, CF 827A 求构造一个最小字典序的字符串, 其中字符串某些位置的字符固定 #include <iostream> #define REP

普林斯顿公开课 算法1-10:并查集-优化的快速合并方法

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

(贪心 + 并查集优化) poj 1456

Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9452   Accepted: 4067 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an int

ZOJ 2833-Friendship(并查集+优化)

Friendship Time Limit: 3 Seconds      Memory Limit: 32768 KB A friend is like a flower, a rose to be exact, Or maybe like a brand new gate that never comes unlatched. A friend is like an owl, both beautiful and wise. Or perhaps a friend is like a gho