Codeforces Round #518 Div. 1没翻车记
2024-09-02 14:21:18
A:设f[i][j][0/1]为前i个数第i位为j且第i位未满足/已满足限制的方案数。大力dp前缀和优化即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 100010
#define P 998244353
#define K 200
int n,a[N],f[N][K+][],g[N][K+][];//0 there is limit
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read();
for (int i=;i<=n;i++) a[i]=read();
f[][][]=;
for (int i=;i<=K;i++) g[][i][]=;
for (int i=;i<=n;i++)
{
if (a[i]!=-)
{
inc(f[i][a[i]][],(g[i-][K][]-g[i-][a[i]-][]+P)%P);
inc(f[i][a[i]][],f[i-][a[i]][]);
inc(f[i][a[i]][],g[i-][a[i]-][]),inc(f[i][a[i]][],g[i-][a[i]-][]);
}
else
{
for (int j=;j<=K;j++)
{
inc(f[i][j][],(g[i-][K][]-g[i-][j-][]+P)%P);
inc(f[i][j][],f[i-][j][]);
inc(f[i][j][],g[i-][j-][]),inc(f[i][j][],g[i-][j-][]);
}
}
for (int j=;j<=K;j++)
g[i][j][]=(f[i][j][]+g[i][j-][])%P,g[i][j][]=(f[i][j][]+g[i][j-][])%P;
}
if (a[n]!=-) cout<<f[n][a[n]][];
else
{
int ans=;
for (int i=;i<=;i++) inc(ans,f[n][i][]);
cout<<ans;
}
return ;
}
B:显然若合法根一定是直径中点。跑几遍dfs。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 100010
int n,m,p[N],deep[N],fa[N],t=,root;
struct data{int to,nxt;
}edge[N<<];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k)
{
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k])
{
deep[edge[i].to]=deep[k]+;
fa[edge[i].to]=k;
dfs(edge[i].to);
}
}
bool check(int k)
{
bool flag=;
int x=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k]) x++;
if (x==) return deep[k]==m;
if (x>=)
{
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=fa[k]) flag=flag&&check(edge[i].to);
}
else flag=;
return flag;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
n=read(),m=read();
for (int i=;i<n;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
dfs();
for (int i=;i<=n;i++) if (deep[i]>=deep[root]) root=i;
memset(deep,,sizeof(deep));
memset(fa,,sizeof(fa));
dfs(root);
for (int i=;i<=n;i++) if (deep[i]>=deep[root]) root=i;
if (deep[root]!=m*) {cout<<"No";return ;}
for (int i=;i<=m;i++) root=fa[root];
memset(deep,,sizeof(deep));
memset(fa,,sizeof(fa));
dfs(root);
if (check(root)) cout<<"Yes";
else cout<<"No";
return ;
}
一题20min感觉非常友好。然后一看C是构造就弃了。D一点不会。E看不懂。hack不动。一个多小时无所事事地看着排名往下掉。
难得手速快了一次?
result:rank 95 rating +83 突然就上黄了感觉下一场就掉回去了啊。
最新文章
- iOS开发之新浪微博山寨版代码优化
- oracle之rownum(伪列)
- Eclipse 3.5使用dropins的插件安装方式
- 1、iOS9 HTTP 不能正常使用的解决办法
- sql 联合查询并更新
- zookeeper_笔记
- [Mac]使用xcode命令行编译protobuf
- 鉴客 C# 抓取页面(带认证)
- mysql进阶(三)游标简易教程
- 详解TCP三次握手
- EF三种编程方式图文详解
- Python给照片换底色(蓝底换红底)
- /etc/shadow中密码段的生成方式
- 循环队列 &; 栈的共用空间
- 319. Bulb Switcher
- 这才是真正的裸眼3D!超级震撼!!
- vscode ";没有活动的源代码控制提供程序"; 解决办法
- HTTP笔记(二)
- c++ 判断容器A是否是容器B的子集,如果是,返回true(includes)
- Android版本分布——2017年5月更新