hdu5441 并查集 长春网赛

对于每次询问的大的值,都是从小的值开始的,那就从小到大处理,省去很多时间,并且秩序遍历一遍m;

这题cin容易超时,scanf明显快很多很多。G++又比C++快;

//这代码scanf400+,cin800+ 并且我交了快10次cin的8次超时
//scanf代码C++400+,G++250+
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 20010
using namespace std;
struct node
{
    int l,r,val;
}a[100010];
struct Node
{
    int id;
    int askval;
}fq[5010];
int pa[maxn],n,ans[5010],num[maxn];
bool cmp(node aa,node bb)
{
    return aa.val<bb.val;
}
bool bcmp(Node aa,Node bb)
{
    return aa.askval<bb.askval;
}
int Find(int m)
{
    if(m!=pa[m])
        pa[m]=Find(pa[m]);
    return pa[m];
}
int main()
{
    int i,j,t,m,q;
    cin>>t;
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&q);//写scanf cin容易超时
        for(i=0;i<=n;i++)
        {
            pa[i]=i;
            num[i]=1;
        }
        for(i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            a[i].l=x;
            a[i].r=y;
            a[i].val=z;
        }
        sort(a+1,a+m+1,cmp);
        for(i=0;i<q;i++)
        {
            scanf("%d",&fq[i].askval);
            fq[i].id=i;
        }
        sort(fq,fq+q,bcmp);
        int ret=0;
        j=1;
        for(i=0;i<q;i++)
        {
            for(;j<=m&&a[j].val<=fq[i].askval;j++)
            {
                int fx=Find(a[j].l);
                int fy=Find(a[j].r);
                if(fx!=fy)
                {
                    pa[fy]=fx;
                    ret+=2*num[fx]*num[fy];
                    num[fx]+=num[fy];
                }
            }
            ans[fq[i].id]=ret;
        }
        for(i=0;i<q;i++)
        {
            printf("%d\n",ans[i]);
        }
    }
}
时间: 2024-10-20 07:38:53

hdu5441 并查集 长春网赛的相关文章

hdu5438 dfs+并查集 长春网赛

先dfs对度小于2的删边,知道不能删为止. 然后通过并查集来计算每一个分量里面几个元素. #include<iostream> #include<cstring> #include<vector> #define maxn 10010 #define LL __int64 using namespace std; int in[maxn],vis[maxn],p,pa[maxn],cou[maxn]; LL sum[maxn]; vector<int>mp[

hdu 5441 Travel (2015长春网赛)

http://acm.hdu.edu.cn/showproblem.php?pid=5441 题目大意是给一个n个城市(点)m条路线(边)的双向的路线图,每条路线有时间值(带权图),然后q个询问,每个询问一个时间值 求不大于这个时间的可以连通的城市有多少种连法 比如样例中第一个询问6000,不大于6000时间值的连通城市有3,5.所以有3-->5,5-->3两种 第二个询问10000,符合条件的连通的城市有2,3,5,所以有2-->3,3-->2,2-->5,5-->2

hdu 5441 Travel 长春网赛

想到最小生成树的sort+并查集算法,于是可以顺便用并查集维护点所在的连通分量的点的数目(不知道学名是不是这么说),记为poi[v]; 然后当边权限制为f[i].w时,其答案为ww[i]=ww[i-1]-(poi[u]-1)*poi[u]-(poi[v]-1)*poi[v]+(poi[u]+poi[v])*(poi[u]+poi[v]-1); 之后连通u,v,并将新的poi[u]更新至并查集的树根.这样就相当于用最小生成树+并查集打了个表了,对于询问二分即可 自己YY的方法,很多地方丑 #inc

ACM学习历程—HDU 5443 The Water Problem(RMQ)(2015长春网赛1007题)

Problem Description In Land waterless, water is a very limited resource. People always fight for the biggest source of water. Given a sequence of water sources with a1,a2,a3,...,an representing the size of the water source. Given a set of queries eac

hdu5441 并查集+克鲁斯卡尔算法

这题计算 一张图上 能走的 点对有多少个  对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #include <algorithm> #include <string.h> #include <cstdio> #include <vector> #include <queue> using namespace std; const int maxn

ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)

Problem Description On the way to the next secret treasure hiding place, the mathematician discovered a cave unknown to the map. The mathematician entered the cave because it is there. Somewhere deep in the cave, she found a treasure chest with a com

hdu 5443 (2015长春网赛G题 求区间最值)

求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 22 33 3 Sample Output1002344519999999999991 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm>

ACM学习历程—HDU 5451 Best Solver(Fibonacci数列 &amp;&amp; 快速幂)(2015长春网赛1007题)

Problem Description The so-called best problem solver can easily solve this problem, with his/her childhood sweetheart. It is known that y=(5+2√6)^(1+2^x).For a given integer x (0≤x<2^32) and a given prime number M (M≤46337) , print [y]%M . ([y] mean

hdu 5444 Elven Postman长春网赛

5444 2333 建二插排序树,dfs一遍,之后o(1)应对查询 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn=1008; struct fuck{ int left,right; }poi[maxn]; int tol; struct shit{ char s[maxn]; int idx