T1.string

题意:

给定由小写字母组成的长度为 n 的字符串

将其所有 n * (n + 1) / 2 个子串按字典序排序

输出第 k 个子串

k > (n * (n + 1) / 2) 就输出"No such line."

1 <= n, k <= 1e5

解法:

解法很多(我不会写自动机啊

我用的解法应该算是比较简单

一位一位地去计数来确定当前位的字母

比如一开始O(n)扫描出以a开头的子串有3个

以b开头的子串有4个,而我要输出排名第5的子串

所以这一位一定是'b',后面每一位字母的确定同理

当前位是空格的时候标志着结果输出结束

代码比较简单,可以参考

但是我们要说明一下效率

一开始脑残了误以为是O(26n)

但是其实每次while中运行次数与之前已经输出的子串在原字符串中出现的次数有关

那么我们可以考虑最坏情况,10w个'a'

这时候如果要求输出排名最靠后的子串的话效率已经O(n^2)

还好我们题目有限制 k <= 1e5

所以这种做法的最坏效率其实比较玄学(但是过了就好了233

 #include <cstdio>
#include <vector>
#include <cstring> using namespace std; typedef long long ll; vector <int> p[], pp; char str[]; ll cnt[]; int n, m; int main() {
scanf("%s %d", str, &m);
n = strlen(str);
if(1ll * n * (n + ) / < m) {
puts("No such line.");
return ;
}
for(int j, i = ;i < n;i ++) {
j = str[i] - ;
cnt[j] += n - i;
p[j].push_back(i);
}
while() {
int pos;
for(int i = ;i <= ;i ++) {
if(cnt[i] >= m) {
pos = i;
if(!pos) return ;
putchar( + i);
break;
}
else m -= cnt[i];
}
for(int i = ;i <= ;i ++) {
cnt[i] = ;
if(i != pos) p[i].clear();
}
cnt[] = p[pos].size();
for(int k, j, i = ;i < p[pos].size();i ++) {
j = p[pos][i] + ;
if(j >= n) continue;
k = str[j] - ;
cnt[k] += n - j;
if(k == pos) pp.push_back(j);
else p[k].push_back(j);
}
p[pos].clear();
for(int i = ;i < pp.size();i ++)
p[pos].push_back(pp[i]);
pp.clear();
}
}

T2.Levko and Array

题意:

给定数组a[2000],-1e9 <= a[i] <= 1e9

最多允许修改 k(k <= n) 个元素

求 max(abs(a[i] - a[i + 1])) 的最小值

解法:

这题是看别人题解做的

猜测正解效率可能n^2

但并没有什么策略能直接由条件得到答案

满足单调,考虑二分,可能效率n^2logn,可以接受

然后这个judge函数就比较神了

考虑dp,f[i]表示先只考虑前 i 个且第 i 个不动的情况下

最少修改多少个能够让前 i 个的 max(abs(a[i] - a[i + 1])) <= mid

转移方程 f[i] = min(f[i], f[j] + i - j - 1)

转移条件是abs(f[i] - f[j]) <= (i - j) * mid

即,保证i j 都不变,(i, j)都改变

要能够使[i, j]任意相邻两个之差 <= mid才能转移

上面我们提到f[i]的意义,只考虑了前 i 个

但我们考虑最优解一定有最后连续 t 个都是要被修改的(0 <= t < n)

所以我们计算完所有 f[i] 之后

在从 1 到 n 扫一遍 f[i] + n - i

是一定能够包含最优解的

当然f[i] + n - i <= k就可以返回true了

参考的题解

 #include <cstdio>

 typedef long long ll; 

 int n, k, a[], f[];

 int min(int x, int y) {
return x < y ? x : y;
} int dis(int x, int y) {
if(x < y) return y - x;
return x - y;
} bool judge(ll d) {
f[] = ;
for(int i = ;i <= n;i ++) {
f[i] = ;
for(int j = i- ;j;j --)
if(dis(a[i], a[j]) <= d * (i - j))
f[i] = min(f[i], f[j] + i - j - );
if(i <= k + ) f[i] = min(f[i], i - );
}
for(int i = ;i <= n;i ++)
if(f[i] + n - i <= k)
return ;
return ;
} int main() {
scanf("%d %d", &n, &k);
for(int i = ;i <= n;i ++)
scanf("%d", &a[i]);
ll l = , r = 2e9, mid;
while(l <= r) {
mid = (l + r) >> ;
if(judge(mid)) r = mid - ;
else l = mid + ;
}
printf("%I64d", l);
return ;
}

everyday two problems / 3.1的更多相关文章

  1. everyday two problems / 3.11 - 3.17

    7日共14题,因为3.14两题相同,所以实际总共13题 13道题分为难易两部分,没有按照时间顺序排列题目 A.易: 1.覆盖数字的数量 题意: 给出一段从A - B的区间S(A,B为整数) 这段区间内 ...

  2. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  3. Ehcache(2.9.x) - API Developer Guide, Blocking and Self Populating Caches

    About Blocking and Self-Populating Caches The net.sf.ehcache.constructs package contains some applie ...

  4. 228. Summary Ranges (everyday promlems) broken problems

    Given a sorted integer array without duplicates, return the summary of its ranges. Example 1: Input: ...

  5. List of NP-complete problems

    This is a list of some of the more commonly known problems that are NP-complete when expressed as de ...

  6. Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译

    本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...

  7. MS SQL错误:SQL Server failed with error code 0xc0000000 to spawn a thread to process a new login or connection. Check the SQL Server error log and the Windows event logs for information about possible related problems

          早晨宁波那边的IT人员打电话告知数据库无法访问了.其实我在早晨也发现Ignite监控下的宁波的数据库服务器出现了异常,但是当时正在检查查看其它服务器发过来的各类邮件,还没等到我去确认具体情 ...

  8. Problems about trees

    Problems (1) 给一棵带边权的树,求遍历这棵树(每个节点至少经过一次)再回到起点的最短路程. 答案是显然的:边权之和的两倍. (2)给一棵带边权的树,求遍历这棵树(每个节点至少经过一次)的最 ...

  9. Problems with MMM for mysql(译文)

    Problems with mmm for mysql posted in MySQL by shlomi 原文:http://code.openark.org/blog/mysql/problems ...

随机推荐

  1. XAML实例教程系列 - XAML传递参数到值转换类实例 八

    Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - XAML传递参数到值转换类实例 2012-06-28 05:25 by jv9, 508 阅读, 0 评论, 收藏, 编辑 继上 ...

  2. bzoj 1935 Tree 园丁的烦恼

    题目大意: 一些点,每次查询一个矩形内有多少个点 思路: 因为空间太大 所以不能用什么二维树状数组 需要把这些点和所有查询的矩阵的左下和右上离线下来 先离散化 然后每个子矩阵像二维前缀和那样查询 按照 ...

  3. Python中操作myslq的方法

    实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发,请见我的另一篇文章: MySQL-python Windows下EXE安装文件下载 # -*- coding ...

  4. bzoj2300

    http://www.lydsy.com/JudgeOnline/problem.php?id=2300 终于对了... 平衡树又写挂了...不要忘记清空原先的root和修改root... #incl ...

  5. 64. Extjs中grid 的ColumnModel 属性配置

    转自:https://blog.csdn.net/u011530389/article/details/45821945 本文导读:Ext.grid.ColumnModel 该类用于定义表格的列模型, ...

  6. 点开瞅瞅,再来几道Python面试题吧,Python面试题No20

    本面试题题库,由公号:非本科程序员 整理发布 第1题:如何理解 Django 被称为 MTV 模式? 这个题就是面向对象设计和设计模式的开始. 你可能比较熟悉的模式叫做: MVC.说是 Model V ...

  7. 24Pointgame-----24点游戏

    题意简单     第一行是  测试数据有几组   然后分别有  几行  第一个数字是  有几个数字  第二个是 需要配出来的数字 下面附上我的代码   ---   我感觉 我这个代码 和其他人的都不一 ...

  8. c++ 四种类型转换机制

    类型转换机制可以分为:隐式类型转换 和 显示类型转换(强制类型转换) C中的类型转换: 事情要从头说起,这个头就是C语言.我们已经习惯了使用C-like类型转换,因为它强大而且简单. 主要有一下两种形 ...

  9. 开始玩qt,使用代码修改设计模式生成的菜单

    之前制作菜单时,不是纯代码便是用设计模式 直接图形化完成. 今天我就是想用代码修改已经存在的菜单项,如果是用代码生成的可以直接调用指针完成: 但通过设计模式完成的没有暴露指针给我,至少我没发现. 在几 ...

  10. Alpha Edition [ Group 1 ]

    Deltafish Alpha Edition 一.博客归档(记录人:娄雨禛) 小组会议 DeltaFish 校园物资共享平台 第一次小组会议 DeltaFish 校园物资共享平台 第二次小组会议 D ...