【ZJOI2016】线段树





ZJOI的题神啊。

我们考虑计算每个位置\(p\),它在操作过后变成第\(x\)个数的操作序列数。

我们枚举\(x\)。我们先得到了\(L_x,R_x\)表示最左边比\(x\)小的数以及最右边比\(x\)小的数(权值相同编号小的更小)。设\(f_{i,l,r}\)表示前\(i\)个操作结束后,恰好\([l,r]\)的权值\(\leq a_x\),\([L_x,l-1],[r+1,R_x]\)的权值\(> a_x\)的方案数。初始\(f_{0,L_x,R_x}=1\)。

考虑转移。我们新的状态\(l',r'\)一定是有\(l',t\)或者\(t,r'\)转移过来的。

以第一种为例:

\[\displaystyle
f_{i,l',r'}=\sum_{t=r'+1}^{R_x}f_{i-1,l',t*(n-t)}
\]

然后这个可以前缀和优化。

还有就是第\(i\)个操作区间为\([1,l-1],[l,r],[r+1,n]\)的子区间,这样的话\(l'=l,r'=r\)。

开始想的状态是\(f_{i,l,r}\)表示\([l,r]\)的权值\(>a_x\)的,怎么都转移不了。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 405
#define int ll
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} const ll mod=1e9+7;
int f[2][N][N];
int n,q;
int w[N];
int L[N],R[N];
int sum[N];
int g[N][N]; void solve(int L,int R,int id) {
for(int i=L;i<=R;i++)
for(int j=i;j<=R;j++)
f[0][i][j]=0;
f[0][L][R]=1;
int now=0;
for(int i=0;i<q;i++) {
for(int l=L;l<=R;l++) {
int tem=0;
for(int r=R;r>=l;r--) {
(f[now^1][l][r]=tem);
(tem+=1ll*f[now][l][r]*(n-r))%=mod;
}
}
for(int r=L;r<=R;r++) {
ll tem=0;
for(int l=L;l<=r;l++) {
(f[now^1][l][r]+=tem)%=mod;
(tem+=1ll*f[now][l][r]*(l-1))%=mod;
}
}
for(int l=L;l<=R;l++) {
for(int r=l;r<=R;r++) {
(f[now^1][l][r]+=1ll*f[now][l][r]*(sum[r-l+1]+sum[l-1]+sum[n-r]))%=mod;
}
}
now^=1;
}
for(int i=L;i<=R;i++) {
int tem=0;
for(int j=R;j>=i;j--) {
(tem+=f[now][i][j])%=mod;
(g[j][id]+=tem)%=mod;
}
}
} bool cmp(int a,int b) {
if(w[a]!=w[b]) return w[a]<w[b];
return a<b;
} int st[N];
ll ans[N]; main() {
n=Get(),q=Get();
for(int i=1;i<=n;i++) sum[i]=i*(i+1)/2;
for(int i=1;i<=n;i++) w[i]=Get();
for(int i=1;i<=n;i++) st[i]=i;
sort(st+1,st+1+n,cmp);
for(int i=1;i<=n;i++) {
L[i]=R[i]=i;
for(int j=i-1;j>=1&&w[j]<w[i];j--) L[i]=j;
for(int j=i+1;j<=n&&w[j]<=w[i];j++) R[i]=j;
solve(L[i],R[i],i);
}
for(int i=1;i<=n;i++) {
ll pre=0;
for(int j=1;j<=n;j++) {
if(!g[i][st[j]]) continue ;
g[i][st[j]]=(g[i][st[j]]-pre+mod)%mod;
pre=(pre+g[i][st[j]])%mod;
(ans[i]+=1ll*w[st[j]]*g[i][st[j]])%=mod;
}
}
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}

【ZJOI2016】线段树的更多相关文章

  1. bzoj 4574: [Zjoi2016]线段树

    Description 小Yuuka遇到了一个题目:有一个序列a_1,a_2,?,a_n,q次操作,每次把一个区间内的数改成区间内的最大值,问 最后每个数是多少.小Yuuka很快地就使用了线段树解决了 ...

  2. BZOJ4574 [Zjoi2016]线段树

    比较厉害的dp. 网上题解都是利用了随机的条件,用了一个$O(n^4)$的dp,这里简单说一下. 用f(x,i,l,r)表示经过前i轮操作,[l,r]的所有数<=x,且l-1和r+1都>x ...

  3. Luogu3352 ZJOI2016 线段树 概率、区间DP

    传送门 考虑对于每一个位置\(i\),计算所有可能的结果出现的概率. 定义一个区间\([l,r]\)为对于\(x\)的极大区间,当且仅当\(\max \limits _{i=l}^r \{a_i\} ...

  4. 【UOJ#196】【BZOJ4574】[Zjoi2016]线段树

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4574 http://uoj.ac/problem/196 考虑数字随机并且值域够大,我们 ...

  5. bzoj4574:Zjoi2016线段树 dp

    传送门 题解传送门 //Achen #include<algorithm> #include<iostream> #include<cstring> #includ ...

  6. @loj - 2093@ 「ZJOI2016」线段树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Yuuka 遇到了一个题目:有一个序列 a1,a2,..., ...

  7. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  8. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  9. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

随机推荐

  1. SVN 安装后右键出现点击鼠标右键弹出错误提示:CrashHandler initialization error

    SVN 安装后右键出现点击鼠标右键弹出错误提示:CrashHandler initialization error 原因是目标文件夹中缺少SendRpt.exe文件 解决方案:找svn是好的的同事将b ...

  2. [MySQL] INFORMATION_SCHEMA 数据库包含所有表的字段

    sql注入后可以通过该数据库获取所有表的字段信息 1. COLLATIONS表 提供有关每个字符集的排序规则的信息. COLLATIONS表包含以下列: COLLATION_NAME 排序规则名称. ...

  3. 24.QTableView函数使用,右击菜单实现

    QTableView view(this); QStandardItemModel model(this); /*设置表头水平标题*/ model.setHorizontalHeaderItem(,n ...

  4. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  5. Debug始于71年前

    摘要: 纪念Grace Hopper发现世界上第一个计算机BUG! 1947年9月9日,Grace Hopper的计算科学团队在哈佛的哈弗Mark II电脑运行程序时遇到一个技术故障.她在发生故障的M ...

  6. xhr post请求

    1. post提交的时候要设置post请求头,可以使用setRequestHeader(单独指定请求的某个http头) 2.通常在web开发中,使用表单提交数据的时候,一般是使用xml的格式进行的.可 ...

  7. 15-可视化工具Navicat的使用

    [转]15-可视化工具Navicat的使用 本节重点: 掌握Navicat的基本使用 # PS:在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化 ...

  8. vue从入门到进阶:自定义指令directive,插件的封装以及混合mixins(七)

    一.自定义指令directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的 ...

  9. 使用FileReader接口读取文件内容

    如果想要读取或浏览文件,则需要通过FileReader接口,该接口不仅可以读取图片文件,还可以读取文本或二进制文件,同时,根据该接口提供的事件与方法,可以动态侦察文件读取时的详细状态,接下来,我们详细 ...

  10. Java用户自定义函数

    用户除了可以使用JavaScript的内置函数之外,还可以自己定义函数.自定义函数有3种方法. 使用关键字 function 构造 语法: function funcName([param1][,pa ...