T1 叉叉

题目描述

现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对其他25个字母也做同样3的操作。

现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另外一个端点在外部。

下图是一个例子,共有三对连线交叉(我们连线的时候,只能从字符串上方经过)。

输入格式

一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。

输出格式

一个整数,表示答案。

样例输入

abaazooabz

样例输出

3

数据范围

对于30%的数据,字符串长度不超过50。

对于100%的数据,字符串长度不超过100,000。

#include#include#include#include#define MAXN 100010
using namespace std;
char s[MAXN];
int nxt[MAXN],cnt[26],pos[26],pre[MAXN];
bool is[MAXN];
int main(int argc,char *argv[]) {
freopen("cross.in","r",stdin);
freopen("cross.out","w",stdout);future
scanf("%s",s + 1);
int len = strlen(s + 1);
for(int i=0; i<=25; ++i) pos[i] = len + 1;
memset(nxt,127/3,sizeof nxt );
for(int i=len; i>=1; --i){
++cnt[s[i] - 'a'];
if(!(cnt[s[i] - 'a'] & 1)) is[i] = true;
nxt[i] = pos[s[i] - 'a'],pos[s[i] - 'a'] = i;
}
int Ans = 0;
for(register int i,j=1; j<=26; ++j){
for(i=1; i<=len; ++i)
if(s[i] == 'a' + j - 1) break;
for(int p = i; p<=len; p = nxt[p] ,p = nxt[p])
for(int k=p+1; k<=len && knxt[p] && is[k]) ++Ans; } } printf("%d\n",Ans); fclose(stdin); fclose(stdout); return 0; }
T2 跳跳虎回家

英文名称: move 时间限制: 1s 空间限制: 256M
题目描述
跳跳虎在外⾯出去玩忘了时间,现在他需要在最短的时间内赶回家。
跳跳虎所在的世界可以抽象成⼀个含有 个点的图(点编号从 到 ),跳跳虎现在在 号点,跳跳虎的家在 号点。
图上⼀共有  条单向边,通过每条边有固定的时间花费。
同时,还存在若⼲个单向传送通道,传送通道也有其时间花费。
传送通道⼀般来说⽐普通的道路更快,但是跳跳虎最多只能使⽤ 次。
跳跳虎想知道他回到家的最⼩时间消耗是多少。
输入格式
第⼀⾏输⼊ 个整数  ( 表⽰点数,  表⽰普通道路的数量, 表⽰传送通道的数量, 表⽰跳跳虎最多使⽤ 次传送通道)
接下来  ⾏每⾏ 个整数  ,表⽰有⼀条从 到 ,时间花费为 的普通道路(  )
接下来 ⾏每⾏ 个整数  ,表⽰有⼀条从 到 ,时间花费为 的传送通道(  )
输出格式
输出⼀⾏⼀个整数表⽰最⼩时间消耗,如果没法回到家输出  。
样例输⼊
5 5 2 1
1 2 1
1 3 2
2 4 2
3 4 3
4 5 4
1 4 1
2 5 1
样例输出
2
数据范围和约定
对于  的数据,
对于另外  的数据,
对于  的数据,
n 1 n 1 n
m
k
4 n,m,q,k n m q k k
m 3 u,v,w u v w 1 ≤ u,v ≤ n,1 ≤ w ≤ 10 3
q 3 x,y,z x y z 1 ≤ x,y ≤ n,1 ≤ z ≤ 10 3
−1
30% 1 ≤ n ≤ 500,0 ≤ m,q ≤ 2000,k = 0
30% 1 ≤ n ≤ 500,0 ≤ m,q ≤ 2000,k = 1
100% 1 ≤ n ≤ 500,0 ≤ m,q ≤ 2000,0 ≤ k ≤ 10^9

#include#include#include#include#include#define MAXN 515 #define MAXM 2017 using namespace std; struct Edge{ int to,next,value; }e[MAXM << 2]; int head[MAXN],dis[MAXN],n,m,q,k,tot; bool exist[MAXN]; inline void read(int &x) { x=0; int f=1; register char c=getchar(); while(c>'9'||c<'0') { if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); } x*=f; } inline void Add_Edge(int u,int v,int w) { e[++tot].to = v,e[tot].value = w,e[tot].next = head[u],head[u] = tot; } int SPFA() { memset(dis,-1,sizeof dis ); queueq; q.push(1); dis[1] = 0; while(!q.empty()) { int u = q.front(); q.pop(); exist[u] = false; for(int i=head[u]; i; i=e[i].next) { int v = e[i].to; if(dis[v] == -1 || dis[v] > dis[u] + e[i].value) { dis[v] = dis[u] + e[i].value; if(!exist[v]) q.push(v),exist[v] = true; } } } return dis[n]; } void solve() { int u,v,w,Ans = 1e9 + 7; for(register int i=1; i<=m; ++i) read(u),read(v),read(w),Add_Edge(u,v,w); ++tot; for(register int i=1; i<=q; ++i) { read(u),read(v),read(w); int temp = head[u]; e[tot].to = v,e[tot].value = w,e[tot].next = head[u],head[u] = tot; int tmp = SPFA(); if(tmp != -1) Ans = min(tmp,Ans); head[u] = temp; } printf("%d\n",Ans); fclose(stdin); fclose(stdout); exit(0); } void xolve() { int u,w,v; for(register int i=1; i<=m; ++i) read(u),read(v),read(w),Add_Edge(u,v,w); printf("%d\n",SPFA()); fclose(stdin); fclose(stdout); exit(0); } void caolidie() { int u,v,w,Ans = 1e9 + 7; for(register int i=1; i<=m; ++i) read(u),read(v),read(w),Add_Edge(u,v,w); for(register int i=1; i<=q; ++i) read(u),read(v),read(w),Add_Edge(u,v,w); printf("%d\n",SPFA()); fclose(stdin); fclose(stdout); exit(0); } int main(int argc,char *argv[]) { freopen("move.in","r",stdin); freopen("move.out","w",stdout); read(n),read(m),read(q),read(k); if(k == 0) xolve(); else if(k == 1) solve(); else caolidie(); return 0; }
树(T3的题目原型:51Nod 算法马拉松3 Tree)
System Message (命题人)

基准时间限制:1 秒 空间限制:131072 KB 分值: 80

今天小a在纸上研究树的形态,众所周知的,有芭蕉树,樟树,函树,平衡树,树套树等等。那么小a今天在研究的就是其中的平衡树啦。

小a认为一棵平衡树的定义为一个n个点,从1到n编号,n-1条边,且任意两点间一定存在唯一一条简单路径,且n>=k。

现在小a看到一棵很大很大的树,足足有n个节点,这里n一定大于等于k!为了方便起见,它想把这个树删去某些边,使得剩下的若干个联通块都满足是平衡树。这时,小b走过来,不屑一顾的说,如果我一条边都不删,那么也算一棵平衡树咯。

小a对于小b的不屑感到很不爽,并问小b,你能算出我删边的方案总数使得满足我的条件吗?两个删边的方案A,B不同当且仅当存在某一条边属于集合A且不属于集合B,或者存在某一条边属于集合B且不属于集合A。为了让你方便,你只要告诉我答案对1000000007(1e9+7)取模就行了。

小b犯了难,找到了身为程序猿的你。

Hint:

样例解释,

第一种方案为不删边,

第二种方案为删去2 3这一条边,

第三种方案为删去3 4这一条边。

分析:我们令dp[i][j]表示以i为根且当前联通块大小为k的方案总数,特别的,dp[i][0]表示割点当前点与其父亲是棵平衡树的方案总数。

对于u的一个孩子v可以得到转移方程dp[u][j+k]=dp[u][j]*dp[v][k]

另外dp[u][0]=Σdp[u][j](j>=题目给定的k)

这样乍看是n^3的,有一个技巧可以做到n^2即每次dp时,只枚举当前u所在子树的大小,每当枚举到它的其中孩子时,当前u所在子树的大小加上它孩子为根的子树的大小。可以理解为每一个点对只被枚举到一次。

最后答案即为dp[root][0]

#include#include#include#include#define MAXN 2222
#define Mod 1000000007
using namespace std;
typedef long long LL;
int n,K,tot,head[MAXN],siz[MAXN];
LL dp[MAXN][MAXN];
struct Edge { int to,next; }e[MAXN << 1];
inline void Add_Edge(int u,int v) {
e[++tot].to = v,e[tot].next = head[u],head[u] = tot;
e[++tot].to = u,e[tot].next = head[v],head[v] = tot;
}
inline void ADD_MOD(LL &x,LL y) {
x += y;
if(x >= Mod) x -= Mod;
}
inline void read(int &x) {
x = 0; register char c = getchar();
while(c > '9' || c < '0') c = getchar();
while(c >= '0' && c<= '9') { x = x * 10 + c - '0'; c = getchar(); }
}
void DFS(int u,int fa) {
siz[u] = 1,dp[u][ siz[u] ] = 1;
for(int i=head[u]; i; i=e[i].next) {
int v = e[i].to;
if(v == fa) continue;
DFS(v,u);
for(int j=siz[u]; j>=1; --j){
for(int k=siz[e[i].to]; k>=1; --k)
ADD_MOD(dp[u][j + k],(LL)dp[u][j] * dp[e[i].to][k] % Mod);
dp[u][j] = (LL)dp[u][j] * dp[e[i].to][0] % Mod;
}
siz[u] += siz[e[i].to];
}
for(int k=K; k<=siz[u]; ++k) ADD_MOD(dp[u][0],dp[u][k]);
}
int main(int argc,char *argv[]) {
read(n),read(K);
int u,v;
for(register int i=1; i<=n-1; ++i)
read(u),read(v),Add_Edge(u,v);
DFS(1,-1);
printf("%d\n",dp[1][0]);
return 0;
}

2017.10.23 模拟考试 (题目来自:学大伟业)相关推荐

  1. 高考2017c语言试卷,2017高考语文模拟考试试卷附答案

    2017高考语文的备考需要考生多做模拟考试试卷查漏补缺.接下来,学习啦小编为你分享2017高考语文模拟考试试卷,希望对你有帮助. 2017高考语文模拟考试试卷附答案一.阅读80分 (一)阅读下文,完成 ...

  2. 2017计算机专业职称,2017年计算机职称考试题目及答案

    2017年计算机职称考试题目及答案 一.选择题 D(1)十进制数215用二进制数表示是 A)1100001 B)11011101 C)0011001 D)11010111 C(2)计算机的特点是处理速 ...

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

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

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

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

  5. 学大伟业Day1解题报告

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

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

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

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

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

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

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

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

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

最新文章

  1. Linux2.6--Linus电梯
  2. Beanstalkd使用
  3. Newtonsoft.Json 的序列化与反序列化
  4. 程序语言python循环_《python语言程序设计》_第5章_循环
  5. OpenCV在Android设备上运行深度网络
  6. 树的存储结构以及实现代码
  7. imclearboder matlab,Lucas
  8. 动态获取某个元素的高度_codeforces 1443D,解法简单,思维缜密的动态规划问题...
  9. arm linux挂载ubi,挂载ubifs文件系统分区
  10. java多线程详解(8)-volatile,Atomic比较
  11. 机器学习算法工程师的经典面试问题
  12. 《TensorFlow技术解析与实战》——1.1 什么是人工智能
  13. 知识分享 | IEC FMEA手册 附录A.1摘录
  14. 产品 电信nb接口调用_NB-IOT开发流程---基于中国电信物联网平台实现平台对接
  15. CODING 助力江苏高速信息实现组织敏捷与研发敏捷,领跑智慧交通新基建
  16. android 应用中 assets 下文件的绝对路径
  17. 微信小程序——事件绑定
  18. 我的世界服务器修改npc,我的世界npc修改对话框 | 手游网游页游攻略大全
  19. 如何做一场B格满满的技术大会演讲
  20. iphone与计算机连接,将 iPhone 与电脑同步

热门文章

  1. java生成表格图片
  2. MOSS工作流 InfoPath+WorkFlow+Moss 开发要点
  3. 在ASF根据事件(Event)下载SAR数据
  4. 你还在担心黑客攻击吗?所有程序员都应该掌握的基础网络安全知识,快进来看看吧
  5. 【洛谷】P1828 香甜的奶油
  6. c语言输入三个商品的价格,若有一个大于100元或者总价大于200元,全部商品打9折,并完成付款和找零
  7. Java虚拟机学习与总结(二)
  8. plt.scatter(X[0, :], X[1, :], c=Y, s=40, cmap=plt.cm.Spectral)出错
  9. 写给 Java 程序员的前端 Promise 教程
  10. 关于ASP 文件类的使用