• [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,Mle 10000)

    对于(100\%)的数据,(N,Mle 3cdot 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
    ", X ^ Y) ;
    			Y = X ^ Y ;
    		}
    	}
    	return 0 ;
    }
    
  • 相关阅读:
    Mysql优化之Explain查询计划查看
    map转listmap
    代码大全
    cas
    日志
    xml模板
    springboot
    日志
    spring应用
    拆分表中sheet
  • 原文地址:https://www.cnblogs.com/sue_shallow/p/Tirpitz.html
Copyright © 2020-2023  润新知