期望得分:100+100+20=220

实际得分:100+100+20=220

(好久没有期望==实际了 ,~\(≧▽≦)/~)

对于 a。。。。。。。。a

如果 第1个a 后面出现的第1个b~z 是右端点,且在第2个a之前,那么有贡献

如果 第2个a 前面出现的第1个b~z 是左端点,且在第1个a之后,那么有贡献

最后的贡献/2

#include<cstdio>
#include<cstring>#define N 100001using namespace std;char s[N];int LAST[26],last[N],pre[N][26],suf[N][26];
bool w[N],c[26];int main()
{freopen("cross.in","r",stdin);freopen("cross.out","w",stdout);scanf("%s",s+1);int len=strlen(s+1),ans=0,ch;for(int i=1;i<=len;i++)for(int j=0;j<26;j++)if(s[i]-'a'==j) pre[i][j]=i;else pre[i][j]=pre[i-1][j];for(int i=0;i<26;i++) suf[len][i]=len+1;suf[len][s[len]-'a']=len;for(int i=len-1;i;i--)for(int j=0;j<26;j++)if(s[i]-'a'==j) suf[i][j]=i;else suf[i][j]=suf[i+1][j];for(int i=1;i<=len;i++){ch=s[i]-'a';c[ch]^=1; w[i]=!c[ch];if(c[ch]) LAST[ch]=i;else last[i]=LAST[ch];}for(int i=1;i<=len;i++)if(w[i]){for(int j=0;j<26;j++)if(j!=s[i]-'a'){if(suf[last[i]][j]<i && w[suf[last[i]][j]]) ans++;if(pre[i][j]>last[i] && !w[pre[i][j]]) ans++;}}printf("%d",ans>>1);
}

View Code

dis[i][j] 表示 到第i个点,用了j次传送的最快时间

堆优化的dijkstra

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;#define N 501
#define M 2001int n,m,g,k;int front[N],to[M<<1],nxt[M<<1],val[M<<1],tot;
bool fly[M<<1];int DIS[N][2001];struct node
{int tim,dis,num;bool operator < (node p) const{return dis>p.dis;}
}cur,nt;priority_queue<node>q;void read(int &x)
{x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}void add(int u,int v,int w,bool fl)
{to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w; fly[tot]=fl;
}void init()
{read(n); read(m); read(g); read(k);int u,v,w;k=min(g,k);while(m--){read(u); read(v); read(w);add(u,v,w,0);}while(g--){read(u); read(v); read(w);add(u,v,w,1);}
}void dijkstra()
{memset(DIS,63,sizeof(DIS));cur.dis=0; cur.num=1; cur.tim=0;DIS[1][0]=0;q.push(cur);while(!q.empty()){cur=q.top(); q.pop();if(cur.num==n){printf("%d",cur.dis);return;}if(DIS[cur.num][cur.tim]!=cur.dis) continue;for(int i=front[cur.num];i;i=nxt[i]){if(DIS[to[i]][cur.tim+fly[i]]<cur.dis+val[i]) continue;if(cur.tim+fly[i]>k) continue;DIS[to[i]][cur.tim+fly[i]]=cur.dis+val[i];nt.dis=cur.dis+val[i];nt.tim=cur.tim+fly[i];nt.num=to[i];q.push(nt);}}printf("-1");
}int main()
{freopen("move.in","r",stdin);freopen("move.out","w",stdout);init();dijkstra();return 0;
}

View Code

相当于把树分成许多块,每一个块的大小>=k,求分块方案数

树上背包

dp[i][j] 以i为根子树内,块的大小为j的方案数

g[j] 当前大小为j的块的方案数

cnt[i] 以i为根节点的块,大小>=k的方案数

假设当前正在合并u的子节点 v

v所在块 如果本身就>=k,那么v可以不并入u,g[j]=cnt[v]*dp[u][j]

枚举已经与u合并的块的大小j

枚举v所在块的大小h

g[j+h]+=dp[x][j]*dp[v][h]

合并u和v,把g赋给dp

最后处理完u的时候更新cnt

注意师最后合并,这样可以使时间复杂度降到 n^2

相当于每对点只在LCA处有贡献

#include<cstdio>
#include<iostream>using namespace std;#define N 5001
#define mod 786433int front[N],to[N<<1],nxt[N<<1],tot;int siz[N],dp[N][N],g[N],cnt[N];int k;void read(int &x)
{x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}void add(int u,int v)
{to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
}void init()
{int n;read(n); read(k);int u,v;for(int i=1;i<n;i++){read(u); read(v);add(u,v);}
}void dfs(int x,int y)
{siz[x]=1;dp[x][1]=1;for(int i=front[x];i;i=nxt[i])if(to[i]!=y){dfs(to[i],x);for(int j=1;j<=siz[x]+siz[to[i]];j++) g[j]=0;for(int j=1;j<=siz[x];j++) g[j]=1ll*cnt[to[i]]*dp[x][j]%mod;for(int j=1;j<=siz[x];j++)for(int h=1;h<=siz[to[i]];h++)g[j+h]=(g[j+h]+1ll*dp[x][j]*dp[to[i]][h]%mod)%mod;for(int j=1;j<=siz[x]+siz[to[i]];j++) dp[x][j]=g[j];siz[x]+=siz[to[i]];}for(int i=k;i<=siz[x];i++) cnt[x]+=dp[x][i],cnt[x]%=mod;
}int main()
{freopen("cut.in","r",stdin);freopen("cut.out","w",stdout);init();dfs(1,0);int ans=0;for(int i=k;i<=siz[1];i++) ans+=dp[1][i],ans%=mod;printf("%d",ans);
}

View Code

2^n  20分暴力

#include<cstdio>
#include<iostream>
#include<algorithm>using namespace std;#define N 5001int n,k;int front[N],to[N<<1],nxt[N<<1],from[N<<1],tot;int ans,cnt;bool use[N];int siz[N];void read(int &x)
{x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}void add(int u,int v)
{to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u;to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; from[tot]=v;
}void init()
{read(n); read(k);int u,v;for(int i=1;i<n;i++){read(u); read(v);add(u,v);}
}void dfs2(int x,int y)
{cnt++;for(int i=front[x];i;i=nxt[i])if(to[i]!=y && use[i]) dfs2(to[i],x);
}void judge()
{for(int i=1;i<=n;i++){cnt=0;dfs2(i,0);if(cnt<k) return;}ans++;
}void dfs(int x)
{if(x==(n-1)*2+1) {judge();return;}dfs(x+2);use[x]=use[x+1]=true; dfs(x+2); use[x]=use[x+1]=false;
}int main()
{freopen("cut.in","r",stdin);freopen("cut.out","w",stdout);init();dfs(1);printf("%d",ans);
}

View Code

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7717287.html

学大伟业 2017 国庆 Day1相关推荐

  1. 学大伟业Day1解题报告

    学大伟业Day1解题报告 张炳琪 一.   时间分配 T1:30分钟  T2: 60分钟  T3:100分钟 二.答题情况及错因 T1:100         T2:55             T3 ...

  2. 学大伟业2018-2019学年第二学期《自主招生集训课程》

    尊敬的校长.主任.老师: 您好! 北京学大伟业教育科技有限公司是专注学科奥林匹克竞赛.高校自主招生.高考培优.美加游学.艺术培训的高端品牌教育机构.我们秉承"共育人才,开创未来"的 ...

  3. 学大伟业:学长是如何对待数学竞赛的

    如果你是下定决心要学数竞,真的很认真地做了决定,那么你的自学能力必须要过关,专注度一定要够强.当然,这里的专注度不是指40分钟过去了,才连一条几何辅助线,也不是说60分钟过去了,你才完成了一试的填空题 ...

  4. 学大伟业:在数学竞赛学习中,你属于哪种类型?

    学习数学竞赛,在其他人眼中是一种什么存在,你知道么? 你在学习数学竞赛中属于什么类型的,你自己知道么? 下面几种类型, 赶紧看看自己,中枪了没. 做题狂魔型 这类人的主要特征就是喜欢做题,简直到了一种 ...

  5. 学大伟业:如何利用课余时间学习物理竞赛,搞定自主招生?

    今天撇开能力超强的学生不谈,仅针对目标自主招生的学生,谨慎的给出一些物理竞赛的学习建议. 高一 高中物理竞赛中力学.电磁学模块占据了70%的考试内容,这两个模块也是最难的模块,热学.光学.近代物理内容 ...

  6. 学大伟业:2019年数学竞赛学习经验分享

    学习是一个持之以恒的过程,需要不断探索.不断前行.在这路上,我认为最重要的是学习心态.每个人都不可避免地会遇到自己的学习困难,产生消极的想法.有区分度的是能否及时调整好自己,再重新投入到学习中去.身处 ...

  7. 学大伟业(杭州分校)数学联赛 GA3-1 国奥专题班

    北京学大伟业(bjxdwy)杭州分校2019课程于4月4日至4月7日开课,名师生齐聚课堂,助力2019五项学科竞赛!冲刺c9名校!

  8. 2017.10.23 模拟考试 (题目来自:学大伟业)

    T1 叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条 ...

  9. 2017-10-23学大伟业Day1

    T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...

最新文章

  1. LTV 即用户生命周期价值
  2. JMeter入门(1):JMeter总体介绍及组件介绍
  3. 理解Meta Learning 元学习,这篇文章就够了!
  4. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
  5. 【JavaSE_06】Java中的数组(array)-提高练习
  6. Hashtable源码分析
  7. 外媒曝iPhone 13 CAD渲染图:对角后置摄像头布局
  8. in band out of band
  9. 【500-Lines-or-Less】-【翻译练习】-【chapter-14】-【简单对象模型】-【第三部分】...
  10. 纯Git实现前端项目打包部署
  11. 在Python中分词
  12. 尚观python培训视频教程
  13. Android混淆注意事项
  14. Instruments之相关介绍(一)
  15. python使用venv环境报Python.h : No such file or direc
  16. Taro3.2 适配 React Native 之运行时架构详解
  17. gulp前端自动化构建工具:常用插件介绍及使用
  18. oracle sqlunldr 导出csv乱码
  19. Mavn 的 systemPath 无效,Windows 上成功,Linux 失败问题解决
  20. 怎样用英语在麦当劳点餐

热门文章

  1. centos7默认mariadb与mysql官网下载安装问题解决
  2. html立体图表样式,项目进度可视化图表
  3. Dota 2 with Large Scale Deep Reinforcement Learning翻译
  4. ArcGIS符号导入图片
  5. Yamaha DGX660 电钢琴aux-in只响一边的处理记录
  6. 推荐一个在线ide的网站
  7. php获取数据编码,php 获取编码和转换编码
  8. 梯度下降法算法比较和进一步优化
  9. Shader 蔓藤生长动画
  10. 动物识别系统代码python_动物识别系统 代码