做题记录:P1196 [NOI2002]银河英雄传说

P1196 [NOI2002]银河英雄传说

//P1196 [NOI2002]银河英雄传说
#include<iostream>
#include<cstdio>
#include<cmath>
    using namespace std;
    int f[30005],p[30005],s[30005];
    //f[i]表示第i艘战舰与哪一艘战舰在同一列中
    //p[i]表示第i艘战舰的前面有多少艘战舰
    //s[i]表示第i列有多少艘战舰
void find_x(int x)//起到路径压缩的作用
{
    if(f[x]==x) return;//如果找到了祖先,就结束
    find_x(f[x]);//如果没有,就继续找
    p[x]+=p[f[x]];//更新p[x]的值
    f[x]=f[f[x]];//路径压缩
}
int main()
{
    for(int i=1;i<=30000;i++)//初始化
    {
        f[i]=i;
        s[i]=1;
        p[i]=0;

    }
    int T=0;
    scanf("%d",&T);
    for(int q=1;q<=T;q++)
    {
        char x=‘ ‘;
        int y=0,z=0;
        scanf(" %c%d%d",&x,&y,&z);
        if(x==‘M‘)//合并操作
        {
            find_x(y);
            find_x(z);
            int tx=f[y],ty=f[z];
            f[tx]=ty;//合并
            p[tx]=s[ty];//合并到另一列的那个队列的队首战舰前面的战舰数就是另一列的总战舰数
            s[ty]+=s[tx];//更新这一列的战舰数
            s[tx]=0;//更新这一列的战舰数
        }
        else//询问
        {
            find_x(y);
            find_x(z);
            int tx=f[y],ty=f[z];
            if(tx!=ty) printf("-1\n");//如果不在同一列,输出-1
                else printf("%d\n",int(abs(p[y]-p[z])-1));//否则输出它们之间的战舰数目
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/wozaixuexi/p/8438076.html

时间: 2024-11-06 12:41:40

做题记录:P1196 [NOI2002]银河英雄传说的相关文章

洛谷 P1196 [NOI2002]银河英雄传说

有很多人都把这道题讲得很详细了,我就不再重复了. 要总结的是,这可以看作一种"边带权"的并查集,对于这种并查集我们可以另开数组记录边上的关系,然后在find和unite的同时对关系进行维护. 于是此题中我们用一个 d 数组来记录当前战舰 到 这列战舰最前面的战舰 的战舰数量, 用一个 size 数组(在程序中为了避免关键字换成了siz)记录当前战舰后面跟了多少战舰(为了方便M操作时更新d). 具体的维护方式参考代码. 1 #include <bits/stdc++.h> 2

P1196 [NOI2002]银河英雄传说

题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …,30000.之后,他把自己的战舰也依次编号为1, 2,

NOI2002银河英雄传说

原先就看过这道题,觉得很复杂. 不知道为什么今天一看觉得好水啊-- 难道这就是并查集的启发式合并? 数组d[i]表示i到其父节点的距离,即中间隔了多少船舰. 数组sum[i]记录以i为根的集合总共有多少个元素,将新节点插入的时候距离设为sum[i]就好了. 代码: 1 var fa,d,sum:array[0..30001] of longint; 2 t,i,xx,yy,x,y:longint; 3 ch:string[1]; 4 function find(x:longint):longin

[noi2002]银河英雄传说

Description 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.        宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌.        杨威利擅长排兵布阵,巧妙运用各种战术屡次以少胜多,难免恣生骄气.在这次决战中,他将巴米利恩星域战场划分成30000列,每列依次编号为1, 2, …, 3000

数据结构(并查集):260. [NOI2002] 银河英雄传说

260. [NOI2002] 银河英雄传说 ★★☆   输入文件:galaxy.in   输出文件:galaxy.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇宙舰队司令莱因哈特率领十万余艘战舰出征,气吞山河集团点名将杨威利组织麾下三万艘战舰迎敌. 杨威利擅长排兵布

【BZOJ做题记录】07.07~?

在NOI一周前重开一个坑 最后更新时间:7.07 11:26 7.06 下午做的几道CQOI题: BZOJ1257: [CQOI2007]余数之和sum:把k mod i写成k-k/i*i然后分段求后面的部分就好了 BZOJ1258: [CQOI2007]三角形tri:在草稿纸上按照位置和边找一下规律就好了 BZOJ1260: [CQOI2007]涂色paint:简单的区间DP BZOJ1303: [CQOI2009]中位数图:小于中位数的改为-1大于的改为1,算一算前缀和然后哈希一下乘一乘就好

project euler做题记录

ProjectEuler_做题记录 简单记录一下. problem 441 The inverse summation of coprime couples 神仙题.考虑答案为: \[\begin{array}{c} S(n) & = & \sum_{i = 1} ^ n \sum_{p = 1} ^ i \sum_{q = p + 1} ^ i \frac {1}{pq}[p + q \geq i][gcd(p, q) = 1] \& = & \sum_{i = 1} ^

退役前的做题记录5.0

退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树,这样跨越\(mid\)的点对之间的最短路一定会经过\(mid\),因此两点之间的最短路径就可以描述成最短路树上的两段到根路径.对每棵最短路树处理\(dfs\)序,用树状数组维护权值修改即可. [Wannafly挑战赛4F]线路规划 类似SCOI2016萌萌哒一题,并查集\(f_{i,j}\)表示从

后缀自动机做题记录

目录 后缀自动机做题记录 sp1811 sp1812 sp10570 luogu 2463 CF873F TJOI2015 弦论 AHOI2013 差异 HEOI2016/TJOI2016 字符串 HAOI2016 找相同字符 SDOI2016 生成魔咒 ZJOI2015 诸神眷顾的幻想乡 留坑待填 广义SAM 其他 NOI原题练习 后缀自动机做题记录 来填之前的坑了...考后大概会做做有字符串的综合题吧 sp1811 lcs板子,对于第一个串建出SAM,第二个串在上面跑,即可求出对于每一个位置