【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 满足 现在给定一 ...
随机推荐
- ref是什么?
ref是组件的特殊属性,组件被渲染后,指向组件的一个引用.可以通过组件的ref属性,来获取真实的组件. 因为,组件并不是真正的DOM节点,而是存在于内存中的一种数据结构,称为虚拟的DOM,只有当它真正 ...
- 通过tomcat配置访问本机资源
背景:在最近的项目中使用海康威视的摄像机,在项目预算中没有购买对应的硬盘录像机,但是由于客户需要能够进行视频的回放功能,所以直接采用了海康提供的视频管理客户端直接进行视频录像,然后保存在本机进行播放. ...
- ZJOI2019Round#2
乱听课记录 关于树的分治问题&杂题选讲 张哲宇 边分治 (边分不是很鸡肋吗) 例题一 题目大意:给出两颗有正负边权的树,求出两个点\(u,v\)使得两棵树中\((u,v)\)距离的和最大. ...
- ElasticSearch High Level REST API【7】聚合
获取平均值聚合示例,最大值.最小值.求和类似 public void aggregation(){ RestHighLevelClient client = elasticClient.getRest ...
- MySQL如何计算重要的指标,来确定配置是否正确
在调优MySQL数据库和监控数据库时,很多朋友不知道如何下手,怎么来确定是不是参数设置的合理,下面给出一些如何计算指标,来确定数据库参数是否设置合理,希望给大家一些方法,去做MySQL数据库优化,最好 ...
- CI 框架源码解析一之入口文件 index.php
Index.php作为CI框架的入口文件,源码分析,自然而然由此开始.在源码分析的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现,如果英文水平很好的话,读过index.php文件的英文注释之 ...
- pageScope、requestScope、sessionScope、applicationScope的区别
https://www.cnblogs.com/qianbaidu/p/6006459.html 1.区别: 1.page指当前页面有效.在一个jsp页面里有效 2.request 指在一次请求的全过 ...
- 一个操作轻松截取长图,Win10上网截长图小技巧!
截屏的方法有很多,但是有时候我们会遇到比电脑屏幕还大的图,比如网站上的长图.N条引用的评论...你要怎么截取呢?是不是最多只能截全屏?还是要做到第三方的截图软件呢? 下面介绍一种win10电脑自带的滚 ...
- 单片机入门学习笔记8:STM32单片机使用
经常会在某个QQ群里看见某人的QQ昵称的名字"不会32绝不改名",其实无论会不会,之后名称都改了. STM32单片机在我看来就三部分组成:各部分的初始化,中断的使用,Main函数内 ...
- scrapy之分布式
分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取. 原生的scrapy是不可以实现分布式爬虫? a) 调度器无法共享 b) 管道无法共享 工具 scrapy-redis组件: ...