zoukankan      html  css  js  c++  java
  • 「游记」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("
    ");
    	}
    	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;
    }
    

    没开(unsignedspace longspace 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)

  • 相关阅读:
    shell--练习--简易计算器
    shell--运算符
    shell--传递参数
    PHP数学函数的练习
    PDO对数据库的操作
    PHP实现手机短信的验证
    ThinkPHP框架 _ 学习16
    ThinkPHP框架 _ 学习15
    ThinkPHP框架 _ 学习14
    ThinkPHP框架 _ 学习13
  • 原文地址:https://www.cnblogs.com/liuxizai/p/13946330.html
Copyright © 2011-2022 走看看