【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
题目描述
输入
输出
样例输入
5
1 2 4 5 3
样例输出
8
题目大意
给定一个1~n的全排列序列,求出将这个序列分成两个都不含逆序对的子序列的方案数(子序列可以为空,可以不连续)
题解
树状数组+STL-set
先说一下个人的思路吧~(按照这个思路T了,后面会讲优化)
首先,一个逆序对不能分在同一个子序列里,即一个逆序对必须分到两个不同的子序列里。
对于每个逆序对组(一个集合,其中每个元素都至少与一个其它元素存在逆序对关系),只存在两种不同的分法,所以可以用带权并查集来维护逆序对组数。
于是每次找到一个数,就看它前面有多少个比它大的数,然后将所有比它大的数与它在带权并查集中合并,若矛盾则无解,最后统计一下就可以了。
而这里如果加了无解判断,那么合并操作的总次数是O(n)级别的。
然而一开始用set TLE了,才发现set很难查询一段区间,时间会很长。
所以要手写Treap或Splay,果断放弃。
最后还是参考了下 CQzhangyu 大犇的做法:先用树状数组求最长下降子序列,判断是否达到3导致无解;然后插入时只保留它和比它大的数中的最大的那个,最后答案为2^size。
这里简单证明一下:按照我的做法,每次带权并查集合并时都要合并很多数,而实际上如果有解,那么只需要保留一个逆序对组的一个元素即可代表整个组。由于是逆序对,这个元素最大时才能代表整个组来继续进行接下来的元素的合并操作。
所以不需要每次都找所有比当前数大的,只需要维护最大值就行了。
#include <cstdio>
#include <set>
#define N 100010
using namespace std;
int n , f[N] , a[N];
set<int> s;
set<int>::iterator it;
void update(int x , int a)
{
int i;
for(i = x ; i <= n ; i += i & -i) f[i] = max(f[i] , a);
}
int query(int x)
{
int i , ans = 0;
for(i = x ; i ; i -= i & -i) ans = max(ans , f[i]);
return ans;
}
int main()
{
int i , tmp , ans = 1;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%d" , &a[i]);
tmp = query(n - a[i]);
if(tmp >= 2)
{
printf("0\n");
return 0;
}
update(n - a[i] + 1 , tmp + 1);
}
for(i = 1 ; i <= n ; i ++ )
{
tmp = a[i];
while((it = s.upper_bound(tmp)) != s.end()) tmp = *it , s.erase(tmp);
s.insert(tmp);
}
tmp = s.size();
while(tmp -- ) ans = ans * 2 % 998244353;
printf("%d\n" , ans);
return 0;
}
【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set的更多相关文章
- [bzoj4881][Lydsy2017年5月月赛]线段游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...
- BZOJ 4881: [Lydsy2017年5月月赛]线段游戏
4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 164 Solved: 81[Submit][St ...
- 【BZOJ4881】5月月赛D 线段游戏 树状数组+set
Description quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐 标分别为(0,i)和(1,p_i),其中p_1,p_2,. ...
- BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)
4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 359 Solved: 205[Submit][Stat ...
- [补档][Lydsy2017年4月月赛]抵制克苏恩
[Lydsy2017年4月月赛]抵制克苏恩 题目 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平. 如果你不玩炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一 ...
- 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)
4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 275 Solved: 87 Descripti ...
- 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望
[BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...
- [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)
4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 673 Solved: 261[Submit][ ...
- bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT
4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec Memory Limit: 128 MB Description 定义二元运算 opt 满足 现在给定一 ...
随机推荐
- 面试题 LazyMan 的Rxjs实现方式
前言 笔者昨天在做某公司的线上笔试题的时候遇到了最后一道关于如何实现LazyMan的试题,题目如下 实现一个LazyMan,可以按照以下方式调用:LazyMan("Hank")输出 ...
- 差点掉坑,MySQL一致性读原来是有条件的
众所周知,在设定了隔离等级为Repeatable Read及以上时,InnoDB 可以实现数据的一致性读.换句话来说,就是事务执行的任意时刻,读取到的数据是同一个快照,不会受到其他事务的更新影响. 以 ...
- BFS例题:A计划
ContribContrib/a11y/accessibility-menu.js 关于 BFS要点: 1.若为可化为的坐标系图形,可用结构体存储其x值,y值和步数.(一般开now 和 next ,n ...
- Spring使用mutipartFile上传文件报错【Failed to instantiate [org.springframework.web.multipart.MultipartFile]】
报错场景: 使用SSM框架实现文件上传时报“Failed to instantiate [org.springframework.web.multipart.MultipartFile]”错,控制器源 ...
- Eclipse+Tomcat7.0+MySQL 连接池设置
http://blog.sina.com.cn/s/blog_85d71fb70101ab99.html 工程名:JavaWeb 第一步:配置server.xml 在Tomcat的server.xml ...
- saltstack plug in
目录 可插拔的子系统 灵活性 虚拟模块 salt的核心架构提供了一种高速的交流总线,在核心架构的上层,salt暴露出来的特征是:松散耦合,可插拔的子系统. 可插拔的子系统 salt包含20中插件系统, ...
- VSX-4 VSXTra
要介绍VSXTra项目不是一个简单的事情. 而且要在上面进行扩展,删减就更不容易. 源码分析的资料几乎没有,可怜的几个示例项目,相较而言,英文已经不是阻碍我前进的步伐了. 本篇只是简单的分析,对于已经 ...
- 剑指Offer - 九度1368 - 二叉树中和为某一值的路径
剑指Offer - 九度1368 - 二叉树中和为某一值的路径2013-11-23 03:46 题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结 ...
- python学习笔记十:异常
一.语法 #!/usr/bin/python filename='hello' #try except finally demo try: open('abc.txt') print hello ex ...
- css 之 border-radius属性
css中给盒子设置圆角可以通过 border-radius 属性来实现(具体原理就不深入探讨了); 在开发过程中都会遇到浏览器兼容问题,这问题其实也不难解决,无非就是加上私有前缀,在这里先忽略掉. ...