T1 叉叉

题目名称

叉叉

程序文件名

cross

输入文件名

cross.in

输出文件名

cross.out

每个测试点时限

1秒

内存限制

128MB

测试点数目

10

每个测试点分值

10

是否有部分分

试题类型

传统

题目描述

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

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

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

输入格式

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

输出格式

一个整数,表示答案。

样例输入

abaazooabz

样例输出

3

数据范围

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

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

处理出每对字符的两个位置,按左端点排序,判断是否会相交,加一个小剪枝、、、暴力做法数据水就过了。。

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4.  
  5. const int N();
  6. int cnt,n,ans;
  7. struct Node {
  8. int l,r;
  9. bool operator < (const Node&x)const
  10. {
  11. return l<x.l;
  12. }
  13. }a[N];
  14. char s[N];
  15.  
  16. int Presist()
  17. {
  18. freopen("cross.in","r",stdin);
  19. freopen("cross.out","w",stdout);
  20. scanf("%s",s+); n=strlen(s+);
  21. cnt=;
  22. for(int k=; k<; ++k)
  23. for(int i=; i<=n; ++i)
  24. if(s[i]-'a'==k)
  25. {
  26. if(a[cnt].r) a[++cnt].l=i;
  27. else if(!a[cnt].l) a[cnt].l=i;
  28. else a[cnt].r=i;
  29. }
  30. std::sort(a+,a+cnt+);
  31. for(int i=; i<=cnt; ++i)
  32. // printf("%d %d\n",a[i].l,a[i].r);
  33. for(int j=i+; j<=cnt; ++j)
  34. {
  35. if(a[i].r<a[j].l) break;
  36. ans+=(a[i].r<a[j].r);
  37. }
  38. printf("%d\n",ans);
  39. return ;
  40. }
  41.  
  42. int Aptal=Presist();
  43. int main(int argc,char**argv){;}

AC

T2 跳跳虎想回家

k==0的就是普通的最短路,k==1的可以Floyd求出多源最短路,枚举每个传送通道更新最小值,

另外就是乱搞的(把传送通道全加进去跑最短路。。可能还是数据水)、、考试时数组开小了80分、

  1. #include <cstdio>
  2. #include <queue>
  3.  
  4. #define min(a,b) ((a)<(b)?(a):(b))
  5.  
  6. inline void read(int &x)
  7. {
  8. x=; register char ch=getchar();
  9. for(; ch>''||ch<''; ) ch=getchar();
  10. for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
  11. }
  12.  
  13. const int INF(0x3f3f3f);
  14. const int M();
  15. const int N();
  16. int n,m,q,k,ans;
  17. int dis[N][N];
  18. bool vis[N];
  19.  
  20. int head[N],sumedge;
  21. struct Edge {
  22. int v,next,w;
  23. Edge(int v=,int next=,int w=):
  24. v(v),next(next),w(w){}
  25. }edge[M<<];
  26. inline void ins(int u,int v,int w)
  27. {
  28. edge[++sumedge]=Edge(v,head[u],w);
  29. head[u]=sumedge; dis[u][v]=w;
  30. }
  31.  
  32. struct Node {
  33. int pos,dis;
  34. bool operator < (const Node&x)const
  35. {
  36. return dis>x.dis;
  37. }
  38. }u,v;
  39. std::priority_queue<Node>que;
  40.  
  41. inline void Dijkstra(int s)
  42. {
  43. for(int i=; i<=n; ++i)
  44. dis[s][i]=INF,vis[i]=;
  45. u.dis=dis[s][s]=,u.pos=s;
  46. for(; !que.empty(); ) que.pop(); que.push(u);
  47. for(; !que.empty(); )
  48. {
  49. u=que.top(); que.pop();
  50. if(vis[u.pos]) continue; vis[u.pos]=;
  51. for(int i=head[u.pos]; i; i=edge[i].next)
  52. {
  53. v.pos=edge[i].v;
  54. if(dis[s][v.pos]>dis[s][u.pos]+edge[i].w)
  55. {
  56. dis[s][v.pos]=dis[s][u.pos]+edge[i].w;
  57. v.dis=dis[s][v.pos]; que.push(v);
  58. }
  59. }
  60. }
  61. }
  62.  
  63. struct Road {
  64. int u,v,w;
  65. Road(int u=,int v=,int w=):u(u),v(v),w(w){}
  66. }road[M];
  67.  
  68. inline void violence()
  69. {
  70. for(int k=; k<=n; ++k)
  71. for(int i=; i<=n; ++i)
  72. for(int j=; j<=n; ++j)
  73. dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
  74. ans=dis[][n];
  75. for(int u,w,v,i=; i<=q; ++i)
  76. {
  77. u=road[i].u,v=road[i].v,w=road[i].w;
  78. ans=min(ans,dis[][u]+dis[v][n]+w);
  79. }
  80. printf("%d\n",ans>=INF?(-):ans);
  81. }
  82.  
  83. inline void violence2()
  84. {
  85. for(int u,w,v,i=; i<=q; ++i)
  86. ins(road[i].u,road[i].v,road[i].w);
  87. Dijkstra(); printf("%d\n",dis[][n]>=INF?(-):dis[][n]);
  88. }
  89.  
  90. int Presist()
  91. {
  92. freopen("move.in","r",stdin);
  93. freopen("move.out","w",stdout);
  94. read(n),read(m),read(q),read(k);
  95. for(int i=; i<=n; ++i)
  96. for(int j=; j<=n; ++j)
  97. dis[i][j]=(i!=j)*INF;
  98. for(int u,v,w,i=; i<=m; ++i)
  99. read(u),read(v),read(w),ins(u,v,w);
  100. for(int u,v,w,i=; i<=q; ++i)
  101. read(u),read(v),read(w),road[i]=Road(u,v,w);
  102. if(!k) { Dijkstra(); printf("%d\n",dis[][n]>=INF?(-):dis[][n]); return ;}
  103. else if(k==) { violence(); return ; }
  104. else { violence2(); return ; }
  105. return ;
  106. }
  107.  
  108. int Aptal=Presist();
  109. int main(int argc,char**argv){;}

AC

T3 秀秀 和哺 噜国 ( cut )

f[i][j]表示以i为根,连通块大小为k的满足题目要求联通个数的方案数,f[i][0]表示以i为根的所有合法方案数

对于u的一个孩子v,f[u][j+k]+=f[u][j]*f[v][k],(乘法原理,一颗以u的孩子为根的树的贡献与其余树互不影响)

f[u][0]+=f[u][i](k<=i<=size[u])

只枚举当前 u 所在子树的大小,每当枚举到它的其中孩子时,当前 u 所在子树的大小加上它孩子为根的子树的大小。

可以理解为每一个点对只被枚举到一次。 这样可以优化到n^2

ans=f[root][0]

  1. #include <cstdio>
  2.  
  3. #define min(a,b) ((a)<(b)?(a):(b))
  4.  
  5. inline void read(int &x)
  6. {
  7. x=; register char ch=getchar();
  8. for(; ch>''||ch<''; ) ch=getchar();
  9. for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
  10. }
  11. const int mod();
  12. const int N();
  13. int n,q,ans,dis[N][N];
  14. int head[N],sumedge;
  15. struct Edge {
  16. int v,next;
  17. Edge(int v=,int next=):v(v),next(next){}
  18. }edge[N<<];
  19. inline void ins(int u,int v)
  20. {
  21. edge[++sumedge]=Edge(v,head[u]);
  22. head[u]=sumedge,dis[u][v]=;
  23. }
  24.  
  25. int size[N],tmp[N],f[N][N];
  26. void DFS(int u,int pre)
  27. {
  28. size[u]=; f[u][]=;
  29. for(int v,i=head[u]; i; i=edge[i].next)
  30. {
  31. v=edge[i].v; if(v==pre) continue;
  32. DFS(v,u); int tot=size[u]+size[v];
  33. for(int j=; j<=tot; ++j) tmp[j]=;
  34. for(int j=; j<=size[u]; ++j)
  35. tmp[j]=1ll*f[v][]*f[u][j]%mod;
  36. for(int j=; j<=size[u]; ++j)
  37. for(int k=; k<=size[v]; ++k)
  38. tmp[k+j]=(tmp[k+j]%mod+1ll*f[u][j]*f[v][k]%mod)%mod;
  39. for(int j=; j<=tot; ++j) f[u][j]=tmp[j];
  40. size[u]+=size[v];
  41. }
  42. for(int i=q; i<=size[u]; ++i) f[u][]=(f[u][]+f[u][i])%mod;
  43. }
  44.  
  45. int Presist()
  46. {
  47. // freopen("cut.in","r",stdin);
  48. // freopen("cut.out","w",stdout);
  49. read(n),read(q);
  50. for(int i=; i<=n; ++i)
  51. for(int j=; j<=n; ++j)
  52. dis[i][j]=(i!=j)*(n+);
  53. for(int u,v,i=; i<n; ++i)
  54. read(u),read(v),ins(u,v);
  55. DFS(,-);
  56. printf("%d\n",f[][]);
  57. return ;
  58. }
  59.  
  60. int Aptal=Presist();
  61. int main(int argc,char**argv){;}

AC

2017-10-23学大伟业Day1的更多相关文章

  1. 学大伟业Day1解题报告

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

  2. 学大伟业 2017 国庆 Day1

    期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...

  3. 学大伟业 Day 3 培训总结

    今天讲的字符串: 不多说,直接看题 一.表达式求值 题目大意: 输入一行一个表达式,计算其答案 表达式包含非负整数.加减乘除.括号 两种做法 ·栈 ·表达式树 这里更推荐表达式树,因为栈是先压进去,逆 ...

  4. 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等

    今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...

  5. 学大伟业 国庆Day2

    期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...

  6. 学大伟业DAY2模拟赛

    T1忍者钩爪 题目描述 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个练习使用钩爪的好地方,决定在这里大显身手. 场景的天花板可以被描述为一个无穷长的数轴,初始小Q挂在原点上.数轴 ...

  7. 学大伟业 Day 6 培训总结

    今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那 ...

  8. 学大伟业 Day 5 培训总结

    今天讲数据结构 先从mzx大佬的ppt摘抄一段: 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下,精心选择的数据结构可以带来更高的运行或 ...

  9. 学大伟业 Day 1 培训总结

    第一天培训,讲的基本算法,东西很多.还有些数论,图论,数据结构and some small tricks 一.输入输出技巧 //输入输出技巧 /* scanf.printf:速度快,需要记忆不同数据类 ...

随机推荐

  1. Windows MinGW 64-bit boost 踩坑

    >g++ -Wall -shared -g -DBUILD_DLL main.cpp -ID:\gcc\boost\include\boost-1_69 -LD:\gcc\boost\lib - ...

  2. java在线聊天项目 swt可视化窗口Design 好友列表窗口

    熟练使用各种布局方式 FlowLayout 流布局 left center right等 BorderLayout 边框布局 east west sorth north center Absolute ...

  3. ios xmpp demo

    为了方便程序调用,我们把XMPP的一些主要方法写在AppDelegate中 在AppDelegate.m下这几个方法为: [java] view plaincopy -(void)setupStrea ...

  4. modelsim安装调试

    modelsim,debug:“unable to checkout a viewer license necessary for use of the modelsim graphical user ...

  5. DELL R730 服务器拷贝大文件

    从服务器上拷贝大文件,通过USB拷贝,写入速度很慢,而且拷贝到100多G的时候直接卡死. 原因:服务器的USB是2.0,传输速率很慢. 解决方法: 找一台笔记本,USB 接口是3.0的,通过网络共享传 ...

  6. POJ-3481 Double Queue,Treap树和set花式水过!

                                                    Double Queue 本打算学二叉树,单纯的二叉树感觉也就那几种遍历了, 无意中看到了这个题,然后就 ...

  7. 送信 okhttp

    package jp.co.gunmabank.minefocus.accountApp import android.content.Intentimport android.graphics.Co ...

  8. POJ——3984迷宫问题(BFS+回溯)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14568   Accepted: 8711 Description ...

  9. BZOJ 3028 食物 ——生成函数

    把所有东西的生成函数搞出来. 发现结果是x*(1-x)^(-4) 然后把(1-x)^(-4)求逆,得到(1+x+x^2+...)^4 然后考虑次数为n的项前的系数,就相当于选任意四个非负整数构成n的方 ...

  10. BestCoder Round #36

    HDU5198 Strange Class 问题描述 在Vivid的学校里,有一个奇怪的班级(SC).在SC里,这些学生的名字非常奇怪.他们的名字形式是这样的anbncn(a,b,c两两不相同.).例 ...