常州day3

Task1

小 W 得到了一堆石子,要放在 N 条水平线与 M 条竖直线构成的网格的交点上。
因为小 M 最喜欢矩形了, 小 W 希望知道用 K 个石子最多能找到多少四边平行于坐标轴的
长方形,它的四个角上都恰好放着一枚石子。

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

简单题,枚举即可

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long ll;
 8 ll n,m,k,ans,now,a,b,c,p,q;
 9 int main(){
10     freopen("rectangle.in","r",stdin);
11     freopen("rectangle.out","w",stdout);
12     cin>>n>>m>>k;
13     for(int i=1;i<=n;i++){
14         a=i;b=k/i;c=k%i;now=p=q=0;
15         if(b>m) continue;
16         now=(a*(a-1)/2)*(b*(b-1)/2);
17         if(a<n){
18             if(c>b) continue;
19             p=now+c*(c-1)/2*a;
20         }
21         if(b<m){
22             if(c>a) continue;
23             q=now+c*(c-1)/2*b;
24         }
25         ans=max(ans,max(p,q));
26     }
27     cout<<ans;
28     return 0;
29 }

Task 2

小 W 发现了一个神奇的数列: 这就是著名的 Fibonacci
Sequence = =!。
众所周知,小 M 的数学超级超级好,于是给小 W 出了一道题:
给小 W 两个数 X,Y,其中 X ≤ Y≤ 2^31−1。
小 W 任务就是求出 Fibonacci 数列第 X~Y 项的和除以 10000 的余数。
然而小 W 是数学战五渣,于是只能把这个任务交给机智的你啦。

对于 100%的数据:T<=1000,Y<=2^31-1

简单题,矩阵快速幂裸题

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string.h>
 7 #define il inline
 8 using namespace std;
 9 const int mod=10000;
10 int base[3][3],ans[3][3],tmp[3][3],s,t,T;
11 il void mul(int a[3][3],int b[3][3],int c[3][3]){
12     memset(tmp,false,sizeof(tmp));
13     for(int i=0;i<3;i++)
14         for(int j=0;j<3;j++)
15             for(int k=0;k<3;k++)
16                 tmp[i][j]=(tmp[i][j]+a[i][k]*b[k][j])%mod;
17     for(int i=0;i<3;i++)
18         for(int j=0;j<3;j++)
19             c[i][j]=tmp[i][j];
20 }
21 il int est(int n){
22     if(n==0) return 0;
23     if(n==1) return 1;
24     if(n==2) return 2;
25     memset(base,0,sizeof(base));
26     memset(ans,0,sizeof(ans));
27     ans[0][0]=ans[1][1]=ans[2][2]=1;
28     base[0][1]=base[0][2]=base[1][0]=base[1][1]=base[1][2]=base[2][2]=1;
29     for(int pow=n-2;pow;pow>>=1){
30         if(pow&1) mul(ans,base,ans);
31         mul(base,base,base);
32     }
33     return (ans[0][2]+ans[1][2]+ans[2][2]*2)%mod;
34 }
35 il void init(){
36     scanf("%d%d",&s,&t);
37     printf("%d\n",(mod+est(t)-est(s-1))%mod);
38 }
39 int main(){
40     freopen("fibonacci.in","r",stdin);
41     freopen("fibonacci.out","w",stdout);
42     scanf("%d",&T);
43     for(int i=1;i<=T;i++) init();
44     return 0;
45 }

Task 3

小 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 吧!

对于 100%的数据:2≤N≤1000

最短路径树计数

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<stdlib.h>
 4 #include<algorithm>
 5 #include<math.h>
 6 #include<string>
 7 #include<string.h>
 8 #include<queue>
 9 #define il inline
10 using namespace std;
11 const int N=2001;
12 int n,m,M=0,inq[N],d[N],p[N][N],g[N];
13 long long ans=1;
14 queue<int> q;
15 struct edge{int next,to,val;
16 } e[2000001];
17 struct data{int dist,id;
18 } b[N];
19 il void addedge(int x,int y,int z){
20     e[++M]=(edge){g[x],y,z};g[x]=M;
21 }
22 il bool cmp(data a,data b){
23     return a.dist<b.dist;
24 }
25 int main(){
26     freopen("treecount.in","r",stdin);
27     freopen("treecount.out","w",stdout);
28     scanf("%d%d",&n,&m);
29     for(int i=0;i<=n+1;i++)
30         for(int j=0;j<=n+1;j++)
31             p[i][j]=p[j][i]=(1<<20);
32     for(int i=1,x,y,z;i<=m;i++){
33         scanf("%d%d%d",&x,&y,&z);
34         addedge(x,y,z);
35         addedge(y,x,z);
36         p[x][y]=p[y][x]=z;
37     }
38     for(int i=1;i<=n;i++) d[i]=(1<<20);
39     memset(inq,false,sizeof(inq));
40     d[1]=0;q.push(1);
41     while(!q.empty()){
42         int h=q.front();q.pop();inq[h]=false;
43         for(int i=g[h];i;i=e[i].next)
44             if(d[e[i].to]>d[h]+e[i].val){
45                 d[e[i].to]=d[h]+e[i].val;
46                 if(!inq[e[i].to]){
47                     inq[e[i].to]=true;
48                     q.push(e[i].to);
49                 }
50             }
51     }
52     for(int i=1;i<=n;i++){
53         b[i].dist=d[i];
54         b[i].id=i;
55     }
56     sort(b+1,b+n+1,cmp);
57     for(int i=2;i<=n;i++){
58         int cnt=0;
59         for(int j=1;j<i;j++)
60             if(b[j].dist+p[b[j].id][b[i].id]==b[i].dist)
61                 cnt++;
62         ans=ans*cnt%2147483647ll;
63     }
64     cout<<ans;
65     return 0;
66 }
时间: 2024-11-11 21:46:35

常州day3的相关文章

块池是属于单个命名空间的一组块。

块池( Block Pool)     块池是属于单个命名空间的一组块.     每一个datanode为所有的block pool存储块.     Datanode是一个物理概念,而block pool是一个重新将block划分的逻辑概念.     同一个datanode中可以存着属于多个block pool的多个块.     Block pool允许一个命名空间在不通知其他命名空间的情况下为一个新的block创建Block ID.     一个Namenode失效不会影响其下的datanod

常州培训 day3 解题报告

第一题: 给出数轴正半轴上N个点的坐标和其权值,给出初始体力值M,人一开始在位置0,体力值会随着走过路程的增加而增加,走多少个单位的路消耗多少体力值.到每个点可以打掉,消耗的体力值就是其权值.求 最多能打掉多少点. N<=10000,其他<=10^18; 解题过程: 1.一开始就直接想到是贪心,首先人是不可能往左走的,否则不会最优.枚举最后停在哪个点,减去到这个点需要的体力,然后把这个点之前的所有点(包括这个店)的权值排个序,从小到大一个一个打,打到体力没有为止.复杂度分析:枚举N次,每次快拍

[蒟蒻修炼计划][谜之吐槽]常州集训day3

T1 Description 有K个石子,石子只能放在N条水平线与M条竖直线构成的网格的交点上. 求用K个石子最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子. Input 第一行三个整数N,M,K. Output 一个非负整数,即最多的满足条件的长方形数量. Sample Input 3 3 8 Sample Output 5 HINT N<=30000,保证任意两点不重合,K<=N*M Solution 很显然,最佳的方案长这样: xxx…xxx           

【2016常州一中夏令营Day3】

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

Python自动化运维课程学习--Day3

本文为参加老男孩Python自动化运维课程第三天学习内容的总结. 大致内容如下: 1.文件操作 2.字符编码转码相关操作 3.函数 0.关于本文中所有运行Python代码的环境: --操作系统:Ubuntu 16.10 (Linux 4.8.0) --Python版本:3.5.2 python2.7.12 --Python IDE: PyCharm 2016.3.2 一.文件操作: 1.文件操作流程:以只读.写(覆盖写).追加写.读写.追加读写.二进制读写等模式打开文件 ==> 得到文件句柄,并

Day3 String using Rules

//                                  **Day3 //                                  **for number in 1...10 //let closedRangeNumber = ["t","w","w"] //for i in 0..<closedRangeNumber.count //{ //       print(closedRangeNumber[i])

常州培训 day6

第一题: 题目大意: 给出一个N*N的矩阵,矩阵元素均为0或1.定义矩阵权值为sum(F[i][j]*F[j][i]); 给出K个操作: 询问矩阵的权值mod 2. 将矩阵的某一行元素取反(0变成1,1变成0). 将矩阵的某一列元素取反. N<=1000,K<=10^5 解题过程: 一开始看到K的范围有点大,肯定不能模拟,想到前几天N皇后那题大神讲了可以用60位压成一个long long优化,于是就傻乎乎的把每一行每一列都60位压缩.然后各种麻烦的操作,写到最后发现写不下去了,顿时心情糟透了,

Djano 分页 day3 html_helper.py

day3: 将startr 和 end 值加入html_helper.py 更加方便导入 1:???? 11 个 页码 如果 总页数 < 11 1-总页数 else: 当前页 < 6: 1 - 11 当前页 > 6: 如果 当前页 + 5 > 总页数 当前页 + 5 --- 总页数 当前页 -5 -- 当前页 + 5 2:输入 page 当前页数 num 总页数 per_item 默认值为5 输出 start end all_page_count 3:使用类会产生 start 和

python s12 day3

python s12 day3 深浅拷贝 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import copy # ######### 数字.字符串 ######### n1 = 123 # n1 = "i am alex age 10" print(id(n1)) # ## 赋值 ## n2 = n1 print(id(n2)) # ## 浅拷贝 ## n2 = cop