[HDU5919]Sequence II

试题描述

Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,?,an There are m queries.

In the i-th query, you are given two integers li and ri. Consider the subsequence al_i,al_(i+1),al_(i+2),?,ari.

We can denote the positions(the positions according to the original sequence) where an integer appears first in this subsequence as p(i)1,p(i)2,?,p(i)k_i (in ascending order, i.e.,p(i)1<p(i)2<?<p(i)k_i).

Note that ki is the number of different integers in this subsequence. You should output p(i)?ki/2?for the i-th query.

输入

In the first line of input, there is an integer T (T≤2) denoting the number of test cases.

Each test case starts with two integers n (n≤2×105) and m (m≤2×105). There are n integers in the next line, which indicate the integers in the sequence(i.e., a1,a2,?,an,0≤ai≤2×105).

There are two integers li and ri in the following m lines.

However, Mr. Frog thought that this problem was too young too simple so he became angry. He modified each query to l‘i,r‘i(1≤l‘i≤n,1≤r‘i≤n). As a result, the problem became more exciting.

We can denote the answers as ans1,ans2,?,ansm. Note that for each test case ans0=0.

You can get the correct input li,ri from what you read (we denote them as l‘i,r‘i)by the following formula:

li=min{(l‘i+ansi?1) mod n+1,(r‘i+ansi?1) mod n+1}

ri=max{(l‘i+ansi?1) mod n+1,(r‘i+ansi?1) mod n+1}

输出

You should output one single line for each test case.

For each test case, output one line “Case #x: p1,p2,?,pm”, where x is the case number (starting from 1) and p1,p2,?,pm is the answer.

输入示例

2
5 2
3 3 1 5 4
2 2
4 4
5 2
2 5 2 1 2
2 3
2 4

输出示例

Case #1: 3 3
Case #2: 3 1

数据规模及约定

见“输入

题解

就是这道题再强行套一个二分。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;

const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
	if(Head == Tail) {
		int l = fread(buffer, 1, BufferSize, stdin);
		Tail = (Head = buffer) + l;
	}
	return *Head++;
}
int read() {
	int x = 0, f = 1; char c = Getchar();
	while(!isdigit(c)){ if(c == ‘-‘) f = -1; c = Getchar(); }
	while(isdigit(c)){ x = x * 10 + c - ‘0‘; c = Getchar(); }
	return x * f;
}

#define maxn 200010
#define maxnode 4000010

int ToT, sumv[maxnode], lc[maxnode], rc[maxnode];
void update(int& y, int x, int l, int r, int p) {
	sumv[y = ++ToT] = sumv[x] + 1;
	if(l == r) return ;
	int mid = l + r >> 1; lc[y] = lc[x]; rc[y] = rc[x];
	if(p <= mid) update(lc[y], lc[x], l, mid, p);
	else update(rc[y], rc[x], mid + 1, r, p);
	return ;
}
int query(int o, int l, int r, int qr) {
	if(!o) return 0;
	if(r <= qr) return sumv[o];
	int mid = l + r >> 1, ans = query(lc[o], l, mid, qr);
	if(qr > mid) ans += query(rc[o], mid + 1, r, qr);
	return ans;
}

int rt[maxn], lstp[maxn], ANS[maxn], cnt;

int len;
char Out[maxn*7];
int main() {
	int T = read();
	for(int kase = 1; kase <= T; kase++) {
		memset(lstp, 0, sizeof(lstp));
		memset(sumv, 0, sizeof(sumv));
		memset(lc, 0, sizeof(lc));
		memset(rc, 0, sizeof(rc));
		memset(rt, 0, sizeof(rt));
		ToT = 0;
		int n = read(), q = read();
		for(int i = 1; i <= n; i++) {
			int v = read();
			update(rt[i], rt[i-1], 0, n, lstp[v]);
			lstp[v] = i;
		}

		cnt = 0;
		int lst = 0;
		while(q--) {
			int ql = (read() + lst) % n + 1, qr = (read() + lst) % n + 1;
			if(ql > qr) swap(ql, qr);
			int l = ql, r = qr, k = query(rt[qr], 0, n, ql - 1) - query(rt[ql-1], 0, n, ql - 1) + 1 >> 1, lval = query(rt[ql-1], 0, n, ql - 1);
			while(l < r) {
				int mid = l + r >> 1;
				if(query(rt[mid], 0, n, ql - 1) - lval < k)
					l = mid + 1;
				else r = mid;
			}
			ANS[++cnt] = lst = l;
		}

		printf("Case #%d: ", kase);
		len = 0;
		int num[10], cntn;
		for(int i = 1; i <= cnt; i++) {
			int tmp = ANS[i];
			if(!tmp) Out[len++] = ‘0‘;
			cntn = 0; while(tmp) num[++cntn] = tmp % 10, tmp /= 10;
			for(int j = cntn; j; j--) Out[len++] = num[j] + ‘0‘;
			if(i < cnt) Out[len++] = ‘ ‘;
		}
		Out[len] = ‘\0‘;
		puts(Out);
	}

	return 0;
}
时间: 2024-08-01 11:38:44

[HDU5919]Sequence II的相关文章

HDOJ 5147 Sequence II 树状数组

树状数组: 维护每一个数前面比它小的数的个数,和这个数后面比他大的数的个数 再枚举每个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 121    Accepted Submission(s): 58 Problem Description Long long ago, there is a seq

HDU 5919 Sequence II(主席树+逆序思想)

Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1422    Accepted Submission(s): 362 Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2

HDU 5919 Sequence II 主席树

Sequence II Problem Description Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,?,an There are m queries. In the i-th query, you are given two integers li and ri. Consider the subsequence ali,ali+1,ali+2,?,ari. We can deno

hdu 5147 Sequence II(树状数组)

题目链接:hdu 5147 Sequence II 预处理每个位置作为b和c可以组成的对数,然后枚举b的位置计算. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 50005; int N, arr[maxn], fenw[maxn], lef[maxn], rig[maxn]; #d

hdu 5147 Sequence II (树状数组 求逆序数)

题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 331    Accepted Submission(s): 151 Problem Description Long long ago, there is a sequence A with length n. All numbers in this se

bestcoder#23 1002 Sequence II 树状数组+DP

Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 652    Accepted Submission(s): 164 Problem Description Long long ago, there is a sequence A with length n. All numbers in this sequenc

[ACM] hdu 5147 Sequence II (树状数组,前缀和,后缀和)

Sequence II Problem Description Long long ago, there is a sequence A with length n. All numbers in this sequence is no smaller than 1 and no bigger than n, and all numbers are different in this sequence. Please calculate how many quad (a,b,c,d) satis

HDOJ 5147 Sequence II 树阵

树阵: 每个号码的前面维修比其数数少,和大量的这后一种数比他的数字 再枚举每一个位置组合一下 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 121    Accepted Submission(s): 58 Problem Description Long long ago, there is a sequen

HDU5919:Sequence II

题面 Vjudge Sol 给一个数列,有m个询问,每次问数列[l,r]区间中所有数的第一次出现的位置的中位数是多少,强制在线 主席树 询问区间内不同的数的个数 树上二分找到那个中位数 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; con