当前位置 : 主页 > 编程语言 > c语言 >

scu 优先队列

来源:互联网 收集:自由互联 发布时间:2023-09-07
Description Sidney想去Gandtom家玩。但Sidney家和Gandtom家之间是高低不平、坑坑洼洼的土路。所以他需要用他的背包装几袋稀的泥,在路上铺平一些干的土,使路变成平整的泥土,才能到Gand

Description
  Sidney想去Gandtom家玩。但Sidney家和Gandtom家之间是高低不平、坑坑洼洼的土路。所以他需要用他的背包装几袋稀的泥,在路上铺平一些干的土,使路变成平整的泥土,才能到Gandtom家见到Gandtom。
  已知现在有n袋稀的泥,第i袋稀的泥的质量为wi。初始时,第i个分组只有第i袋稀的泥。接下来Sidney每一次会把质量最小(如果质量相同取编号小的)的两组稀的泥合并成一组。新的分组的质量为原来两分组质量的和,编号为原来两组稀的泥的编号的较小者的编号。
  试求Sidney经过t次操作后,第q袋稀的泥在第几组中。

Input
第一行有一个整数T,表示组数。
每组数据第一行有两个正整数n,m

(0

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<string>
#include<bitset>
#include<ctime>

typedef long long ll;
using namespace std;
typedef unsigned long long int ull;
#define maxn 500005
#define ms(x) memset(x,0,sizeof(x))
#define Inf 0x7fffffff
#define inf 0x3f3f3f3f
const long long int mod = 1e9 + 7;
#define pi acos(-1.0)
#define pii pair<int,int>
#define eps 1e-7
#define pll pair<ll,ll>



ll quickpow(ll a, ll b) {
    ll ans = 1;
    a = a % mod;
    while (b > 0) {
        if (b % 2)ans = ans * a;
        b = b / 2;
        a = a * a;
    }
    return ans;
}

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a%b);
}

int t[maxn], q[maxn], fa[maxn];
struct node {
    int id, w;
    node(){}
    node(int id, int w) :id(id), w(w) {};
    bool operator < (const node &rhs)const {
        if (rhs.w == w)return rhs.id < id;
        return rhs.w < w;
    }
};

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


int main()
{
    //ios::sync_with_stdio(false);
    int tt;
    //cin >> tt;
    scanf("%d", &tt);
    while (tt--) {
        priority_queue<node>qq;
        int n, m, tmp;
        //cin >> n >> m;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) {
            fa[i] = i;
            //cin >> tmp;
            scanf("%d", &tmp);
            qq.push(node(i, tmp));
        }
        int cnt = 0;
        for (int i = 1; i <= m; i++) {
            //cin >> t[i] >> q[i];
            scanf("%d%d", &t[i], &q[i]);
            if (cnt == t[i]) {
                //cout << fath(q[i]) << endl;
                printf("%d\n", fath(q[i]));
                continue;
            }
            while (cnt < t[i]) {
                cnt++;
                node fir = qq.top();
                qq.pop();
                node sec = qq.top();
                qq.pop();

                int nwid = min(fir.id, sec.id);
                fa[sec.id] = fa[fir.id] = fa[nwid];
                qq.push(node(fa[nwid], fir.w + sec.w));

            }
            printf("%d\n", fath(q[i]));
        }
    }

}
网友评论