历史

 

3 历史(history.c/cpp/pas)
3.1 题目描述
历史学家小A正在研究一个奇怪的王国的历史。当前阶段的任务是研究该国的交通。
根据这个奇怪的王国的史书记载,史书开始记载前这个王国有 n 个城市(城市从 0 开
始标号),但所有城市之间都没有道路相连。
每一年,在位的国王会修建一条 x 到 y 的双向道路,一条道路可能被修建多次,但不会
修建起点和终点为同一个城市的道路。
而在这之间,国王会计划进行若干次旅行。对于计划进行的一次旅行 st->ed,如果当
时能完成这次旅行,而 t 年前不能完成这次旅行,那么国王会对之前的建设成果感到满意,
否则他会很生气,并在下一次计划旅行前都让史官记录下错误的修建道路的信息,即把 x、
y 记作(x+n-c) mod n,(y+n-c) mod n。
当然在这些年中也发生了若干次国王的交替,初始国王的 c 值为 0,而每个国王的 c 值
不一定相同,但在国王在位期间 c 值不会改变,新上位的国王开始处于不生气的状态。
请根据史书帮助小 A 得出国王每次对于计划旅行是否满意,从而辅助小 A 能够研究该
国的交通信息。
3.2 输入格式
第一行为两个整数 n,m,表示初始城市数和历史书记载的内容数。
接下来 m 行,每行是以下三种格式之一:
1 . K v :表示国王交替,新国王的 c 值为 v
2 . R x y:表示史书上记载的是国王修建了 x 到 y 的双向道路,但注意这个记录的可
能不是实际状况。
3 . T st ed t:表示国王计划进行的一次 st->ed 的旅行,且比较的是 t 年前的情况(国
NOIP 模拟试题 #5
7
王可能会和史书开始记载以前的情况比较),注意这个记录的肯定是实际情况。
注意只有遇到 R 操作才会使年份的计数+1。
3.3 输出格式
输对于每个 T 的记录输出一行,如果此次计划旅行令国王满意,则输出 Y,否则输出 X。
3.4 样例输入
3 7
R 0 1
T 0 1 1
K 1
R 0 1
T 0 1 1
R 0 1
T 0 2 1
3.5 样例输出
Y
N
Y
3 .6 数据范围与约定
对于 30%的数据,保证 n<=1000 ,m<=3000。
另 30%的数据满足没有发生国王的交替。
NOIP 模拟试题 #5
8
对于 100%的数据,保证 n,m<=300000,0<=v,x,y,st,ed<n,0<=t<m。
数据有梯度

 

思路:

  在线处理,用并查集记录道路的连接情况,同时记录每条边的创建时间(这是为了找到t年前的道路连接情况)。

  注意查询时,有创建时间的限制。还有城市是从零开始的。

#include <cstdio>
#include <algorithm>
using namespace std;
#define M 300009
int n,m;
int f[M],sum[M],yr[M];
int anger,c,year,x,y,st,ed,t;
int find(int x,int t)
{
    while(x!=f[x] && yr[x]<=t) x=f[x];
    return x;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++)    f[i]=i,sum[i]=1;
    char C;
    while(m--)
    {
        cin>>C;
        if(C=='K')
        {
            scanf("%d\n",&c);
            anger=0;continue;
        }
        if(C=='R')
        {
            scanf("%d%d",&x,&y);
            if(anger)
            {
                x+=c,y+=c;
                x%=n,y%=n;                
            }
            year++;
            x=find(x,year);y=find(y,year);
            if(x == y) continue;
            if(sum[x] < sum[y]) {
                f[x] = y;
                sum[y] += sum[x];
                yr[x] = year;
            }
            else {
                f[y] = x;
                sum[x] += sum[y];
                yr[y] = year;
            }
            continue;
        }
        if(C=='T')
        {
            scanf("%d%d%d",&st,&ed,&t);
            if(anger=( find(st,year)^find(ed,year) ) || (find(st,year-t)==find(ed,year-t)))
                printf("N\n");
            else printf("Y\n");
        }
    }
    return 0;
}

 样例

3 3
R 0 1
R 0 2
T 0 2 2

输出

Y

 

转载于:https://www.cnblogs.com/CLGYPYJ/p/7486208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值