[题解]Codeforces Round #519 - D. Mysterious Crime
【题目】
【描述】
有m个n排列,求一共有多少个公共子段。
数据范围:1<=n<=100000,1<=m<=10
【思路】
对于第一个排列来说,如果第k个位置开始往后L长的子段是一个公共的子段,那么从k开始往后数1,2,...,L-1长的子段都是公共的子段;如果第k个位置开始往后L长的子段是一个公共的子段,但第k个位置开始往后L+1长的子段不是一个公共的子段,那么位置k到位置k+L中任一位置j开始往后直到位置k+L的子段都不是公共的子段。这就意味着公共的子段被划分成了若干个部分,每个部分一定有最长的一个公共子段。对于一个最长的公共子段,不妨设其长度为L,则与它划分在同一组内的公共子段也就是它的子段,长度为1的有L个,长度为2的有L-1个…… 于是这一组一共有1+2+...+L=(L+1)*L/2个公共子段。
用一个数组pos[x][i]=j表示数字x在第i个排列中是第j个。要判断第k个位置的数是否还跟前面是在同一组,就需要判断前面那一组的开始(设为第p个位置)处的数和第k个位置处的数在m个排列中的相对位置是否都一样,即是不是都相差k-p,做一次检查需要O(m)。而由于公共子段的划分是不重合的(即没有一个公共子段属于一个以上的组),于是只需要从前往后扫一遍:从i开始向后扩展公共子段,当新的位置不再属于前一个组时,起始位置i跳到这个新的位置继续重复之前的操作。于是总的复杂度为O(n*m)。
(智障的zyy在比赛的时候把上一段加粗处的地方写错了,直接把位置当做这个位置上的数那来算,竟然还过了6组数据orz…… 因为这个智障的问题,再一次跟跑回expert失之交臂…… (年轻时候的zyy真厉害啊…… (说不定这道题做对了也回不了expert呢orz…… (闭嘴吧……
【我的实现】
复杂度:O(n*m)
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5
6 using namespace std;
7 #define MaxN 100020
8 #define MaxM 20
9
10 long long pos[MaxN][MaxM];
11 long long a[MaxN];
12 long long Len[MaxN];
13 int n, m;
14 bool Check(int x, int y) //true: same
15 {
16 int delta = pos[x][1] - pos[y][1];
17 for(int i = 2; i <= m; i++)
18 if(pos[x][i] - pos[y][i] != delta)
19 return false;
20 return true;
21 }
22
23 int main()
24 {
25 int i, j;
26 int x;
27 long long Ans;
28 scanf("%d%d", &n, &m);
29 for(i = 1; i <= m; i++)
30 {
31 for(j = 1; j <= n; j++)
32 {
33 scanf("%d", &x);
34 pos[x][i] = j; //x zai i hang j lie
35 if(i == 1)
36 a[j] = x;
37 }
38 }
39 memset(Len, 0, sizeof(Len));
40 for(i = 1; i <= n; )
41 {
42 Len[i]++;
43 for(j = i+1; j <= n; j++)
44 {
45 if(Check(a[i], a[j]))
46 Len[i]++;
47 else
48 {
49 //i = j;
50 break;
51 }
52 }
53 i = j;
54 }
55 Ans = 0;
56 for(i = 1; i <= n; i++)
57 if(Len[i])
58 Ans += Len[i] * (Len[i] + 1) / 2;
59 cout << Ans << endl;
60 return 0;
61 }
【评测结果】
[题解]Codeforces Round #519 - D. Mysterious Crime的更多相关文章
- Codeforces Round #519 D - Mysterious Crime
题目 题意: 在m组数,每组有n个数(数的范围1-n)中,找到某些序列 使它是每组数的一个公共子序列,问这样的某些序列的个数? 思路: 不难想出答案ans是≥n的. 创立一个next数组,使每组中第i ...
- [题解]Codeforces Round #519 - C. Smallest Word
[题目] C. Smallest Word [描述] IA有一个由若干个'a'和'b'组成的字符串,IA可以翻转该字符串的任意长的前缀,IA想通过这样的操作得到一个字典序最小的字符串,求一种可能的翻转 ...
- [题解]Codeforces Round #519 - B. Lost Array
[题目] B. Lost Array [描述] Bajtek有一个数组x[0],x[1],...,x[k-1]但被搞丢了,但他知道另一个n+1长的数组a,有a[0]=0,对i=1,2,...,n.由此 ...
- [题解]Codeforces Round #519 - A. Elections
[题目] A. Elections [描述] Awruk和Elodreip参加选举,n个人投票,每个人有k张票,第i个人投a[i]张票给Elodreip,投k-a[i]张票给Awruk.求最小的k,使 ...
- Codeforces Round #519 by Botan Investments(前五题题解)
开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...
- Codeforces Round #519 by Botan Investments
Codeforces Round #519 by Botan Investments #include<bits/stdc++.h> #include<iostream> #i ...
- Codeforces Round #519 题解
A. Elections 题意概述 给出 \(a_1, \ldots, a_n\),求最小的 \(k (k \ge \max a_i)\), 使得 \(\sum_{i=1}^n a_i < \s ...
- [题解] Codeforces Round #549 (Div. 2) B. Nirvana
Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...
- Codeforces Round #519
题目链接:传送门 A. Elections (思维+暴力) 思路: 从最小的k开始枚举就好了- -. #include <bits/stdc++.h> using namespace ...
随机推荐
- python实现--九九乘法表
1 for i in range(1,10): 2 for j in range(1,i+1): 3 print("%d*%d=%d"%(j,i,j*i),end="\t ...
- 《剑指offer》面试题49. 丑数
问题描述 我们把只包含因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5 ...
- 《剑指offer》面试题58 - I. 翻转单词顺序
问题描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出&quo ...
- golang gin框架中使用protocol buffers和JSON两种协议
首先,我使用protobuf作为IDL,然后提供HTTP POST + JSON BODY的方式来发送请求. 能不能使用HTTTP POST + PB序列化后的二进制BODY呢? 做了一下尝试,非常简 ...
- 技巧02--Terminal Preview优化
0x00 下载安装 可在MS应用商店安装,也可以直接百度下载安装包安装 0x01 设置默认自启 0x02 Terminal Preview美化 1.打开终端settings 2.点击这个Open JS ...
- plsql 普通游标
-- ①普通游标:操作步骤 边敲边想 学无止境 /* 游标:指针:内存中的一块数据缓冲区,上下文: 将查询到的结果集缓存起来,便于进行逐行定位处理. 使用完成后要及时关闭: 操作步骤? 1.定义游标 ...
- ql/sql 循环语句、异常处理、事务处理!
一.ql sql 循环语句? /*1.loop循环 语法: 声明循环变量 loop 判断循环条件 ,如果循环条件不成立,跳出循if 条件表达式 then exit; end if; 语句块; 改变循环 ...
- 羽夏看Win系统内核——同步篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- vue中router与route区别
1.$route对象 $route对象表示当前的路由信息,包含了当前 URL 解析得到的信息.包含当前的路径,参数,query对象等. 1. $route.path 字符串,对应当前路 ...
- python程序语法元素分析
#TemConvert.py TempStr = input("请输入带有符号的温度值:") if TempStr[-1] in ['F', 'f']: C = (eval(Tem ...