「游记」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\space long\space 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\)

posted @ 2020-11-08 22:48  Liuxizai  阅读(63)  评论(0编辑  收藏