[Cometoj#4 E]公共子序列_贪心_树状数组_动态规划
公共子序列
题目链接:https://cometoj.com/contest/39/problem/E?problem_id=1585
数据范围:略。
题解:
首先可以考虑知道了$1$的个数和$3$的个数,怎么求?
其实就是从开始找$x$个$1$,从结尾找$z$个$3$,然后两个序列中间$2$的个数的较小值。
然后按照官方题解那样推式子,发现可以用树状数组维护。
代码:
#include <bits/stdc++.h>
#define N 5000010
using namespace std;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0;
char c = nc();
while (c < 48) {
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x;
}
struct BT {
int tree[N << 1], n;
inline int lowbit(int x) {
return x & (-x);
}
void update(int x, int val) {
for (int i = x; i <= n; i += lowbit(i)) {
tree[i] = max(tree[i], val);
}
}
int query(int x) {
int ans = -999999999;
for (int i = x; i; i -= lowbit(i)) {
ans = max(ans, tree[i]);
}
return ans;
}
}T1, T2;
struct Node {
int x, y;
}st1[N], st2[N];
int a[N], b[N], sa[N], sb[N], cnt1, cnt2;
int main() {
// cout << (int)0xefefefef << ' ' << -999999999 << endl ;
int T = rd();
while (T -- ) {
int n = rd(), m = rd();
T1.n = T2.n = n + m + 1;
for (int i = 1; i <= n + m + 1; i ++ ) {
T1.tree[i] = T2.tree[i] = -999999999;
}
for (int i = 1; i <= n; i ++ ) {
a[i] = rd();
sa[i] = sa[i - 1];
if (a[i] == 2) {
sa[i] ++ ;
}
}
for (int i = 1; i <= m; i ++ ) {
b[i] = rd();
sb[i] = sb[i - 1];
if (b[i] == 2) {
sb[i] ++ ;
}
}
int u1 = 1, u2 = 1;
cnt1 = 0;
while (1) {
for (; a[u1] != 1 && u1 < n; u1 ++ );
for (; b[u2] != 1 && u2 < m; u2 ++ );
if (a[u1] != 1 || b[u2] != 1) {
break;
}
st1[ ++ cnt1] = (Node) {u1, u2};
u1 ++ , u2 ++ ;
}
u1 = n, u2 = m;
cnt2 = 0;
while (1) {
for (; a[u1] != 3 && u1 > 1; u1 -- );
for (; b[u2] != 3 && u2 > 1; u2 -- );
if (a[u1] != 3 || b[u2] != 3) {
break;
}
st2[ ++ cnt2] = (Node) {u1, u2};
u1 -- , u2 -- ;
}
int now = 0, ans = 0;
st2[0] = (Node) {n, m};
for (int i = cnt1; ~i; i -- ) {
int x = st1[i].x, y = st1[i].y, mdl;
for (; st2[now].x >= x && st2[now].y >= y && now <= cnt2; now ++ ) {
mdl = sa[st2[now].x] - sb[st2[now].y];
T1.update(m + 1 + mdl, now + sa[st2[now].x]);
T2.update(n + 1 - mdl, now + sb[st2[now].y]);
}
mdl = sa[x] - sb[y];
ans = max(ans, i + T1.query(m + 1 + mdl) - sa[x]);
ans = max(ans, i + T2.query(n + 1 - mdl) - sb[y]);
}
printf("%d\n", ans);
}
return 0;
}
[Cometoj#4 E]公共子序列_贪心_树状数组_动态规划的更多相关文章
- [luoguP3402] 最长公共子序列(DP + 离散化 + 树状数组)
传送门 比 P1439 排列LCS问题,难那么一点点,只不过有的元素不是两个串都有,还有数据范围变大,树状数组得打离散化. 不过如果用栈+二分的话还是一样的. ——代码 #include <cs ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- BZOJ_3289_Mato的文件管理_莫队+树状数组
BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...
- BZOJ_3529_[Sdoi2014]数表_莫比乌斯反演+树状数组
Description 有一张 n×m 的数表,其第 i 行第 j 列(1 <= i <= n, 1 <= j <= m)的数值为 能同时整除 i 和 j 的所有自然数之和.给 ...
- Testing Round #12 A,B,C 讨论,贪心,树状数组优化dp
题目链接:http://codeforces.com/contest/597 A. Divisibility time limit per test 1 second memory limit per ...
- zoj-3963 Heap Partition(贪心+二分+树状数组)
题目链接: Heap Partition Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A sequence ...
- Codeforces Round #413, rated, Div. 1 + Div. 2 C. Fountains(贪心 or 树状数组)
http://codeforces.com/contest/799/problem/C 题意: 有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 ...
- csu 1757(贪心或者树状数组)
1757: 火车入站 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 209 Solved: 51[Submit][Status][Web Board] ...
- Java_File类讲解_打印目录树状结构_递归算法
package cn.xiaocangtian.testFile; import java.io.File; public class FileTree { public static void ma ...
随机推荐
- 深入理解Java输入输出流
Java.io包的File类,File类用于目录和文件的创建.删除.遍历等操作,但不能用于文件的读写. Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流.如何理解流的概念呢?可以 ...
- 8月清北学堂培训 Day 7
当天走得太兴奋了,忘记保存就关电脑了o(╥﹏╥)o,现在补上( p′︵‵.) 今天是杨思祺老师的讲授~ 练习题 首先求出最短路: 如果选择的边不是最短路上的边,那么毫无影响: 对于最短路径上的边,我们 ...
- 前端逼死强迫症系列之javascript
JavaScript 和Python.C#.Java.Ruby一样,都是一门独立的编程语言. 像python.C.Java等都需要解释器,学习它们的语法.而浏览器本身就是javascript的解释器. ...
- vue的一些随笔
一.点击路由后的样式,可以在路由文件index.js中设置 再在样式里面设置active的类名对应的样式. ———————————————————————————————————————————— 二 ...
- CF1214B
CF1214B 解法: 暴力枚举,时间复杂度 $ O(n) $ CODE: #include<iostream> #include<cstdio> #include<cs ...
- Maven的安装和配置(Windows 10)
1. 官网下载Maven管理工具 官网:https://maven.apache.org/download.cgi 系统要求: JDK:Maven 3.3以上需要JDK 1.7以上版本支持 Memor ...
- 笔记四(Competitor Analysis Test小结)
1.关机后启动电脑,测试BIOS的POST time 2.进入睡眠模式后,按任意键,通过Windows logs查看bios的init时间 3.进入BIOS setup的快捷键,一般为F2 4.进入B ...
- 重读APUE(13)-可靠信号
在信号产生和传递之间有一段时间间隔,称为信号是未决的: 进程可以设置阻塞信号传递:如果进程产生了一个阻塞的信号,并且对该信号的动作是系统默认或者捕捉该信号,则该进程保持此信号为未决状态,直到该进程对此 ...
- 文件转移 互联网组成 路由器 分组交换 交换机 冲突域 网卡 数据帧的发送与接收会带来CPU开销 CPU中断 双网卡切换
https://zh.wikipedia.org/zh-cn/网段 在以太网环境中,一个网段其实也就是一个冲突域(碰撞域).同一网段中的设备共享(包括通过集线器等设备中转连接)同一物理总线,在这一总线 ...
- [转][C#].Net反编译利器
来自:https://www.cnblogs.com/zsuxiong/p/5117465.html 有以下8款非常不错的.Net反编译利器: 1.Reflector Reflector是最为流行的. ...