MENU

「补档」CSP-S 2020 游记

坐标 HB,TG 选手。

作为初一 OIer,再加上八月份才开始接触 OI,我本打算今年只考普及,但是华一高那边的意思是让我考提高,结果就参加了 CSP-S。

总的来说,今年算是考垮了。

早上 8 点多起床,然后刷了华一高信息组那边上周 CSP-S Day1 模拟考的题,另外看了一下 Tarjan,我因为学校文化课,10 月月考之后工作日就没参加华一高的集训,结果 Tarjan、数论、线代都没学,少考了几场试,CSP-S 之前想着能多补一点是一点。

下午 1 点 20 从家里出发前往华一高考试,有意思的是华一高学长 CSP-S 复赛是在华科考,而我却跑到了华一高来参考。

一号考场是真的拉垮,键盘空格要用力敲才打得进去,而且 Dev C++ 的调试功能也是完全没法用,必须要在桌面新建项目才能调试,而且还会随机闪退,我 tm 直接当场裂开,代码又得放在 D 盘(怕电脑出问题后重启,所以不能放桌面),我考试的时候就只能频繁的把 D 盘里的代码复制到桌面上调试,然后调完后再复制回 D 盘。我跟监考老师说这个调试有问题,他说能用就行。

考试开始,输解压密码输了半天,0 和 O 分不清楚。

T1

一看是大模拟直接傻掉,搞了一个多小时,勉强把大样例过掉也就不想调了,大样例要跑 0.8s。

#include<bits/stdc++.h>
#define F(name) freopen(name".in", "r", stdin); freopen(name".out", "w", stdout);
using namespace std;
typedef long long ll;

int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int y, m, d, t;
int q, r;

inline ll readint(){
    ll f = 1, n = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-')
            f *= -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        n = n * 10 + (ch - '0');
        ch = getchar();
    }
    return f * n;
}

inline bool isrunnian(int n){
    if(n >= 1582)
        return n % 400 == 0 || n % 4 == 0 && n % 100 != 0;
    if(n < 0){
        n++;
        return n % 4 == 0;
    }
    return n % 4 == 0;
}
inline int get10000(int y){
    if(y == -4713) return 3652463;
    return 3652425;
}
inline int get100(int y){
    if(y < 1488) return 36525;
    if(y == 1488) return 36515;
    if((y - 88) % 400 == 300) return 36525;
    return 36524;
}
inline int getday(int y){
    if(y == 1582) return 355;
    if(isrunnian(y)) return 366;
    return 365;
}
inline int getday(int y, int m){
    if(y == 1582 && m == 10) return 21;
    if(isrunnian(y) && m == 2) return 29;
    return days[m];
}

int main(){
    F("julian")
    q = readint();
    while(q--){
        r = readint();
        y = -4713, m = 1, d = 1;
        while((t = get10000(y)) <= r){
            r -= t;
            if(y == -4713) y = 5288;
            else y += 10000;
        }
        while((t = get100(y)) <= r){
            r -= t;
            if(y == -13) y = 88;
            else y += 100;
        }
        while((t = getday(y)) <= r){
            r -= t;
            y++;
            if(y == 0) y++;
        }
        while((t = getday(y, m)) <= r){
            r -= t;
            m++;
        }
        d += r;
        printf("%d %d %d ", d, m, abs(y));
        if(y < 0) printf("BC");
        printf("\n");
    }
    return 0;
}

能拿 40pts,还过得去。

那么问题来了,考完试我交上去的代码并不是这么写的,而是长这样:

inline get10000(int y){

内联函数没写类型,CE,完了。

应该是我调试的时候,改完代码忘了复制回 D 盘。测民间数据时哭死在桌上,过于下饭。

T2

T2 是整场考试最水的一道题???

我考试的时候想了半天,然后位运算又调了半天,代码长这样:

#include<bits/stdc++.h>
#define F(name) freopen(name".in", "r", stdin); freopen(name".out", "w", stdout);
using namespace std;
typedef long long ll;

struct node{
    int p, q;
    node(): p(0), q(0) {}
    node(int p, int q): p(p), q(q) {}
};
int n, m, c, k, p, q, t, b, ans;
bool digit[70];
vector<node>si;
vector<int>used;

inline ll readint(){
    ll f = 1, n = 0;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-')
            f *= -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        n = n * 10 + (ch - '0');
        ch = getchar();
    }
    return f * n;
}

bool cmp(node n1, node n2){
    return n1.q < n2.q;
}

int main(){
    F("zoo")
    n = readint(), m = readint(), c = readint(), k = readint();
    for(register int i = 0; i < n; i++){
        t = readint();
        int j = 0;
        while(t){
            if((t & 1) == 1 && ((b >> j) & 1) == 0) b += 1 << j;
            t >>= 1, j++;
        }
    }
    for(register int i = 0; i < m; i++){
        p = readint(), q = readint();
        if(((b >> p) & 1) == 0) si.insert(lower_bound(si.begin(), si.end(), node(p, q), cmp), node(p, q));
        else used.insert(lower_bound(used.begin(), used.end(), q), q);
    }
    int i = 0, j = 0;
    while(i < si.size()){
        while(j < used.size() && used[j] < si[i].q) j++;
        if(used[j] != si[i].q) digit[si[i].p] = true;
        i++;
    }
    for(register int i = 0; i < k; i++)
        if(!digit[i]) ans++;
    printf("%d", (int)pow(2, ans) - n);
    return 0;
}

没开 unsigned long long,数据范围没看清楚,而且我这个算法好像也不行,还是菜。

而且,

while(t){
    if((t & 1) == 1 && ((b >> j) & 1) == 0) b += 1 << j;
    t >>= 1, j++;
}

这一段我居然手写,明明可以用 |=???位运算我好像只有与和位移用的比较熟。

60pts。

T3

暴力都没打好,爆零了。

其实硬着模拟也可以拿点分,我考试的时候却想着能不能用一个 $k$ 存倍数,然后每次单点添加时只添加 $\frac{V_i}{k}$,这样两种操作复杂度都只有 $O(1)$,但显然精度差的太远,我都不知道我考试的时候怎么会想到这么写。

也想到了线段树,但是打得不熟,可能要调很长时间,剩的时间已经不多了。

T4

没时间写 T4,其实有个贪心的思路,应该可以混点分的。

$k=3$ 的那 20pts 都没拿到……

Ending

洛谷 0 + 60 + 0 + 0 = 60,华一高信息组垫底预定。

不知道 HB 这边能不能混个 3=。

还是练的太少了,虽然机器上有些问题,可能在一定程度上影响了发挥以及效率,但是说到底还是自己能力太弱,怪什么都没用。

马上要参加华一高一个月的封闭集训,高一的学长备战 NOIp,我应该是打不了的,但也要跟着好好练,不能再下滑了,再滑就滑没了。

(初一硬是过上了高一的生活,不容易不容易)

总结经验,不能信 CCF 的样例,样例实在是太了。

考试要会分配时间,要学会打暴力,不要随便用乱搞算法,这样可能连暴力分也拿不到

平时要好好对待模拟考和洛谷月赛,多做题

毕竟是第一次参加 CSP,明年 CSP-S 再战。


2020.11.14

有道小图灵查分:60pts

预计获奖级别:2=


2020.11.17

CCF 初评成绩:0 + 60 + 10 + 0 = 70pts,华一高 rk34,2020 级 rk7。

居然比预期高了 10pts,好像这次 CCF 的数据比民间数据水,学长分数普遍比估分高了 10~20pts。

Last Modified: June 25, 2024
Archives Tip
QR Code for this page
Tipping QR Code