[HZOI 2015]疯狂的颜色序列

%ad大神的脑洞,这题是强制在线版的HH的项链

所以可以考虑树套树,和主席树之类的做法

对于每个点,可以将这个点的颜色上一次出现的位置插入到主席树里,对于每一个 l ~ r 的询问, l 到 r 之间有多少颜色上一次出现的位置在0 到 l-1 内就是答案

 1 #define MAXN 500010UL
 2 #include <cstdio>
 3 #include <algorithm>
 4
 5 using namespace std;
 6
 7 int n, m, Rt[MAXN], num, ans, lt[MAXN];
 8
 9 struct Seg {
10     int ls, rs, val;
11 }bn[MAXN*20];
12
13 void Insert(int lrt, int &rt, int l, int r, int pos) {
14     rt = ++ num;
15     bn[rt] = bn[lrt];
16     if(l==r) {
17         ++ bn[rt].val;
18         return;
19     }
20     int mid = (l+r)>>1;
21     if(pos<=mid) Insert(bn[lrt].ls, bn[rt].ls, l, mid, pos);
22     else Insert(bn[lrt].rs, bn[rt].rs, mid+1, r, pos);
23     bn[rt].val = bn[bn[rt].ls].val+bn[bn[rt].rs].val;
24     return;
25 }
26
27 void Find(int lrt, int rt, int l, int r, int ls, int rs) {
28     if(bn[rt].val-bn[lrt].val<=0) return;
29     if(ls<=l&&rs>=r) {
30         ans += bn[rt].val-bn[lrt].val;
31         return;
32     }
33     int mid = (l+r)>>1;
34     if(ls<=mid) Find(bn[lrt].ls, bn[rt].ls, l, mid, ls, rs);
35     if(rs>mid) Find(bn[lrt].rs, bn[rt].rs, mid+1, r, ls, rs);
36     return;
37 }
38
39 void In(int &x) {
40     x = 0;
41     char tmp = getchar();
42     while(tmp<‘0‘||tmp>‘9‘) tmp = getchar();
43     while(tmp>=‘0‘&&tmp<=‘9‘) x = x*10+tmp-‘0‘, tmp = getchar();
44     return;
45 }
46
47 int main() {
48     freopen("color_seq.in", "r", stdin);
49     freopen("color_seq.out", "w", stdout);
50     In(n), In(m);
51     for(int i = 1, x ; i <= n ; ++ i) {
52         In(x);
53         Insert(Rt[i-1], Rt[i], 0, n, lt[x]);
54         lt[x] = i;
55     }
56     for(int i = 1, l, r ; i <= m ; ++ i) {
57         In(l), In(r);
58         l = (l+ans)%n+1, r = (r+ans)%n+1;
59         if(l>r) swap(l, r);
60         ans = 0, Find(Rt[l-1], Rt[r], 0, n, 0, l-1);
61         printf("%d\n", ans);
62     }
63     return 0;
64 }

时间: 2024-10-12 21:10:21

[HZOI 2015]疯狂的颜色序列的相关文章

cojs 疯狂的魔法树 疯狂的颜色序列 题解报告

疯狂的魔法树 一个各种操作大杂烩的鬼畜数据结构题目 首先我们注意到树的形态是半随机的 我们可以树分块,对树分成若干个块 对于每个块我们维护一个add标记表示增量 维护一个vis标记表示覆盖量 注意标记的下放和两个标记之间的处理 之后我们对于每个块我们排序,并维护块内的有序化 这样对于每个查询如果涉及到完整的块二分即可 否则暴力查询 这样时间复杂度是O(n*sqrt(n)*log(n)) 疯狂的颜色序列 很古老的题目,如果去掉强制在线的话我已知的有五种不同的解法 第一种做法是莫队 第二种做法是离线

COGS2287 [HZOI 2015]疯狂的机器人

[题目描述] 现在在二维平面内原点上有一只机器人 他每次操作可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格) 但是由于本蒟蒻施展的大魔法,机器人不能走到横坐标是负数或者纵坐标是负数的点上 否则他就会big bang 给定操作次数n,求有多少种不同的操作序列使得机器人在操作后会回到原点 输出答案模998244353后的结果 注意如果两个操作序列存在某一时刻操作不同,则我们认为这两个操作序列不同 [输入格式] 输入n,表示操作次数 n<=100000 [输出格式] 按要求输出答案

cogs 2320. [HZOI 2015]聪聪的世界题解

2320. [HZOI 2015]聪聪的世界 时间限制:6 s   内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1-an,完成以下操作: 1  x 询问从x向左数第一个<ax的数: 2  x 询问从x向左数第一个>ax的数: 3  x 询问从x向右数第一个<ax的数: 4  x 询问从x向右数第一个>ax的数: 5  x y 交换ax与ay: 6  x y w 给ax-ay加上w: 7  x y w 给ax-a

杂项(最小表示法):HZOI 2015 Glass Beads

[题目描述] 给定长度为n(n<=300000)的循环同构的字符串,定义最小表示为该字符串的字典序最小的同构表示,请输出这个表示. [输入格式] 第一行是串的长度,第二行是字符串. [输出格式] 串的最小表示. [样例输入] 10 helloworld [样例输出] dhelloworl [题目来源] HZOI2015 改编自poj1509 算法很显然,需要注意的是:s[len+1]要赋值成一个较大值. 1 #include <iostream> 2 #include <cstri

COGS 2188. [HZOI 2015] Math 题解

  题目描述: 给定n个数X1-Xn,求下面式子的值(整数部分): n<=107,xi<=109且互不相同. 分析: 其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不会= = 后来看了各路神犇的题解,又仔细想了想,大概明白了. 首先,k这么大,已经不是高精乘和高精开方所能承受的了(当然,你也可以找个超级计算机算算试试) 所以我们可以把k视为∞(INF). 极限思想,由于xi互不相同,所以每个元素在比它稍微大一点点的数面前都是微乎其微,不会影响到整数部分的. (可以粗略验证

cogs 2320. [HZOI 2015]聪聪的世界

solution 6 7 8都好说 对于1 2 3 4只需自己yy一个函数就行 (ps:我把L打成l....) 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define ll long long 5 using namespace std; 6 const int N=1000006; 7 inline ll maxn(ll a,ll b){return a>b?a:b;} 8 in

[COGS 2258][HZOI 2015]复仇的序幕曲

Description 你还梦不梦痛不痛,回忆这么重你怎么背得动 ----序言 当年的战火硝烟已经渐渐远去,可仇恨却在阿凯蒂王子的心中越来越深 他的叔父三年前谋权篡位,逼宫杀死了他的父王,用铁血手腕平定了国内所有的不满 只有他一个人孤身逃了出来,而现在他组织了一只强大的军队,反攻的号角已经吹响 大战一触即发,作为他的机智又勇敢的指挥官,你必须要准确及时的完成他布置的任务 这个国家的布局是一棵树,每个城市都是树上的结点,其中每个结点上都有军队ai(人数) 树上的每条边有边权wi,表示通过这条边所需

BZOJ2120 数颜色 分块+二分法

题意:给定一个颜色序列,维护:1.单点修改  2.区间查询不同颜色的种数 题解: 定义f[i]为i左边第一个和i颜色相同的位置,用分块来维护f. 询问:看区间中有多少个位置的f[i]<l 更新:暴力枚举p左右最近的与p颜色相同的位置,更新即可 #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #includ

BZOJ 2120 数颜色(带修改莫队)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色的数目. [题解] 我们按照最近一次修改对查询操作进行时间标号,在莫队排序的时候引入时间作为第三维, 对于每个修改操作,我们记录修改之前的颜色和修改之后的颜色, 对于两个相邻两个查询,我们将其之间时间差距的修改操作进行记录或者撤销之后查询即可. [代码] #include <cstdio> #in