【OI 生涯起点】CSP-J2 游记
LucasXu80
2020-11-06 21:53:27
直接上接期中考游记,从 Day -1 开始写。
### Day -1
出了一场水题赛,背了高精和背包的板子。
希望今天背的明天都不要考到。
### Day 1
直接来呗。
第一次参加线下 OI 比赛,不免有些激动。
$7:50$ 到考场,发现大家都到了,我已经是最后几个了(
进考场前看到 xj(学校信奥老师),让我细心点。rp++。
$8:00$ 被一个老师像赶牛一样赶到了考场。
机器是 win7 的,配有虚拟机,还有教程。不过因为没找到 `Guide` 没用。
$8:10$ 打完了 $4$ 题的模板,又打了个快排热热手。
$8:30$ 时间到了,但是老师说密码没来,让我们耐心等候。
$8:40$ 密码来了,但是没人能解压,老师说他们来解压,让我们耐心等候。
$8:43$ 解压完的文件来了,开题。
T1:???优秀的拆分?好像是一道黑题。。。
/jk/jk/jk
T2:???NOI 2130?看上去不难,再说了。
T3:???什么又臭又长的题面?不管了,先看 T4。
T4:???????????????????????
然后做题。
$8:50$ T1 样例 + 自造数据全过
$9:00$ T2 想到正解,一次性样例全过
T2 直接想到 $O(600n)$ 的正解了,根本没想快排暴力。
T3 不会。
$9:30$ T4 20pts 暴力完成,思路是简单 dfs。小样例可过。
$10:10$ T4 40pts $O(n^3m)$ 完成。思路是 dp 算每一个格子的最大值。自造数据发现极限在 $n=m=170$ 左右。
$10:20$ 思维貌似有些停滞,上了个厕所,心情舒畅。
$10:50$ T4 70pts $O(n^2m)$ 完成,思路是一些些前缀和优化降了一层循环。极限数据为 $n=m=460$ 可过。
接下来的时间里,我干嘛了呢?
1. 把 T3 样例 $3$ 复制下来,肉眼找 `x780` `x80` `x134` `x913` 等。
2. 闭目养神。
3. 吃了个饼干。
4. 检查了 $5$ 遍文件夹及各题小样例。
没错我整场考试 T3 基本没看。事实证明我很幸运,因为它不在我的能力范围内。
估分 $100+100+0+70/80$,不算太好……
### Day 2
考场代码发下来,回来更新。
先把考场代码贴出来:(未做任何改动)
T1 power
```cpp
#include <bits/stdc++.h>
using namespace std;
int n;
bool a[30];
int pow(int x,int y) //x^y
{
int ret=1;
for (int i=1; i<=y; i++) ret*=x;
return ret;
}
int main()
{
freopen("power.in","r",stdin);
freopen("power.out","w",stdout);
cin>>n;
if (n%2==1)
{
cout<<-1;
return 0;
}
for (int i=30; i>=1; i--)
{
int now=pow(2,i);
if (n>=now)
{
n-=now;
a[i]=1;
}
}
for (int i=30; i>=1; i--)
{
if (a[i]) cout<<pow(2,i)<<" ";
}
return 0;
}
```
T2 live
```cpp
#include <bits/stdc++.h>
using namespace std;
int n,w,a[100001],t[601]={0};
int main()
{
freopen("live.in","r",stdin);
freopen("live.out","w",stdout);
cin>>n>>w;
for (int i=1; i<=n; i++)
{
cin>>a[i];
//t[a[i]]++;
}
for (int i=1; i<=n; i++)
{
t[a[i]]++;
int now=i*w/100,cnt=0;
now=max(1,now);
for (int j=600; j>=0; j--)
{
cnt+=t[j];
if (cnt>=now)
{
cout<<j<<" ";
break;
}
}
}
return 0;
}
```
T3 expr
```cpp
#include <bits/stdc++.h>
using namespace std;
string s;
int n,q;
bool a[100001];
int c[100001];
int main()
{
freopen("expr.in","r",stdin);
freopen("expr.out","w",stdout);
getline(cin,s);
cin>>n;
for (int i=1; i<=n; i++) cin>>a[i];
cin>>q;
for (int i=1; i<=q; i++) cin>>c[i];
for (int i=1; i<=q; i++) cout<<0<<endl;
return 0;
}
```
T4 number
```cpp
#include <bits/stdc++.h>
using namespace std;
int n,m,a[1001][1001],c[1001];
long long dp[1001][1001];
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
cin>>n>>m;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++) cin>>a[i][j];
}
dp[1][1]=a[1][1];
for (int i=2; i<=n; i++) dp[i][1]=dp[i-1][1]+a[i][1];
for (int i=2; i<=m; i++) //this loop only focuses on the i-th colomn
{
c[1]=a[1][i];
for (int j=2; j<=n; j++) c[j]=c[j-1]+a[j][i];
for (int j=1; j<=n; j++) //now searching a[j][i]
{
if (i==m && j!=n) continue;
dp[j][i]=-2147483647;
int tmp=c[j];
for (int k=1; k<=n; k++) //depth
{
if (k!=1)
{
if (k<=j) tmp-=a[k-1][i];
if (k>j) tmp+=a[k][i];
}
dp[j][i]=max(dp[j][i],dp[k][i-1]+tmp);
}
}
}
cout<<dp[n][m];
return 0;
}
```
具体原理啥的就不写了。
oitiku 估分:
![](https://cdn.luogu.com.cn/upload/image_hosting/grb8m4lg.png)
洛谷估分:
$100+100+0+70$(其中第三题暂无数据)
然而看到难度是 橙+橙+?+黄,感觉是不是 $300+$ 才能 1= 啊 /fad/fad
总之,总结一下本次考试的经验和教训。
1. 开考前一定要把所有题都看一遍,看一下难度和自己是否有思路。如果连最简单的部分分都没有思路,就先完全放弃,只有剩下几题全 A 了或者确定自己不可能再得分了,再回来想这道题。
2. 考试时一定要检查 freopen 的正确性,具体方法是:把样例放到一个 `xxx.in` 的文件里(用原来样例的那个文件也行),然后输出到自己建立的 `xxx.out` 文件中,再与答案 `xxx.ans` 比对。这样既测了样例,又验了 freopen。
3. 考试时去上个厕所真的很重要,我的 T4 第 $3$ 个部分分就是一回来马上想到并一次性码对的。
4. 考场还是建议使用 bits/stdc++.h 以防万一,但自己调试的时候如果心烦意乱就先不要用 bits,因为 bits 编译慢。
5. 提交代码前一定要**多次检查**自己的代码、文件输入输出和文件夹,我检查了 $5$ 遍。
6. 考试的时候如果认为你写的是正解,一定要算极限数据的时间复杂度,如果很危险或者根本过不去,不要太自信,赶紧想正解 / 优化。
这就是今年的 CSP-J2 了。
明天期中考就要出分了 /fad
【upd1】11.08.13:00
洛谷的 $4$ 题数据都有了。第 $3$ 题全输 $0$ 居然有 $3$ 个点,因此洛谷估分 $100+100+15+70=285$。
这样我自己估分 $100+100+10/15+70/75=280-290$。
希望能捞一个 1=,拿个绿钩钩(
明年还会继续,冲提高组。
希望还有更多的小伙伴们陪我走下去。
【upd2】11.17.22:00
官方分数出来了。$100+100+5+70=275$。
所以 CCF 数据最毒瘤(确信
@楼楼223 说我 1= 稳了。那先恭喜我自己咯(
今天英语考炸了,有点难过,借此安慰自己。
希望明天数学脑子不要抽(
目标:班级 rk$(90-avg)$($avg$ 指年级均分)