首页 > 其他分享 >题解 [USACO18JAN] MooTube G

题解 [USACO18JAN] MooTube G

时间:2023-07-19 14:33:19浏览次数:51  
标签:USACO18JAN return int 题解 LL long fa MooTube

题目链接

可以发现,对于一个固定的 \(k\),所有边权小于 \(k\) 的边对答案是没有贡献的,因为一条边的相关性是最小相关性,这也意味着我们不能从 \(<k\) 的边到达其他的点。

由于本题有多组询问,所以对于没有用的边,将其看做被删除,有用的边,将其看做被插入。

考虑到本题实际上要维护连通块的大小,所以想到用并查集维护。

对于所有问题,不妨按 \(k\) 从大到小排序,然后依次插入符合 \(k\) 条件的边,这样就将删除操作去掉了。

时间复杂度 \(O(n\log n)\) ,瓶颈在排序。

#include<bits/stdc++.h>
using namespace std;

#define PII pair<int,int>
typedef long long LL;
typedef unsigned long long ULL;

LL read() {
    LL sum=0,flag=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
    while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
    return sum*flag;
}

const int N=1e5+10;
int n,q;
int ans[N];
int fa[N],siz[N];
struct node {
    int p,q,r;
}a[N];
struct node2 {
    int k,v,id;
}b[N];

int cmp1(node x,node y) {
    return x.r>y.r;
}

int cmp2(node2 x,node2 y) {
    return x.k>y.k;
}

int find(int x) {
    if(x==fa[x]) return x;
    else return fa[x]=find(fa[x]);
}

int main() {
    cin>>n>>q;
    for(int i=1;i<n;i++) {
        cin>>a[i].p>>a[i].q>>a[i].r;
    }
    for(int i=1;i<=n;i++) {
        siz[i]=1;
        fa[i]=i;
    }
    sort(a+1,a+n,cmp1);
    for(int i=1;i<=q;i++) {
        cin>>b[i].k>>b[i].v;
        b[i].id=i;
    }
    sort(b+1,b+1+q,cmp2);
    int num=0;
    for(int i=1;i<=q;i++) {
        while(a[num+1].r>=b[i].k&&num+1<=n-1) {
            num++;
            int fx=find(a[num].p),fy=find(a[num].q);
            if(fx!=fy) {
                fa[fx]=fy;
                siz[fy]+=siz[fx];
                siz[fx]=0;
            }
        }
        ans[b[i].id]=siz[find(b[i].v)]-1;
    }
    for(int i=1;i<=q;i++) {
        cout<<ans[i]<<'\n';
    }


    return 0;
}
/*

*/

标签:USACO18JAN,return,int,题解,LL,long,fa,MooTube
From: https://www.cnblogs.com/zhangyuzhe/p/17565449.html

相关文章

  • 洛谷 P1122 最大子树和 题解
    一道入门的树形DP。首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序、单调、子问题等等性质),以便于后续的转化、推理和处理。有序化可以“转化和创造”性质首先将视角从无根树切换为有根树,这样我们就可以得到一个带有最优子结构、无后效性......
  • HDU 5492 Find a path 题解
    Description在矩阵中,找一条到从\((1,1)\)到\((n,m)\)(只能向上,右走)的路径,使路径上方差最小。输出方差平方乘\(n+m-1\)的结果。对于所有数据,\(1\leqn,m,A_{i,j}\leq30\)。Solution设路径上的数为\(A_{1},A_{2},A_{3},\cdots,A_{n+m-1}\),\(\overline{A}\)为其平均数,则答......
  • 题解 序列合并
    题目链接首先不难想到,最小数的一定是\(a_1+b_1\),次小的数是\(a_1+b_2\)和\(a_2+b_1\)中小的。得出结论,若\(a_i+b_j\)是第\(k\)小,那么\(a_{i+1}+b_j\)和\(a_i+b_{j+1}\)有可能成为第\(k+1\)小。这是一个很优秀的性质,这意味着我们可以通过最小值推出次小值,再通过......
  • “范式杯”2023牛客暑期多校训练营1 蒻蒟题解
    A.AlmostCorrect题意:给定一个01串,要求构造一系列排序操作(xi,yi),使得经过这些排序操作后可以使与给定01串等长的所有其他01串完全排好序,而给定的01串无法完全排好序Solution构造题我们考虑到对0和1的位置进行统计,统计得出最左边的1的位置为l,最右边的0的位置为r我们进行三次......
  • 【SP21463 题解】
    Descirption给定\(n\timesm\)的矩阵,求最大子矩阵的面积满足每一行每一列都构成等差数列。Solution我们另\(up_{i,j}\)表示最小的\(k\)满足\((i,k),(i,k+1),\cdots,(i,j)\)构成等差数列,可以用\(\mathcalO(nm)\)求出。对于一个矩阵的左上角\((a,b)\),右下......
  • BZOJ 1461 题解
    考虑设计一个哈希函数\(hash(x)=f(x)\timesbase^x\)。其中\(f(x)\)表示\(\sum_{j=1}^{i-1}[j<i]\)。然后类似于滑动窗口计算区间哈希值,加入一个数就计算贡献,减去一个数就计算这个数产生了贡献,两个东西都可以树状数组维护,那么愉快做完了。#include<bits/stdc++.h>#de......
  • P5494 题解
    来一发\(O(\logn)\)线性空间的解法。考虑通过只维护线段树叶子节点的虚树的方法压缩空间,考虑记录下每个节点的编号,然后通过异或完求最低位的\(1\)的方式求出LCA的深度,然后记录下LCA右端点的编号。在回收节点的时候可以释放储存右端点编号的空间,但是这里为了方便就不这样......
  • UNR #7 Day2 T1 火星式选拔题解
    放一个比赛链接先考虑打完暴力后\(k=1\)的特殊性质。当队列容量为\(1\)时,队中的人\(i\)会被第一个满足\(i\leqj\)且\(b_i\leqa_j\)的人淘汰,并且队列中的人会变成\(j\),考虑倍增加速这个过程,令\(f_{i,j}\)表示第\(i\)个人进队后淘汰过程发生\(2^j\)次后队......
  • P6684 题解
    真的卡不动了,但是我感觉我的思路还是有一些价值的,就来写一篇题解吧。考虑使用回滚莫队(不增)来维护,当区间删去一个点时相当于全局加入一条边,这个询问的本质是询问是否是二分图,所以考虑扩展值域并查集,这里使用路径压缩加按秩合并,记录下修改,在回滚时全部还原。总复杂度是\(O(n\sqr......
  • 「JOISC 2019 Day4」蛋糕拼接 3 题解
    先考虑这个式子:\(\sum_{j=1}^{M}|C_{k_{j}}-C_{k_{j+1}}|\)一定是在\(C\)有序时取到,具体证明很简单各位读者自己证明。那么现在式子变成:\(\sum{V}+2\times({C_{\max}-C_{\min}})\)这个时候一个常见的技巧是将\(C\)排序。这个时候就可以定义状态:\(dp_{i,j}=\s......