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 突然就上黄了感觉下一场就掉回去了啊。

最新文章

  1. iOS开发之新浪微博山寨版代码优化
  2. oracle之rownum(伪列)
  3. Eclipse 3.5使用dropins的插件安装方式
  4. 1、iOS9 HTTP 不能正常使用的解决办法
  5. sql 联合查询并更新
  6. zookeeper_笔记
  7. [Mac]使用xcode命令行编译protobuf
  8. 鉴客 C# 抓取页面(带认证)
  9. mysql进阶(三)游标简易教程
  10. 详解TCP三次握手
  11. EF三种编程方式图文详解
  12. Python给照片换底色(蓝底换红底)
  13. /etc/shadow中密码段的生成方式
  14. 循环队列 &amp; 栈的共用空间
  15. 319. Bulb Switcher
  16. 这才是真正的裸眼3D!超级震撼!!
  17. vscode &quot;没有活动的源代码控制提供程序&quot; 解决办法
  18. HTTP笔记(二)
  19. c++ 判断容器A是否是容器B的子集,如果是,返回true(includes)
  20. Android版本分布——2017年5月更新

热门文章

  1. Zabbix 3.x中使用Percona Monitoring Plugins监控MySQL
  2. JS对象和数组在谷歌浏览器中引用存储的表现
  3. JQuery中使用FormData异步提交数据和提交文件
  4. 微信小程序引用iconfont图标字体解决方案;
  5. 一个好用的C# HttpHelper类
  6. Python学习:If 语句与 While 语句
  7. python 排列组合
  8. 怎么修复网站漏洞之metinfo远程SQL注入漏洞修补
  9. AHOI2018 (暨HNOI2018)编外滚粗记
  10. java 单例模式(singleton)