[CSP-S模拟测试]:降雷皇(DP+树状数组)
题目描述
降雷皇哈蒙很喜欢雷电,他想找到神奇的电光。
哈蒙有$n$条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的。
哈蒙想知道电光最多能通过多少条导线,还想知道这样的方案有多少。
输入格式
第一行两个整数$n$和$type$。$type$表示数据类型
第二行$n$个整数表示电阻。
输出格式
第一行一个整数表示电光最多能通过多少条导线。
如果$type=1$则需要输出第二行,表示方案数,对$123456789$取模。
样例
样例输入:
5 1
1 3 2 5 4
样例输出:
3
4
数据范围与提示
对于$20\%$的数据,$n\leqslant 10$;
对于$40\%$的数据,$n\leqslant 1,000$;
对于另外$20\%$的数据,$type=0$;
对于另外$20\%$的数据保证最多能通过不超过$100$条导线;
对于$100\%$的数据$n\leqslant 100000$,电阻值不超过$100000$。
题解
不输出方案数就是一个普通的$LCS$。
最经典的做法就是用树状数组做到$\Theta(n\log n)$。
对于这道题,无非就是在树状数组统计时再加一个方案数即可。
时间复杂度:$\Theta(n\log n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
const int mod=123456789;
int n,type;
int a[100001];
int tr[500000],val[500000],maxn;
pair<int,int> ans;
int lowbit(int x){return x&-x;}
void add(int x,int w,int sz)
{
for(int i=x;i<=500000;i+=lowbit(i))
{
if(w==val[i])tr[i]=(tr[i]+sz)%mod;
else if(w>val[i]){tr[i]=sz;val[i]=w;}
}
}
pair<int,int> ask(int x)
{
pair<int,int> res=make_pair(0,0);
for(int i=x;i;i-=lowbit(i))
if(val[i]>res.first)res=make_pair(val[i],tr[i]);
else if(val[i]==res.first)res.second=(res.second+tr[i])%mod;
return res;
}
int main()
{
scanf("%d%d",&n,&type);
add(1,0,1);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);a[i]+=2;
ans=ask(a[i]-1);
add(a[i],ans.first+1,ans.second);
maxn=max(maxn,a[i]);
}
ans=ask(maxn);
printf("%d\n",ans.first);
if(type)printf("%d",ans.second);
return 0;
}
rp++
[CSP-S模拟测试]:降雷皇(DP+树状数组)的更多相关文章
- [CSP-S模拟测试]:序列(二分答案+树状数组)
题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...
- 「10.10」神炎皇(欧拉函数)·降雷皇(线段树,DP)·幻魔皇
A. 神炎皇 很好的一道题,可能第一次在考场上遇到欧拉函数 题意:对于一个整数对 $(a,b)$,若满足 $a\times b\leq n$且$a+b$是$a\times b$的因子, 则称为神奇的数 ...
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组
题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...
- 奶牛抗议 DP 树状数组
奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...
- 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp
显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...
- BZOJ.4361.isn(DP 树状数组 容斥)
题目链接 长度为\(i\)的不降子序列个数是可以DP求的. 用\(f[i][j]\)表示长度为\(i\),结尾元素为\(a_j\)的不降子序列个数.转移为\(f[i][j]=\sum f[i-1][k ...
- P1020 导弹拦截 dp 树状数组维护最长升序列
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
随机推荐
- bash shell:获取当前脚本的绝对路径(pwd/readlink)
有时候,我们需要知道当前执行的输出shell脚本的所在绝对路径,可以用dirname实现. 我们知道 dirname 可以获取一个文件所在的路径,dirname的用处是: 输出已经去除了尾部的”/”字 ...
- 宝塔 windows下apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件
首先我们来看两段对上传目录设置无权限的列子,配置如下: //在宝塔下如用/upload这个路径应用无效,一定要C:/wwwroot/upload才有效果 <Directory "要去掉 ...
- Node.js实战9:用EventEmitter触发和响应事件。
Nodejs有一个重要的事件模块:EventEmitter. 它在Nodejs的内置及第三方模块中被大量使用,许多Nodejs项目的架构都是用它实现的. 可见,EventEmitter对于学习Node ...
- [Python3] 008 列表内涵,“满腹经纶”
目录 简述 少废话,上例子 例1 用 for 创建列表 例2 看看乘法"向"着谁 例3 给列表加一张"滤纸" 例4 列表生成式可以嵌套 例5 列表生式还能嵌入条 ...
- mysql自动补全功能(只能用于表/列 名)
关键字:mysql自动补全,auto-rehash 注:只能补齐表,列名,使用tab进行补全操作 一.修改my.cnf vi /etc/my.cnf [mysql] auto-rehash #添加au ...
- 《剑指offer》面试题16 反转链表 Java版
(输入链表的头节点,反转链表) 书中方法:对于一个链表,我们只能从头往后遍历,如果要反转,我们需要更改当前节点的next域指向前一个节点,此时链表断开,为了能继续修改下一个节点的next域,我们还要维 ...
- 【题解】1-2-K Game
题目大意 现有\(n\)个东西,每次可以取\(1\)个,\(2\)个或\(k\)个.Alice和Bob轮流取,且Alice先取.问谁是最后一个取的.(\(0 \leq n \leq 10^9\), ...
- 七层模型? IP ,TCP/UDP ,HTTP ,RTSP ,FTP 分别在哪层?
IP: 网络层TCP/UDP: 传输层HTTP.RTSP.FTP: 应用层协议
- python学习三十九天filter() map()用法及lambda搭配使用
python函数中的 filter() map() 前者是过滤的,后者是映射关系,需要与函数搭配使用,这时候匿名函数派上用场了,用简单的表达式就可以显示比较复杂的功能 1,python函数 filte ...
- selenium 定位方式
在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方式共八种,现分别介绍如下 ...