【FZU】Problem 2059 MM(离线处理并查集)

离线处理,并查集

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100005;
struct Node{
    int id,value;
}node[maxn],input[maxn];
bool cmp(Node p,Node q){
    return p.value > q.value;
}
int p[maxn],vis[maxn],fa[maxn],num[maxn],ans[maxn];
int n,m,cnt;
int find_father(int u){
    return fa[u] == u ? u : fa[u] = find_father(fa[u]);
}
void init(){
    for(int i = 1; i <= n; i++){
        fa[i] = i;
        num[i] = 1;
    }
    memset(vis,0,sizeof(vis));
    sort(node + 1,node + 1 + n, cmp);
    for(int i = 1; i <= n; i++)
        p[node[i].id] = i;
    cnt = 0;
}
void solve(){
    sort(input,input + cnt,cmp);
    int ret = 0;
    int   j = 1;
    for(int i = 0; i < cnt; i++){
        int t = input[i].id;
        for(;j <= n && node[j].value >= input[i].value; j++){
            ret = max(ret,1);
            int pos = node[j].id;
            vis[pos] = 1;
            int lpos = pos - 1,rpos = pos + 1;
            if(lpos >= 1 && vis[lpos]){
                int f1 = find_father(pos);
                int f2 = find_father(lpos);
                if(f1 != f2){
                    if(f1 > f2) swap(f1,f2);
                    num[f1] += num[f2];
                    fa[f2] = f1;
                    ret = max(ret,num[f1]);
                }
            }
            if(rpos <= n && vis[rpos]){
                int f1 = find_father(pos);
                int f2 = find_father(rpos);
                if(f1 != f2){
                    if(f1 > f2) swap(f1,f2);
                    num[f1] += num[f2];
                    fa[f2] = f1;
                    ret = max(ret,num[f1]);
                }
            }
        }
        ans[t] = ret;
    }
    for(int i = 0; i < cnt; i++)
        printf("%d\n",ans[i]);
}
void read(){
    int op,a,b;
    init();
    for(int i = 0; i < m; i++){
        scanf("%d",&op);
        if(op == 1){
            input[cnt].id = cnt;
            scanf("%d",&input[cnt++].value);
        }
        else{
            solve();
            scanf("%d%d",&a,&b);
            node[p[a]].value = b;
            init();
        }
    }
    solve();
}
int main(){
    while(scanf("%d%d",&n,&m) != EOF){
        for(int i = 1; i <= n; i++){
            node[i].id = i;
            scanf("%d",&node[i].value);
        }
        read();
    }
    return 0;
}

时间: 2024-08-01 22:45:29

【FZU】Problem 2059 MM(离线处理并查集)的相关文章

URAL1671 Anansi&#39;s Cobweb(离线做 + 并查集)

传送门 大意:给出一个无向图,删除Q条边,每删除一次就询问一次目前的连通块的数目. 思路:离线搞, 把删边转换为加边,每加一次边,若两个顶点不连通就用并查集把着这两个连通块合并. 代码: #include<cstdio> #include<cstring> #include<algorithm> #define MAXN 100005 using namespace std; int n, m, q; int s[MAXN], t[MAXN]; int ban[MAXN

【bzoj4551】[Tjoi2016&amp;Heoi2016]树 离线处理+并查集

题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记.)2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖先)你能帮帮他吗? 输入 输入第一行两个正整数N和Q分别表示节点个数和操作次数接下来N-1行,每行两个正整数u,v(1≤u,v≤n)表示u到v有一条有向边接下来Q行,形如"oper

【bzoj5183】[Baltic2016]Park 离线+对偶图+并查集

题目描述 在Byteland的首都,有一个矩形围栏围起来的公园.在这个公园里树和访客都以一个圆形表示.公园有四个出入口,每个角落一个(1=左下角,2=右下角,3=右上角,4=左上角).访客能通过这些出入口进出公园.访客在同时碰到一个角落的两条边时就可以通过该角落进出公园.访客在公园里可以自由地移动,但他们不能和树和围栏相交.对于每个访客,给定他们进入公园的出入口,你的任务是计算他们能在哪个出入口离开公园. 输入 输入的第一行包含两个整数:n,m:树的数量和访客的数量. 第二行包含两个整数:w,h

HDU 5441 离线处理 + 并查集

题意:给n个节点m条带权值边的无向图.然后q个问题,每次询问点对的数目,点对需要满足的条件是:1)连通:2)其路径的最大权值不能超过询问值. 分析:如果没次询问一次,dfs一次,很可能超时,因此可以用并查集.离线处理,把边按权值排序,把问题按大小排序.然后离线的过程就是不断向图中加边的过程. 比如样例如下: 然后离线处理,排完序后将会是一条一条的加边:问题也排了序,因此是个累加过程... 1 #include <cstdio> 2 #include <iostream> 3 #in

hdu3938 Portal 离线的并查集

离线算法是将全部输入都读入,计算出所有的答案以后再输出的方法.主要是为避免重复计算.类似于计算斐波那契数列的时候用打表的方法. 题目:给一个无向图,求有多少个点对,使得两点间的路径上的花费小于L,这里路径上的花费是这样规定的,a.b两点之间所有的路径中的最大边的最小值.    当然题目上不是这么写的.它问的是有多少种路径,这里就比较模糊了,到底两个路径怎样才算是两种路径呢,这时候重新看题,可以发现,如果理解为路径中经过的点不同的话,题目中给的所谓两点间的花费这个定义就没有意义了,所以就可以猜测,

[hdu4585]离线,并查集

题意:把一些数加到集合里面,每个数有两个属性,分别是编号和值,加进去之前询问集合里面距离自己“最近”的数的编号.最近的意思是值的差的绝对值最小,如果有相等的,则取值小的.并且已知所有数的id和value都是唯一的. 思路:把处理过程反过来,就变成了一次把一个点删除,删除可以用数组标记,而询问则转化为找某个数左边的第一个没标记的数和右边的第一个没被标记的数,由于删除是永久的,所以完全可以通过并查集来加速,标记也可以省略. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

FZU 2192 位置信息挖掘 (种类并查集)

题目链接:click here~~ [题目大意]: O2O即Online To Offline,是指将线下的商务机会与互联网结合,让互联网成为线下交易的前台.这些商务机会主要是偏服务类的商品,例如汽车售后服务.摄影服务.餐饮.电影等,其特色是线上购买.线下服务. 因此,对这类垂直行业的商品做移动推荐时,用户和商品的位置信息显得格外重要.但是,可能存在用户.商品的位置信息缺失的情况,例如:用户不共享位置信息.商家未填写位置信息-- 现在,Jason给出用户在移动端的购买行为数据,以及商品集合,希望

(离线处理+并查集) hdu 3938

Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 977    Accepted Submission(s): 490 Problem Description ZLGG found a magic theory that the bigger banana the bigger banana peel .This import

[HDOJ2586]How far away?(最近公共祖先, 离线tarjan, 并查集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 这题以前做过…现在用tarjan搞一发…竟然比以前暴力过的慢………… 由于是离线算法,需要Query来保存查询数据,Ans来保存结果.最后输出的时候按照idx的顺序输出,所以胡搞了个排序.. dfs每次更新depth,当前点depth是上一个点累积下来的. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6