NOIP模拟87(多校20)
前言
题目不难,但是个人感觉小细节有一些,然后有亿点卡常。。
感觉对于笛卡尔树的题目看不出算法,然后代码实现方面细节注意太少,常数有点大。
下次注意吧。
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]\) 这个区间中,我们是不会尝试下一个的,因为有风险。
于是这个区间的期望值就是:
\]
从最后一位直接推回去就好了。
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)\) 。
\]
考虑优化,发现最后面的那一项可以整除分块,同时对于 \(\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)的更多相关文章
- NOIP模拟83(多校16)
前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...
- Noip模拟81 2021.10.20
T1 语言 比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数.... 所以就枚举动词的位置,找前面后面有没有出现$4$即可 1 #include<bits/stdc++. ...
- NOIP模拟84(多校17)
T1 宝藏 解题思路 考场上一眼出 \(nlog^2\) 做法,然后没看见是 1s 3e5 的数据,我竟然以为自己切了?? 考完之后尝试着把二分改为指针的移动,然后就过了??或许是数据水吧,感觉自己的 ...
- Noip模拟57 2021.9.20
规律总结:联考必爆炸 T1 2A 没$A$掉的大水题,但是是真的不知道$000$前面的$00$也算先导$0$,以后要长记性,这种东西不能再错了 再打三遍: $000$前面的$00$也算先导$0$ $0 ...
- NOIP模拟85(多校18)
前言 好像每个题目背景所描述的人都是某部番里的角色,热切好像都挺惨的(情感上的惨). 然后我只知道 T1 的莓,确实挺惨... T1 莓良心 解题思路 首先答案只与 \(w\) 的和有关系,于是问题就 ...
- NOIP模拟92(多校25)
前言 所以说这次是 HZOI 多校联测巅峰????(题目,数据过水??) T1 石子合并 解题思路 签到题. 发现我们可以给每个数字附一个正负号,每个数字的贡献就是它本身乘上这个符号. 发现至少应该有 ...
- NOIP模拟86(多校19)
T1 特殊字符串 解题思路 \(f_{i,j}\) 表示前 \(i\) 个字符中结尾为 \(j\) 的最大贡献. 转移枚举当前位置于之前位置结尾的组合加上贡献即可. 对于边界问题,容易发现选择 1 一 ...
- NOIP模拟88(多校21)
前言 对于这套题的总体感觉就是难,然后就是自己很菜... 对于 T1 考试时只会一个最垃圾的背包,考完之后对于思路这一块也不是很顺利,大概这就是薄弱的地方吧. 然后 T2 是比较简单的一道题了,但是考 ...
- NOIP模拟96(多校29)
T1 子集和 解题思路 大概是一个退背包的大白板,然而我考场上想复杂了,竟然还用到了组合数. 但是大概意思是一样的,有数的最小值一定是一个在 \(a\) 数组中存在的数字. 那么我们想办法除去它对应的 ...
- NOIP模拟99(多校31)
T1 法阵 解题思路 原题3100,张口放 T1(出题人原话) 思维题,合法的情况其实就是上下两个梯形拼起来的样子. 他们的边界都是在 \(i\) 轴上面,但是不能相交. 于是我们可以尝试两者相交的纵 ...
随机推荐
- 利用navicat实现excel转json
1.需要工具,Navicat Premium,网上有破解及安装教程 2.新建sqlite连接,选择新建sqlite3,如下图 3.接着点确定,如图 4. 5.
- Vue 路由组件传参的 8 种方式
我们在开发单页面应用时,有时需要进入某个路由后基于参数从服务器获取数据,那么我们首先要获取路由传递过来的参数,从而完成服务器请求,所以,我们需要了解路由传参的几种方式,以下方式同 vue-router ...
- Advanced .Net Debugging 7:托管堆与垃圾收集
一.简介 这是我的<Advanced .Net Debugging>这个系列的第七篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第五章,这一章主要讲的是从根本上认识托管堆和垃圾回收 ...
- CF1535F String Distance
\(CF1535F\ \ String\ Distance\) 题意 给 \(n\) 个长度均为 \(len\) 的字符串 \(T_1,T_2,\dots T_n\),定义 \(f(a,b)\) 为将 ...
- Flutter+FaaS一体化任务编排的思考与设计
作者:闲鱼技术-古风 Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业务闭环.在新的研发模式落地与实践的过程中,一直在思考如 ...
- 实时计算pv/uv Demo
简介: 本文由阿里巴巴高级技术专家邓小勇(静行)分享,主要用 Demo 演示如何通过实时计算 Flink 实时计算pv/uv的场景. 本文由阿里巴巴高级技术专家邓小勇(静行)分享,主要用 Demo 演 ...
- 好云推荐官丨飞天加速之星怎样选择云服务器ECS?
编者按:本文来自"好云推荐官"活动的技术博主投稿,作者(昵称天狼)曾入选首届"飞天加速之星",获得飞天人气奖. 你是否还在苦苦地寻找一家合适的云厂商,寻找合 ...
- 浅谈分布式一致性:Raft 与 SOFAJRaft
简介: SOFAJRaft已开源 作者 | 家纯来源 | 阿里技术公众号 一 分布式共识算法 (Consensus Algorithm) 1 如何理解分布式共识? 多个参与者针对某一件事达成完全一致: ...
- 在线工具的 UI 变迁
V1. Ref:https://www.cnblogs.com/farwish/p/16823474.html
- postman使用中问题汇总
当用postman来通过接口造数据时,读取参数化文件中身份证字段的值读取错误. 参数文件如下 选择参数文件后预览的数据如下 身份证号码全部变成了0000结尾的 解决方案: 需要将身份证号码用引号引起来 ...