2017.7.15清北夏令营精英班Day1解题报告

成绩:

预计分数:20+10+40

实际分数:100+10+40.

一百三十多人的比赛全场rand7还水了个鼠标+键盘

unbelievable!

考试题目链接:

https://www.luogu.org/team/show?teamid=1353

T1

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<stack>
 8 #define lli long long
 9 using namespace std;
10 const int mod=998244353;
11 void read(int &n)
12 {
13     char c=‘+‘;int x=0;bool flag=0;
14     while(c<‘0‘||c>‘9‘){c=getchar();if(c==‘-‘)flag=1;}
15     while(c>=‘0‘&&c<=‘9‘)
16     x=(x<<1)+(x<<3)+c-48,c=getchar();
17     flag==1?n=-x:n=x;
18 }
19 lli n,m;
20 int fastmul(int x,int p)
21 {
22     int now=x;
23     int ans=0;
24     while(p)
25     {
26         if(p&1)
27         {
28             --p;
29             ans=(ans+now)%mod;
30         }
31         p>>=1;
32         now=(now+now)%mod;
33     }
34     return (ans-1)%mod;
35 }
36 int main()
37 {
38     freopen("bpmp.in","r",stdin);
39     freopen("bpmp.out","w",stdout);
40     //read(n);read(m);
41     cin>>n>>m;
42     cout<<fastmul(n,m)%mod;
43     return 0;
44 }

T1快速乘

一开始搞了个贪心不知道对不对,所以不期望能拿多少分,但没想到居然AC了

而且我以为这个题没有那么水于是就写了个快速乘、

事实上只要输出(n*m-1)%mod 就能AC,

(表示差点被卡成rank8,没奖)

http://www.cnblogs.com/zwfymqz/p/7186080.html

T2

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 #include<queue>
  7 #include<stack>
  8 #include<cstdlib>
  9 using namespace std;
 10 inline void read(int &n)
 11 {
 12     char c=‘+‘;int x=0;bool flag=0;
 13     while(c<‘0‘||c>‘9‘){c=getchar();if(c==‘-‘)flag=1;}
 14     while(c>=‘0‘&&c<=‘9‘)
 15     x=(x<<1)+(x<<3)+c-48,c=getchar();
 16     flag==1?n=-x:n=x;
 17 }
 18 int n,m;
 19 struct node
 20 {
 21     int a[101][101];
 22     int nowmaxn;
 23     int bgx,bgy,edx,edy;
 24 }now,nxt;
 25 int ans=-0x7ffff;
 26 queue<node>q;
 27 int tot=0;
 28 inline void calc()
 29 {
 30     /*memset(nxt.a,0,sizeof(nxt.a));
 31     for(int i=now.bgx;i<=now.edx;i++)
 32         for(int j=now.bgy;j<=now.edy;j++)
 33             nxt.a[i][j]=now.a[i][j];*/
 34     nxt=now;
 35 }
 36 inline void print()
 37 {
 38
 39     for(int i=now.bgx;i<=now.edx;i++)
 40     {
 41         for(int j=now.bgy;j<=now.edy;j++)
 42             printf("%d ",now.a[i][j]);
 43         printf("\n");
 44     }
 45     printf("*********************************\n");
 46 }
 47 inline void getans()
 48 {
 49     for(int i=now.bgx;i<=now.edx;i++)
 50             for(int j=now.bgy;j<=now.edy;j++)
 51                 ans=max(ans,now.a[i][j]);
 52 }
 53 void check()
 54 {
 55     tot++;
 56     //cout<<tot<<"---"<<endl;
 57     if(tot>63843800)
 58     {
 59         cout<<ans;
 60         exit(0);
 61     }
 62
 63 }
 64 inline void bfs(int hc,int lc)
 65 {
 66     q.push(now);
 67     while(!q.empty())
 68     {
 69         now=q.front();
 70         q.pop();
 71         int num=0;
 72         for(int i=now.bgx;i<=now.edx;i++)
 73             for(int j=now.bgy;j<=now.edy;j++)
 74                 if(now.a[i][j]>0)
 75                     num+=now.a[i][j],check();
 76         if(ans>num)
 77             continue;
 78
 79         getans();
 80         calc();
 81     //    print();
 82         for(int i=now.bgy;i<now.edy;i++)//横向折叠
 83         {
 84             for(int j=1;j<=(min((i-now.bgy),(now.edy-i))+1);j++)
 85             {
 86                 for(int k=1;k<=now.edx;k++)
 87                 {
 88                     nxt.a[k][i+j]+=nxt.a[k][i-j+1];
 89                     nxt.a[k][i-j+1]=0;
 90                     check();
 91                 }
 92             }
 93         //    cout<<now.bgy<<"&"<<i<<endl;
 94             nxt.bgy=i+1;
 95         //    cout<<nxt.bgy<<"^"<<endl;
 96             nxt.edy=max(now.edy,i+i-now.bgy+1);
 97             nxt.bgx=now.bgx;
 98             nxt.edx=now.edx;
 99             q.push(nxt);
100             calc();
101         }
102         for(int i=now.bgx;i<now.edx;i++)
103         {
104             for(int j=1;j<=(min((i-now.bgx),(now.edx-i+1))+1);j++)
105             {
106                 for(int k=1;k<=now.edy;k++)
107                 {
108                     nxt.a[i+j][k]+=nxt.a[i-j+1][k];
109                     nxt.a[i-j+1][k]=0;
110                     check();
111                 }
112             }
113             nxt.edy=now.edy;
114             nxt.bgy=now.bgy;
115             nxt.bgx=i+1;
116             nxt.edx=max(now.edx,i+i-now.bgx+1);
117             q.push(nxt);
118             calc();
119         }
120     }
121
122 }
123 int main()
124 {
125     freopen("cfyw.in","r",stdin);
126     freopen("cfyw.out","w",stdout);
127     read(n);read(m);
128     for(int i=1;i<=n;i++)
129         for(int j=1;j<=m;j++)
130             read(now.a[i][j]);
131     now.bgx=now.bgy=1;
132     now.edx=n;
133     now.edy=m;
134     bfs(0,0);
135     printf("%d",ans);
136     return 0;
137 }

T2爆搜

一开始以为是矩阵什么乱七八糟的肯定不会于是就写超级暴力广搜,

本来以为能过50%的数据结果发现连4*4的都跑不出来。

没办法加了个最优性剪枝又加了个卡时,

结果。

除了第一个点AC其他全MLE,,,,,,,,,,,,,

What‘ a pity!

http://www.cnblogs.com/zwfymqz/p/7185970.html

T3

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<stack>
 8 #define lli long long int
 9 using namespace std;
10 inline void read(int &n)
11 {
12     char c=‘+‘;int x=0;bool flag=0;
13     while(c<‘0‘||c>‘9‘){c=getchar();if(c==‘-‘)flag=1;}
14     while(c>=‘0‘&&c<=‘9‘)
15     x=(x<<1)+(x<<3)+c-48,c=getchar();
16     flag==1?n=-x:n=x;
17 }
18 int mod=998244353;
19 int n,m;
20 int ans=0;
21 int gcd(int a,int b)
22 {
23     return b==0?a%mod:gcd(b,a%b)%mod;
24 }
25 int hash[40000001];
26 int main()
27 {
28     //freopen("hoip.in","r",stdin);
29 //    freopen("hoip.out","w",stdout);
30     read(n);read(m);
31     if(n<4000&&m<4000)
32     {
33         for(int i=1;i<=n;i++)
34             for(int j=1;j<=m;j++)
35                 ans=(ans+gcd(i,j))%mod;
36         printf("%d",ans%mod);
37     }
38     else if(n>6001&&m>6001)
39     {
40         printf("0");
41     }
42     else
43     {
44         for(int i=1;i<=n;i++)
45             for(int j=1;j<=m;j++)
46             {
47                 if(hash[(i*257)%23456789+(j*359)%23456789])
48                 {
49                     ans+=hash[(i*257)%23456789+(j*359)%23456789];
50                     continue;
51                 }
52                 lli p=gcd(i,j)%mod;
53                 lli a=i,b=j;
54                 while(a<n&&b<m)
55                 {
56                     p=p+p;
57                     a=a+a;
58                     b=b+b;
59                     hash[(i*257)%23456789+(j*359)%23456789]=p;
60                 }
61             }
62         printf("%d",ans);
63     }
64     return 0;
65 }

T3暴力+打表

暴力暴力暴力!!!

http://www.cnblogs.com/zwfymqz/p/7189521.html

总结:

这次考试也是比较无语,

感觉自己运气成分比较大,

全场40多个140分.......

也就是说T2接近150行的暴力救了我一命=.=///

不过我们学校居然有A了T3的(但那孩子T1炸了。。。)

以后继续努力吧!

时间: 2024-12-28 16:40:43

2017.7.15清北夏令营精英班Day1解题报告的相关文章

清北夏令营考试day1

清北夏令营考试day1 送分题(songfen) Time Limit:1000ms   Memory Limit:128MB 题目描述: LYK喜欢干一些有挑战的事,比如说求区间最大子段和.它知道这个题目有O(n)的做法.于是它想加强一下. 也就是说,LYK一开始有n个数,第i个数字是ai,它找来了一个新的数字P,并想将这n个数字中恰好一个数字替换成P.要求替换后的最大子段和尽可能大. LYK知道这个题目仍然很简单,于是就扔给大家来送分啦~ 注:最大子段和是指在n个数中选择一段区间[L,R](

清北押题班(1)

清北押题冲刺班Text1 T1 Count 问有几个无序二元组 $ (x ?, ?y) $ 满足 $ xy \equiv 1?(mod?P ) $ , $ 0 \leq x < P?, ?0 \leq y <P $ 解题思路: 你没看错,这是day1的T1,一道赤裸裸的数学题. Subtask 1:枚举 $ O(P^2) $ 个二元组,选出符合条件的,再去重: Subtask 2:可以发现模 $ P $ 意义下,一个数 x 有逆元,当且仅当 $ gcd(x, P) = 1 $ .并且如果 $

洛谷P1080 [NOIP2012提高组D1T2]国王游戏 [2017年5月计划 清北学堂51精英班Day1]

P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大

P2327 [SCOI2005]扫雷 [2017年5月计划 清北学堂51精英班Day1]

P2327 [SCOI2005]扫雷 题目描述 输入输出格式 输入格式: 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<= N <= 10000) 输出格式: 一个数,即第一列中雷的摆放方案数. 输入输出样例 输入样例#1: 2 1 1 输出样例#1: 2 其实还是扫雷玩的少..知道思路之后很快 只需枚举前两个各自的情况,后面的各自便能够计算出来 注意几个细节(在代码里面) #include <iostream> #include <cstdio> #in

2017.9.23清北第二场

1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 const int MAXN=400001; 8 inline void read(int &n) 9 { 10 char c=getchar();n=0;bool flag=0; 11 while

2017 济南精英班 Day1

不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in","r",stdin); freopen("bpmp.out","w",stdout); int n,m; scanf("%d%d",&n,&m); int ans=(1ll*n*m-1)%998244353; prin

清北学堂学习总结 day1 数据结构 练习

1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数.如果第一个数是1,后接3个正

2017清北精英班整理内容掌握考试题

精英班考试题 2017.2.10 题目名 工资 藏妹子之处 银河之星 源文件 money.cpp/c/pas excel.pas/cpp galaxy.cpp/c/pas 输入文件 money.in excel.in galaxy.in 输出文件 money.out excel.out galaxy.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 128MB 256MB 测试点 10 10 10 测试点分值 10 10 10 第一题 工资 链接 第二题  藏妹子

2017传智播客python基础班+就业班

2017传智播客python基础班+就业班  地址:http://www.zygx8.com/thread-6085-1-1.html 本课程包含了Python的基础语法和核心编程,以及Python应用中流行的数据库.前端,Web框架,爬虫框架及其分布式策略等技术,包含了丰富的项目案例.适合零基础或有一定Linux和Python基础的学生,特别适合于大专院校计算机专业的学生,学习过各类视频教程的未就业人士以及在职程序员. python基础 linux操作系统基础 1-Linux以及命令 2-li