FZU Monthly-201901 tutorial
FZU Monthly-201901 tutorial
题目(难度递增) | easy | easy-medium | medium | medium-hard | hard |
---|---|---|---|---|---|
思维难度 | AHG | F | B | CE | D |
编码难度 | AH | CEFG | B | D |
A. RonTanYoYiSen
对于本题,你只需要FOR一遍判断是不是回文串即可。不管一个字符串是不是回文串,只有将它反过来再写一边就可以构造出一个回文串。根据题意,如果是回文串则输出“YES NO”,否则输出“NO YES”。
复杂度\(O(N)\)
B. max position set
Tutorial 1. Bruce force
由于是字典序的缘故,所以我们从第一列开始看到最后一列,如果当前列选择后,不会违背字典序,那么根据贪心思想这一列要,否则显然不能取。这样做 \(N\) 次,每次把新的一列加到前面选出来的字符串后面,check一下是否合法。总复杂度 \(O(N^3)\)。
例子:
adc
bcd
加进第一列
a
b
合法,保留。加入第二列
ad
bc
不合法,撤销。加入第三列
ac
bd
合法,保留。
Tutorial 2. Observe
观察可以发现,每加入一列后,如果第 \(i\) 行的字典序小于第 \(i+1\) 行,那么之后怎么怎么加都不会再对着这两行有影响,即:整个过程中需要考虑的一定是相邻的且所有字符均一样的字符串。所以标记一下 \(N-1\) 个相邻关系中国哪些已经出现偏序,那些还没有,不需要考虑前面的取的字符,只需要比较当前新加进的这一列即可(因为前面一定是一样的)
这样还是做 \(N\) 次,每次比较只花 \(O(N)\) 的时间,总复杂度 \(O(N^2)\)。
C.Palindrome
画图把相同的字符连线会发现就只有4种情况,然后分类讨论一下
m1:当m1时,任意长度为1的子串显然都是回文串,所以答案是 \(k^n\)
m > n:与m==1情况是一样的
m==n:这个时候只需要考虑前半部分,这时候答案分别是 \(k^{n/2}\)(n为偶数),\(k^{n/2+1}\)(n为奇数)
m < n: 当m为奇数,答案为\(k^2\),当m为偶数,答案为\(k\)
注:m > n 的时候,显然怎么构造都满足题意
复杂度为\(O(N)\)
D. special square
同样的题目背景,经典题型是求面积最大的全1矩阵。先学习一下这道题的做法,关于这道题,演算法笔记上有非常详尽的分析:http://www.csie.ntnu.edu.tw/~u91029/MaximumSubarray.html#2
这题的做法基本与那道经典题类似,一样的按行or列枚举,通过单调栈去check,核心就是满足条件的矩形四条边都要顶到障碍物,代码基本与原经典题类似,理解原经典题后如还有细节有疑惑可见代码。
复杂度为\(O(N^2)\)
//
// solution.cpp
// special-matrix
//
// Created by 郑浩晖 on 2018/12/19.
// Copyright © 2018 郑浩晖. All rights reserved.
//
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define sz(x) ((int)(x).size())
#define dd(x) cout << #x << " = " << (x) << ", "
#define de(x) cout << #x << " = " << (x) << endl
typedef pair<int, int> pii;
const int N = 5e3 + 7;
char s[N][N];
int n, m, up[N][N];
void solve()
{
cin >> n >> m; m++;
for (int i = 0; i < n; i++) { scanf("%s", s[i]); s[i][m-1] = '0'; }
for (int i = 0; i < m; i++) s[n][i]='0';
for (int j = 0; j < m; j++) up[0][j] = s[0][j] == '1';
for (int i = 1; i < n; i++) {
for (int j = 0; j < m; j++) {
up[i][j] = s[i][j] == '1' ? up[i - 1][j] + 1 : 0;
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
stack<pii> stk;
int max_col = -1;
for (int j = 0; j < m; j++) {
int pos = j;
while (!stk.empty() && stk.top().second > up[i][j]) {
if (stk.top().first <= max_col)
ans++;
pos = stk.top().first;
stk.pop();
}
if (s[i + 1][j] == '0') max_col = j;
if (!stk.empty() && stk.top().second == up[i][j]) continue;
if (up[i][j]) stk.push({pos, up[i][j]});
}
}
cout << ans << endl;
}
int main()
{
solve();
return 0;
}
E.LiHuaAndPoker
分类讨论
- K = 1。这个情况,字符串的相对位置不变,所以可能最多只有n种(每一个字母做开头),对n种情况做一个比较即可,复杂度可以是O(n),O(nlogn),O(n2),O(n2logn)均可以通过。
- K > 1。对于K大于1的所有情况,任何字符串都能调整成他的最小字典序(想想为什么),即对原字符串从小到大排序。对于K>2的排序情况类似冒泡排序。
F.LiHuaAndArray
一个经典的标记技巧(延迟计算)。对所有的[L,R]区间,在L位置标记+1,在R位置标记-1。标记结束后统计每一对奇偶位置的前缀和,前缀和是奇数的就交换位置,是偶数的不做操作。
复杂度O(N)。
G.Assassin
模拟题,分阶段模拟
- 负一从A点出发追小号
- 负一追到小号后回A点
注:有个学弟 “小号已经走的路程” 用了int变量,太心疼了
H.DeadlyShoot
这个题目在大一的c语言日常题目中出现过。
Tutorial 1. Bruce force
对着题意模拟一直做数位求和直到一位,然后分类找出最大的一组输出。
Tutorial 2. Math
我们设一个数A的数位和为S,那么易得A和S同余于9。由此,反复求数位和直到只剩一位这个操作等价于对9取模。因此,按照所有数对9的余数进行分类,最后输出余数最大的那一组即可,需要特别注意的是,当某个数能被9整除的时候,他最后得到的数位和是9而不是0。
复杂度为\(O(N)\)
**
**
博主只是友情提供代发服务
FZU Monthly-201901 tutorial的更多相关文章
- FZU Monthly-201903 tutorial
FZU Monthly-201903 tutorial 题目(难度递增) easy easy-medium medium medium-hard hard 思维难度 ABF G CH D E A. D ...
- FZU Monthly-201909 tutorial
FZU Monthly-201909 tutorial 题目(难度递增) easy easy-medium medium medium-hard hard 思维难度 AB CD EF G H A. I ...
- FZU Monthly-201906 tutorial
FZU Monthly-201906 tutorial 题目(难度递增) easy easy-medium medium medium-hard hard 思维难度 AE B DG CF H A. X ...
- FZU Monthly-201905 tutorial
FZU Monthly-201905 tutorial 题目(难度递增) easy easy-medium medium medium-hard hard 思维难度 AB H DG CE F A. C ...
- Microsoft Azure Tutorial: Build your first movie inventory web app with just a few lines of code
Editor’s Note: The following is a guest post from Mustafa Mahmutović, a Microsoft Student Partner wh ...
- Monthly数据类型
Monthly由来 最近在做关于智能财税的项目,大量用到了账期相关的数据操作.项目已有两年历史了,对于账期数据,前辈们用的是DateTime数据类型,即每个月的最后一天就是账期.而用DateTime来 ...
- Career Planning:Developers Best Practices Tutorial
This small tutorial is based on my past 16+ years of experience in software development industry. I ...
- [翻译+山寨]Hangfire Highlighter Tutorial
前言 Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows ...
- Monthly Income Report – August 2016
原文链接:https://marcoschwartz.com/monthly-income-report-august-2016/ Every month, I publish a report of ...
随机推荐
- MySQL的安装与维护
一.数据库的基本概念 数据库: 以一定方式储存在一起.能为多个用户共享.具有尽可能小的冗余度的特点.是与应用程序彼此独立的数据集合. DBMS(DataBase Management System,数 ...
- Gold Rush(hnu13249)
Gold Rush Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:65536KB Total submit users: 15 ...
- Android-View的绘制源码学习总结
##前言 算是第一篇正式的github博文,回顾了一下之前看过的view源码解析,做一个对目前为止View学习小的总结. 我觉得对于源码的解析和学习,把所有流程记下来意义并不是很大,最关键的是: 1. ...
- Java三大特性:封装,继承,多态
java提高篇(一)-----理解java的三大特性之封装 概念: 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独 ...
- Linux CentOS Nginx安装配置
Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...
- ScheduledExecutorService的两种方法
开发中,往往遇到另起线程执行其他代码的情况,用java定时任务接口ScheduledExecutorService来实现. ScheduledExecutorService是基于线程池设计的定时任务类 ...
- POJ1811(SummerTrainingDay04-G miller-rabin判断素性 && pollard-rho分解质因数)
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 35528 Accepted: 9479 Case ...
- 设计模式原则(1)--Single Responsibility Principle(SRP)--单一职责原则
1.定义: 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 2.使用场景: 如果类A有两个职责:d1,d2.当职责d1需要修改时,可能会导致原本运行正常的职责d2功能产生问题. ...
- VMware虚拟机安装黑苹果MacOS Mojave系统详细教程
更多资源请百度搜索:前端资源网 欢迎关注我的博客:www.w3h5.com 最近遇到一个H5页面的 iPhone X 刘海兼容问题.查到一个 XCode 编辑器,可以模拟 iPhone X 环境运行. ...
- OSGI企业应用开发(六)细说Blueprint & Gemini Blueprint(一)
上篇文章介绍了如何使用Blueprint將Spring框架整合到OSGI应用的Bundle中,从上篇文章中我们大概了解了Blueprint与Gemini Blueprint的关系,简单的说,Bluep ...