Link:

传送门

A:

套路题结果想了好久……

排序二叉树的性质就是中序遍历单调递增

于是只考虑当前树的中序遍历的序列即可,与树的形态无关

将序列改成严格单调增想到最大化不变的数,但直接LIS求的是改为非严格单调增的数

一个将严格单调增问题改为非严格的套路是将数$a_i$替换成$a_i-i$,对转换后序列求LIS即可

(其实也可以理解为在严格单增问题中能拓展的条件为$a[i]-a[k]\ge i-k$,那么也就是$a[i]-i\ge a[k]-k$)

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
ll dat[MAXN],ind[MAXN],tot;
int n,x,y,ch[MAXN][],dp[MAXN],res; void dfs(int x)
{
if(~ch[x][]) dfs(ch[x][]);
ind[++tot]=dat[x];
if(~ch[x][]) dfs(ch[x][]);
} int main()
{
scanf("%d",&n);
memset(ch,-,sizeof(ch));
for(int i=;i<=n;i++)
scanf("%lld",&dat[i]);
for(int i=;i<n;i++)
scanf("%d%d",&x,&y),ch[x][y]=i+;
dfs();dp[]=-<<; for(int i=;i<=n;i++) ind[i]-=i;
for(int i=;i<=n;i++)
{
if(ind[i]>=dp[res]) dp[++res]=ind[i];
else dp[upper_bound(dp+,dp+res+,ind[i])-dp]=ind[i];
}
printf("%d",n-res);
return ;
}

Problem A

B:

长度可行性单调,对长度二分答案

发现区间$[l,r]$中存在$k$的条件为:$gcd(l...r)=min(l...r)=k$

区间最小和$gcd$明显可以用$RMQ$维护,但此题卡$log^2$,因此只能用$ST$表来维护

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=5e5+;
int res[MAXN],tot;
int n,dat[MAXN],lg2[MAXN],mn[MAXN][],gcd[MAXN][];
int GCD(int x,int y){return x%y==?y:GCD(y,x%y);} void pre()
{
lg2[]=;
for(int i=;i<=n;i++)
lg2[i]=lg2[i-]+((<<(lg2[i-]+))==i); for(int i=n;i>=;i--)
{
mn[i][]=dat[i];
for(int j=;(i+(<<j)-)<=n;j++)
mn[i][j]=min(mn[i][j-],mn[i+(<<j-)][j-]);
}
for(int i=n;i>=;i--)
{
gcd[i][]=dat[i];
for(int j=;(i+(<<j)-)<=n;j++)
gcd[i][j]=GCD(gcd[i][j-],gcd[i+(<<j-)][j-]);
}
}
int Query_min(int l,int r)
{
int t=lg2[r-l+];
return min(mn[l][t],mn[r-(<<t)+][t]);
}
int Query_gcd(int l,int r)
{
int t=lg2[r-l+];
return GCD(gcd[l][t],gcd[r-(<<t)+][t]);
} bool check(int len)
{
tot=;
for(int i=;i<=n-len+;i++)
if(Query_min(i,i+len-)==Query_gcd(i,i+len-))
res[++tot]=i;
return tot>;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&dat[i]);
pre(); int l=,r=n;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid)) l=mid+;
else r=mid-;
}
check(r);
printf("%d %d\n",tot,r-);
for(int i=;i<=tot;i++) printf("%d ",res[i]);
return ;
}

Problem B

如果只有询问用$ST$表$O(1)$询问

同时注意由于对一个数多次求$gcd$不会影响区间$gcd$值,因此可以直接用$ST$表维护$gcd$

C:

很像以前冒泡排序相关题的一个$Trick$:

由于交换序列是一个排列,因此每次交换后左右不可能再有交换,这样就拆为独立的子问题了

由于初始状态的值有规律是单调的,因此反向考虑问题:

对于当前区间$[l,r]$枚举交换位置$i$,如果交换$i,i+1$后左序列是$[l,l+i-1]$的一个排列则计算其贡献

$dp[l][r]=dp[l][l+i-1]*dp[l+i][r]*C^{i-1}_{r-l+1-2}$

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=,MOD=1e9+;
int n,dat[MAXN];
ll C[MAXN][MAXN],dp[MAXN][MAXN]; ll dfs(int l,int r)
{
if(~dp[l][r]) return dp[l][r];
if(l==r) return dp[l][r]=;
//不能开全局……
int st[MAXN],top=;dp[l][r]=;
for(int i=;i<=n;i++)
if(dat[i]>=l&&dat[i]<=r)
st[++top]=dat[i]; for(int i=;i<top;i++)
{
swap(st[i],st[i+]);
bool f=;
for(int j=;j<=i;j++)
if(st[j]>=l+i){f=;break;}
for(int j=i+;j<=top;j++)
if(st[j]<l+i){f=;break;}
if(!f){swap(st[i],st[i+]);continue;} (dp[l][r]+=dfs(l,l+i-)*dfs(l+i,r)%MOD*C[r-l-][i-]%MOD)%=MOD;
swap(st[i],st[i+]);
}
return dp[l][r];
} int main()
{
scanf("%d",&n);
memset(dp,-,sizeof(dp));
for(int i=;i<=n;i++)
scanf("%d",&dat[i]);
for(int i=;i<=n;i++)
{
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%MOD;
}
dfs(,n-); if(~dp[][n-])
printf("%lld",dp[][n-]);
else puts("");
return ;
}

Problem C

注意这里每次处理的$[l,r]$的排列是$p$的子序列!

(处理到该子问题时能保证数在$p$中的相对位置不变)

D:

关键在于贡献为$2^{R+C}$,可以理解为对每一个子集算一次贡献

接下来算每个集合被包含的期望次数即可:

$res=\sum C^i_n*C^j_n*\frac{C^{k-num}_{m-num}}{C^k_m}$

其中$num$为如果$i$行$j$列全涂黑的个数,预处理组合数即可

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+;
int n,m,k;
db res,cn[MAXN],cm[MAXN]; double cal(int i,int j)
{
int num=n*(i+j)-i*j;
return k-num<?:cm[num];
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
cn[]=cm[]=;
for(int i=;i<=n;i++) cn[i]=cn[i-]*(n-i+)/i;
for(int i=;i<=m;i++) cm[i]=cm[i-]*(k-i+)/(m-i+); for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
res+=cn[i]*cn[j]*cal(i,j);
printf("%.6lf",(res>1e99)?1e99:res);
return ;
}

Problem D

[ZROI 9.16模拟赛] Tutorial的更多相关文章

  1. [ZROI 9.15模拟赛] Tutorial

    Link: 传送门 可能要补一补之前的题了 题目名字天(Sky)的(De)炭(C)好评啊…… A: 从买/卖物品的配对来考虑: 可以发现如果当前物品为卖,肯定从之前选最小的(无论其为买/卖),因为贡献 ...

  2. ZROI提高组模拟赛05总结

    ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...

  3. ZROI 普及组模拟赛02总结

    ZROI 普及组模拟赛02总结 先放[网址][http://zhengruioi.com/contest/96] 可能是有一段时间没有打这种正式的比赛了,今天打的很奇怪... T1 模拟水题 既然是普 ...

  4. [8.16模拟赛] 玩具 (dp/字符串)

    题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老 ...

  5. 9 16 模拟赛&关于线段树上二分总结

    1 考试时又犯了一个致命的错误,没有去思考T2的正解而是去简单的推了一下式子开始了漫漫找规律之路,不应该这样做的 为了得到规律虽然也打了暴力 但是还是打了一些不必要的程序 例如求组合数什么的比较浪费时 ...

  6. 2020.12.16 模拟赛x+1

    A. 接力比赛 跑两遍背包,再进行一些玄学的剪枝 代码 #include<cstdio> #include<algorithm> #define rg register inl ...

  7. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  8. [NOIP2018模拟赛10.16]手残报告

    [NOIP2018模拟赛10.16]手残报告 闲扯 炉石乱斗模式美滋滋啊,又颓到好晚... 上来T2先敲了树剖,看T1发现是个思博DP,然后没过大样例,写个暴力发现还是没过大样例!?才发现理解错题意了 ...

  9. 2017.1.16【初中部 】普及组模拟赛C组总结

    2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...

随机推荐

  1. 微信小程序导航设置

    "tabBar": { "backgroundColor": "#ffffff", "color": "#00 ...

  2. Linux命令之uptime

    这是什么 uptime用来查看系统已经启动了多长时间了. 它显示的信息和w命令的头(第一行)是一样一样的. 举个栗子 举一个实际的应用场景: 比如发现服务器上的某些没有加入开机启动的服务挂了一片,这个 ...

  3. [SVN技巧]代码提交中遇到的两个问题及其解决方案

    前言 SVN在使用的过程中会遇到各种各样的问题,小黑在最近的使用中,遇到如下的两个问题,这里贴出来供大家参考 问题记录 SVN在源码仓库中不存在,导致无法删除和上传 问题提示: Working cop ...

  4. 简约而不简单的Django

    本文面向:有python基础,刚接触web框架的初学者. 环境:windows7   python3.5.1  pycharm专业版  Django 1.10版 pip3 一.Django简介 百度百 ...

  5. hexdump related.

    hexdump format strings Tue 13 December 2005 In tips. Ian Wienand More from the "things you'd le ...

  6. [BZOJ3150][Ctsc2013]猴子 期望dp+高斯消元

    3150: [Ctsc2013]猴子 Time Limit: 20 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 163  Solved: 10 ...

  7. Web APi入门之基本操作(一)

    最近学习了下WebApi,WebApi是RESTful风格,根据请求方式决定操作.以博客的形式写出来,加深印象以及方便以后查看和复习. 1.首先我们使用VS创建一个空的WebApi项目 2.新建实体以 ...

  8. ubuntu 系统提示升级失败,boot空间不足

    系统提示升级失败,boot空间不足,解决方法: linux 随着系统的升级,会自动攒下好几个内核 执行 uname -a 看下自己当前启动的是哪个内核 dpkg --get-selections |g ...

  9. Typo: In word 拼写检查

    Settings->Inspections > Spelling > Typo 评写检查,

  10. Nodejs 接收RabbitMQ消息

    参考官方地址:https://www.rabbitmq.com/tutorials/tutorial-one-javascript.html 关于C#消息发送端,请参考<c# RabbitMQ ...