BZOJ 4881: [Lydsy1705月赛]线段游戏 动态规划 + 线段树
Description
Input
Output
问题可以转化为:
给定一个序列,求将这个序列分成两个上升子序列的方案数.
令 $f_{i,j}$ 表示一个序列选 $i$,令一个序列的最大值为 $p_{j}$ 的方案数 ($j<i$).
考虑转移:
- $f_{i,j}=f_{i-1,j},j<i-1$ 且 $p_{i-1}<p_{i}$
- $f_{i,i-1}=\sum f_{i-1,k},p_{k}<p_{i}$
$f_{i,j}$ 的转移只和 $f_{i-1,?}$ 的转移有关,所以可以将第一维滚掉.
而每一次 $f$ 的更新只有两种:区间清零,用一个区间和来更新单点的点值.
这些操作可以用线段树来实现.
#include <cstdio>
#include <algorithm>
#define N 100006
#define mod 998244353
#define setIO(s) freopen(s".in", "r" , stdin)
using namespace std;
int a[N], n ;
struct Node
{
int sum, lazy ;
}t[N << 2];
inline void mark(int now)
{
t[now].sum = 0, t[now].lazy = 1;
}
inline void pushdown(int l, int r, int now)
{
int mid = (l + r) >> 1;
if(t[now].lazy)
{
mark(now << 1);
if(r > mid) mark(now << 1 | 1);
t[now].lazy = 0;
}
}
inline void pushup(int l, int r, int now)
{
int mid = (l + r) >> 1;
t[now].sum = t[now << 1].sum ;
if(r > mid) t[now].sum += t[now << 1 | 1].sum, t[now].sum %= mod ;
}
inline void update(int l, int r, int now, int p, int v)
{
if(l == r)
{
t[now].sum += v, t[now].sum %= mod;
return ;
}
int mid = (l + r) >> 1;
pushdown(l, r, now);
if(p <= mid) update(l, mid, now << 1, p, v);
else update(mid + 1, r, now << 1 | 1, p, v);
pushup(l, r, now);
}
inline int query(int l, int r, int now, int L, int R)
{
if(l >= L && r <= R) return t[now].sum ;
pushdown(l, r, now);
int mid = (l + r) >> 1, re = 0;
if(L <= mid) re += query(l, mid, now << 1, L, R);
if(R > mid) re += query(mid + 1, r, now << 1 | 1, L, R);
return re % mod;
}
int main()
{
// setIO("input");
int i , j ;
scanf("%d", &n);
for(i = 1 ; i <= n ; ++ i) scanf("%d", &a[i]);
update(0, n, 1, 0, 1);
for(i = 2 ; i <= n ; ++ i)
{
int sum = query(0, n , 1, 0, a[i] - 1);
if(a[i] < a[i - 1]) mark(1);
update(0, n, 1, a[i - 1], sum);
}
printf("%d\n", query(0, n, 1, 0, n) * 2 % mod);
return 0;
}
BZOJ 4881: [Lydsy1705月赛]线段游戏 动态规划 + 线段树的更多相关文章
- bzoj 4881 [Lydsy1705月赛]线段游戏
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4881 1.当一块相互交织的线段中有3个或以上两两相交的那种线段时,无解. 这就是最长下降子序 ...
- bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
[Lydsy1705月赛]排名的战争 Time Limit: 8 Sec Memory Limit: 256 MBSubmit: 338 Solved: 69[Submit][Status][Di ...
- 「雅礼集训 2017 Day2」线段游戏(线段树懒标记“启发式下传”,李超树)
题面 题解 加入一条线段,可以把它转化为在[L,R]区间内加一条线 y=ax+b (如果原线段与y轴平行,就相当于在{x1}处加一条线 y=max(y1,y2)) 我们可以把它加到线段树上,线段树上每 ...
- BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
相当于将线段划分成两个集合使集合内线段不相交,并且可以发现线段相交等价于逆序对.也即要将原序列划分成两个单增序列.由dilworth定理,如果存在长度>=3的单减子序列,无解,可以先判掉. 这个 ...
- bzoj 2017 [Usaco2009 Nov]硬币游戏 动态规划
[Usaco2009 Nov]硬币游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 431 Solved: 240[Submit][Status] ...
- bzoj 4883 [Lydsy1705月赛]棋盘上的守卫——并查集(思路!)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4883 把各行和各列看成n+m个点. 如果一下能防守行和列,就是最大匹配了.这是每两个左右部点 ...
- BZOJ 4883: [Lydsy1705月赛]棋盘上的守卫 最小生成树 + 建模
Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须恰好放置一个纵向守卫.每个位置放置守卫的代价是不一样的,且每个位置 ...
- BZOJ 5129: [Lydsy1712月赛]树上传送 点分树+Dijkstra
Description http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf Input Output 暑假集训的时候点分树做的比较少,所 ...
- BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)
4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 359 Solved: 205[Submit][Stat ...
随机推荐
- vue --》动态路由的实现 (根据用户的权限来访问对应的模块)
为了设置用户的访问权限,所以在一个vue工程中,往往需要前端和后端开发人员共同配合设置动态路由, 进而实现根据用户的权限来访问对应的模块 1.首先在登录页面,前端跟据后端返回的路由信息进行配置,配置后 ...
- Hive-Container killed by YARN for exceeding memory limits. 9.2 GB of 9 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.
Caused by: org.apache.spark.SparkException: Job aborted due to stage failure: Task times, most recen ...
- jquery validate 自定义校验方法
1.引入JS jquery.min.js jquery.validate.min.js messages_zh.min.js 2.添加验证方法,第一个参数为验证方法的名称,第二个参数为验证方法. $. ...
- Objective-C中的自动释放池
自动释放池块@autoreleasepool 自动释放池块在MRC和ARC下都可以使用.在MARC下,为了将自动释放池块内部的变量放入自动释放池,需要手动调用autorelease方法:在ARC下,只 ...
- 洛谷 P1197 星球大战 题解
题面 并查集处理问题的基本思路:如果不是强制在线那么可以倒着处理,把删边改为可爱的加边,然后使用并查集来判断是否联通: 所以可以较为轻松的写出AC代码: #include <bits/stdc+ ...
- 洛谷 P1879 玉米田Corn Fields 题解
题面 一道思维难度不大的状态压缩,也并不卡常,但细节处理要格外注意: f[i][j]表示前i行最后一行状态是j的方案数 #include <bits/stdc++.h> #define p ...
- Git-版本控制 (三)
前面两篇我们成功安装了Git,并且成功创建了我们的版本库. 创建了版本库,怎么可以不往里面放内容呢,所以今天的任务就是学会将文件放入至我们的版本库中...... 首先,我们点开我们的"Git ...
- 第99:真正理解拉格朗日乘子法和 KKT 条件
- 运维日常错误总结(docker)
一:Apache服务启动失败 报错原因:80端口被占用 分析:netstat -anp|grep 80 检查80端口的占用情况,发现是启动了nginx服务,占用了http服务 解决方式: 1:如ngi ...
- nginx的简单介绍
nginx简单介绍 Nginx的负载均衡策略可以分两大类:内置策略和扩展侧略: 内置策略包括:轮询,加权轮询,IP hash 扩展策略是:url hash ,fair nginx.conf文件结构 1 ...