A - Tic-Tac-Toe

直接考虑每个人8种赢的情况即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5;
char g[N][N];
int main()
{//IO;int T=1;cin>>T;while(T--){for(int i=1;i<=3;i++) cin>>g[i]+1;bool ok1=0,ok2=0;if(g[1][1]=='A'&&g[1][2]=='A'&&g[1][3]=='A') ok1=1;if(g[2][1]=='A'&&g[2][2]=='A'&&g[2][3]=='A') ok1=1;if(g[3][1]=='A'&&g[3][2]=='A'&&g[3][3]=='A') ok1=1;if(g[1][1]=='A'&&g[2][1]=='A'&&g[3][1]=='A') ok1=1;if(g[1][2]=='A'&&g[2][2]=='A'&&g[3][2]=='A') ok1=1;if(g[1][3]=='A'&&g[2][3]=='A'&&g[3][3]=='A') ok1=1;if(g[1][1]=='A'&&g[2][2]=='A'&&g[3][3]=='A') ok1=1;if(g[1][3]=='A'&&g[2][2]=='A'&&g[3][1]=='A') ok1=1;if(g[1][1]=='B'&&g[1][2]=='B'&&g[1][3]=='B') ok2=1;if(g[2][1]=='B'&&g[2][2]=='B'&&g[2][3]=='B') ok2=1;if(g[3][1]=='B'&&g[3][2]=='B'&&g[3][3]=='B') ok2=1;if(g[1][1]=='B'&&g[2][1]=='B'&&g[3][1]=='B') ok2=1;if(g[1][2]=='B'&&g[2][2]=='B'&&g[3][2]=='B') ok2=1;if(g[1][3]=='B'&&g[2][3]=='B'&&g[3][3]=='B') ok2=1;if(g[1][1]=='B'&&g[2][2]=='B'&&g[3][3]=='B') ok2=1;if(g[1][3]=='B'&&g[2][2]=='B'&&g[3][1]=='B') ok2=1;if(ok1&&ok2) cout<<"invalid\n";else if(ok1) cout<<"Yes\n";else if(ok2) cout<<"No\n";else cout<<"draw\n";}return 0;
}

B - 打 boss

如果第一次都能打死就不考虑回复血的情况
如果第一次打不死并且回血不少于掉血肯定永远打不死
人死之前最多能攻击⌈h1a2⌉\lceil\frac{h_1}{a_2} \rceil⌈a2​h1​​⌉次,如果死之前打不死(需要干掉h2+m⌈h1a2−1⌉h2+m\lceil\frac{h_1}{a_2}-1 \rceilh2+m⌈a2​h1​​−1⌉血量)那么就打不死,否则能打死。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int main()
{IO;int T=1;cin>>T;while(T--){ll h1,h2;ll a1,a2;ll m;cin>>h1>>h2>>a1>>a2>>m;if(h2<=a1) cout<<"Yes\n";else if(m>=a1) cout<<"No\n";else if(((h1+a2-1)/a2)*a1<h2+m*((h1+a2-1)/a2-1)) cout<<"No\n";else cout<<"Yes\n";}return 0;}

C - 装货物

搜索渣渣。没经历过偏分的oi没能成为搜索king

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=30;
ll w[N];
int n,m,W;
ll now[N];
bool ok;
void dfs(int u,int cnt)
{if(ok) return;//这个优化直接让我过了if(u>n){ok=1;return;}for(int i=1;i<=cnt;i++){if(now[i]+w[u]<=W){now[i]+=w[u];dfs(u+1,cnt);now[i]-=w[u];}}if(w[u]<=W&&cnt+1<=m){now[cnt+1]=w[u];dfs(u+1,cnt+1);now[cnt+1]-=w[u];}
}
int main()
{IO;int T=1;cin>>T;while(T--){cin>>n>>m>>W;for(int i=1;i<=n;i++) cin>>w[i];sort(w+1,w+1+n);reverse(w+1,w+1+n);ok=0;memset(now,0,sizeof now);dfs(1,0);if(ok) cout<<"Yes\n";else cout<<"No\n";}return 0;}

D - 回文串

学了一下manacher算法,模板++
用manacher算法求后p[i]-1即表示原字符串回文序列长度,而且经过对字符串进行添加*操作后最终每个回文字符串的最左或右端一定是*
对于本题需求不相交且长度和最大的非空回文子串,我们可以尝试枚举划分点,左边最长的回文子串+右边最长的回文子串(预处理前缀后缀即可)即可求出。

注意:由于每个回文字符串的最左或右端一定是*,一定不会出现相交的情况。
非空想想不难知道只有在整个字符串都是回文串的情况下非空才会和不非空的结果不一样(其他情况非空的结果一定更优)。我们需要特判整个字符串是回文串的情况。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=400010;
int n;
char s[N];
int p[N],lmax[N],rmax[N];
int init()
{n=strlen(s+1);for(int i=2*n;i;i-=2){s[i]=s[i/2];s[i-1]='*';}s[2*n+1]='*';s[0]='@',s[2*n+2]='&';//哨兵return 2*n+1;
}
int manacher()
{int res=0;int now=0,mx=0;for(int i=1;i<=n;i++){p[i]=i<mx?min(p[2*now-i],mx-i):1;while(s[i+p[i]]==s[i-p[i]]) p[i]++;if(i+p[i]>mx){mx=i+p[i];now=i;}res=max(res,p[i]-1);}return res;
}
int main()
{cin>>s+1;n=init();manacher();for(int i=1;i<=n;i++){int r=p[i]+i-1;rmax[r]=max(rmax[r],p[i]-1);}for(int i=n;i;i--){int l=i-p[i]+1;lmax[l]=max(lmax[l],p[i]-1);}for(int i=1;i<=n;i++) rmax[i]=max(rmax[i-1],rmax[i]);for(int i=n;i>=1;i--) lmax[i]=max(lmax[i+1],lmax[i]);int res=0;int ok=0;// 特判整个字符串都是回文串for(int i=1;i<=n;i++) if(p[i]-1==(n-1)/2) ok=1;if(ok) cout<<(n-1)/2-1<<'\n';else {for(int i=1;i<=n;i++) res=max(res,lmax[i]+rmax[i]);cout<<res<<'\n';}return 0;
}

E - 划分树

大佬题解

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=500010;
const ll mod=1004535809;
int h[N],e[2*N],ne[2*N],idx;
int n,m;
ll w[N];
ll f[N][2];
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
void dfs(int u)
{f[u][0]=1;//删除偶数条边(不删)方案数是1ll cnt1,cnt0;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];dfs(j);w[u]^=w[j];cnt0=f[u][0],cnt1=f[u][1];f[u][0]=(cnt0*f[j][0]+cnt1*f[j][1])%mod;f[u][1]=(cnt1*f[j][0]+cnt0*f[j][1])%mod;}cnt0=f[u][0],cnt1=f[u][1];if(u==1) return;// 考虑连向父亲if(w[u]==0) f[u][0]=(f[u][0]+cnt1)%mod;if(w[u]==m) f[u][1]=(f[u][1]+cnt0)%mod;}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>m;memset(h,-1,sizeof h);for(int i=2;i<=n;i++){int p;cin>>p;add(p,i);}for(int i=1;i<=n;i++) cin>>w[i];dfs(1);cout<<(f[1][0]*(w[1]==m)+f[1][1]*(w[1]==0))%mod<<'\n';}return 0;}

F有点懵,先记下来。
要加油哦~

牛客练习赛 57——manacher算法 树形dp?相关推荐

  1. 牛客练习赛52 | C | [烹饪] (DP,裴蜀定理,gcd)

    牛客练习赛52 C 烹饪 链接:https://ac.nowcoder.com/acm/contest/1084/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 327 ...

  2. 牛客练习赛26B 烟花 (概率DP)

    链接:https://ac.nowcoder.com/acm/contest/180/B 来源:牛客网 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5 ...

  3. 牛客练习赛60C 操作集锦(DP)

    题目链接 链接:https://ac.nowcoder.com/acm/contest/4853/C 来源:牛客网 题目描述 有一款自走棋有26种操作,每种操作我们都用a,b,c,d,-,x,y,z的 ...

  4. 牛客练习赛69D-火柴排队【dp】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/7329/D 题目大意 nnn个数的序列,排序后让随机kkk个数加上ddd,求依旧满足单调上升的期望概率 解题思 ...

  5. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

  6. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  7. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  8. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  9. 牛客练习赛73 D 离别(线段树+右端点排序离线查询)

    牛客练习赛73 D 离别 思路: 对于每一个固定的右端点i,我们都找到一个区间(l,r)使得区间中的点为左端点时 里面最大的的种数为k. 这个可以用队列或者vector来维护. 然后我们对于q个查询, ...

最新文章

  1. IDEA 小技巧之书签与收藏
  2. 电灯泡内通有交流电,为什么看不到灯泡在闪烁?
  3. excel文件修复工具_Windows商店上架文件恢复工具!仅8.29MB,纯净无捆绑,80%修复率...
  4. 浏览器加载和渲染html的顺序
  5. Python 多线程抓取网页
  6. java程序设计复习题_java程序设计复习大全(100题及答案).doc
  7. 如何从svn上down项目
  8. 关于空值null的排序问题 mysql 和oracle
  9. linux创建更改目录,Linux中目录的创建与删除命令使用说明
  10. 玩转 SpringBoot 2.x 之使用 SpringDataJpa 篇
  11. 7.Git的版本退回
  12. Nginx篇--解读nginx配置
  13. 保存界面cd的内容图片到本地
  14. worldpress或zblog安装时建立数据库连接时出错
  15. how-I-hacked-Facebook-again-unauthenticated-RCE-on-MobileIron-MDM笔记
  16. 网页/公众号音乐下载
  17. HDU多校第三场6608 Fansblog(米勒罗宾+威尔逊定理)
  18. 工作站 Linux 系统下无线网卡配置
  19. Hadoop学习之环境搭建和解决方案
  20. Xcode Cloud 是什么

热门文章

  1. fb静态区域_fb 静态数据
  2. python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...
  3. harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架
  4. post多个参数_关于HTTP GET和POST的区别
  5. matlab eval函数_matlab自动给变量命名
  6. 算法设计与分析——递归与分治策略——最接近点对问题
  7. leetcode209. 长度最小的子数组(暴力+滑动窗口)
  8. html语言对齐是什么意思,html – 对齐RTL语言的元素
  9. Friendly Group Gym - 102769F 2020(并查集)ccpc秦皇岛分站赛
  10. Enlarge GCD CodeForces - 1034A(欧拉筛+最大公约数)