bzoj4104 [Thu Summer Camp 2015]解密运算

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4104

【题解】

脑洞+找规律做出来的。。

我用样例作为说明吧

样例给了我们这个

A
A
A
C
.
A
B

看起来没啥用

这是那个矩阵的最后一列对吧。

第一列是什么呢?我们都知道,按字典序排列。

.
A
A
A
A

C

由于这是一个环,所以第一个字母和最后一个字母是相邻的。换句话说,我们只要知道第一个字母和最后一个字母的对应关系,我们就能知道环长什么样了。

问题在于。有很多个重复的数,我们怎么知道对应的顺序呢?

如果我要比较A的顺序,我们不妨画个图

_ _ _ _ _ _ A
_ _ _ _ _ _ A
_ _ _ _ _ _ A
_ _ _ _ _ _ C
_ _ _ _ _ _ .
_ _ _ _ _ _ A 
_ _ _ _ _ _ B

如果我把第一个A作为首位,和第二个A作为首位,哪个字典序大?

要明确的是,第一个A的前面6个位置组成的字符串一定小于第二个A前面6个位置组成的字符串

所以把A提前,仍然是第一个A作为首位的字符串<第二个A作为首位的字符串。

我们就可以把A标号,然后进行对应了。

.   _____A1
A1_____A2
A2_____A3
A3_____C
A4_____.
B _____A4
C _____B

这样就非常好了,然后我们从"."开始,把"______"看成边,沿着边走一遍就得到了这个环。

稍微看下就知道要从那个方向开始走了。

然后就解决了这道题了。

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10;
const int mod = 1e9+7;

# define RG register
# define ST static

int n, m, v[M], nx[M], beg;
struct pa {
    int x, pos;
    pa() {}
    pa(int x, int pos) : x(x), pos(pos) {}
    friend bool operator < (pa a, pa b) {
        return a.x < b.x || (a.x == b.x && a.pos < b.pos);
    }
}p[M];

int main() {
    cin >> n >> m;
    for (int i=1; i<=n+1; ++i) {
        scanf("%d", &v[i]);
        p[i] = pa(v[i], i);
        if(v[i] == 0) beg = i;
    }
    sort(p+1, p+n+2);
    for (int i=1; i<=n+1; ++i)
        nx[i] = p[i].pos;
    int cur = beg;
    while(nx[cur] != beg) {
        cur = nx[cur];
        printf("%d ", v[cur]);
    }
    return 0;
}

时间: 2024-08-05 09:39:31

bzoj4104 [Thu Summer Camp 2015]解密运算的相关文章

[Thu Summer Camp 2015]解密运算

4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MB Description 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串. 比如对于字符串“ABCAAA”,我们可以得到这N+1个串: ABCAAA. BCAAA.A CAAA.AB AAA.ABC AA.ABCA A

【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)

4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 370  Solved: 237 Description 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之后将字符串视为一个环,从位置1,2,3,...,N+1为起点读出N+1个字符,就能得到N+1个字符串. 比如对于字符串"ABCAAA",我们可以得到这N+1个串: ABCAAA.

bzoj:4105: [Thu Summer Camp 2015]平方运算

Description Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数. 接下来一行N个数代表一开始的序列{X1,X2,...,XN}. 接下来M行,每行三个整数op,l,r.其中op代表本次操作的类型.若op=0,代表这是一次平方操作,平方的区间为[l,r]:如果op=1,代表这是一次询问操作,询问的区间为[l,r]. Output 对于每次的询问操作,输出一行代表这段区间内数的总和.注意:答案没有对任何数取模. Sample

【BZOJ4103】[Thu Summer Camp 2015]异或运算 可持久化Trie树

[BZOJ4103][Thu Summer Camp 2015]异或运算 Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij. Input 第一行包含两个正整数n,m,分别表示两个数列的长度 第二行包含n个非负整数xi 第三行包含m个非负整数yj 第四行包含一个正整数p,表示询问次数 随后p行,每行

【BZOJ 4103】 4103: [Thu Summer Camp 2015]异或运算 (可持久化Trie)

4103: [Thu Summer Camp 2015]异或运算 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 474  Solved: 258 Description 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij. Input 第一行包含两个正整数n,m,分别表示两

【BZOJ 4104】【Thu Summer Camp 2015】解密运算

http://www.lydsy.com/JudgeOnline/problem.php?id=4104 网上题解满天飞,我也懒得写了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 200003; int in() { int k = 0, fh = 1; char c = getchar(); for(; c < '0' || c

[BZOJ4103][Thu Summer Camp 2015]异或运算

试题描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor  yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij. 输入 第一行包含两个正整数n,m,分别表示两个数列的长度 第二行包含n个非负整数xi 第三行包含m个非负整数yj 第四行包含一个正整数p,表示询问次数 随后p行,每行均包含5个正整数,用来描述一次询问,每行包含五个正整数u,d,l,r,k,含义如题意所述. 输

bzoj4103[Thu Summer Camp 2015]异或运算(可持久化trie树)

一看数据范围,n很小m很大,对长的那一维建可持久化线段树,另一维暴力枚举 1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int n,m,cnt,tot,p; 7 int rt[300005]; 8 int x[2005]; 9 int y[300005]; 10 struct Trie{ 11 in

bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)

内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi xor yj,每次询问给定矩形区域i∈[u,d],j∈[l,r],找出第k大的Aij. 输入格式 第一行包含两个正整数n,m,分别表示两个数列的长度 第二行包含n个非负整数xi 第三行包含m个非负整数yj 第四行包含一个正整数p,表示询问次数 随后p行,每行均包含5个正整数,用来描述一次询问,每行