神秘比赛,以《哈利波特》为主题……有点难。

C题我熬夜切终于是写出来了,可惜比赛结束了,气啊。

比赛链接:点我

【A】汤姆·里德尔的日记

题意:

哈利波特正在摧毁神秘人的分灵体(魂器)。第一个他见到的魂器是在密室中的日记本,现在这本日记令金妮打开了密室。

哈利波特想要知道哪些人没有被日记施魔,以确保他们不会被日记影响。

哈利波特有一个名单,依次记录了那些被日记本施魔的人,对于每个人,他想知道这个人的名字在之前有没有出现过。

如果第\(i\)个字符串之前有相同的字符串,那么输出"YES",否则输出"NO"。

输入:

第一行,一个正整数\(n(1\leq n\leq100)\)——名单中的字符串数量。

接下来\(n\)行,每行一个字符串,长度在\(1\)到\(100\)之间。

输出:

对于每个字符串,判断它在之前有没有出现过。

题解:

暴力判,你也可以扔到set里面查找,甚至建一棵trie树,我反正暴力判,其实用set写的更方便。

 #include<cstdio>
int n;
char str[][];
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i){
scanf("%s",str[i]);
int ok=;
for(int j=;j<i;++j){
int o=,k;
for(k=;str[i][k]!='\0'&&str[j][k]!='\0';++k){
if(str[j][k]!=str[i][k]) {o=; break;}
}
if((str[i][k]=='\0'&&str[j][k]!='\0')||(str[j][k]=='\0'&&str[i][k]!='\0')) o=;
if(o==) {ok=; break;}
}
if(ok==) puts("Yes");
else puts("No");
}
return ;
}

【B】马沃罗·冈特的戒指

题意:

邓布利多教授正在帮助哈利摧毁分灵体。他侦测到了一个分灵体在冈特家,于是他去了那儿。他看到了马沃罗·冈特的戒指,并认定那是一个分灵体。虽然他摧毁了分灵体,但是自己也身中了黑魔法诅咒。斯内普教授正帮助邓布利多消除诅咒,他需要给邓布利多滴正好\(x\)滴药水,\(x\)的计算方法如下:

\(x\)是\(p\cdot a_{i}+q\cdot a_{j}+r\cdot a_{k}\)的最大值,其中\(1\leq i\leq j\leq k\leq n\)。

帮助斯内普教授计算\(x\)的值,注意,\(x\)可能是负数。

输入:

第一行,四个数,\(n,p,q,r(-10^9\leq p,q,r\leq10^9,1\leq n\leq10^5)\)。

第二行,\(n\)个数,表示\(a_{1},a_{2},\cdots,a_{n}(-10^9\leq a_{i}\leq10^9)\)。

输出:

输出\(x\)。

题解:

枚举\(j\),通过\(p\)的正负性算出\(i\),通过\(r\)的正负性算出\(k\)。

 #include<cstdio>
int n,p,q,r,a[],min1[],max1[],min2[],max2[];
long long ans=-3100000000000000000ll;
inline int Min(int x,int y){return x<y?x:y;}
inline int Max(int x,int y){return x>y?x:y;}
int main(){
scanf("%d%d%d%d",&n,&p,&q,&r);
for(int i=;i<=n;++i) scanf("%d",a+i);
for(int i=;i<=n+;++i) min1[i]=min2[i]=, max1[i]=max2[i]=-;
for(int i=;i<=n;++i) min1[i]=Min(min1[i-],a[i]), max1[i]=Max(max1[i-],a[i]);
for(int i=n;i>=;--i) min2[i]=Min(min2[i+],a[i]), max2[i]=Max(max2[i+],a[i]);
for(int j=;j<=n;++j){
long long sum=1ll*q*a[j];
if(p>) sum+=1ll*p*max1[j];
else sum+=1ll*p*min1[j];
if(r>) sum+=1ll*r*max2[j];
else sum+=1ll*r*min2[j];
if(ans<sum) ans=sum;
}
printf("%I64d",ans);
return ;
}

【C】赫尔加·赫奇帕奇的金杯

题意:

哈利,罗恩和赫敏发现赫尔加·赫奇帕奇的金杯是一个分灵体。通过赫敏与贝拉特里克斯·莱斯特兰奇的遭遇,她知道了金杯被存放在古灵阁巫师银行中的贝拉特里克斯的金柜中。

古灵阁可以看做是有着\(n\)个金柜的一棵树,每个金柜有一个型号,范围在\(1\)到\(m\)之中。

最高安全的金柜的型号为\(k\),并且所有型号为\(k\)的金柜都是最高安全的。

最多有\(x\)个金柜是最高安全的

另:如果一个金柜是最高安全的,那么与它直接相连的所有金柜都不是最高安全的,且它们的型号一定小于\(k\)

哈利想知道所有的金柜型号的可能性,这样他能规划出去到贝拉特里克斯的金柜的最佳路线。所以,你需要告诉他,给定古灵阁的结构,所有可能的金柜型号总数。

输入:

第一行,两个正整数\(n,m(1\leq n\leq10^5,1\leq m\leq10^9)\),表示金柜的数量,即树中的节点数,和金柜的型号范围。

接下来\(n-1\)行,每行两个正整数\(u_{i},v_{i}(1\leq u_{i},v_{i}\leq n)\),表示第\(i\)条边,表示了金柜\(u_{i},v_{i}\)之间有连边。保证给定图是一棵树。

接下来一行,两个正整数\(k,x(1\leq k\leq m,1\leq x\leq10)\),表示最高安全的金库的型号和最高安全的金库的最多个数。

输出:

输出一个非负整数,表示方案数对\(10^9+7\)取模的结果。

题解:

这题难度较大,适合做提高组练习……

考虑树形DP,用\(f[i][j][x\!=\!0\!/1\!/2]\)表示在以\(i\)为根的子树中,有\(j\)个最高安全的金柜,而金柜\(i\)的型号是\(\left\{\begin{matrix}x\!=\!0&1\leq type<k\\x\!=\!1&type=k\\x\!=\!2&k<type\leq m\end{matrix}\right.\)。

转移方程如下:\(\begin{matrix}f[i][j][0]=&\left(k-1\right)\sum_{j_{1}+j_{2}+\cdots+j_{i.sons}=j}\left(\prod_{k=1}^{i.sons}f[i.son_k][j_k][0]+f[i.son_k][j_k][1]+f[i.son_k][j_k][2]\right)\\f[i][j][1]=&\sum_{j_{1}+j_{2}+\cdots+j_{i.sons}=j-1}\left(\prod_{k=1}^{i.sons}f[i.son_k][j_k][0]\right)\\f[i][j][2]=&(m-k)\sum_{j_{1}+j_{2}+\cdots+j_{i.sons}=j}\left(\prod_{k=1}^{i.sons}f[i.son_k][j_k][0]+f[i.son_k][j_k][2]\right)\end{matrix}\)。

直接转移比较困难,我选择了左孩子右兄弟,然后再分别处理,导致代码其丑无比,不想拿出来看……

 #include<cstdio>
const int Mod=;
int n,m,k,X,left[],rr[],right[],dp[][][];
int h[],to[],nxt[],tot=;
int vis[];
inline void Ins(int x,int y){nxt[++tot]=h[x]; to[tot]=y; h[x]=tot;}
inline void ins(int x,int y){
if(!left[x]) left[x]=y, rr[x]=y;
else right[rr[x]]=y, rr[x]=y;
}
void dfs1(int u){
vis[u]=;
for(int i=h[u];i;i=nxt[i]){
if(vis[to[i]]) continue;
ins(u,to[i]); dfs1(to[i]);
}
}
void dfs2(int u){
if(left[u]) dfs2(left[u]);
if(right[u]) dfs2(right[u]);
if(left[u]){
if(right[u]){
dp[u][][]=((long long)(k-)*(dp[left[u]][][]+dp[left[u]][][])%Mod)*dp[right[u]][][]%Mod;
dp[u][][]=(((long long)(m-k)*(dp[left[u]][][]+dp[left[u]][][])%Mod)*(dp[right[u]][][]+dp[right[u]][][])+
((long long)(k-)*(dp[left[u]][][]+dp[left[u]][][])%Mod)*dp[right[u]][][])%Mod;
for(int x=;x<=X;++x){
for(int y=;y<=x;++y)
dp[u][x][]=(dp[u][x][]+
((long long)(k-)*((long long)dp[left[u]][y][]+dp[left[u]][y][]+dp[left[u]][y][]))%Mod*
dp[right[u]][x-y][])%Mod;
for(int y=;y<=x-;++y)
dp[u][x][]=(dp[u][x][]+
(long long)dp[left[u]][y][]*((long long)dp[right[u]][x-y-][]+dp[right[u]][x-y-][]+dp[right[u]][x-y-][]))%Mod;
for(int y=;y<=x;++y)
dp[u][x][]=(dp[u][x][]+
((long long)(k-)*((long long)dp[left[u]][y][]+dp[left[u]][y][]+dp[left[u]][y][]))%Mod*
dp[right[u]][x-y][]%Mod+
((long long)(m-k)*(dp[left[u]][y][]+dp[left[u]][y][]))%Mod*dp[right[u]][x-y][]%Mod)%Mod;
for(int y=;y<=x;++y)
dp[u][x][]=(dp[u][x][]+
((long long)(k-)*((long long)dp[left[u]][y][]+dp[left[u]][y][]+dp[left[u]][y][]))%Mod*
dp[right[u]][x-y][]%Mod+
((long long)(m-k)*(dp[left[u]][y][]+dp[left[u]][y][]))%Mod*(dp[right[u]][x-y][]+dp[right[u]][x-y][])%Mod)%Mod;
}
}
else{
dp[u][][]=(long long)(k-)*(dp[left[u]][][]+dp[left[u]][][])%Mod;
dp[u][][]=(long long)(m-k)*(dp[left[u]][][]+dp[left[u]][][])%Mod;
for(int x=;x<=X;++x){
dp[u][x][]=(long long)(k-)*((long long)dp[left[u]][x][]+dp[left[u]][x][]+dp[left[u]][x][])%Mod;
dp[u][x][]=dp[left[u]][x-][];
dp[u][x][]=(long long)(m-k)*(dp[left[u]][x][]+dp[left[u]][x][])%Mod;
}
}
}
else{
if(right[u]){
dp[u][][]=(long long)(k-)*dp[right[u]][][]%Mod;
dp[u][][]=((long long)(m-k)*(dp[right[u]][][]+dp[right[u]][][])+(long long)(k-)*dp[right[u]][][])%Mod;
for(int x=;x<=X;++x){
dp[u][x][]=(long long)(k-)*dp[right[u]][x][]%Mod;
dp[u][x][]=((long long)dp[right[u]][x-][]+dp[right[u]][x-][]+dp[right[u]][x-][]+
(long long)(m-)*dp[right[u]][x][])%Mod;
dp[u][x][]=((long long)(m-k)*(dp[right[u]][x][]+dp[right[u]][x][])+(long long)(k-)*dp[right[u]][x][])%Mod;
}
}
else{
dp[u][][]=k-;
dp[u][][]=;
dp[u][][]=m-k;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=,x,y;i<n;++i) scanf("%d%d",&x,&y), Ins(x,y), Ins(y,x);
scanf("%d%d",&k,&X);
dfs1();
dfs2();
/* for(int i=1;i<=n;++i) printf("(%d,%d)\n",left[i],right[i]);
for(int i=1;i<=n;++i){
for(int j=0;j<=X;++j){
printf("%d, %d : %d, %d, %d\n",i,j,dp[i][j][0],dp[i][j][1],dp[i][j][2]);
}
}*/
long long Ans=;
for(int i=;i<=X;++i) Ans+=(long long)dp[][i][]+dp[][i][]+dp[][i][];
printf("%I64d",Ans%Mod);
return ;
}

而学长的就画风清奇,看上去舒服至极,我实在是自愧不如。

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<queue>
#include<map>
#include<set>
#define MN 100000
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int f[MN+][],F[MN+][],s[MN+][],S[MN+][],l[MN+][],L[MN+][],n,K,m,Mx,cnt=,head[MN+];
struct edge{int to,next;}e[MN*+];
inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
}
inline void R(int&x,int y){x+=y;x>=mod?x-=mod:;}
void Dp(int x,int fa)
{
f[x][]=;s[x][]=K-;l[x][]=m-K;
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa)
{
Dp(e[i].to,x);
for(int j=;j<=Mx;++j)
for(int k=;k+j<=Mx;++k)
{
R(F[x][j+k],1LL*f[x][j]*s[e[i].to][k]%mod);
R(S[x][j+k],1LL*s[x][j]*((f[e[i].to][k]+s[e[i].to][k])%mod+l[e[i].to][k])%mod);
R(L[x][j+k],1LL*l[x][j]*(s[e[i].to][k]+l[e[i].to][k])%mod);
}
for(int j=;j<=Mx;++j)
{
f[x][j]=F[x][j],F[x][j]=;
s[x][j]=S[x][j],S[x][j]=;
l[x][j]=L[x][j],L[x][j]=;
}
}
} int main()
{
n=read();m=read();
for(int i=;i<n;++i) ins(read(),read());
K=read();Mx=read();
Dp(,);int ans=;
for(int i=;i<=Mx;++i) R(ans,f[][i]),R(ans,l[][i]),R(ans,s[][i]);
printf("%d\n",ans);
return ;
}

【D】【E】【F】目前不会。

【codeforces】【比赛题解】#855 Codefest 17的更多相关文章

  1. 纪中OJ 2019.02.15【NOIP提高组】模拟 B 组 梦回三国 比赛题解(第一个)

    声明 旁边的同学小 H(胡)对我说: “哟,比赛拿了 140,强!要知道,如果哥第三题 AC 了,哥就 230 了,你个废柴!!!(比赛实际分数 130 额呵)” 顿时,千万草泥马从我心中奔腾而过:你 ...

  2. [比赛题解]CWOI2019-1

    [比赛题解]CWOI2019-1 比赛日期:2019.10.12 T1 一道神仙DP题. 我们考虑\(dp[i][j][k]\)表示最后\(i\)位数,\(i-1\)位都是9,最后一位为\(j\),最 ...

  3. 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)

    科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...

  4. 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)

    这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...

  5. 【codeforces】【比赛题解】#868 CF Round #438 (Div.1+Div.2)

    这次是Div.1+Div.2,所以有7题. 因为时间较早,而且正好赶上训练,所以机房开黑做. 然而我们都只做了3题.:(. 链接. [A]声控解锁 题意: Arkady的宠物狗Mu-mu有一只手机.它 ...

  6. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

  7. 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)

    剧毒比赛,至少涨了分对吧.: ( [A]Left-handers, Right-handers and Ambidexters 题意: 有\(l\)个右撇子,\(r\)个左撇子,\(a\)个双手都惯用 ...

  8. 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)

    因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...

  9. 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)

    没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...

随机推荐

  1. 将javaweb项目部署到阿里云服务器

    主要步骤:1. 购买阿里云服务器2. 远程连接3. 在云服务器上配javaweb环境:jdk,tomcat,MySQL4. 将项目的war文件放到Tomcat下关于云服务器ECS:如果还想在买服务器之 ...

  2. Redis 基础:Redis 数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串).hash(哈希).list(列表).set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  3. Ubuntu和Windows相互共享文件夹

    一.Ubuntu访问Windows共享文件夹 1.对需要共享文件夹右击->属性->共享 2.选择要与其共享的用户,选择好用户点击有点添加按钮添加,然后点击下方的共享按钮 3.完成共享 4. ...

  4. Qt——常用控件样式

    下面是我设计.调整.修改的Qt控件样式,仅供参考. Github地址:https://github.com/ikongziming/QtDemo/tree/master/StyleSheetDemo ...

  5. 再谈 最速下降法/梯度法/Steepest Descent

    转载请注明出处:http://www.codelast.com/ 最速下降法(又称梯度法,或Steepest Descent),是无约束最优化领域中最简单的算法,单独就这种算法来看,属于早就“过时”了 ...

  6. MT【150】源自斐波那契数列

    (清华2017.4.29标准学术能力测试7) 已知数列$\{x_n\}$,其中$x_1=a$,$x_2=b$,$x_{n+1}=x_n+x_{n-1}$($a,b$是正整数),若$2008$为数列中的 ...

  7. BZOJ3142 [Hnoi2013]数列 【组合数学】

    题目链接 BZOJ3142 题解 题意:选一个正整数和\(K - 1\)个\([1,M]\)中的数,使得总和小于等于\(N\),求方案数模\(P\) 题目中\(K(M - 1) < N\)的限制 ...

  8. Java EE之会话

    1.需要会话的原因 所有HTTP服务器技术都普遍采用HTTP会话的概念,并且Java EE也在规范中添加了对会话的支持. 维持状态 会话用于维持请求和请求之间的状态.HTTP请求自身是完全无状态的.从 ...

  9. 解题:BJOI 2006 狼抓兔子

    题面 可以看出来是最小割,然后你就去求最大流了 这么大的范围就是让你用网络流卡的?咋想的啊=.=??? 建议还是老老实实用 平面图最小割等于其对偶图最短路 这个东西来做吧,虽然这个东西跑的也挺慢的,最 ...

  10. c语言条件编译和预编译

    转自http://www.cnblogs.com/rusty/archive/2011/03/27/1996806.html 一.C语言由源代码生成的各阶段如下: C源程序->编译预处理-> ...