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 ...
随机推荐
- 【Qt开发】布局控件之间的间距设置
void QLayout::setContentsMargins ( int left, int top, int right, int bottom ) Sets the left, top, ri ...
- 学习Linux第一周记
2019/11/25 服务器硬件详述1) CPU 作用:运算/控制 关注信息 :路数 服务器中CPU的颗数 一般有 (单路 双路 ...
- LayaAir疑难杂症之四:laya引擎自动断点到bundle.js文件中且无报错,但程序不再执行
在一次断点调试中,突然程序不再按照博主指定的断点执行,莫名其妙端点到了bundle.js文件中的某一行中,这是不应该的,第一次时间反应就是引擎出了问题,但是总不能让博主卸载重装吧. 经过查找资料,询问 ...
- Spring MVC 中使用AOP 进行统一日志管理--注解实现
1.AOP简介 AOP称为面向切面编程 AOP的基本概念 (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知 (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的 ...
- [转帖]linux文件描述符文件/etc/security/limits.conf
linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...
- 史上最详细 Linux 用户与用户组知识
1.用户和用户组文件 在 linux 中,用户帐号,用户密码,用户组信息和用户组密码均是存放在不同的配置文件中的. 在 linux 系统中,所创建的用户帐号和其相关信息 (密码除外) 均是存放在 / ...
- springboot笔记之helloworld
开发工具:IDEA 2019 springboot版本:2.1.9 一.springboot2.x VS 1.x 基础环境升级 最低 JDK 8,支持 JDK 9,不再支持 Java 6 和 7 依赖 ...
- centos 7下nginx搭建流媒体服务器【动态添加模块】
1.安装nginx依赖包 yum install gcc gcc-c++ openssl-devel zlib-devel pcre pcre-devel yamdi 2.下载解压nginx_mod_ ...
- 0-1-Tree CodeForces - 1156D (并查集)
大意: 给定树, 边权为黑或白, 求所有有向路径条数, 满足每走过一条黑边后不会走白边. 这题比赛的时候想了个假算法, 还没发现..... 显然所求的路径要么全黑, 要么全白, 要么先全白后全黑, 所 ...
- 剑指offer-连续子数组的最大和-数组-python
题目描述 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止). 给一个数组,返回它的最大连续子序列的和 思路:动态规划 # -*- coding:u ...