神奇的矩阵

题目大意

有一个矩阵\(A\),第一行是给出的,接下来第\(x\)行,第\(y\)个元素的值为数字\(A_{x-1,y}\)在\(\{A_{x-1,1},A_{x-1,2},A_{x-1,3},\cdots,A_{x-1,y}\}\)出现的次数。

现在有修改及询问操作:

  • 修改第一行的一个元素
  • 询问矩阵某个位置的值

要点

这个矩阵果然神奇,第\(x(x\geq 4)\)和第\(x-2\)行是一样的。这个举个例子就知道了。

现在,我们只需要关心前\(3\)行就可以了。

算法1

这个是标答。

先分块,然后维护两个数组:

  • sum1[i][j]:第\(1\)行,前\(i\)块数字\(j\)出现了多少次(由于第一行的数字可能很大,我们可以离散化)。
  • sum2[i][j]:第\(2\)行,前\(i\)块数字\(j\)出现了多少次。

先看修改:

当一个地方的数字改变时,假设由\(a\)变为\(b\):

sum1直接搞搞就好。我们来看看sum2

举个例子:假设第一行是这样的

b a c a | a a a d | d a d a a a
1 1 1 2 3 4 5 1 2 6 3 7 8 9

|表示分块,假设第\(6\)个数由\(a\)变为\(b\),我们来看看第\(2\)行的变化:

b a c a | a b a d | d a d a a a
1 1 1 2 3 2 4 1 2 5 3 6 8 7

再简单一点,我们看看关于数字\(a\)的变化:

* a * a | a a a * | * a * a a a
* 1 * 2 3 4 5 * * 6 * 7 8 9
* a * a | a # a * | * a * a a a
* 1 * 2 3 # 4 * * 5 * 6 7 8

这样我们就可以知道去掉一个数该如何修改sum1了:假设这个数在第\(i\)块,那么对于所有的\(j\geq i\),第\(j\)块只是少了一个数,减去就好了。添加一个数同理。有了删除和添加,那么修改=删除+添加

再看询问,这个有了那两个数组,怎么搞都可以吧!

算法2

莫队算法。

每个状态为\((y, k)\),表示经历了\(k\)个操作之后,处在第\(y\)列。我们要维护第一行前\(y\)个数每个数字各出现了多少次,以及第二行前\(y\)个数每个数字各出现了多少次(这个可以利用算法1的手段)。

然后采用经典的莫队做法,时间复杂度:\(O(n \sqrt n)\)。

感觉自己对莫队算法的思想了解还不够。。

神奇的矩阵 NOI模拟题的更多相关文章

  1. NOI模拟题6 Problem C: Circle

    Solution 首先这个矩阵, 很明显的就是Vandermonde矩阵. 我们有公式: \[ |F_n| = \prod_{1 \le j < i \le n} (a_i - a_j) \] ...

  2. NOI模拟题4 Problem B: 小狐狸(fox)

    Solution 考虑分开统计朝向每一个方向的所有狐狸对答案的贡献. 比如说以向右为例, 我们用箭标表示每一只狐狸的方向, 用\('\)表示当前一步移动之前的每一只狐狸的位置. \[ \begin{a ...

  3. NOI模拟题1 Problem A: sub

    题面 Sample Input 5 7 2 -1 -3 1 1 1 2 1 3 3 4 3 5 2 1 3 0 2 1 2 1 2 1 1 -3 2 Sample Output 2 4 5 2 HIN ...

  4. 花海漫步 NOI模拟题

    题目好像难以看懂? 题目大意 给出一个字符串\(S\),统计满足以下条件的\((i,j,p,q)\)的数量. \(i \leq j, p \leq q\) \(S[i..j],S[p..q]\)是回文 ...

  5. NOI模拟题5 Problem A: 开场题

    Solution 注意到\(\gcd\)具有结合律: \[ \gcd(a, b, c) = \gcd(a, \gcd(b, c)) \] 因此我们从后往前, 对于每个位置\(L\), 找到每一段不同的 ...

  6. NOI模拟题4 Problem C: 填格子(board)

    Solution 首先我们要有敏锐的直觉: 我们将每一列中不选哪种颜色看作是一个序列, 则我们发现这个序列要求相邻两位的颜色不同. 我们还发现, 一个这样的序列对应两种不同的合法的棋盘, 因此统计合法 ...

  7. NOI模拟题4 Problem A: 生成树(mst)

    Solution 我们考虑答案的表达式: \[ ans = \sqrt{\frac{\sum_{i = 1}^{n - 1} (w_i - \overline{w})^2}{n - 1}} \] 其中 ...

  8. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  9. poj 1888 Crossword Answers 模拟题

    Crossword Answers Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 869   Accepted: 405 D ...

随机推荐

  1. PC游戏编程(入门篇)(前言写的很不错)

    PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...

  2. 分布式配置管理平台 Disconf

    Distributed Configuration Management Platform(分布式配置管理平台) 专注于各种 分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务. 包括 ...

  3. POJ-1006 Biorhythms

    [题目描述] 三个周期时间分别为:23,28和33.分别给定三个周期的某一天(不一定是第一天),和开始计算的日期,输出下一个triple peak. [思路分析] 如果不了解中国剩余定理,可以通过模拟 ...

  4. Android SDK三种更新失败及其解决方法

    更新Android SDK,居然失败了三次. 1.第一次失败 出现Failed to fetch URL错误提示 Failed to fetch URL https://dl-ssl.google.c ...

  5. 面试之ajax原理(转载)

    总结1 总结2 AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术, 是几种原有技术的结合体. ...

  6. C# Best Practices - Creating Good Properties

    Coding Properties Code in the Getter Check the user's credentials Check application state Format the ...

  7. lightOJ 1317 Throwing Balls into the Baskets

    lightOJ  1317  Throwing Balls into the Baskets(期望)  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/ ...

  8. Xcode 插件优缺点对比(推荐 20 款插件)

    链接地址:http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=402439598&idx=1&sn=e8800cb0aa2 ...

  9. An Introduction to Interactive Programming in Python

    这是在coursera上面的一门学习pyhton的基础课程,由RICE的四位老师主讲.生动有趣,一共是9周的课程,每一周都会有一个小游戏,经历一遍,对编程会产生很大的兴趣. 所有的程序全部在老师开发的 ...

  10. UIWebvView 解决onClick 延迟相应问题

    在使用 UIWebView 的过程中, 发现 onClick 触发需要等待300-500ms, Google了一下, 发现是因为ScrollView 在等待doubleTap, 所以有延迟 使用如下代 ...