热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ2120数颜色【带修改莫队】

任意门:https:www.lydsy.comJudgeOnlineproblem.php?id21202120:数颜色TimeLimit:6SecMemory

任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120

2120: 数颜色

Time Limit: 6 Sec  Memory Limit: 259 MB
Submit: 10095  Solved: 4222
[Submit][Status][Discuss]

Description

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

Input

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

Output

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

Sample Input

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

Sample Output

4
4
3
4

HINT

 

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。


2016.3.2新加数据两组by Nano_Ape

 

 

解题思路:

单点更新,xjb查询,莫队或者分块。

但是莫队需要离线,这里需要修改,怎么办呢?

引入第三个参数记录时间,根据时间点的不同更新答案。

 

AC code:

  1 #include 
  2 #define INF 0x3f3f3f3f
  3 #define LL long long
  4 using namespace std;
  5 const int MAXN = 1e4+10;
  6 const int MAXM = 1e6+10;
  7 int N, M;
  8 int h[MAXN], num[MAXN];
  9 int ans[MAXN], sum[MAXM];
 10 struct Query
 11 {
 12     int l, r, id, t;
 13 }Q[MAXN];
 14 
 15 struct Time
 16 {
 17     int ip, co, lt;
 18 }t[MAXN];
 19 int last[MAXN];
 20 
 21 bool cmp(Query a, Query b)
 22 {
 23     if(h[a.l] != h[b.l]) return h[a.l] < h[b.l];
 24     else{
 25         if(h[a.r] != h[b.r]) return h[a.r] < h[b.r];
 26         else return a.t < b.t;
 27     }
 28 }
 29 
 30 int update(int tt, int L, int R, int no)
 31 {
 32     int res = 0;
 33     int x = t[tt].ip, val = t[tt].co, lst = t[tt].lt;
 34     if(t[tt].ip >= L && t[tt].ip <= R){
 35         if(sum[num[x]] == 1) res--;
 36         sum[num[x]]--;
 37         if(no == 1){
 38             if(sum[val] == 0) res++;
 39             sum[val]++;
 40         }
 41         else if(no == -1){
 42             if(sum[lst] == 0) res++;
 43             sum[lst]++;
 44         }
 45     }
 46     if(no == 1) num[x] = val;
 47     else if(no == -1) num[x] = lst;
 48     return res;
 49 }
 50 
 51 int add(int x, int val)
 52 {
 53     int res = 0;
 54     if(val == 1 && sum[num[x]] == 0) res++;
 55     if(val == -1 && sum[num[x]] == 1) res--;
 56     sum[num[x]]+=val;
 57     return res;
 58 }
 59 
 60 int main()
 61 {
 62     scanf("%d %d", &N, &M);
 63     for(int i = 1; i <= N; i++){
 64         scanf("%d", &num[i]);
 65         last[i] = num[i];
 66     }
 67     int lim = pow(N, (double)2/3);
 68     for(int i = 1; i <= N; i++) h[i] = (i-1)/lim+1;
 69     int cnt = 0, Tcnt = 0;
 70     char com[5];
 71     for(int i = 1; i <= M; i++){
 72         scanf("%s", com);
 73         if(com[0] == 'Q'){
 74             cnt++;
 75             scanf("%d %d", &Q[cnt].l, &Q[cnt].r);
 76             Q[cnt].t = Tcnt;
 77             Q[cnt].id = cnt;
 78         }
 79         else{
 80             Tcnt++;
 81             scanf("%d %d", &t[Tcnt].ip, &t[Tcnt].co);
 82             t[Tcnt].lt = last[t[Tcnt].ip];
 83             last[t[Tcnt].ip] = t[Tcnt].co;
 84             //printf("%d %d\n", t[Tcnt].co, t[Tcnt].lt);
 85         }
 86     }
 87     sort(Q+1, Q+1+cnt, cmp);
 88 
 89     int L = 1, R = 0, T = 0, cur = 0;
 90     for(int i = 1; i <= cnt; i++){
 91         while(T 1);
 92         while(T > Q[i].t) cur+=update(T--, L, R, -1);
 93         while(L 1);
 94         while(L > Q[i].l) cur+=add(--L, 1);
 95         while(R 1);
 96         while(R > Q[i].r) cur+=add(R--, -1);
 97         ans[Q[i].id] = cur;
 98     }
 99 
100     for(int i = 1; i <= cnt; i++){
101         printf("%d\n", ans[i]);
102     }
103 
104     return 0;
105 
106 }

 


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
author-avatar
手机用户2502922667
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有