2021 10.26 模拟测试
\(\mathrm{T1}\)
\(\mathrm{Solution}\)
我们可以记录一个\(cnt[x]\)表示到第\(i\)个操作要让答案是\(x\)的最小操作数。
显然对于操作一等同于将\(cnt[p]\)清零,将除\(p\)以外的所有\(cnt \)
而对于操作2则是将\(cnt[q]\)更新为\(\min(cnt[p],cnt[q])\),而\(cnt[p] \)
但这样做是\(O(n^2)\)的,所以只需要把操作一的区间加法优化为O(1)即可
#包括ebit/stdc .h
#首先定义船方不负担装货费用
#定义硒秒
#在已读()中定义
使用命名空间标准;
内联int read()
{
int data=0,w=1;char ch=getchar();
while((ch'0'||ch'9')ch!='-')ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch=' 0 ' ch=' 9 ')data=(data 3)(data 1)ch-' 0 ',ch=getchar();
返回数据* w;
}
内联无效写入(int x)
{
if(x0) putchar('-'),x=-x;
if(x9)写(x/10);
putchar(x 48);
}
const int N=1e 7 5;
int n,lzy
int cnt[N],懒惰[N];
int main()
{
//freopen('order.in ',' r ',stdin);
//freopen('order.out ',' w ',stdout);
n=in
memset(cnt,-1,sizeof(CNT));
CNT[1]=0;
for(int I=1;I=n;(一)
{
int op=in
if(op==1)
{
lzy
//for(int I=1;I=n;(一)
//if(~ CNT[I])CNT[I];
int p=in
CNT[p]=0;懒惰[p]=lzy;
}
if(op==2)
{
int p=in,q=in
if(~ CNT[p]((CNT[q]lzy-lazy[q])(CNT[p]lzy-lazy[p])| | CNT[q]===-1))
cnt[q]=cnt[p],lazy[q]=lazy[p];
if(~ CNT[p])CNT[p];
}
//cout 1 ' \ n ';
//cout CNT[2]' \ n ';
}
for(int I=1;I=n;i ) //write(cnt[i]),放char(');
写(~ CNT[I]CNT[I]lzy-lazy[I]:-1),放char(');
}
/*
5
2 1 4
1 3
2 3 5
1 2
1 5
*/
\(\mathrm{T2}\)
\(\mathrm{Solution}\)
对于暴力枚举点是\(O(n^2)\)的,但是发现每一个点对答案的贡献只有自己的度数减去与其他点的连的边的个数,而度数最多只有\(\sqrt{m}\)个,所以如果我们先不考虑重边而去枚举度数的话效率是\(O(m)\)的,最后在枚举点去把重复的点删掉即可
效率\(O(n)m \)
为什么最多只有\(\sqrt{m}\)个呢,因为对于所有点来说度数之和为\(2m\),而最坏情况就是\(1 2 …… k=2m\),解得\(k\)约等于\(\sqrt{m}\)
#包括ebit/stdc .h
#首先定义船方不负担装货费用
#定义硒秒
#定义pii pairint,int
#定义国会议员制作对
#定义整数长
#在已读()中定义
使用命名空间标准;
内联int read()
{
int data=0,w=1;char ch=getchar();
while((ch'0'||ch'9')ch!='-')ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch=' 0 ' ch=' 9 ')data=(data 3)(data 1)ch-' 0 ',ch=getchar();
返回数据* w;
}
内联无效写入(int x)
{
if(x0) putchar('-'),x=-x;
if(x9)写(x/10);
putchar(x 48);
}
const int N=1e 6 5;
int n,m,Q,rd[N],t[N];
int a[N1];
向量[N];
vectorpiic
签名main()
{
n=in,m=in
for(int i=1,u,v;I=m;(一)
{
u=in,v=in
e[u].push _ back(v);
if(u!=v) e[v].push _ back(u);
}
for(int I=1;I=n;i ) t[rd[i]=e[i].size()];
for(int I=0;I=m;i ) if(t[i]0) c.push_back(mp(i,t[I]);
for(int I=0;IC。size();(一)
for(int j=I;JC。size();j)
if(i==j) a[c[i].fi c[i].fi]=(c[i].se*(c[i]).se-1))1;
否则a[c[I]].金融情报中心.fi]=c[i].se*c[j].se;
for(int u=1;u=n;u)
{
静态int CNT[N];
for(int v:e[u])
if(vu)CNT[v];
for(int v:e[u])
if(cnt[v])
{
a[rd[u]rd[v]]-;
a[rd[u]rd[v]-CNT[v]];
CNT[v]=0;
}
}
for(int I=m1;~我;-I)a[I]=a[I 1];
Q=in
而(Q -)写(a[in 1]),puts(');
}
\(\mathrm{T3}\)
\(\mathrm{Solution}\)
设\(dp[i][mov]\)表示考虑第\(i\)个到第\(n\)个操作,能有至少一次到当前位置\(mov\)的概率
转移即
\[DP[I][mov]=p \乘以dp[i 1][mov]
\]\[DP[I][mov a[I]]=(1-p)\乘以dp[i 1][mov]
\]\[dp[i][0]=1
\]最后\(dp[1][i]\)就是答案
#包括ebit/stdc .h
#在已读()中定义
使用命名空间标准;
内联int read()
{
int data=0,w=1;char ch=getchar();
while(ch!='-'(ch ' 0 ' | | ch ' 9 ')ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch=' 0 ' ch=' 9 ')data=(data 3)(data 1)ch-' 0 ',ch=getchar();
返回数据* w;
}
内联无效写入(int x)
{
if(x0) putchar('-'),x=-x;
if(x9)写(x/10);
putchar(x"0”);
}
const int mod=998244353
const int N=5e 3 5;
const int _ 100=828542813
整数N,p,a[N];
N1;
内联int add(int a,int B){ return a B=moda B- mod : a B;}
inline int mul(int a,int b){ return(1ll * a * b)% mod;}
inline int dec(int a,int b){ return a-b0a-b mod : a-b;}
void solve()
{
f[n ^ 1][n]=1;int l=0,r=0;
for(int I=n;我;我)
{
a[I]==1r : l;
for(int j=N-l;j=N r;j)
{
f[i][j]=add(f[i][j],mul(p,f[I 1][j]);
f[i][j a[i]]=add(f[i][j a[i]],mul(dec(1,p),f[I 1][j]);
}
f[I][N]=1;
}
for(int I=N-N;i=N n(一)
write(f[1][i]),puts(');
}
int main()
{
n=in,p=mul(in,_ 100);
for(int I=1;I=n;I)a[I]=in;
puts(' 0 ');solve();
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/51629.html