\([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 ;
}

[LCOI2018][WX] Tirpitz的更多相关文章

  1. wx.onMenuShareTimeline使用注意事项

    我在开发测试过程中,发现使用wx.onMenuShareTimeline无效果,没有显示我定义的图片.title和链接,经过调试发现原因如下: 1.图片大小要大于300pix才能显示 2.这个方法必须 ...

  2. 微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决

    微信小程序上传图片的时候,如果是多图片上传,一般都是直接用一个循环进行wx.uploadFile 这个在电脑上面测试与苹果手机上面都不会有什么问题 但当用安卓测试的时候,你会发现小程序会提示一个the ...

  3. 微信 小程序 drawImage wx.canvasToTempFilePath wx.saveFile 获取设备宽高 尺寸问题

    以下问题测试环境为微信开发者0.10.102800,手机端iphone6,如有不对敬谢指出. 根据我的测试,context.drawImage,在开发者工具中并不能画出来,只有预览到手机中显示. wx ...

  4. wx.ListCtrl简单使用例子

    效果图: 示例代码: #! /usr/bin/env python #coding=utf-8 import wx import sys packages = [('jessica alba', 'p ...

  5. wx.html2.WebView在 target="_blank" or rel="external" 没有反映的解决方法

    在wx.html2.EVT_WEBVIEW_LOADED中,用WebView.RunScript运行删除链接目标的脚本 javaScriptStr = '''function deleteBlank( ...

  6. referenceerror wx is not defined 微信JsSdk开发

    如果你和我一样遇到了“referenceerror wx is not defined”错误,很有可能是jweixin-1.0.0.js与你其它某js冲突. 解决办法: <script type ...

  7. wxPython安装错误问题:No module named wx

    今天心血来潮安装wxPython,本机win7,且已经安装Python,版本为2.7.3,然后IDE使用的PyCharm,然后wxPython下载的版本为:wxPython2.8-win32-unic ...

  8. 微信企业号 jsSDK wx.config报invalid signature错误,导致api接口无法使用

    最近在做公司定制化的时候发现一个问题,使用微信的语音API的时候微信报错,错误信息为:the permission value is offline verifying 但是诡异的是:同样的代码在我们 ...

  9. PIL Image 转成 wx.Image、wx.Bitmap

    import wx from PIL import Image def ConvertToWxImage(): pilImage = Image.open('1.png') image = wx.Em ...

随机推荐

  1. C# ——窗体和控件随着分辨率的变化自适应大小

    一.说明 我们自己编写程序的界面,会遇到各种屏幕分辨 率,只有自适应才能显的美观.实际上,做到这点也很简单,就是首先记录窗体和它上面控件的初始位置和大小,当窗体改变比例时,其控件的位置和大小也按此比 ...

  2. Android 友盟统计的集成与使用(包含多渠道打包配置)

    前言 app上线后,一般公司都希望跟踪app在市场上的使用情况.包括新增用户.活跃用户.渠道信息.错误信息等,还有例如商城类的app,需要跟踪用户最喜欢浏览哪种类型的店铺或商品.这些都可以通过集成友盟 ...

  3. 安装、配置Jupyter Notebook快速入门教程

    What? Why? How? ---安装 ---启动 ---关闭 ---保存 Markdown语法 Magic关键词 转换notebook--toHTML 创建幻灯片 运行代码 What? 文字化编 ...

  4. python 进程池的使用

    进程同步 进程的数据是独立存在的,进程也能加锁. from multiprocessing import Process, Lock def f(l,i): l.acquire() print('he ...

  5. 创建第一个windows服务

    windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志. 计算机启动时,服务会自动开 ...

  6. java实现哈弗曼树和哈夫曼树压缩

    本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...

  7. Tomcat中server.xml文件内各节点详解

    由于 Tomcat 基于 Java,实际上在各种 Linux 发行版里的配置方法都大同小异,只是我看见在 Arch Linux 环境里搭建 Tomcat 的文章比较少,所以在 Arch Linux 实 ...

  8. java.langThrowable:STACKTRACE

    Jboss版本是4.2.0.GA代码运行完后总报错 但是程序的运行结果没问题 请问下这是什么原因2009-12-11 01:53:26,611 INFO  [org.jboss.resource.co ...

  9. MYSQL连接相关参数和状态值详解

    针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_ ...

  10. linux下安装及配置jenkins

    jenkins常用的有两种安装方式: 1.直接下载war包jenkins.war,下载地址https://jenkins.io/download 直接下载 1.1.可以把war包直接部署到servle ...