zoukankan      html  css  js  c++  java
  • [HDU5919]Sequence II

    [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/2for the i-th query.

    输入

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

    Each test case starts with two integers n (n2×105) and m (m2×105). There are n integers in the next line, which indicate the integers in the sequence(i.e., a1,a2,,an,0ai2×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 li,ri(1lin,1rin). 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 li,ri)by the following formula:
    li=min{(li+ansi1) mod n+1,(ri+ansi1) mod n+1}

    ri=max{(li+ansi1) mod n+1,(ri+ansi1) 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] = '';
    		puts(Out);
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    背景不动,内容滚动的解决方案(移动端)
    移动端真实1px的实现方法
    用户模板和用户场景
    构建之法阅读笔记02
    学习进度六
    NABCD
    构建之法阅读笔记01
    学习进度五
    梦断代码阅读笔记03
    地铁系统
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6359917.html
Copyright © 2011-2022 走看看