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(100005);
 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+1); n=strlen(s+1);
21     cnt=1;
22     for(int k=0; k<26; ++k)
23       for(int i=1; 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+1,a+cnt+1);
31     for(int i=1; i<=cnt; ++i)
32 //        printf("%d %d\n",a[i].l,a[i].r);
33       for(int j=i+1; 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 0;
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=0; register char ch=getchar();
  9     for(; ch>'9'||ch<'0'; ) ch=getchar();
 10     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
 11 }
 12
 13 const int INF(0x3f3f3f);
 14 const int M(2333);
 15 const int N(505);
 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=0,int next=0,int w=0):
 24         v(v),next(next),w(w){}
 25 }edge[M<<1];
 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=1; i<=n; ++i)
 44         dis[s][i]=INF,vis[i]=0;
 45     u.dis=dis[s][s]=0,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]=1;
 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=0,int v=0,int w=0):u(u),v(v),w(w){}
 66 }road[M];
 67
 68 inline void violence()
 69 {
 70     for(int k=1; k<=n; ++k)
 71       for(int i=1; i<=n; ++i)
 72           for(int j=1; j<=n; ++j)
 73           dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
 74     ans=dis[1][n];
 75     for(int u,w,v,i=1; i<=q; ++i)
 76     {
 77         u=road[i].u,v=road[i].v,w=road[i].w;
 78         ans=min(ans,dis[1][u]+dis[v][n]+w);
 79     }
 80     printf("%d\n",ans>=INF?(-1):ans);
 81 }
 82
 83 inline void violence2()
 84 {
 85     for(int u,w,v,i=1; i<=q; ++i)
 86         ins(road[i].u,road[i].v,road[i].w);
 87     Dijkstra(1); printf("%d\n",dis[1][n]>=INF?(-1):dis[1][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=1; i<=n; ++i)
 96       for(int j=1; j<=n; ++j)
 97           dis[i][j]=(i!=j)*INF;
 98     for(int u,v,w,i=1; i<=m; ++i)
 99         read(u),read(v),read(w),ins(u,v,w);
100     for(int u,v,w,i=1; i<=q; ++i)
101         read(u),read(v),read(w),road[i]=Road(u,v,w);
102     if(!k) { Dijkstra(1); printf("%d\n",dis[1][n]>=INF?(-1):dis[1][n]); return 0;}
103     else if(k==1) { violence(); return 0; }
104          else { violence2(); return 0; }
105     return 0;
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=0; register char ch=getchar();
 8     for(; ch>'9'||ch<'0'; ) ch=getchar();
 9     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
10 }
11 const int mod(786433);
12 const int N(5233);
13 int n,q,ans,dis[N][N];
14 int head[N],sumedge;
15 struct Edge {
16     int v,next;
17     Edge(int v=0,int next=0):v(v),next(next){}
18 }edge[N<<1];
19 inline void ins(int u,int v)
20 {
21     edge[++sumedge]=Edge(v,head[u]);
22     head[u]=sumedge,dis[u][v]=1;
23 }
24
25 int size[N],tmp[N],f[N][N];
26 void DFS(int u,int pre)
27 {
28     size[u]=1; f[u][1]=1;
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=1; j<=tot; ++j) tmp[j]=0;
34         for(int j=1; j<=size[u]; ++j)
35             tmp[j]=1ll*f[v][0]*f[u][j]%mod;
36         for(int j=1; j<=size[u]; ++j)
37           for(int k=1; 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=1; 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][0]=(f[u][0]+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=1; i<=n; ++i)
51       for(int j=1; j<=n; ++j)
52         dis[i][j]=(i!=j)*(n+1);
53     for(int u,v,i=1; i<n; ++i)
54         read(u),read(v),ins(u,v);
55     DFS(1,-1);
56     printf("%d\n",f[1][0]);
57     return 0;
58 }
59
60 int Aptal=Presist();
61 int main(int argc,char**argv){;}

AC

转载于:https://www.cnblogs.com/Shy-key/p/7716544.html

2017-10-23学大伟业Day1相关推荐

  1. 学大伟业Day1解题报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 学大伟业 2017 国庆 Day1

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

最新文章

  1. eureka client客户端启动时都做了哪些事
  2. 在iOS中安装OpenCV
  3. [摘抄]江湖经验:喝酒时玩的游戏大全!
  4. sublime支持虚拟环境python2.7
  5. 设置build.gradle打包时自动加时间
  6. python基础的学习
  7. gradle对java插件的扩展_Gradle之java插件入门
  8. c++11多线程学习笔记之一 thread基础使用
  9. 问题解决,心情不错:)
  10. 一种简单的图像显著性计算模型
  11. 《信号与系统学习笔记》—信号与系统(四)
  12. ACCESS网上书店数据库系统
  13. python的ols_工具方法 | 6行代码教你用Python做OLS回归(内附CFPS实例)
  14. cad图转成shp文件并把其平面坐标投影配准成大地坐标(配准针对没有底图的情况)
  15. 获取Excel中sheet页的name,并对不同sheet 页进行处理
  16. 解决Python3 urllib3 urllib3.exceptions.maxretryerror: httpsconnectionpool(host=‘xxxxx‘, port=443)
  17. 【javascript】车标JSON格式--汽车品牌JSON格式
  18. E: 仓库 没有Release 文件
  19. 安卓手机文件系统 roots recovery bootimg
  20. 基于python和pySimpleGUI的久坐提醒强制锁屏神器

热门文章

  1. 深入浅出的马尔科夫入门文章
  2. 【算法】高精度(加减乘除)包含高精度*高精度高精度/高精度
  3. 如何在Google Chrome浏览器中清除浏览历史记录
  4. 超级浣熊的最近黑科技!?太有用了
  5. 计算机网络常见缩略语
  6. [组图]10个免费在线图片特效处理的网站
  7. JAVA如何利用迅雷接口解析磁力,关于神秘代码(磁力链接)如何正确使用
  8. perl 产生随机数
  9. 物联网(IOT)之常见物联网通信技术概览-无线篇①
  10. invalid vcs root mapping 怎么解决_一加黑鲨华硕OPPO等手机root后微信指纹支付不可用怎么解决...