2020牛客暑期多校训练营(第七场) J Pointer Analysis———set模拟

题目题面太死亡了,跟队友来来回回看了好几遍,硬生生被绕进去了,最开始觉得这个指针一次指向多个变量怎么回事,然后发现了是可以无限次乱序执行,讨论好久的题意,终于能解释清楚了。然后发现对象的成员变量和全局的变量来来回回,好,死了。我选择换题。
队友毅然决然上图论,并查集,启动。
今天,我为他默哀。
题目链接

题目大意

一个程序,现在有26个最多对象a,b,c,d…w,y,z
每个对象有最多26个指针成员变量, [a.a], [a.b], [a.c], [a.d] …
然后加上全局指针变量26个A,B,C,D…W,Y,Z
现在有四种操作语句,在乱序执行无限次的情况下,输出26个全局指针变量可能指向的所有对象

四种操作(分别记作操作1,操作2,操作3,操作4):
在这里插入图片描述
操作1最简单,直接把对象给过去了,不解释
操作2也不难,它会把B指向的所有对象都送到A中
操作3就很绕了,准确翻译就是把B指向的所有对象,送到A可达的所有对象的成员变量 f 中,这包含三个步骤,一个是找到B指向的所有对象,一个是找到A可达的所有对象,然后把B指向那个的对象送入到A可达的对象的特定成员变量中。
操作四有所简化,找到B的特定成员变量指向的所有对象,然后加入A中即可。

这样分析下来,其实就可以直接用两个二维的set来维护结果,第一个set维护26个全局指针,第二个set维护26个对象的26个成员变量,然后按照操作一个一个来。因为执行次数无限且乱序,那么直接执行多次就好,set相当于维护一个并集,保留所有可能的结果。简单模拟,结束。

那么这题为什么坑呢?题面太长太难读了··最骚的是,说好的对象object有成员变量,结果用成员变量的全都是大写字母的全局指针,各种理不顺逻辑。尤其是样例2,明明B.f已经指向了某个对象,但是B可能指向的对象是空,好,我宣告吐血身亡,下一道题。赛后看大佬直播讲题,模拟,强颜欢笑,我当时为什么考虑那么多关系,数据范围这么小,直接模拟然后多次执行不好么。
上一份大佬的代码

代码

大佬地址

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
set<int>A[30],B[30][30],tmp;
//A 模拟题目中的大写字母(全局指针)
//B 模拟成员变量用
//tmp 临时变量 用于操作4 因为操作4操作的是对象的所有成员变量的对象
string a[300],b[300],c[300];//读入用
int main()
{
   
    int n;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值