热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NOIP模拟测试17&18

NOIP模拟测试17&1817-T1给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是?特判比值为1的情况,预处理比值2~10

NOIP模拟测试17&18

17-T1

给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是?

特判比值为1的情况,预处理比值2~1000的幂,存map里。接下来枚举左端点,算出比值,枚举右端点,用平衡树便携判断某个数是否已经在区间内出现过。

#include
using namespace std;
inline long long read()
{
long long x=0,fh=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
while(ch>='0' && ch<='9'){x=(x<<1LL)+(x<<3LL)+(ch^48LL);ch=getchar();}
return x*fh;
}
const int maxn=1e5+5;
const int mod=1e5+3;
const long long INF=1000000000000000000ll;
map fr;
long long a[maxn],mmax,mmin;
int ans=1,h[maxn],tot=1,n;
struct hash{
int num,nxt;
long long val;
}b[maxn<<4];
set s;
int main(){
for(unsigned long long i=1000;i>=2;i--)
{
for(unsigned long long j=i;j<=INF;j*=i)
{
if(j==0)
break;
fr[(long long)j]=i;
}
}
memset(h,-1,sizeof(h));
n=read();
long long lat=0;
int cnt=0;
for(int i=1;i<=n;i++){
a[i]=read();
if(a[i]==lat)
{
cnt++;
}
else
{
lat=a[i];
cnt=1;
}
ans=max(ans,cnt);
}
for(int l=1;l {
s.clear();
s.insert(a[l]);
mmax=max(a[l],a[l+1]);
mmin=min(a[l],a[l+1]);
if(mmin==mmax || mmax%mmin)
continue;
s.insert(a[l+1]);
int gys=fr[mmax/mmin];
ans=max(ans,2);
for(int r=l+2;r<=n;r++){
if(s.find(a[r])!=s.end())
break;
s.insert(a[r]);
mmax=max(a[r],a[r-1]);
mmin=min(a[r],a[r-1]);
if(mmax%mmin!=0)
break;
if(fr[mmax/mmin]!=gys)
break;
ans=max(ans,r-l+1);
}
}
printf("%d\n",ans);
return 0;
}



17-T2

对一个节点进行一次”精彩操作”付出的时间代价是这个节点到根节点路径上的轻边数量.

根节点自身进行精彩操作的代价一定是0.我们只关注最坏情况下的时间复杂度,求出每个节点进行一次精彩操作的代价,然后在这些代价中取最大值,就得到了这棵树此时的最坏时间复杂度.

每一个非叶节点将在它的所有儿子中等概率随机选择一个作为重儿子.给出一棵树,按上面的方式随机选择重儿子,求最坏时间复杂度的期望 \(mod1e9+7\)

设 \(f[i][j]\) 为以ii为根节点的子树中最坏时间复杂度小于等于jj的概率设 \(g[i][j]\) 为当前扫到的以ii为父亲节点的所有儿子最坏时间复杂度小于等于 \(j\) 的概率之和.

枚举当前哪一个节点充当重儿子、所有儿子、枚举最坏时间复杂度 \(k\).

如果第二重循环中枚举的儿子恰好是重儿子的话,那么父亲节点的最坏时间复杂度为 \(k\) 的情况可以由两种情况转移过来.

1.重儿子的时间复杂度恰好为 \(k\) 的概率乘上其它儿子时间复杂度小于等于 \(k\) 的概率

2.其它儿子的时间复杂度恰好为 \(k\) 的概率乘上重儿子的时间复杂度小于等于 \(k\) 的概率.


#includeusing namespace std;const int N=5000,M=10000,mod=1e9+7;struct bian{
int nxt,to;}b[M];int head[N],cnt,n,son[N],fa[N],root=1,siz[N];long long ans,f[N][N],g[N],h[N];void add(int from,int to){
b[++cnt].nxt=head[from];
b[cnt].to=to;
head[from]=cnt;}int qp(int a,int b){
int rec=1;
while(b>0)
{
if(b&1)
{
rec=1LL*rec*a%mod;
}
a=1LL*a*a%mod;
b>>=1;
}
return rec;}void dfs(int u){
siz[u]=1;
int i=head[u],v;
while(i)
{
v=b[i].to;
if(v!=fa[u])
{
dfs(v);
siz[u]+=siz[v];
}
i=b[i].nxt;
}
int p=qp(son[u],mod-2);
i=head[u];
while(i)
{
v=b[i].to;
if(v==fa[u])
{
i=b[i].nxt;
continue;
}
for(int j=0;j<=n;j++)
g[j]=1;
int j=head[u],v2;
while(j)
{
v2=b[j].to;
if(v2==fa[u])
{
j=b[j].nxt;
continue;
}
for(int k=0;k<=siz[v2]+1;k++)
{
long long qt=g[k],xz=f[v2][k];
if(k)
{
qt-=g[k-1];
xz-=f[v2][k-1];
}
if(v==v2)
{
h[k]=(qt*f[v2][k]%mod+xz*g[k]%mod-xz*qt%mod+mod)%mod;
}
else
{
xz=f[v2][k-1];
if(k>1)
xz-=f[v2][k-2];
h[k]=(qt*f[v2][k-1]%mod+xz*g[k]%mod-xz*qt%mod+mod)%mod;
}
}
g[0]=h[0],h[0]=0;
for(int k=1;k<=siz[v2]+1;k++)
{
g[k]=(g[k-1]+h[k])%mod;
h[k]=0;
}
j=b[j].nxt;
}
for(int j=siz[u];j>=1;j--)
{
g[j]=(g[j]-g[j-1]+mod)%mod;
}
if(u==1)
{
int xxx;
xxx++;
}
for(int j=0;j<=siz[u];j++){
f[u][j]=(f[u][j]+g[j]*p%mod)%mod;
}
i=b[i].nxt;
}
if(son[u]==0)
f[u][0]=1;
for(int i=1;i<=siz[u]+1;i++)
{
f[u][i]=(f[u][i]+f[u][i-1])%mod;
}}int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&son[i]);
for(int j=1,v;j<=son[i];j++)
{
scanf("%d",&v);
fa[v]=i;
add(i,v);
add(v,i);
}
}
while(fa[root])
root=fa[root];
dfs(root);
for(int i=1;i<=n;i++)
{// cout< ans=(ans+1LL*i*(f[root][i]-f[root][i-1]+mod)%mod+mod)%mod;
}
printf("%lld\n",ans);
return 0;}



17-T3

在学生的联名提议下,HZ决定在校园内建造一个新型游乐场。

游乐场一共有n个项目,在不同的项目之间有一些走廊相连。

为了保证学生能顺利的游玩完游乐场的每个项目,一个建造方案需要满足以下的条件:将游乐园抽象为一张图,把走廊视为无向边,整张图无重边,无自环。可以通过恰好一次操作使得图中存在一条欧拉回路(从某个点出发经过所有边恰好一次并最终回到起点的路径),其中操作可以是添加一条不在图中的边或是删去一条图中的边。要求操作后的图仍满足条件1,且图中任意两点可以互相到达。设计游乐场布局的任务被委托给了学生会会长小R,小R想先统计出所有的方案,但她数数向来数不清,所以你能不能帮小R统计一下一共有多少种建造方案。

一句话题意:求 \(n\)个点任意连无向边组成的欧拉回路种类乘\(C_{n}^{2}\)

引理

1.无向连通图奇数出度的点个数为偶数.

2.度数均为偶数的无向联通图为欧拉回路.

设:

\(f[i]\) 表示 \(i\) 个点任意连无向边组成的欧拉回路种类.

\(g[i]\) 表示 \(i-1\) 个点任意连无向边组成的图种类.显然有 \(g[i]=2^{C_{i}^{2}}\)

\(i-1\) 个点的无向连通图向 \(i\) 点连成欧拉回路的充要条件是,将原图中奇数出度的点与 \(i\) 点连接。

我们运用容斥,\(f[i]=g[i]-\sum_{j=1}^{i-1}f[j]g[i-j]C_{i-1}^{j-1}\)

(总情况减去不连通的)

#include
#define N 5000
using namespace std;
const int mod=1e9+7;
inline int read()
{
int s=0,w=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
int n;
long long C[N][N],p[N],f[N];
long long qp(long long a,long long b)
{
long long rec=1;
while(b>0)
{
if(b&1)
{
rec*=a;
rec%=mod;
}
a*=a;
a%=mod;
b>>=1;
}
return rec;
}
int main()
{
n=read();
for(int i=0;i<=n;i++)
C[i][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=i;j++)
// {
// printf("%lld ",C[i][j]);
// C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
// }
// puts("");
// }
for(int i=1;i<=n;i++)
p[i]=qp(2,C[i-1][2]);
for(int i=1;i<=n;i++)
{
long long sum=0;
f[i]=p[i];
for(int j=1;j<=i-1;j++)
{
f[i]-=f[j]*p[i-j]%mod*C[i-1][j-1]%mod;
f[i]%=mod;
}
f[i]=((f[i]%mod+mod)%mod+mod)%mod;
}
printf("%lld\n",((f[n]*C[n][2]%mod+mod)%mod+mod)%mod);
return 0;
}
/*
欧拉回路:无向图的每个节点的度数都是偶数度
无向图奇数度的点一定为偶数
n^2递推,f[i]表示i个点的欧拉回路最终图种类数
最终答案为f[n]*C[n][2]
不合法的转移
j个点的欧拉回路
*/


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有