首页 > 其他分享 >P3970 [TJOI2014] 上升子序列

P3970 [TJOI2014] 上升子序列

时间:2023-10-09 21:26:11浏览次数:38  
标签:P3970 int sum TJOI2014 序列 线段 define

题目

先将 \(a[i]\) 离散化。

设 \(f[i]\) 表示以数字 \(i\) 结尾的上升子序列数量。

则有 \(f[i]=\sum_{j=1}^{i-1}f[j]\)。

考虑用线段树实时维护 \(f[j]\),就可以 \(logn\) 查询。

扫一遍整个序列,因为不能算重复,所以 \(ans\) 先减去上一次见到 \(a[i]\) 时的贡献 \(f[a[i]]\),再在线段树查询区间得到此时的 \(f[a[i]]\),将 \(ans\) 加上此时的 \(f[a[i]]\),最后在线段树更新此时 \(f[a[i]]\),时间复杂度 \(O(nlogn)\)。

#include<bits/stdc++.h>
#define mod 1000000007
#define N 100001
#define ll long long
using namespace std;
ll n,a[N],b[N],tr[N<<2],f[N],num,ans;
ll ask(ll rt,ll l,ll r,ll x,ll y){if(x>y)return 0;
	if(x<=l&&r<=y)return tr[rt];
	ll mid=(r+l)>>1,sum=0;
	if(mid>=x)sum=(sum+ask(rt<<1,l,mid,x,y))%mod;
	if(mid<y)sum=(sum+ask(rt<<1|1,mid+1,r,x,y))%mod;
	return sum;
}
void add(ll rt,ll l,ll r,ll x,ll d){if(l==r){tr[rt]=d;return;}
	ll mid=(r+l)>>1;
	if(mid>=x)add(rt<<1,l,mid,x,d);
	else add(rt<<1|1,mid+1,r,x,d);
	tr[rt]=(tr[rt<<1]+tr[rt<<1|1])%mod;
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1),num=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+num+1,a[i])-b;
		ans=(ans-f[a[i]]+mod)%mod,f[a[i]]=ask(1,1,num,1,a[i]-1),add(1,1,num,a[i],f[a[i]]+1),ans=(ans+f[a[i]])%mod;
	}
	cout<<ans;
}

标签:P3970,int,sum,TJOI2014,序列,线段,define
From: https://www.cnblogs.com/Exotic-sum/p/17753174.html

相关文章

  • R语言ARMA-GARCH模型金融产品价格实证分析黄金价格时间序列
    全文链接:http://tecdat.cn/?p=32677原文出处:拓端数据部落公众号最近我们被客户要求撰写关于ARMA-GARCH的研究报告,包括一些图形和统计输出。研究黄金价格的动态演变过程至关重要。文中以黄金交易市场下午定盘价格为基础,帮助客户利用时间序列的相关理论,建立了黄金价格的ARMA-GA......
  • 利用 Javascript 生成数字序列
    <!DOCTYPEhtml><html><head><title>生成数字序列</title></head><body><h1>Element对象之innerHTML属性</h1><pid="demo"onclick="myFunction()">点击生成数字序列</p><script>funct......
  • 《动手学深度学习 Pytorch版》 8.1 序列模型
    到目前为止,我们遇到的数据主要是表格数据和图像数据,并且所有样本都是独立同分布的。然而,大多数的数据并非如此。比如语句中的单词、视频中的帧以及音频信号,都是有顺序的。简言之,如果说卷积神经网络可以有效地处理空间信息,那么本章的循环神经网络(recurrentneuralnetwork,RNN)则可......
  • pytorch(8-1) 循环神经网络 序列模型
    https://zh.d2l.ai/chapter_recurrent-neural-networks/sequence.html     #%matplotlibinlineimporttorchfromtorchimportnnfromd2limporttorchasd2lfromAPI_Drawimport*T=1000#总共产生1000个点#time[0,1...,999]time=torch.arange(......
  • Unity 通信方案 - 使用 Google Protobuf 序列化数据
    1.下载和编译1.1下载ProtoBuf源文件从github下载最新的protoBuf库,如下图所示 Releases·protocolbuffers/protobuf(github.com)1.2编译dll和导入解压后打开/scharp/src中的sln工程文件 选择Release,Google.Protobuf,之后在生成中生成文件在......
  • 数据结构的关键码序列的理解概述
    1、关键码序列的理解所谓关键码序列,就是出现在二叉排序树中的,对二叉排序树的各个结点进行排序的一个结点序列。依据左子树的各个结点的值都小于父结点的值,右子树的各个结点的值都大于父结点的值的条件进行排序。2、习题解决一般都是给我们一个二叉排序树的图,让我们去判断选......
  • Mysql 分布式序列算法
    接上文Mysql分库分表1.分布式序列简介在分布式系统下,怎么保证ID的生成满足以上需求?ShardingJDBC支持以上两种算法自动生成ID。这里,使用ShardingJDBC让主键ID以雪花算法进行生成,首先配置数据库,因为默认的注解id是int类型,装不下64位,需要进行修改:#在本地和远端服务器数据......
  • Excel快速下拉填充序列至10000行
    问题:想要下拉输入的数据递增得到1、2、3……10000,但是手动下拉太累解决:1.如在A1单元格输入1,在A2单元格输入22.选中A2单元格,在上方名称框中填写A2:A1000,回车,此时将选中A2:A10003.在编辑栏中填写=A1+1,按Ctrl+回车,便可得到一万条递增数据1、2、3……100004.同上效果,可在编辑栏......
  • flink序列化类型验证
    flink支持的序列化类型官方支持javatuplesandscalacaseclassesjavapojosprimitivetypesregularclassesvalueshadoopwritablesspeclalTypes验证代码StreamExecutionEnvironmentenv=StreamExecutionEnvironment.getExecutionEnvironment();......
  • MapReduce的排列和序列化的学习
    1、概念和原理--结构化对象转换为字节流2、编程流程(举例说明)1、读取文件为键值对<偏移量,文件内容>2、Map阶段3、排序4、Reduce阶段5、保存结果--使用TextOutputFormat类3、代码编写1、自定义类型和比较器--自定义命名为SortBean并实现接口WritableComparable,还需......