[LCOI2018][WX] Tirpitz

\([LCOI2018][WX11.1]~Tirpitz​\)


时限:1s 内存限制:131072KB

输入文件: T.in 输出文件: T.out

题目背景

王九日很颓废,这也就是他为什么这么弱的原因。

众所周知,提尔比茨(Tirpitz)又被称为“北方的孤独女王”。

然而这个东西和题目并没有什么关系

题目描述

\(Felling\)和邪恶的修道者\(Neyii\)对战。十分的激烈,地球人为了纪念这场伟大的战斗。于是将这一史诗级的故事,编写成了游戏,名字叫做《黑白块》

地球上的中二少年\(LZR\)十分沉浸于这段历史,不但以这段历史作为题目背景,出了一套题面十分毒瘤的题目,还去游玩了这款激烈的战斗游戏《黑白块》

然鹅他太手残了,玩《黑白块》的时候只能玩一列的情况(什么鬼)

然后为了简化问题,我们将这一列进行翻转,变为一行的情况。

然后我们分别以0代表白块,1代表黑块。

但是,这段黑白块是不断变化的,所以\(LZR\)想让你帮帮他,维护这一段黑白序列

需要你支持一下两种操作

1.将一个白块变成黑块

2.输出某个黑块左边的第一个白块

输入输出格式
输入格式

第一行有两个数,分别为\(N,M\) 表示这个黑白序列有个元素,共要进行\(M\)次操作

第二行有\(N\)个数字,为题目中描述的黑白序列

接下来有\(M\)行,每行有二个数字

若输入格式为

E X

则为将第\(X\)个块变成黑色,若已经是黑色。则忽略这条输入

若输出格式为

Z X

则请你输出第\(X\)个块最左面的白块,如果第\(X\)个块为白块,则输出\(X\)^\(K\)。若第\(X\)个数左边没有白块,则输出\(0\)

\(K\)为上一次操作的\(X\),一开始\(K=0\),‘^’为异或。

输出格式

每行一个数字,为操作2中的白块位置。

样例输入输出
样例输出
4 4
0 0 0 0
E 1
Z 1
E 2
Z 4
样例输出
1
4

对于\(40\%\)的数据,\(N,M\le 10000\)

对于\(100\%\)的数据,\(N,M\le 3\cdot 10^6\)


首先\(O(N)\)预处理出每一个黑点\(X\)在最开始,左边的第一个白点的位置\(F(X)\)

void Init(){
    int Now = 0 ;
    for(int i = 1; i <= N; i ++)
        if(! Data[i]) Now = Data[i] ;
        else F[i] = Now ;
}

然后,对于每一次修改,我们知道该点被修改了,但是它前面的那个点的属性并没有改变。所以我们直接将它赋值为前一个点的\(F\)就好了。然后对于每一次,询问,查询一个\(Find(X)\)就可以了。实际上是利用了一个类似于并查集的思想。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 500010
#define Inf 0x7fffffff
#define LL long long
using namespace std ;
int Read(){
    int X = 0 ; char ch = getchar() ;
    while(ch > '9' || ch < '0') ch = getchar() ;
    while(ch >= '0' && ch <= '9')
        X = (X << 1) + (X << 3) + (ch ^ 48), ch = getchar() ;
    return X ;
}
int N, M, F[MAXN], Y ;
bool Data[MAXN] ;
int Find(int Now){
    if(F[Now] == Now) return F[Now] ;
    else return F[Now] = Find(F[Now]) ;
}
void Init(){
    int Now = 0 ;
    for(int i = 1; i <= N; i ++){
        if(! Data[i]) Now = i ;
        F[i] = Now ;
    }
        
}
int main(){
    N = Read(), M = Read() ;
    for(int i = 1; i <= N; i ++)
        Data[i] = Read() ;
    Init() ;
    for(int i = 1; i <= M; i ++){
        char Opt = getchar() ;
        if(Opt == 'E'){
            int X = Read() ;
            if(Data[X]) continue ;
            Data[X] = 1 ;
            F[X] = Find(X - 1) ;
        }   else{
            int X = Read() ;
            X = Find(X) ;
            printf("%d\n", X ^ Y) ;
            Y = X ^ Y ;
        }
    }
    return 0 ;
}

转载于:https://www.cnblogs.com/Yeasio-Nein/p/Tirpitz.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值