前言

题目不难,但是个人感觉小细节有一些,然后有亿点卡常。。

感觉对于笛卡尔树的题目看不出算法,然后代码实现方面细节注意太少,常数有点大。

下次注意吧。

T1 集合均值

解题思路

感觉应该是期望题里面比较水的一种。

看了看范围大概的复杂度是 \(n\times m\) 是没问题了,然后看暴力分数比较丰厚,应该也不是一道难题。

枚举每一步操作,计算当前取出来的数字的期望值,然后同时算出来剩下数字的期望总和。

计算的时候除去当前数字的个数,也就是乘一个逆元,直接线性推就行了。

code

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e5+10,M=2e7+10,mod=998244353;
int n,m,ans,base,sum,inv[M];
int main()
{
freopen("mos.in","r",stdin); freopen("mos.out","w",stdout);
n=read(); m=read(); inv[1]=1; for(int i=2;i<=n*m+1;i++) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
for(int i=1,x;i<=n;i++) x=read(),sum=(sum+1ll*x*m%mod)%mod;
for(int i=1,temp;i<=n*m;i++) temp=1ll*sum*inv[n*m-i+1]%mod,base=(base+temp)%mod,ans=(ans+1ll*base*inv[i+1])%mod,sum=(sum-temp+mod)%mod;
printf("%d",ans);
return 0;
}

T2 聚烷撑乙二醇

解题思路

也是期望,但是相较于上一个题目有一小点的难度,边界需要注意,还有就是精度问题了。

发现正着去推有一点困难,于是我们选择反推,这样我们就可以得出来每一步的期望值了。

假设当前的区间是 \(L_i,R_i\) 下几个区间的最优策略期望值是 \(p\) 。

那么显然如果随机出来的数字在 \([L_i,p]\) 这个区间中的话我们一定是会选择尝试下一个的,毕竟风险比较低。

同样的道理如果随机出来的数字在 \((p,R_i]\) 这个区间中,我们是不会尝试下一个的,因为有风险。

于是这个区间的期望值就是:

\[\displaystyle p_i=\dfrac{p-L_i}{R_i-L_i}\times p+(1-\dfrac{p-L_i}{R_i-L_i})\times\dfrac{R_i+p}{2}
\]

从最后一位直接推回去就好了。

code

#include<bits/stdc++.h>
#define int long long
#define double long double
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e6+10;
int n;
double ans,l[N],r[N];
#undef int
int main()
{
#define int long long
freopen("pag.in","r",stdin); freopen("pag.out","w",stdout);
n=read(); for(int i=1;i<=n;i++) l[i]=read(),r[i]=read();
ans=(l[n]+r[n])/2.0;
for(int i=n-1;i>=1;i--)
{
if(l[i]>=ans){ans=(l[i]+r[i])/2.0;continue;}
if(r[i]<=ans||l[i]==r[i]) continue;
ans=(ans-l[i])/(r[i]-l[i])*ans+(1-(ans-l[i])/(r[i]-l[i]))*(r[i]+ans)/2.0;
}
printf("%.5Lf",ans);
return 0;
}

T3 技术情报局

解题思路

真的没看出来是笛卡尔树,但是貌似如果模数是质数的话可以直接 单调栈+前缀和 过掉。

然后对于这个题,单调栈+前缀和 加上暴扫单调栈就可以获得 75pts 的高分 code

发现对于最大值的维护可以直接建立一个大根笛卡尔树,然后每次将子树的信息合并上来就好了。

大概做法就是维护一个随着坐标的增加升序或者降序的和。

假设当前最大值是 \(maxn\) 。

不算中间值的左边的和 \(suf=L_1+L_1\times L_2+L_1\times L_2\times L_3···\)

不算中间值的右边的和 \(pre=R_1+R_1\times R_2+R_1\times R_2\times R_3···\)

于是当前的点的贡献就是 \((suf+1)\times(pre+1)\times maxn^2\)

对于信息的合并再维护一个子树内数字的乘积就好了。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
#define ls son[x][0]
#define rs son[x][1]
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
namespace GenHelper
{
unsigned z1, z2, z3, z4, b;
unsigned rand_()
{
b = ((z1 << 6) ^ z1) >> 13;
z1 = ((z1 & 4294967294U) << 18) ^ b;
b = ((z2 << 2) ^ z2) >> 27;
z2 = ((z2 & 4294967288U) << 2) ^ b;
b = ((z3 << 13) ^ z3) >> 21;
z3 = ((z3 & 4294967280U) << 7) ^ b;
b = ((z4 << 3) ^ z4) >> 12;
z4 = ((z4 & 4294967168U) << 13) ^ b;
return (z1 ^ z2 ^ z3 ^ z4);
}
}
const int N=1e7+10;
int n,ans,top,root,mod,sta[N],s[N],son[N][2],pre[N],suf[N],bas[N];
void init()
{
using namespace GenHelper;
int L,R,cnt=0; unsigned S;
n=read(); S=read(); L=read(); R=read();
z1 = S;
z2 = unsigned((~S) ^ 0x233333333U);
z3 = unsigned(S ^ 0x1234598766U);
z4 = (~S) + 51;
for (int i = 1; i <= n; i++)
{
int x = rand_() & 32767;
int y = rand_() & 32767;
s[++cnt]=L + (x * 32768 + y) % (R - L + 1);
}
}
void dfs(int x)
{
bas[x]=s[x];
if(ls) dfs(ls),bas[x]=bas[x]*bas[ls]%mod;
if(rs) dfs(rs),bas[x]=bas[x]*bas[rs]%mod;
ans=(ans+(suf[ls]+1)*(pre[rs]+1)%mod*s[x]%mod*s[x])%mod;
pre[x]=(pre[ls]+bas[ls]*s[x]%mod*(pre[rs]+1)%mod)%mod;
suf[x]=(suf[rs]+bas[rs]*s[x]%mod*(suf[ls]+1)%mod)%mod;
}
#undef int
int main()
{
#define int long long
freopen("tio.in","r",stdin); freopen("tio.out","w",stdout);
init(); mod=read();
for(int i=1;i<=n;i++)
{
while(top&&s[sta[top]]<s[i]) son[i][0]=sta[top--];
if(top) son[sta[top]][1]=i; sta[++top]=i;
}
while(top) root=sta[top--]; bas[0]=1; dfs(root);
printf("%lld",ans);
return 0;
}

T4 肯德基

解题思路

看到这个题目很难不想起 zxb 之前讲的 记忆这道题。

对于 80pts 做法可以容斥着去求,容斥系数是 \(\mu(i)\) 。

\[\displaystyle ans=\sum \mu(i)\times i^2\times \dfrac{\lfloor\frac{n}{i^2}\rfloor\times(\lfloor\frac{n}{i^2}\rfloor+1)}{2}
\]

考虑优化,发现最后面的那一项可以整除分块,同时对于 \(\mu(i)\times i^2\) 做一个前缀和就好了。

code

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"RP++"<<endl
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=1e7+10;
int T,cnt,pri[N],mu[N];
ull ans,n,pre[N];
bool vis[N];
inline void pre_work(int lim)
{
mu[1]=1;
for(int i=2;i<=lim;i++)
{
if(!vis[i]) pri[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&pri[j]*i<=lim;j++)
{
vis[pri[j]*i]=true;
if(i%pri[j]) mu[pri[j]*i]=-mu[i];
else break;
}
}
for(int i=1;i<=lim;i++) pre[i]=pre[i-1]+mu[i]*i*i;
}
inline ull mul(ull x){if(x&1) return (x+1)/2*x;return x/2*(x+1);}
inline void solve()
{
n=read(); ans=mul(n);
for(ull l=2,r;l*l<=n;l=r+1)
{
r=sqrt(n/(n/(l*l)));
ull temp=n/(l*l),num=mul(temp);
ans+=(pre[r]-pre[l-1])*num;
}
printf("%llu\n",ans);
}
#undef int
int main()
{
#define int long long
freopen("kfc.in","r",stdin); freopen("kfc.out","w",stdout);
pre_work(10000000); T=read(); while(T--) solve(); return 0;
}

NOIP模拟87(多校20)的更多相关文章

  1. NOIP模拟83(多校16)

    前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...

  2. Noip模拟81 2021.10.20

    T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...

  3. NOIP模拟84(多校17)

    T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...

  4. Noip模拟57 2021.9.20

    规律总结:联考必爆炸 T1 2A 没$A$掉的大水题,但是是真的不知道$000$前面的$00$也算先导$0$,以后要长记性,这种东西不能再错了 再打三遍: $000$前面的$00$也算先导$0$ $0 ...

  5. NOIP模拟85(多校18)

    前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...

  6. NOIP模拟92(多校25)

    前言 所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??) T1 石子合并 解题思路 签到题. 发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号. 发现至少应该有 ...

  7. NOIP模拟86(多校19)

    T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...

  8. NOIP模拟88(多校21)

    前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...

  9. NOIP模拟96(多校29)

    T1 子集和 解题思路 大概是一个退背包的大白板,然而我考场上想复杂了,竟然还用到了组合数. 但是大概意思是一样的,有数的最小值一定是一个在 \(a\) 数组中存在的数字. 那么我们想办法除去它对应的 ...

  10. NOIP模拟99(多校31)

    T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...

随机推荐

  1. sql 语句系列(月份的第一天和最后一天)[八百章之第二十章]

    前言 插播一个,从给定日期值里面提取年月日时分秒. 之所以写这个是因为使用频率太高. mysql: select DATE_FORMAT(CURRENT_TIMESTAMP,'%k') hr, DAT ...

  2. arp 的概念解析

    前言 这里基于arp的基础概念,请先看前面那一节. 正文 看图: 和前面一样去解析地址. 以太网目的地址:就是mac地址. 在发送arp包的时候呢,这个mac地址就是全部是1,因为不知道对方地址是啥. ...

  3. 【.net】Error while trying to retrieve text for error ORA-06413

    [.net]Error while trying to retrieve text for error ORA-06413 系统需要,有一个外挂系统使用的是.net,出了问题,所以部署环境查询代码 但 ...

  4. KubeCon 2020 演讲集锦|《阿里巴巴云原生技术与实践 13 讲》开放下载

    2020 年 7 月 30 日至 8 月 1 日,由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 Cloud Native + Open S ...

  5. 如何在golang代码里面解析容器镜像

    ​简介:容器镜像在我们日常的开发工作中占据着极其重要的位置.通常情况下我们是将应用程序打包到容器镜像并上传到镜像仓库中,在生产环境将其拉取下来.然后用 docker/containerd 等容器运行时 ...

  6. 2019-10-31-win10-uwp-访问解决方案文件

    title author date CreateTime categories win10 uwp 访问解决方案文件 lindexi 2019-10-31 09:24:18 +0800 2018-2- ...

  7. 第一章 Jenkins安装配置

    Jenkins官网 # 官网: https://www.jenkins.iohttps://www.jenkins.io/zh/ # docker安装: https://www.jenkins.io/ ...

  8. 009_原理图中电气互连,Net alias,分页符,总线

    009_原理图中电气互连,Net alias,分页符,总线 1.电气互连,就是画线. 2.端口名,适用同一页相连的端口. 3.分页符off page connector,适用于不同页的端口连接. 4. ...

  9. Java中HTTP下载文件——并解决跨域

    1.常用的需要设置的MIME类型 任何文件(二进制文件) application/octet-stream .doc application/msword .dot application/mswor ...

  10. 还在用Jenkins?快来试试这款比Jenkins简而轻的自动部署软件!

    大家好,我是 Java陈序员. 在工作中,你是否遇到过团队中没有专业的运维,开发还要做运维的活,需要自己手动构建.部署项目? 不同的项目还有不同的部署命令,需要使用 SSH 工具连接远程服务器和使用 ...