题目描述

quailty和tangjz正在玩一个关于线段的游戏。在平面上有n条线段,编号依次为1到n。其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成了1到n的一个排列。quailty先手,他可以选择一些互不相交的线段,将它们拿走,当然他也可以一条线段也不选。然后tangjz必须拿走所有剩下的线段,若有两条线段相交,那么他就输了,否则他就赢了。注意若quailty拿走了全部线段,那么tangjz也会胜利。quailty深深喜欢着tangjz,所以他不希望tangjz输掉游戏,请计算他有多少种选择线段的方式,使得tangjz可以赢得游戏。

输入

第一行包含一个正整数n(1<=n<=100000),表示线段的个数。
第二行包含n个正整数p_1,p_2,...,p_n(1<=p_i<=n),含义如题面所述。

输出

输出一行一个整数,即tangjz胜利的方案数,因为答案很大,请对998244353取模输出。

样例输入

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的更多相关文章

  1. [bzoj4881][Lydsy2017年5月月赛]线段游戏

    来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...

  2. BZOJ 4881: [Lydsy2017年5月月赛]线段游戏

    4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 81[Submit][St ...

  3. 【BZOJ4881】5月月赛D 线段游戏 树状数组+set

    Description quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐 标分别为(0,i)和(1,p_i),其中p_1,p_2,. ...

  4. BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)

    4881: [Lydsy1705月赛]线段游戏 Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 359  Solved: 205[Submit][Stat ...

  5. [补档][Lydsy2017年4月月赛]抵制克苏恩

    [Lydsy2017年4月月赛]抵制克苏恩 题目 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平. 如果你不玩炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一 ...

  6. 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 87 Descripti ...

  7. 【BZOJ4832】[Lydsy2017年4月月赛]抵制克苏恩 概率与期望

    [BZOJ4832][Lydsy2017年4月月赛]抵制克苏恩 Description 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q同学会告诉 ...

  8. [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 673  Solved: 261[Submit][ ...

  9. bzoj 4836: [Lydsy2017年4月月赛]二元运算 -- 分治+FFT

    4836: [Lydsy2017年4月月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MB Description 定义二元运算 opt 满足   现在给定一 ...

随机推荐

  1. 微信H5单页面滑动的时候如何避免出界,出现头部和底部的黑底?

    ios系统微信浏览器.safari浏览器中h5页面上拉下滑导致悬浮层脱离窗口的解决方法 ios偶现下拉出现黑底时,界面第一次上拉时拉不动的解决方案: document.querySelector('# ...

  2. runit git-daemon-run 等错误

    正在处理用于 man-db (2.7.5-1) 的触发器 ... 正在设置 runit (2.1.2-3ubuntu1) ... start: 无法连接到 Upstart: Failed to con ...

  3. (排班表三)导出列名不固定的Grid表格到Excel

    将班表信息导出Excel表格保存到本地 要求:文档名称为[XXXX]年X月值班表 文档显示的效果: 实现代码: //导出Excel值班表 private void btn_export_1_Click ...

  4. Maven - 依赖冲突

    依赖冲突有两个规则: 短路优先范例:A -> B -> C -> X-2.0.0A -> D -> X-1.0.0那么A -> X-1.0.0这个版本 先声明优先范 ...

  5. python核心编程2 第六章 练习

    6-2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 key ...

  6. 用 js 写一个获取随机颜色的程序

    function getColor(){ var color="#"; for(var i=0;i<6;i++){ color+=(Math.random()*16 | 0) ...

  7. tcl之控制流-条件运算、条件测试、逻辑表达

  8. RESTful API架构和oauth2.0认证机制(概念版)

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  9. jupyter notebook中出现ValueError: signal only works in main thread 报错 即 长时间in[*] 解决办法

    我在jupyter notebook中新建了一个基于py3.6的kernel用来进行tensorflow学习 但是在jupyter notebook中建立该kernel时,右上角总是显示 服务正在启动 ...

  10. WPF Datagrid对鼠标单击进行响应,借助EventSetter

    在做的一个c#的项目中发现Datagrid没办法直接对鼠标单击进行响应, 调用MouseDown事件也需要点击某一行第二次才能响应. 所以借助EventSetter来简单的实现了一个. 界面部分的代码 ...