bzoj5157: [Tjoi2014]上升子序列(树状数组LIS)
2024-10-01 13:16:30
5157: [Tjoi2014]上升子序列
题目:传送门
题解:
学一下nlogn的树状数组求最长上生子序列就ok(%爆大佬)
离散化之后,用一个数组记录一下,直接树状数组做
吐槽:妈耶...一开始不会lower_bound 的蒟蒻用手打二分离散化...结果去重了...然后屁颠屁颠的学了lower_bound(很好用!)
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define mod 1000000007
using namespace std;
int n,a[],wa[],s[];
int lowbit(int x){return x&-x;}
void add(int x,int p)
{
while(x<=n)
{
s[x]=(s[x]+p)%mod;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ans=;
while(x)
{
ans=(ans+s[x])%mod;
x-=lowbit(x);
}
return ans;
}/*
int LS(int x)
{
int l,r,mid,ans;
l=1,r=n;
while(l<=r)
{
mid=(l+r)/2;
if(wa[mid]<=x)
{
l=mid+1;
ans=mid;
}
else r=mid-1;
}
return ans;
}*/
int f[],last[],w[];
int main()
{
scanf("%d",&n);for(int i=;i<=n;i++)scanf("%d",&a[i]),wa[i]=a[i];
sort(wa+,wa+n+);int sum=;memset(f,,sizeof(f));
for(int i=;i<=n;i++)
{
a[i]=lower_bound(wa+,wa+n+,a[i])-wa;if(w[a[i]]==)sum++;
last[i]=w[a[i]];w[a[i]]=i;//链表记录上次影响的位置
}
for(int i=;i<=n;i++)
{
f[i]=getsum(a[i]-)+;//这个数能贡献的上升子序列个数
add(a[i],(f[i]-f[last[i]]+mod)%mod);//减去重复的贡献
}
int ans=getsum(n);
printf("%d\n",(ans-sum+mod)%mod);
return ;
}
最新文章
- TortoiseGit:记住用户名和密码
- Android菜鸟成长记13 -- 初识application
- mentohust 你让我如何说你是好呢?
- Linux下集群的搭建
- 《day18_String练习_基本类型包装类_集合入门》
- zedboard 驱动理解
- DOCTYPE, HTML和XHTML, Strict DTD和Transitional DTD, Quirks Mode和Standard Mode
- 【原创】leetCodeOj --- Largest Number 解题报告
- 常见C/C++笔试、面试题(二)
- Swift 3.0在集合类数据结构上的一些新变化
- c++中函数的内存注意项
- SuperMap iObject .NET开发完成后私有部署,打包安装
- Codeforces Round #412 C. Success Rate
- 离线安装.NET 3.5
- 手把手教你整合最优雅SSM框架
- windows 常用快捷键和dos命令
- ThinkJava-容器深入研究
- spark SQL学习(数据源之json)
- 牛客网提高组模拟赛第五场 T1同余方程(异或)(位运算)
- 116.001 - 爱折腾之用 Kindle 读学术论文是什么体验?
热门文章
- PHP生成二维码的2种方式
- ffmpeg键盘命令响应程序详解
- 继承TabActivity后不执行onBackPressed()里的方法
- Android饼图的简单实现
- .net 三大核心对象
- LeetCode(17)Letter Combinations of a Phone Number
- 2、Attentive Group Recommendation----注意力集中的群组推荐
- IOS - 总结(网络状态变更)
- -java转json hibernate懒加载造成的无限递归问题
- linux系统添加环境变量,node.js forever 守护进程添加环境变量