小 W 摆石子
【问题描述】
小 W 得到了一堆石子,要放在 N 条水平线与 M 条竖直线构成的网格的交点上。因为小 M 最喜欢矩形了,小 W 希望知道用 K 个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。
【输入格式】
第一行三个整数 N,M,K。
【输出格式】
一个非负整数,即最多的满足条件的长方形数量。
【输入输出样例】

rectangle.in
3 3 8
rectangle.out
5

rectangle.in
7 14 86
rectangle.out
1398

【数据规模】
对于 50%的数据:N<=30
对于 100%的数据:N<=30000,保证任意两点不重合,K<=N*M

题解

暴力枚举即可

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. long long n,m,k,sum,ans;
  9. long long C(long long x){return x*(x-1)>>1;}
  10. long long maxx(long long a,long long b){return a>b?a:b;}
  11. long long work(long long x,long long y)
  12. {
  13. long long i,tans;
  14. tans=0;
  15. for(i=1;i<=y;i++)
  16. if(k/i+(bool)(k%i)<=x)
  17. tans=maxx(tans,C(k/i)*C(i)+C(k%i)*(k/i));
  18.  
  19. return tans;
  20. }
  21.  
  22. int main()
  23. {
  24. int i,j;
  25. freopen("rectangle.in","r",stdin);
  26. freopen("rectangle.out","w",stdout);
  27. scanf("%d%d%d",&n,&m,&k);
  28. ans=maxx(work(n,m),work(m,n));
  29. printf("%lld",ans);
  30. return 0;
  31. }

小 M 玩数列
【问题描述】
众所周知,小 M 的数学超级超级好,于是给小 W 出了一道题:
给小 W 两个数 X,Y,其中 X ≤ Y≤ 2^31−1。
小 W 任务就是求出 Fibonacci 数列第 X~Y 项的和除以 10000 的余数。
然而小 W 是数学战五渣,于是只能把这个任务交给机智的你啦。
【输入格式】
第一行一个整数 T,表示数据组数。
接下来 T 行,每行两个数 X,Y,意义如题所述。
【输出格式】
T 行,每行是一个询问的答案。
【输入输出样例】

fibonacci.in
2
1 5

fibonacci.out
127 255

fibonacci.in
1
12

fibonacci.out
5976
【数据规模】
对于 80%的数据:T=1,Y<=10^6
对于 100%的数据:T<=1000,Y<=2^31-1

题解

矩乘优化即可

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<queue>
  8. #define mod 10000
  9. using namespace std;
  10. struct hh
  11. {
  12. int a[5][5],n,m;
  13. };
  14. hh a,b,c;
  15.  
  16. int t,l,r,suma,sumb,ans;
  17. int f[50005];
  18.  
  19. hh mul(hh,hh);
  20. hh ff(hh,int);
  21. int main()
  22. {
  23. int i,j;
  24. freopen("fibonacci.in","r",stdin);
  25. freopen("fibonacci.out","w",stdout);
  26. scanf("%d",&t);
  27. a.m=a.n=b.n=3;
  28. b.m=1;
  29. for(j=1;j<=3;j++) a.a[1][j]=1;
  30. a.a[2][2]=a.a[2][3]=1;
  31. a.a[3][2]=1;
  32. b.a[1][1]=2;
  33. b.a[2][1]=b.a[3][1]=1;
  34. while(t--)
  35. {
  36. scanf("%d%d",&l,&r);
  37. if(l<=3) suma=l-1;
  38. else{c=mul(ff(a,l-3),b);suma=c.a[1][1];}
  39. if(r<=2) sumb=r;
  40. else{c=mul(ff(a,r-2),b);sumb=c.a[1][1];}
  41. ans=(sumb-suma+mod)%mod;
  42. printf("%d\n",ans);
  43. }
  44. fclose(stdin);
  45. fclose(stdout);
  46. return 0;
  47. }
  48.  
  49. hh mul(hh a,hh b)
  50. {
  51. int i,j,k;
  52. hh c;
  53. c.n=a.n;
  54. c.m=b.m;
  55. memset(c.a,0,sizeof(c.a));
  56. for(i=1;i<=c.n;i++)
  57. for(j=1;j<=c.m;j++)
  58. for(k=1;k<=c.n;k++)
  59. c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
  60. return c;
  61. }
  62.  
  63. hh ff(hh a,int k)
  64. {
  65. int i,j;
  66. hh c;
  67. c.m=a.m;
  68. c.n=a.n;
  69. for(i=1;i<=min(c.n,c.m);i++) c.a[i][i]=1;
  70. for(i=1;i<=c.n;i++)
  71. for(j=1;j<=c.m;j++)
  72. if(i!=j) c.a[i][j]=0;
  73. while(k)
  74. {
  75. if(k&1) c=mul(a,c);
  76. a=mul(a,a);
  77. k>>=1;
  78. }
  79. return c;
  80. }

小 W 计树
【问题描述】
小 W 千辛万苦做出了数列题,突然发现小 M 被困进了迷宫里。迷宫是一个有 N(2≤N≤1000)个顶点 M(N−1≤M≤N∗(N − 1)/2 ) 条边的无向连通图。设 dist1[i]表示在这个无向连通图中, 顶点 i 到顶点 1 的最短距离。为了解开迷宫,现在要求小 W 在这个图中删除 M − (N − 1)条边,使得这个迷宫变成一棵树。设 dist2[i]表示在这棵树中,顶点 i 到顶点 1 的距离。小 W 的任务是求出有多少种删除方案,使得对于任意的 i,满足 dist1[i]=dist2[i]。
快点帮助小 W 救出小 M 吧!
【输入格式】
第一行,两个整数, N, M,表示有 N 个顶点和 M 条边。
接下来有 M 行,每行有 3 个整数 x, y, len(1 ≤ x, y ≤ n, 1 ≤ len ≤ 100),表示顶点 x 和顶点 y 有一条长度为 len 的边。
数据保证不出现自环、重边。
【输出格式】
一行两个整数,表示满足条件的方案数 mod 2147483647 的答案。
【输入输出样例】
treecount.in
3 3
1 2 2
1 3 1
2 3 1

treecount.in
2
【样例解释】
删除第一条边或第三条边都能满足条件,所以方案数是 2。

【数据规模】
对于 30%的数据:2≤N≤5,M≤10
对于 50%的数据:满足条件的方案数不超过 10000
对于 100%的数据:2≤N≤1000

题解

首先考虑离 1 点最近的那个点,一定和 1 点只连着一条边,则这条边是必选的;然后考察第二近的点,一种可能是和 1 点直接连的边比较近,一种可能是经过刚才最近的那个点再到 1 点的路比较近,不管是哪一种,选择都是唯一的,而剩下第三种可能是两者距离相同,这样的话两者选且只能选一个。以此类推,假设现在已经构造好了前 k 个点的一棵子树,看剩余点中到 1 点最近的点,这个点到 1 点有 k 种方法(分别是和那 k 个点连边), 其中有 m 个是可以保持最短距离的,则这一步可选的边数就是 m。一直构造,把方法数累乘,就能得到最后的结果。整个过程可以很好的符合 dijkstra 的过程,而生成树的步骤和 prim 如出一辙。

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<queue>
  8. #define mod 2147483647
  9. using namespace std;
  10.  
  11. int n,m;
  12. bool v[1005];
  13. int we[1010][1010], dis[1010];
  14. int last[1010];
  15. int tot=0;
  16. struct hh
  17. {
  18. int next,to,w;
  19. }e[2000005];
  20.  
  21. long long ans=1;
  22. struct node
  23. {
  24. int id,d;
  25. };
  26. node a[1005];
  27. queue<int> q;
  28.  
  29. bool cmp(node a, node b)
  30. {
  31. return a.d < b.d;
  32. }
  33.  
  34. void add(int a,int b,int c)
  35. {
  36. tot++;
  37. e[tot].to=b;
  38. e[tot].w=c;
  39. we[a][b]=c;
  40. e[tot].next=last[a];
  41. last[a]=tot;
  42. }
  43.  
  44. void spfa()
  45. {
  46. int i,now;
  47. for(i=2;i<=n;i++) dis[i]=9999999;
  48. q.push(1);
  49. dis[1]=0;
  50. while(!q.empty())
  51. {
  52. now=q.front();
  53. q.pop();
  54. v[now]=false;
  55. for(i=last[now];i;i=e[i].next)
  56. if(dis[e[i].to]>dis[now]+e[i].w)
  57. {
  58. dis[e[i].to]=dis[now]+e[i].w;
  59. if(!v[e[i].to])
  60. {
  61. v[e[i].to]=true;
  62. q.push(e[i].to);
  63. }
  64. }
  65. }
  66. }
  67.  
  68. int main()
  69. {
  70. int i,j,x,y,z,now;
  71. freopen("treecount.in","r",stdin);
  72. freopen("treecount.out","w",stdout);
  73. scanf("%d%d",&n,&m);
  74. for(i=1;i<=n;i++)
  75. for(j=1;j<=n;j++)
  76. we[i][j]=9999999;
  77. for(i=1;i<=m;i++)
  78. {
  79. scanf("%d%d%d",&x,&y,&z);
  80. add(x,y,z);
  81. add(y,x,z);
  82. }
  83. spfa();
  84. for (i=1;i<=n;i++)
  85. {
  86. a[i].id=i;
  87. a[i].d=dis[i];
  88. }
  89. sort(a+1,a+n+1,cmp);
  90. for(i=2;i<=n;i++)
  91. {
  92. now=0;
  93. for(j=1;j<=i-1;j++)
  94. if(a[i].d==a[j].d+we[a[i].id][a[j].id]) now++;
  95. ans=ans*(long long)now%mod;
  96. }
  97. printf("%lld",ans);
  98. fclose(stdin);
  99. fclose(stdout);
  100. return 0;
  101. }

【2016常州一中夏令营Day3】的更多相关文章

  1. 【2016常州一中夏令营Day7】

    序列(sequence)[题目描述]蛤布斯有一个序列,初始为空.它依次将 1-n 插入序列,其中 i插到当前第 ai 个数的右边 (ai=0 表示插到序列最左边).它希望你帮它求出最终序列.[输入数据 ...

  2. 【2016常州一中夏令营Day6】

    小 W 算树[问题描述]山有苞棣,隰有树檖.未见君子,忧心如醉~小 W 养了一棵有 N 个点的无根树,由于小 M 最喜欢二叉树了,为了讨小 M 欢喜,小 W想知道有多少个点作为根后,这棵树是一棵二叉树 ...

  3. 【2016常州一中夏令营Day5】

    小 W 拼图[问题描述]小 W 和小 M 一起玩拼图游戏啦~小 M 给小 M 一张 N 个点的图,有 M 条可选无向边,每条边有一个甜蜜值,小 W 要选K 条边,使得任意两点间最多有一条路径,并且选择 ...

  4. 【2016常州一中夏令营Day4】

    小 W 走迷宫[问题描述]小 W 被小 M 困在了一个方格矩阵迷宫里,矩阵边界在无穷远处,我们做出如下的假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b. 走过的格子立即塌陷无 ...

  5. 【2016常州一中夏令营Day2】

    小 W 学数学[问题描述]为了测试小 W 的数学水平,果果给了小 W N 个点,问他这 N 个点能构成的三角形个数.[输入格式]第一行一个整数 N,代表点数.接下来 N 行,每行两个非负整数 X.Y, ...

  6. 【2016常州一中夏令营Day1】

    Problem 1. suffix给定一个单词,如果该单词以 er. ly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作.Input输入一行,包含一 ...

  7. 【FJ省队训练&&NOIP夏令营】酱油&&滚粗记

    FJOI2016省队训练滚粗记 2016.07.03~2016.07.06(Day1~5) 在学校期末考.因为才省选二试too young too simple爆蛋了所以下半个学期只能滚回去读文化课, ...

  8. 夏令营提高班上午上机测试 Day 2 解题报告

    那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧……   是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...

  9. 百练6255-单词反转-2016正式B题

    百练 / 2016计算机学科夏令营上机考试 已经结束 题目 排名 状态 统计 提问   B:单词翻转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个 ...

随机推荐

  1. codechef Heavy-light Decompositions

    Heavy-light Decompositions Problem Code: HLDOTSSubmit All submissions for this problem are available ...

  2. 1.27eia原油

  3. Vagrant-安装教程及常见问题

    http://ju.outofmemory.cn/entry/346215 前言: Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 它的主要意义是让所有开发人员都使用和线上服务 ...

  4. HDU-1160_FatMouse's Speed

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Sp ...

  5. UVA_10071:Back to High School Physics

    Language:C++ 4.8.2 #include<stdio.h> int main(void) { int v, t; while(scanf("%d%d", ...

  6. 从零学React Native之08Image组件

    开发过程中, 几乎每个项目都会用到图片. RN就是通过Image组件显示图片.既可以加载网络图片,也可以加载本地资源图片. Image组件必须在样式中声明图片的款和高.如果没有声明,则图片将不会被呈现 ...

  7. ADO.NET_02

    一.说明 这个例子是小白跟着学习代码记录,模拟用户登陆功能,并可以查询所有学生信息. 二.代码 共4个文件,如下 App.config <?xml version="1.0" ...

  8. 二分查找 Day08

    package com.sxt.arraytest2; /* * 二分查找 前提:有序 */ public class TestBinarySearch { public static void ma ...

  9. @codeforces - 117C@ Cycle

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个竞赛图(有向完全图),请找出里面的某个三元环,或者判断不 ...

  10. 模板—tarjan缩点

    void tarjan(int x) { dfn[x]=++cnt;low[x]=cnt; vi[x]=; stack[++top]=x; for(rint i=f(x);i;i=n(i)) if(! ...