[BZOJ1878] [SDOI2009]HH的项链

2024-01-09 12:59
文章标签 bzoj1878 sdoi2009 hh 项链

本文主要是介绍[BZOJ1878] [SDOI2009]HH的项链,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=1878

题目大意

给定一个序列,求一个区间内有多少个不同的数

题解

核心是离线处理
我们先定义next[i]表示i后面第一个与i颜色相同的位置
我们先考虑对于初始时处理询问区间[1..R]的情况,我们只对每个颜色第一个位置处赋值为1,其余赋值为0,那么答案就是区间和
当我们把左端点推进的时候,比如[2..R],其实我们只是舍掉了第一位的颜色,那么很明显把next[i]的位置赋值从0改成1即可,询问依然是区间和
这个部分我们需要支持区间查询,和单点修改即可,线段树/树状数组均可,这道题只写了线段树的版本(因为我已经不会树状数组了QAQAQ)

varz:array[0..1000006]of longint;t,x,b:array[0..50005]of longint;y:array[0..200005,1..4]of longint;w:array[0..300000,1..3]of longint;i,j,k:longint;n,m:longint;
procedure sort(l,r,tt:longint);
var i,j,a,b,c,k:longint;
begini:=l; j:=r; if tt=1 then begin a:=y[(l+r) div 2,1]; c:=y[(l+r)div 2,2]; end else a:=y[(l+r)>>1,3];repeatif tt=1 then beginwhile (y[i,1]<a)or((y[i,1]=a)and(y[i,2]<c)) do inc(i);while (a<y[j,1])or((y[j,1]=a)and(y[j,2]>c)) do dec(j);endelse beginwhile y[i,3]<a do inc(i);while y[j,3]>a do dec(j);end;if not(i>j) thenbeginfor k:=1 to 4 dobegin b:=y[i,k]; y[i,k]:=y[j,k]; y[j,k]:=b; end;inc(i); dec(j);end;until i>j;if l<j then sort(l,j,tt);if i<r then sort(i,r,tt);
end;procedure build(a,l,r:longint);
var mid:longint;
beginw[a,1]:=l; w[a,2]:=r;if l=r then begin w[a,3]:=b[l]; exit; end;mid:=(l+r)>>1;build(a<<1,l,mid); build(a<<1+1,mid+1,r);w[a,3]:=w[a<<1,3]+w[a<<1+1,3];
end;function query(a,l,r:longint):longint;
var mid:longint;
beginif (w[a,1]=l)and(w[a,2]=r) then exit(w[a,3]);mid:=(w[a,1]+w[a,2])>>1;if r<=mid then exit(query(a<<1,l,r)) elseif l>mid then exit(query(a<<1+1,l,r))else exit(query(a<<1,l,mid)+query(a<<1+1,mid+1,r));
end;procedure update(a,l:longint);
var mid:longint;
beginif (w[a,1]=w[a,2])and(w[a,1]=l) then begin b[l]:=1; w[a,3]:=1; exit; end;mid:=(w[a,1]+w[a,2])>>1;if l<=mid then update(a<<1,l) else update(a<<1+1,l);inc(w[a,3]);
end;beginreadln(n);for i:=1 to n dobegin read(x[i]); inc(x[i]); t[z[x[i]]]:=i; if z[x[i]]=0 then b[i]:=1 else b[i]:=0; z[x[i]]:=i; end;readln(m);for i:=1 to m dobegin readln(y[i,1],y[i,2]); y[i,3]:=i; end;sort(1,m,1); {y[i,1],y[i,2]}build(1,1,n);y[0,1]:=1;for i:=1 to m dobeginif y[i,1]<>y[i-1,1] thenfor j:=y[i-1,1] to y[i,1]-1 doif t[j]<>0 then update(1,t[j]);y[i,4]:=query(1,y[i,1],y[i,2]);end;sort(1,m,2); {y[i,3]}for i:=1 to m dowriteln(y[i,4]);
end.

这篇关于[BZOJ1878] [SDOI2009]HH的项链的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/587191

相关文章

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

【COGS】421 [SDOI2009] HH的项链 树状数组

传送门:【COGS】421 [SDOI2009] HH的项链 题目分析:将区间以右端点为关键字降序排序,然后从左到右依次遍历每个数并插入到树状数组中,如果遍历到一个数的时候在他的前面已经有一个相同的数时,将之前位置上的数从树状数组中删除。然后我们每处理完一个位置上的数后,看这个位置上是否有右端点,如果有则做一次求和,这个右端点属于的区间【L,R】的值即sum(R)-sum(L-1)。

【hh大神的】Tarjan + 缩点 模板

此模板来自 notonlysuccess 原文链接: http://www.notonlysuccess.com/index.php/tarjan/ 大神就是吊啊。 不多说了,想学tarjan ,资料网上是有一堆的 怎么说。。我现在理解的还不算太透彻,但用模板总行吧 这里只存一下模板 使用时注意清空和存图! (基于个人习惯,稍微有些小改动) #define

element-ui 日期选择器用value-format 带上“HH:mm:ss”的时候报错

1. 想用 element-ui 日期选择器取出 “yyyy-MM-dd HH:mm:ss” 格式的日期时间数据。 2. 用 value-format 带上“HH:mm:ss”的时候报错。 <el-form-item prop="time" label="结算时间:"><el-date-picker v-model="settleDO.time" type="datetime" value-f

NYOJ 280 LK的项链 POJ 2409 Let it Bead(polya 定理)

NYOJ 280 LK的项链  :click here POJ 2409 Let it Bead:click here 题意:一盒有红、蓝、绿三种颜色的珠子,每种颜色珠子的个数都大于24,现在LK想用这一盒珠子穿出一条项链,项链上的珠子个数为n(0<=n&lt;=24),请你帮她计算一下一共可以用这一盒珠子可以穿出多少条不同的项链。通过旋转、翻转达到同一种状态的被认为是相同的项链。

2024-05-31T08:36:09.000+00:00 转换 YYYY-MM-DD HH-MM-SS

function formatDate(date) {// 处理ISO 8601字符串if (typeof date === 'string') {date = new Date(date);}// 处理时间戳else if (typeof date === 'number') {date = new Date(date * 1000); // 假设后端时间戳为秒,需要乘以1000转换为毫

【一百一十】【算法分析与设计】[SDOI2009] HH的项链,树状数组应用,查询区间的种类数,树状数组查询区间种类数

P1972 [SDOI2009] HH的项链 [SDOI2009] HH的项链 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH 不断地收集新的贝壳,因此,他的项链变得越来越长。 有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?这个问题很难回答…… 因为项链实在是太长了。

搜狐[编程题]彩色宝石项链.有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等

时间限制:1秒 空间限制:32768K 有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项

HSACM 1680 能量项链

 1680: 能量项链 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 39   Solved: 13   Scores: 90.11 [ Submit][ Status][ BBS] Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有 N颗能量珠。能量珠是一颗有头标记与尾标

C# yyyyMMddHHmmss转yyyy-MM-dd HH:mm:ss

1、yyyyMMddHHmmss转yyyy-MM-dd HH:mm:ss string temp_time = "20091225091010";DateTime dateTime = DateTime.ParseExact(temp_time, "yyyyMMddHHmmss", CultureInfo.CurrentCulture, DateTimeStyles.None); 或