先膜两位出题人


F 简单计数题

题目

有\(n\)个活动,预约期有\(k\)天,第\(j\)天YC可以获得\(a_j(1\leq a_j\leq n)\)张预约券,

他会在\(n\)个活动中等概率选择\(a_k\)个活动消耗预约券,

\(k\)天后,YC同时参加\(n\)个活动的信心就提高了\(\prod_{i=1}^nw_i\),\(w_i\)表示第\(i\)个活动消耗的预约券个数

问他能同时参加\(n\)个活动的信心的期望是多少,为了方便统计,答案乘上\(\prod_{i=1}^nC(n,a_i)\)并对\(10^9+7\)取模


分析

首先乘上最后那一坨就是将期望转换成了贡献和,因为那一坨就是方案数。

接着,贡献就是从\(w_{1\sim n}\)中各抽取1个的方案(乘法原理)

考虑拎出\(n\)个出来,如果有一种方案第\(j\)天的预约券中选择了\(p_j\)张,且\(n=\sum_{i=1}^kp_i\)

那么这种方案的贡献就是\(\prod_{i=1}^kC(n-p_i,a_i-p_i)\),

因为已经保证抽出来了,那么剩下的预约券可以随便分配

那么就可以列\(dp\)方程,设\(dp[i][j]\)表示前\(i\)天预约券共拎出\(j\)张的贡献,那么

\[dp[i][j+k]=\sum dp[i-1][j]*C(j+k,k)*C(n-k,a_i-k)
\]

其中\(dp[0][0]=1\)


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int mod=1000000007,N=1011;
int dp[21][N],c[N][N],n,k,a[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
n=iut(),k=iut(),c[0][0]=dp[0][0]=1;
for (rr int i=1;i<=n;++i){
c[i][0]=c[i][i]=1;
for (rr int j=1;j<i;++j)
c[i][j]=mo(c[i-1][j-1],c[i-1][j]);
}
for (rr int i=1;i<=k;++i) a[i]=iut();
for (rr int i=1;i<=k;++i)
for (rr int j=0;j<=n;++j) if (dp[i-1][j])
for (rr int p=0;p<=n;++p){
if (j+p>n||p>a[i]) break;
rr int t=1ll*c[j+p][p]*c[n-p][a[i]-p]%mod;
dp[i][j+p]=mo(dp[i][j+p],1ll*t*dp[i-1][j]%mod);
}
return !printf("%d",dp[k][n]);
}

K 最简单的题

题目

给出两个长度为\(n\)的数列\(a,b\),

设\(f(i,j)=LIS(a_i,b_i,a_j,b_j)\),

问\(f(i,j)=1\sim 4\)的个数

\(1\leq n\leq 10^5,1\leq a,b\leq m\leq 10^3\)


分析

枚举\(j\),然后分类讨论,标绿为所在位置











首先一共5种情况,考虑它们的共同规律,当\(a_j<b_j\)时,右边罕见的出现平的分界线

其它情况都是要将纵轴顺时针旋转45度,实际上是逆时针。

被BPM大爷嘲讽后恶补高中数学,学完后却发现我在想桃子

还不如直接说原\((x,y)\)对应\((x-y,y)\),当然要平移横坐标,加上\(m\)

如下图\(m=15\)的情况



讲到这里好像还真是一道简单题

一开始我想的是用树状数组维护,但是BPM连\(STL::sort\)也没放过,

多组数据直接TLE(幸好O2卡过去了)

然后BPM就让我用前缀和做,其实思路差不多,

这里也不细讲了,反正代码很清晰


树状数组代码

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define rr register
using namespace std;
const int N=100011;
int n,m,Cnt,c[N]; long long dp[5];
struct rec{int x,y;}a[N],b[N<<1];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
bool cmp1(rec a,rec b){return a.y>b.y;}
inline signed query(int x){rr int ans=0; for (;x;x-=-x&x) ans+=c[x]; return ans;}
inline void update(int x,int y){for (;x<=m;x+=-x&x) c[x]+=y;}
signed main(){
while (scanf("%d%d",&n,&m)==2){
dp[1]=dp[2]=dp[3]=dp[4]=0;
for (rr int i=1;i<=n;++i) a[i]=(rec){iut(),iut()};
for (rr int i=1;i<=n;++i) if (a[i].x<a[i].y)
b[++Cnt]=(rec){a[i].x,a[i].y-(a[i].x+1==a[i].y)};
sort(b+1,b+1+Cnt,cmp1),sort(a+1,a+1+n,cmp1);
for (rr int i=1,j=1;i<=Cnt;++i){
while (j<=n&&a[j].y>=b[i].y) update(a[j].x,1),++j;
rr int t=query(b[i].x-1); dp[3]+=t,dp[2]+=j-t-1;
}
Cnt=0,memset(c,0,sizeof(c));
for (rr int i=1;i<=n;++i) b[i]=(rec){a[i].x>=a[i].y,a[i].x}; Cnt=n;
for (rr int i=1;i<=n;++i) if (a[i].x<a[i].y) b[++Cnt]=(rec){2,a[i].y-(a[i].x+1==a[i].y)};
sort(b+1,b+1+Cnt,cmp1); for (rr int i=1;i<=n;++i) a[i].x-=a[i].y-m;
for (rr int i=1,j=1,t=0;i<=Cnt;++i){
while (j<=n&&a[j].y>=b[i].y) t+=a[j].x<m,++j;
rr int t2=(b[i].x==2)?-1:1,t1=b[i].x!=1;
dp[2+t1]+=t*t2,dp[1+t1]+=(j-t-1)*t2;
}
reverse(a+1,a+1+n),Cnt=0,memset(c,0,sizeof(c));
for (rr int i=1;i<=n;++i) b[i].y=a[i].x-m+a[i].y;
for (rr int i=1;i<=n;++i) b[i].x=a[i].x<m;
sort(b+1,b+1+n,cmp1),reverse(b+1,b+1+n);
for (rr int i=1,j=1,t=0;i<=n;++i){
while (j<=n&&a[j].y<b[i].y) t+=a[j].x<m,++j;
dp[3+b[i].x]+=t,dp[2+b[i].x]+=j-t-1;
}
printf("%lld %lld %lld %lld\n",dp[1],dp[2],dp[3],dp[4]);
memset(c,0,sizeof(c));
}
return 0;
}

前缀和代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=100011,M=1011;
int n,m,Cnt,K,s[M<<1][M],x[N],y[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
while (scanf("%d%d",&n,&m)==2){
rr long long dp[5]={0,0,0,0,0};
memset(s,0,sizeof(s)),K=m<<1;
for (rr int i=1;i<=n;++i)
x[i]=iut(),y[i]=iut(),++s[x[i]][y[i]];
for (rr int i=1;i<=m;++i)
for (rr int j=1;j<=m;++j)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
for (rr int i=1;i<=n;++i)
if (x[i]<y[i]){
rr int px=x[i],py=y[i]-(x[i]+1==y[i]);
dp[3]+=s[px-1][m]-s[px-1][py-1];
dp[2]+=s[m][m]-s[px-1][m]-s[m][py-1]+s[px-1][py-1];
}
for (rr int i=1;i<=m;++i)
for (rr int j=1;j<=m;++j) s[i][j]=0;
for (rr int i=1;i<=n;++i) x[i]-=y[i]-m,++s[x[i]][y[i]];
for (rr int i=1;i<=K;++i)
for (rr int j=1;j<=m;++j)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
for (rr int i=1;i<=n;++i){
rr int T=x[i]<m,F=x[i]+y[i]-m,G=y[i]-(F+1==y[i]);
rr int TEMP=s[K][m]-s[m-1][m]-s[K][F-1]+s[m-1][F-1];
dp[3+T]+=s[m-1][F-1],dp[1+T]+=TEMP;
dp[2+T]+=s[K][m]-TEMP-s[m-1][F-1];
if (!T) continue;
dp[2]-=s[K][m]-s[m-1][m]-s[K][G-1]+s[m-1][G-1];
dp[3]-=s[m-1][m]-s[m-1][G-1];
}
printf("%lld %lld %lld %lld\n",dp[1],dp[2],dp[3],dp[4]);
}
return 0;
}

吐槽和膜拜时间

两位出题人出的题都是码题难度不高,思维难度不低的题目

其中K题所花的改题时间更多了那么一两个月233

吐槽树状数组开了O2比前缀和不开O2还要慢

主要聊一聊K题,历程大概是这样的

两个月,什么也不会,干聊纯属浪费时间;

一个月,学习高中数学;一个月,改完K题

其中大概只有一个月时间是没有被浪费掉的

其实我一开始觉得题目超级难,主要是想起了不堪回首的记忆

但其实说难不难,BPM没有一味地去帮助我,而是让我自己去思考,

虽然有点不情愿,但是我觉得很有道理,

想起考完\(CSP-S\)之后\(WYC\)也给我提出了一些建议

好吧,不管怎么说一模加油,不要丢脸

upd:20200410

#动态规划,组合计数,树状数组,前缀和#F 简单计数题&K 最简单的题的更多相关文章

  1. Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)

    题目链接:http://codeforces.com/contest/703/problem/D 给你n个数,m次查询,每次查询问你l到r之间出现偶数次的数字xor和是多少. 我们可以先预处理前缀和X ...

  2. HDU 6348 序列计数 (树状数组 + DP)

    序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  3. 51nod 1081 子段求和(线段树 | 树状数组 | 前缀和)

    题目链接:子段求和 题意:n个数字序列,m次询问,每次询问从第p个开始L长度序列的子段和为多少. 题解:线段树区间求和 | 树状数组区间求和 线段树: #include <cstdio> ...

  4. FZU2013 A short problem —— 线段树/树状数组 + 前缀和

    题目链接:https://vjudge.net/problem/FZU-2013  Problem 2013 A short problem Accept: 356    Submit: 1083Ti ...

  5. MooFest 树状数组 + 前缀和

    比较友好的数据结构题 建议读者好好思考思考--. 可以分析出与前缀和的关系, 之后就愉快的套起树状数组辣 #include <cstdio> #include<queue> # ...

  6. ACM学习历程—HDU5700 区间交(树状数组 && 前缀和 && 排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=5700 这是这次百度之星初赛2B的第五题.省赛回来看了一下,有这样一个思路:对于所有的区间排序,按左值排序. 然后 ...

  7. CSU - 1551 Longest Increasing Subsequence Again —— 线段树/树状数组 + 前缀和&后缀和

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1551 题意: 给出一段序列, 删除其中一段连续的子序列(或者不删), 使得剩下的序列 ...

  8. [USACO17JAN] Promotion Counting晋升者计数 (树状数组+dfs)

    题目大意:给你一棵树,求以某节点为根的子树中,权值大于该节点权值的节点数 本题考查dfs的性质 离散+树状数组求逆序对 先离散 我们发现,求逆序对时,某节点的兄弟节点会干扰答案 所以,我们在递推时统计 ...

  9. 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】

    先学习下LIS最长上升子序列 ​ 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...

  10. BZOJ 3787 Gty的文艺妹子序列(分块+树状数组+前缀和)

    题意 给出n个数,要求支持单点修改和区间逆序对,强制在线. n,m<=50000 题解 和不带修改差不多,预处理出smaller[i][j]代表前i块小于j的数的数量,但不能用f[i][j]代表 ...

随机推荐

  1. unrar命令

    解压提取RAR压缩文件 语法格式:unrar 参数 压缩包 常用参数 e 将文件解压缩到当前目录 o - 不要覆盖现有文件 l 显示文件列表 p 设置压缩包密码 p 将文件显示到标准输出 r 递归处理 ...

  2. Kotlin 协程二 —— 通道 Channel

    目录 一. Channel 基本使用 1.1 Channel 的概念 1.2 Channel 的简单使用 1.3 Channel 的迭代 1.4 close 关闭 Channel 1.5 Channe ...

  3. 基于Python GDAL为长时间序列遥感图像绘制时相变化曲线图

      本文介绍基于Python中gdal模块,对大量多时相栅格图像,批量绘制像元时间序列折线图的方法.   首先,明确一下本文需要实现的需求:现有三个文件夹,其中第一个文件夹存放了某一研究区域原始的多时 ...

  4. Html飞机大战(十一): 飞机撞毁爆炸

    好家伙,这篇写英雄撞机爆炸   我们先把子弹销毁弄上去 子弹穿过敌机,敌机爆炸后消失,子弹同样也应该销毁,(当然后续会考虑穿甲弹)   然后我们还要把主角碰撞爆炸检测也加上去   因为他们共用一个思路 ...

  5. 【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集

    问题描述 写代码的过程中,时常遇见要通过代码请求其他HTTP,HTTPS的情况,以下是收集各种语言的请求发送,需要使用的代码或命令 一:PowerShell Invoke-WebRequest htt ...

  6. 【Azure 事件中心】 Event Grid(事件网格)+Azure Functions处理IOT Hub中的消息

    问题描述 使用IOT Hub的Events功能,使用Event Grid(事件网格)订阅IOTHub状态消息,发送到Azure Functions.那如何来创建Event Grid触发的Functio ...

  7. 百度爱番番基于图技术、流式计算的实时CDP建设实践

    导读:随着营销3.0时代的到来,企业愈发需要依托强大CDP能力解决其严重的数据孤岛问题,帮助企业加温线索.促活客户.但什么是CDP.好的CDP应该具备哪些关键特征?本文在回答此问题的同时,详细讲述了爱 ...

  8. body标签下莫名奇妙多了一行空行,原来是编码的问题

    之前为了方便,直接在服务器修改文件,然后点保存,但是问题来了,在顶部莫名奇妙多了一个空行,如图1 图1 原来在源代码编辑的代码如图2 图2 但是在FF或者Chrome外部样式却在body里面,而不是h ...

  9. 在winform中如何嵌入第三方软件窗体✨

    相关win32api的学习 SetParent [DllImport("user32.dll ", EntryPoint = "SetParent")] pri ...

  10. Docker安装好后服务启动不了

    安装 安装方式参考地址:https://www.docker.org.cn/book/install/install-docker-on-rhel-29.html 问题 安装好后启动不了服务器.查看状 ...