BZOJ刷题记录---学习一天可做 AC

BZOJ刷题记录---学习一天可做   AC

总目录详见https://blog.csdn.net/mrcrack/article/details/90228694

序号题号算法思想难度实现难度总难度推荐指数
11214Ruby00010
23816Ruby00010
31000可持久化动态仙人掌剖分11210
42462输出1016391
52463小学奥数102122
61192找规律/二分图95149

测评地址:

1.bzoj   1214  已不再是   bzoj1214 [HNOI2004]FTP服务器    故跳过   20190515

2.bzoj 3816  //3816: 矩阵变换   //在线测评地址http://uoj.ac/problem/41

3.bzoj 1000 //1000: A+B Problem  //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1000

4.bzoj 2462   //2462: [BeiJing2011]矩阵模板   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2462

5.bzoj 2463   //2463: [中山市选2009]谁能赢呢?   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2463

6.bzoj 1192   //1192: [HNOI2006]鬼谷子的钱袋   普通版//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1192

6.bzoj 1192   //P2320 [HNOI2006]鬼谷子的钱袋   加强版//在线测评地址https://www.luogu.org/problemnew/show/P2320

题解:

1.bzoj   1214  已不再是   bzoj1214 [HNOI2004]FTP服务器    故跳过   20190515

2.bzoj   3816

//3816: 矩阵变换
//在线测评地址http://uoj.ac/problem/41
//“我们希望保持上面的性质4”没读懂 
//“4 5 3 1 2”输出也没弄明 
//研习此文https://blog.csdn.net/tigerhcs/article/details/46461109
//稳定婚姻问题http://www.matrix67.com/blog/archives/2976文中


//建议 删除 上图中C与3的数据,这样 应用“修补策略”可能会产生死循环,这个例子就没有问题了。 

//https://www.lydsy.com/JudgeOnline/problem.php?id=3816反复阅读题目

0102300405
2030010540
4210003050
0304050120
1003245000

对应输出结果为4 5 3 1 2的变换为

0102300444
2030010555
4210003333
0304050111
1003222222

对应输出结果为5 4 3 1 2的变换为

0102300405
2030010544
4210003333
0304050111
1003222222

//至此 “我们希望保持上面的性质4”没读懂,“4 5 3 1 2”输出也没弄明,

//两个问题得以解决。2019-5-19 15:16

//https://blog.csdn.net/tigerhcs/article/details/46461109看看代码,看看解释,没看太明白, 
//带入样例数据,竟然很快看懂程序意图。
//样例通过,提交Output_Limit_Exceed,重读代码,再看 https://blog.csdn.net/tigerhcs/article/details/46461109
//没有问题,在http://uoj.ac/problem/41提交AC 2019-5-19 21:35
//基本可以确认是BZOJ的问题,该题不能在BZOJ里提交。 
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node{
    int row,col;
}num[210][210];
int cnt[210],now[210],q[210*210],h,t,match[210];
int cmp(node a,node b){
    return a.col>b.col;
}
int main(){
    int T,n,m,i,j,a,x,row;
    scanf("%d",&T);
    while(T--){
        memset(cnt,0,sizeof(cnt)),memset(match,0,sizeof(match));
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++){
                scanf("%d",&a);
                if(a)num[a][++cnt[a]].row=i,num[a][cnt[a]].col=j;
            }
        for(i=1;i<=n;i++)sort(num[i]+1,num[i]+1+n,cmp);
        for(i=1;i<=n;i++)now[i]=1;//now[i]数i对应的排位第几喜欢 
        h=t=1;
        for(i=1;i<=n;i++)q[t]=i,t++;//数i进队列。
        while(h<t){//配对 
            x=q[h],row=num[x][now[x]].row,h++;
            if(!match[row])match[row]=x;
            else if(num[match[row]][now[match[row]]].col>num[x][now[x]].col)
                q[t]=match[row],now[match[row]]++,t++,match[row]=x;
            else now[x]++,q[t]=x,t++;//此处写成 else now[x]++;翻看https://blog.csdn.net/tigerhcs/article/details/46461109才发现 
        } 
        printf("%d",match[1]);
        for(i=2;i<=n;i++)printf(" %d",match[i]);
        printf("\n");
    }
    return 0;
}

行 男  数 女 可看看https://www.cnblogs.com/ywwyww/p/8513151.html代码2019-5-29

//行 男,数 女 此文思路很不错https://blog.csdn.net/qq_40619297/article/details/84147732摘抄如下 2019-5-30
//看完题面后,很容易想到
//1.对于每一行,希望选的数字尽量靠前。重置尽可能多的数字;
//2.对于每一个数字x,希望在所选行的位置尽量靠后。尽量避免和其他行的x冲突;
//再结合题面对A的描述,我们可以知道
//1.对于第i行,所有数字有不同的匹配优先级
//2.对于数字x,所有行有不同的匹配优先级
//数字和行,一对一匹配。恰好就是典型的稳定婚姻问题模型
//现在我们构造一下非法样例验证一下我们的想法。
//i    x x(y)x x x x x x x x
//j                x      y y y y
//明显的在以上样例中,对于第j行的x优先级更高,对于x第j行的优先级更高。
//根据稳定婚姻问题模型的描述,我们应该把x和j匹配才是更优的(YY一下我们会发现这样匹配的确是更优的

//行 男,数 女

//样例输出为

4 1 3 5 2
4 1 3 5 2
//3816: 矩阵变换
//在线测评地址http://uoj.ac/problem/41 
//行 男,数 女
//三处问题
//第一处for(i=1;i<=n;i++)q[t]=i,t++,now[i]=1;//漏了 now[i]=1 
//第二处else if(match[x]&&c[x][row]>c[x][y])//此处写成else if(match[x]&&c[row][now[row]]>c[y][now[y]])跟踪代码后发现
//第三处else now[row]++,q[t]=row,t++;//此处写成 else now[row]++;跟踪代码,对比过逻辑后,发现  
//样例通过,提交AC。2019-5-31 
#include <stdio.h>
#include <string.h>
#define maxn 205
#define maxm 405
int a[maxn][maxm],match[maxn],b[maxn][maxn],cnt[maxn],q[maxn*100],c[maxn][maxn],now[maxn];
int main(){
    int n,m,i,j,T,h,t,row,x,y;
    scanf("%d",&T);
    while(T--){
        memset(a,0,sizeof(a)),memset(b,0,sizeof(b));
        memset(match,0,sizeof(match)),memset(cnt,0,sizeof(cnt));
        memset(c,0,sizeof(c)),memset(now,0,sizeof(now));
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++){
                scanf("%d",&a[i][j]);
                if(a[i][j]){
                    b[i][++cnt[i]]=a[i][j];//i行 第cnt[i]个 数据 为 a[i][j]
                    c[a[i][j]][i]=j;//数a[i][j]在i行对应的列为j 喜好的关键 
                }
            }
        h=t=1;
        for(i=1;i<=n;i++)q[t]=i,t++,now[i]=1;//漏了 now[i]=1
        while(h<t){//稳定婚姻关系
            row=q[h],x=b[row][now[row]],y=match[x]; 
            if(!match[x])match[x]=row;
            else if(match[x]&&c[x][row]>c[x][y])//此处写成else if(match[x]&&c[row][now[row]]>c[y][now[y]])跟踪代码后发现 
                match[x]=row,q[t]=y,t++;
            else now[row]++,q[t]=row,t++;//此处写成 else now[row]++;跟踪代码,对比过逻辑后,发现 
            h++; 
        }
        printf("%d",b[1][now[1]]);
        for(i=2;i<=n;i++)printf(" %d",b[i][now[i]]);
        printf("\n");
    }
    return 0;

3.bzoj 1000   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1000

//1000: A+B Problem
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1000
//样例通过,提交AC。2019-5-15
#include <stdio.h>
int main(){
    int a,b,c;
    scanf("%d%d",&a,&b);
    c=a+b;
    printf("%d\n",c);
    return 0;
}

4.bzoj 2462   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2462

//2462: [BeiJing2011]矩阵模板
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2462
//该题就是一个矩阵的查找
//枚举,肯定超时
//找遍网络,没有从零开始介绍矩阵哈希,建议从代码读起,从中领捂https://blog.csdn.net/i_believe_cwj/article/details/82965434
//突然有个想法,处理数据过程类似于进制,具体在进制中,具体数据确定具体占位。
//该题有几个难点,溢出+子矩阵计算+模(桶排序),搜遍全网,没有讲清楚的。
//先熟悉无符号整数的自然溢出,以及对应的加减法
//亲测usigned int范围,0-4294967295 
//若为4294967296 输出0,若为 若为4294967297 输出1,若为 若为4294967298 输出2
//4294967298-4294967290=8这是理解中的情况,
//计算机处理情况如下,4294967298存储为2,4294967290存储为4294967290
//2-4294967290=8,代码亲测,确实如此,故usigned int自然溢出,不影响两数之间的差值
//测试代码如下

#include <stdio.h>
#define ui unsigned int
int main(){
    ui a,b;
    scanf("%u%u",&a,&b);
    printf("%u\n",a-b);
    return 0;

//测试结果如下 

4294967298 4294967290
8

//int也有同样的结果,自然溢出,不影响两数的差值。
//那为什么不采用int,而采用unsigned int呢,
//因在程序中涉及模运算,并且运算的结果,将成为数组元素的下标,负数作为下标,显然不合适
//自此,第一个难点,选择 无符号整数unsigned int,遇到 自然溢出,不影响程序 的逻辑。得以解决。2019-5-18 16:35

//准备找两个质数,一个比较小,是2,一个比较大,大于1000000,找到1000003,查找程序如下 

#include <stdio.h>
#define ui unsigned int
int main(){
    ui a,j;
    for(a=1000000;a<=1000100;a++){
        for(j=2;j*j<=a;j++)
            if(a%j==0)break;
        if(a%j)printf("%d prime\n",a);
    }
    return 0;

//输出结果如下 2019-5-18 22:49

1000003 prime
1000033 prime
1000037 prime
1000039 prime
1000081 prime
1000099 prime

//一切就绪,可以开始代码的编写

v=sum[i][j]-sum[i-a][j]*pow_row[a]-sum[i][j-b]*pow_col[b]+sum[i-a][j-b]*pow_row[a]*pow_col[b];
            //上式理解,如图所示。sum[i-a][j]相当于 红+蓝,sum[i][j-b]相当于 红+绿,sum[i-a][j-b]相当于 红,v相当于  白


//sum[1][1]类似于进制中的最高位,sum[m][n]是最低位。
//二维 哈希,二维 hash,矩阵 哈希,矩阵 hash
//样例通过,提交AC。2019-5-18 23:49 
#include <stdio.h>
#include <string.h>
#define ui unsigned int
#define maxn 1010
#define BASE_ROW 2
#define BASE_COL 3
#define mod 1000033 
ui m,n,a,b;
char s[maxn][maxn];
ui sum[maxn][maxn],pow_row[maxn],pow_col[maxn],hash[1000100];
int main(){
    ui i,j,v,q;
    scanf("%u%u%u%u",&m,&n,&a,&b);
    for(i=1;i<=m;i++)scanf("%s",s[i]+1);//数组下标从1开始 
    memset(sum,0,sizeof(sum)),memset(hash,0,sizeof(hash));
    pow_row[0]=pow_col[0]=1;
    for(i=1;i<=a;i++)pow_row[i]=pow_row[i-1]*BASE_ROW;
    for(i=1;i<=b;i++)pow_col[i]=pow_col[i-1]*BASE_COL;
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            sum[i][j]+=sum[i-1][j]*BASE_ROW+s[i][j]-'0';//行处理
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            sum[i][j]+=sum[i][j-1]*BASE_COL;//列处理
    for(i=a;i<=m;i++)//计算子矩阵 
        for(j=b;j<=n;j++){
            v=sum[i][j]-sum[i-a][j]*pow_row[a]-sum[i][j-b]*pow_col[b]+sum[i-a][j-b]*pow_row[a]*pow_col[b];
            //上式理解,如图所示。
            hash[v%mod]=1;
        }
    scanf("%u",&q);
    while(q--){
        for(i=1;i<=a;i++)scanf("%s",s[i]+1);
        memset(sum,0,sizeof(sum));
        for(i=1;i<=a;i++)
            for(j=1;j<=b;j++)
                sum[i][j]+=sum[i-1][j]*BASE_ROW+s[i][j]-'0';
        for(i=1;i<=a;i++)
            for(j=1;j<=b;j++)
                sum[i][j]+=sum[i][j-1]*BASE_COL;
        if(hash[sum[a][b]%mod])printf("1\n");
        else printf("0\n");
    }
    return 0;

5.bzoj 2463   //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2463

//2463: [中山市选2009]谁能赢呢?
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2463
//比较欣赏此文思路http://www.cnblogs.com/philippica/p/4006938.html
//这题不科学~~本以为鬼谷子的钱袋是能在BZOJ写的最短的程序了,这题还要短…..好吧,思考难度神马的还是有点的(至少对我这种蒟蒻来说)。很明显这是道博弈论的题目,在纸上画出了n=1~4的博弈树,发现bob和alice是交替出现的…0.0 当时就在想不会这么巧吧。忍不住百度了下解题,果然是这样的,不过解题上说结论归纳可得。。。。弱弱的写一个自己的理解。设小明和小红交替下棋为一个周期,则根据规则一个周期内小红和小明下的棋的形状将是一个1*2的长方形,很容易得出n*n的棋盘当且仅当n为偶数时能被1*2的长方形完全覆盖,当n为奇数时,仅有一块不能被覆盖,于是类似于NIM游戏的构造法,很容易想到当对方走一步后,我总能走到1*2的长方形的另一端,因此当n为偶数时无论如何都是先手必胜,同理当n为奇数时,由于剩下一块不能被长方形覆盖,因此后手必胜
//先模拟n=1 B,n=2 A,n=3 B
//样例通过,Wrong_Answer,读题,发现一次有多组数据。
//修改,提交AC。2019-5-16

//建议学习《组合数学》原书第5版P2  1.1例子:棋盘的完美覆盖。详见https://blog.csdn.net/mrcrack/article/details/80562324
#include <stdio.h>
int main(){
    int n;
    while(scanf("%d",&n)&&n){
        if(n%2==0)printf("Alice\n");
        else printf("Bob\n");
    }
    return 0;
}

bzoj 1192   普通版//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1192

bzoj 1192   加强版//在线测评地址https://www.luogu.org/problemnew/show/P2320

6.普通版//1192: [HNOI2006]鬼谷子的钱袋
//在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1192
//https://blog.csdn.net/zhhx2001/article/details/51803092此文很有收获
//先模拟->找规律
//"并且不有两个钱袋装有相同的大于1的金币数",解释如下,钱袋里的钱大于等于2后,就不相同。
//若钱袋为1,可以雷同
//1:(1)     1->1
//2:(1,1)   1->1  1+1->2
//3:(1,2)   1->1   2->2   1+2->3
//4:(1,1,2) 1->1   2->2  1+1->2  1+2->3  1+1+2->4
//5:(1,1,3) 1->1   1+1->2  3->3   1+3->4  1+1+3->5
//6:(1,2,3) 1->1  2->2  3->3  1+2->3  1+3->4  2+3->5  1+2+3->6
//7:(1,2,4) 1->1  2->2  1+2->3  4->4  1+4->5  2+4->6  1+2+4->7
//8:(1,1,2,4)  1->1  1+1->2  2->2  1+2->3  4->4  1+4->5  2+4->6  1+2+4->7  1+1+2+4->8
//与二进制联系
//样例通过,提交AC。2019-5-15
#include <stdio.h>
#include <math.h>
int main(){
    int m;
    scanf("%d",&m);
    printf("%d\n",(int)(log2(m)+1));
    return 0;
}

6.加强版//P2320 [HNOI2006]鬼谷子的钱袋
//在线测评地址https://www.luogu.org/problemnew/show/P2320
//https://www.luogu.org/problemnew/solution/P2320?page=4此文思路不错  作者: a526955194 更新时间: 2016-02-05 19:44  在Ta的博客查看
//我们可以假象一下 若m=12 则需要求得组合方案有(1 2 3 4 ……12)
//我们可以把他们分成两份 (1 2 …… 6) (7 8 ……12)称左边的为L 右边的为R
//很容易得知R中的每种方案都可以由(12/2)+左边的组合得出
//再次分成两份(1 2 3)(4 5 6)
//同理 当m为奇数时 显而易见地 只需把 (m/2)改为(m/2+1) 即可
//该题考点,二分思想
//log2(10^9)=30
//样例通过,提交AC 2019-5-16
#include <stdio.h>
int a[32];
int main(){
    int m,i;
    scanf("%d",&m);
    a[0]=0;
    while(m){
        if(m%2==0)a[++a[0]]=m/2;
        else a[++a[0]]=m/2+1;
        m/=2;
    }
    printf("%d\n",a[0]);
    for(i=a[0];i>=1;i--)printf("%d ",a[i]);
    return 0;
}

2019-5-19 21:41 AC该章节内容。

学习了  二分思想,矩阵哈希,稳定婚姻问题,棋盘的完美覆盖。

收获满满。同时也感受到了BZOJ题目的强大。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bzoj作为一个计算机竞赛的在线评测系统,不仅可以提供大量的题目供程序员练习和学习,还可以帮助程序员提升算法和编程能力。为了更好地利用bzoj进行题目的学习刷题,制定一个bzoj题计划是非常有必要的。 首先,我们需要合理安排时间,每天留出一定的时间来bzoj的题目。可以根据自己的时间安排,每天挑选适量的题目进行解答。可以先从难度较低的题目开始,逐渐提高难度,这样既能巩固基础知识,又能挑战自己的思维能力。 其次,要有一个计划和目标。可以规划一个每周或每月的题目数量目标,以及每个阶段要学习和掌握的算法知识点。可以根据bzoj的题目分类,如动态规划、图论、贪心算法等,结合自己的实际情况,有针对性地选择题目进行学习。 此外,要充分利用bzoj提供的资源。bzoj网站上有很多高质量的题解和优秀的解题代码,可以参考和学习。还有相关的讨论区,可以与其他程序员交流和讨论,共同进步。 最后,要坚持并保持思考。题不是单纯为了刷数量,更重要的是学会思考和总结。遇到难题时,要有耐心,多思考,多尝试不同的解法。即使不能一次性解出来,也要学会思考和分析解题过程,以及可能出现的错误和优化。 总之,bzoj题计划的关键在于合理安排时间、制定目标、利用资源、坚持思考。通过有计划的刷题,可以提高算法和编程能力,并培养解决问题的思维习惯,在计算机竞赛中取得更好的成绩。 ### 回答2: bzoj题计划是指在bzoj这个在线测评系统上制定一套学习刷题的计划,并且将计划记录在excel表格中。该计划主要包括以下几个方面的内容。 首先是学习目标的设定。通过分析自己的水平和知识缺口,可以设定一个合理的目标,比如每天解决一定数量的题目或者提高特定的算法掌握程度。 其次是题目选择的策略。在excel表格中可以记录下自己选择的题目编号、题目类型和难度等信息。可以根据题目的类型和难度来安排每天的刷题计划,确保自己可以逐步提高技巧和解题能力。 然后是学习进度的记录和管理。将每天的完成情况记录在excel表格中,可以清晰地看到自己的学习进度和任务完成情况。可以使用图表等功能来对学习进度进行可视化展示,更好地管理自己的学习计划。 同时,可以在excel表格的备注栏中记录下每道题目的解题思路、关键点和需要复习的知识点等信息。这样可以方便自己回顾和总结,巩固所学的知识。 最后,可以将excel表格与其他相关资料进行整合,比如算法教材、题目解析和学习笔记等。这样可以形成一个完整的学习档案,方便自己进行系统的学习和复习。 总之,bzoj题计划excel的制定和记录可以帮助我们更加有条理和高效地进行学习刷题。通过合理安排学习目标和题目选择策略,记录学习进度和思路,并整合其他学习资料,我们可以提高自己的解题能力,并在bzoj上取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值