“玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)

题意:初始时有个首都1,有n个操作

+V表示有一个新的城市连接到了V号城市

-V表示V号城市断开了连接,同时V的子城市也会断开连接

每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号最小的城市

输入数据保证正确,每次添加与删除的城市一定是与首都相连的

题解:每次都只需要知道最远且编号最小的城市,所以直接使用优先队列存储

如果是+V就使用并查集(不能路径压缩)添加上然后加入优先队列,接着直接弹出首元素就是结果

如果是-V则把V指向0,接着弹出优先队列的第一个元素

如果他与1相连就是答案,否则将他到0这条路上的点都连上0删除他,继续弹出

注意这儿有个trick就是如果没有城市与1相连,答案就是1

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=1<<28;
const ll INF=1ll<<60;
const double Pi=acos(-1.0);
const int Mod=1e9+7;
const int Max=2e5+7;
struct node
{
    int key,value;//存编号与离1的距离
    bool operator<(const node &c)const//距离大的编号小的优先
    {
        if(value==c.value)
            return key>c.key;
        return value<c.value;
    }
};
priority_queue<struct node> ans;
int fat[Max],val[Max];
char str[Max];
void Init(int n)
{
    while(!ans.empty())
        ans.pop();
        node temp;//初始化一个元素1在队列底部
        temp.value=0;
        temp.key=1;
        ans.push(temp);
    for(int i=0;i<=n;++i)
    {
        fat[i]=i;
        val[i]=0;
    }
    return;
}
int Find(int x)
{
    if(x==fat[x])
    return fat[x];
    return Find(fat[x]);
}
void Solveadd(int f,int s)//+
{
    node temp;

    fat[s]=f;
    val[s]=val[f]+1;

    temp.key=s;
    temp.value=val[s];
    ans.push(temp);

    return;
}
void Solvesub(int f)//-
{
    node temp;
    int s;
    fat[f]=0;
    while(!ans.empty())
    {
        temp=ans.top();
        if(Find(temp.key)==1)
            return;

            s=temp.key;
        while(fat[s]!=0)//链上赋为0
        {
            fat[s]=0;
        }
        ans.pop();
    }
    return;
}
int main()
{
int t,n,m,coun;
scanf("%d",&t);
node temp;
while(t--)
{
    scanf("%d",&n);
    Init(n+1);
    coun=1;
    for(int i=0;i<n;++i)
    {
        getchar();
        scanf("%c%d",&str[i],&m);
        if(str[i]==‘+‘)
        {
            Solveadd(m,++coun);
        }
        else
        {
            Solvesub(m);
        }
            temp=ans.top();
        printf("%d\n",temp.key);
    }
}
return 0;
}
时间: 2024-10-17 09:51:51

“玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)的相关文章

“玲珑杯”ACM比赛 Round #19题解&amp;源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】

A -- simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 SAMPLE INPUT 5 20 1314 SAMPLE OUTPUT 5 21 1317 SOLUTION “玲珑杯”ACM比赛 Round #19 题目链接:http://www.ifrog.cc/acm/problem/1145 分析: 这个题解是官方写法,官方代码如下: 1 #include <iostream>

“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)

“玲珑杯”ACM比赛 Round #19 Start Time:2017-07-29 14:00:00 End Time:2017-07-29 16:30:00 Refresh Time:2017-07-29 16:42:55 Private B -- Buildings Time Limit:2s Memory Limit:128MByte Submissions:590Solved:151 DESCRIPTION There are nn buildings lined up, and th

“玲珑杯”ACM比赛 Round #18 A 暴力水 C dp

“玲珑杯”ACM比赛 Round #18 计算几何你瞎暴力 题意:如果从一个坐标为 (x1,y1,z1)的教室走到(x2,y2,z2)的距离为 |x1−x2|+|y1−y2|+|z1−z2|.那么有多少对教室之间的距离是不超过R的呢? tags:坐标范围很小,瞎暴力 #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring>

“玲珑杯”ACM比赛 Round #18

"玲珑杯"ACM比赛 Round #18 Start Time:2017-07-15 12:00:00 End Time:2017-07-15 15:46:00 A -- 计算几何你瞎暴力 Time Limit:5s Memory Limit:256MByte Submissions:1764Solved:348 DESCRIPTION 今天HHHH考完了期末考试,他在教学楼里闲逛,他看着教学楼里一间间的教室,于是开始思考: 如果从一个坐标为 (x1,y1,z1)(x1,y1,z1)的

“玲珑杯”ACM比赛 Round #1

Start Time:2016-08-20 13:00:00 End Time:2016-08-20 18:00:00 Refresh Time:2017-11-12 19:51:52 Public A -- Absolute Defeat Time Limit:2s Memory Limit:64MByte Submissions:394Solved:119 DESCRIPTION Eric has an array of integers a1,a2,...,ana1,a2,...,an.

“玲珑杯”ACM比赛 Round #18 图论你先敲完模板(dp)

题目链接:http://www.ifrog.cc/acm/problem/1146 题意:中文题 题解:状态转移方程:dp[ i ] = min ( dp[ i ] ,dp[ j ] + 2xi-xj+a ). dp[1]=0,第一个点需要消耗的能量为0,从第二个点(假设这个点为A)开始,往前遍历一遍点(假设这个点为B)假定B点为休息点,然后直接到A点需要的能量, 依次然后找出最小能量,因为从第二个点依次往后,每次前面的都已经最优了,所以最后n位置得到的就是答案了. 然后有几个注意点INF尽量弄

“玲珑杯”ACM比赛 Round #18 A 计算几何你瞎暴力(瞎暴力)

题目链接:http://www.ifrog.cc/acm/problem/1143 题意:如果从一个坐标为 (x1,y1,z1)(x1,y1,z1)的教室走到(x2,y2,z2)(x2,y2,z2)的距离为 |x1−x2|+|y1−y2|+|z1−z2| 那么有多少对教室之间的距离是不超过R的呢? 题解:暴力暴力,把点记录在三维数组里面,然后暴力搜寻符合条件的点,值得注意的是在同个位置可能有不同的教室(明显不符合现实,蜜汁尴尬(逃.....) 不同位置直接暴力,会重复计算一次,比如点(1,2,3

“玲珑杯”ACM比赛 Round #1 A -- Absolute Defeat

DESCRIPTION Eric has an array of integers a1,a2,...,ana1,a2,...,an. Every time, he can choose a contiguous subsequence of length kk and increase every integer in the contiguous subsequence by 11. He wants the minimum value of the array is at least mm

“玲珑杯”ACM比赛 Round #12 (D) 【矩阵快速幂的时间优化】

//首先,感谢Q巨 定义状态向量b[6] b[0]:三面临红色的蓝色三角形个数 b[1]:两面临红色且一面临空的蓝色三角形个数 b[2]:一面临红色且两面临空的蓝色三角形个数 b[3]:三面临红色的黄色三角形个数 b[4]:两面临红色且一面临绿+的黄色三角形个数 b[5]:一面临红色且两面临绿+的黄色三角形个数 转移矩阵: [3 1 0 0 0 0;0 2 2 0 0 0;0 1 3 0 0 0;3 2 1 0 0 0;0 0 0 6 3 0;0 0 0 0 2 4] 最朴素的TLE代码 #in