小 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

题解

暴力枚举即可

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,m,k,sum,ans;
long long C(long long x){return x*(x-1)>>1;}
long long maxx(long long a,long long b){return a>b?a:b;}
long long work(long long x,long long y)
{
long long i,tans;
tans=0;
for(i=1;i<=y;i++)
if(k/i+(bool)(k%i)<=x)
tans=maxx(tans,C(k/i)*C(i)+C(k%i)*(k/i)); return tans;
} int main()
{
int i,j;
freopen("rectangle.in","r",stdin);
freopen("rectangle.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
ans=maxx(work(n,m),work(m,n));
printf("%lld",ans);
return 0;
}

小 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

题解

矩乘优化即可

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#define mod 10000
using namespace std;
struct hh
{
int a[5][5],n,m;
};
hh a,b,c; int t,l,r,suma,sumb,ans;
int f[50005]; hh mul(hh,hh);
hh ff(hh,int);
int main()
{
int i,j;
freopen("fibonacci.in","r",stdin);
freopen("fibonacci.out","w",stdout);
scanf("%d",&t);
a.m=a.n=b.n=3;
b.m=1;
for(j=1;j<=3;j++) a.a[1][j]=1;
a.a[2][2]=a.a[2][3]=1;
a.a[3][2]=1;
b.a[1][1]=2;
b.a[2][1]=b.a[3][1]=1;
while(t--)
{
scanf("%d%d",&l,&r);
if(l<=3) suma=l-1;
else{c=mul(ff(a,l-3),b);suma=c.a[1][1];}
if(r<=2) sumb=r;
else{c=mul(ff(a,r-2),b);sumb=c.a[1][1];}
ans=(sumb-suma+mod)%mod;
printf("%d\n",ans);
}
fclose(stdin);
fclose(stdout);
return 0;
} hh mul(hh a,hh b)
{
int i,j,k;
hh c;
c.n=a.n;
c.m=b.m;
memset(c.a,0,sizeof(c.a));
for(i=1;i<=c.n;i++)
for(j=1;j<=c.m;j++)
for(k=1;k<=c.n;k++)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
return c;
} hh ff(hh a,int k)
{
int i,j;
hh c;
c.m=a.m;
c.n=a.n;
for(i=1;i<=min(c.n,c.m);i++) c.a[i][i]=1;
for(i=1;i<=c.n;i++)
for(j=1;j<=c.m;j++)
if(i!=j) c.a[i][j]=0;
while(k)
{
if(k&1) c=mul(a,c);
a=mul(a,a);
k>>=1;
}
return c;
}

小 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 如出一辙。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#define mod 2147483647
using namespace std; int n,m;
bool v[1005];
int we[1010][1010], dis[1010];
int last[1010];
int tot=0;
struct hh
{
int next,to,w;
}e[2000005]; long long ans=1;
struct node
{
int id,d;
};
node a[1005];
queue<int> q; bool cmp(node a, node b)
{
return a.d < b.d;
} void add(int a,int b,int c)
{
tot++;
e[tot].to=b;
e[tot].w=c;
we[a][b]=c;
e[tot].next=last[a];
last[a]=tot;
} void spfa()
{
int i,now;
for(i=2;i<=n;i++) dis[i]=9999999;
q.push(1);
dis[1]=0;
while(!q.empty())
{
now=q.front();
q.pop();
v[now]=false;
for(i=last[now];i;i=e[i].next)
if(dis[e[i].to]>dis[now]+e[i].w)
{
dis[e[i].to]=dis[now]+e[i].w;
if(!v[e[i].to])
{
v[e[i].to]=true;
q.push(e[i].to);
}
}
}
} int main()
{
int i,j,x,y,z,now;
freopen("treecount.in","r",stdin);
freopen("treecount.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
we[i][j]=9999999;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
spfa();
for (i=1;i<=n;i++)
{
a[i].id=i;
a[i].d=dis[i];
}
sort(a+1,a+n+1,cmp);
for(i=2;i<=n;i++)
{
now=0;
for(j=1;j<=i-1;j++)
if(a[i].d==a[j].d+we[a[i].id][a[j].id]) now++;
ans=ans*(long long)now%mod;
}
printf("%lld",ans);
fclose(stdin);
fclose(stdout);
return 0;
}

【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. 【记录bug】npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.7 (node_modules\fsvents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents1.2.7: wanted {"os":"darwin

    npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.7 (node_modules\fsvents): npm WARN nots ...

  2. IDEA切换git分支

    查看当前所在分支 场景:在多人开发中,需要在主分支的基础上创建一些分支分配给小团队或个人去开发,然后小分支上的小功能开发完毕之后,再merge(合并)到主分支. 1.查看当前所在的分支 下图1.1中是 ...

  3. springboot项目启动,但是访问报404错误

    启动类Application上加了@ComponentScan(basePackages = {})这个注解导致controller扫描不到导致的,如果加了这个注解,springboot就不会扫描Ap ...

  4. oralce基本select语句

    SELECT  [DISTINCT]  *|{column1,column2,column3. . .}   FROM    table l  select指定查询哪些列的数据. l  column指 ...

  5. TIJ——Chapter Twelve:Error Handling with Exception

    Exception guidelines Use exceptions to: Handle problems at the appropriate level.(Avoid catching exc ...

  6. js中的超过16位数字相加问题

    方案一 function sub(str1, str2) { // 补全0,并多补一位0 let arr1 = null, arr2 = null if (str1.length > str2. ...

  7. 【NS2】TCL debug (转载)

    1.使用NS2进行模拟,就不可避免的会接触TCL/OTCL和C/C++.两者配合使用.一般设置场景啊,业务流啊,都使用TCL/OTCL来编写脚 本.要进行路由实验模拟的话,同一类的实验,这些脚本基本上 ...

  8. 巨蟒python全栈开发-第11阶段 ansible_project5

    今日大纲 1.命令展示前端页面实现(下面有个断点) 2.命令下发后端展示

  9. ping的使用

    ping -t cnblogs.com 可以一直ping网址显示对应的响应时间

  10. [kuangbin带你飞]专题九 连通图D - Network POJ - 3694

    这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非 ...