博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces #256 Div.2
阅读量:5240 次
发布时间:2019-06-14

本文共 1075 字,大约阅读时间需要 3 分钟。

B. Suffix Structure

1. 先判断s去掉一些元素是否能构成t,如果可以就是automaton

判断的方法也很简单,two pointer,相同元素同时++,不相同s的指针++,如果t能全找到,那么s能够去掉元素构成t。

bool f(string s, string t) {    int i = 0, j = 0;    while (i < s.size() && j < t.size()) {        if (s[i] == t[j]) {            i++;            j++;        } else {            i++;        }    }    if (j == t.size()) return true;    else return false;}

2. 对s和t排序,如果s和t相等,那么就是array

3. 如果s和t排序之后还是不相等,但是s可以通过去掉一些元素构成t,那么就是both

4. 否则,就是need tree

 

C. Painting Fence

 

 

D. Multiplication Table

矩阵,第(i, j)格子中是i*j,求在矩阵中的第k大数。

通过二分答案来实现,假设第k个数的值为val,我们可以发现对于矩阵来说,每一行也都是有序的,所以我们用O(min(m,n))的遍历可以找到所有行(列)中,小于等于val的数之和。

具体对于第 r 行来说,这一行小于等于val值的数量为min(val/r, 列的个数).

那么二分的具体过程如下:

int64 lo = 1, hi = n*m;while (lo <= hi) {    int64 md = lo + (hi-lo)/2;    if (f(md) < k) lo = md+1;    else hi = md-1;}cout << lo << endl;

进行判断的方法:

int64 f(int64 k) {    int64 r, w;    if (n < m) {r = n; w = m;}    else {r = m; w = n;}    int64 cnt = 0;    for (int64 i = 1; i <= r; i++) {        cnt += min(k / i, w);    }    return cnt;}

转载于:https://www.cnblogs.com/tiny656/p/3859954.html

你可能感兴趣的文章
EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...
查看>>
监控CPU和内存的使用
查看>>
Ubuntu14.04设置开机自启动程序
查看>>
ios app 单元测试 自动化测试
查看>>
年薪二十万
查看>>
强连通tarjan模版
查看>>
javascript_09-数组
查看>>
多进程与多线程的区别
查看>>
PAT 1145 1078| hashing哈希表 平方探测法
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
Linux第七周学习总结——可执行程序的装载
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
细说php(二) 变量和常量
查看>>
iOS开发网络篇之Web Service和XML数据解析
查看>>
个人寒假作业项目《印象笔记》第一天
查看>>
java 常用命令
查看>>
ZOJ 1666 G-Square Coins
查看>>
CodeForces Round #545 Div.2
查看>>
卷积中的参数
查看>>
Linux中Zabbix4.0的搭建
查看>>