绍兴一中暑假集训总结

上接集训记,最后的两场模拟赛,我当做NOIp的D1D2打了,要认真起来了,所以另开一篇博记录一下模拟赛,以及做个总结

NOIp模拟赛

7.26

昨晚第一次不是躺下就睡着,到了23:15还醒着
今天早上醒来有点困,状态不佳
然后我就很懵逼,早上全程掉线,心态不知道有多崩,3.5h打得我非常的憋屈,因为题目有点难
最终无奈的打了三只暴力,结果呢,我在成绩单里找不到自己的名字了。。。翻来翻去找不到,什么情况,下意识地往上面看了看,woc为什么我的名字在std下面。。。醉了
得分60+60+70=190
文化课神仙出题人 z h a n 8855 zhan8855 zhan8855的题面打个好评

T1

题意难懂,看了一会没看懂啥意思,一开始跳过,最后1h返回来做的
中途样例出锅,我很庆幸,因为那时候我并没有做T1嘿嘿嘿
搞了好久好久,终于看懂了题面是什么意思。。。
然后我想会不会有什么规律
就先打个暴力,暴力打表吧
N = 5 N=5 N=5的 情况跑出来了, N = 6 N=6 N=6的情况死活跑不出(后来去吃了个午饭依然没跑出来)
题解是剪枝暴力打表。。。用时20min
我的估计把人类历史跑完也跑不出吧
自己的暴力Code:

#include <bits/stdc++.h>
#define maxn 110
using namespace std;
int d1[maxn][maxn], d2[maxn][maxn], d3[maxn][maxn], d4[maxn][maxn], vis1[maxn], vis2[maxn], vis3[maxn], vis4[maxn];
int n, m, ans;

bool check(int i, int j, int k, int l){ return d1[i][j] && d2[k][l] && d3[i][k] && d4[j][l]; }

void dfs(int t){
	if (t > n) ++ans; else{
		for (int i = 1; i <= n; ++i) if (!vis1[i])
		for (int j = 1; j <= n; ++j) if (!vis2[j])
		for (int k = 1; k <= m; ++k) if (!vis3[k])
		for (int l = 1; l <= m; ++l) if (!vis4[l])
		if (check(i, j, k, l)){
			vis1[i] = vis2[j] = vis3[k] = vis4[l] = 1;
			dfs(t + 1);
			vis1[i] = vis2[j] = vis3[k] = vis4[l] = 0;
		}
	}
}

int main(){
	scanf("%d", &n);
	m = (n << 1) - 1;
	for (int i = 1; i <= n; ++i)
	for (int j = 1; j <= n; ++j) d1[i][j] = d2[n + i - j][i + j - 1] = d3[i][n + i - j] = d4[j][i + j - 1] = 1;
	printf("%d\n", n);
	if (n == 5) { puts("456920"); return 0; }
	dfs(1);
	int power = 1;
	for (int i = 2; i <= n; ++i) power *= i;
	printf("%d\n", ans / power);
	return 0;
}
T2

60分 O ( N M Q ) O(NMQ) O(NMQ)暴力显然,往后想就想不出来了
所以我先写了个60分的暴力,中途 D e v C + + DevC++ DevC++出锅,耗费了好久时间
60分Code:

#include <bits/stdc++.h>
#define maxn 5010
using namespace std;
struct POS{
	int x, y;
}loc[maxn], bag[maxn];
int n, m, Q;

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int main(){
	n = read();
	for (int i = 1; i <= n; ++i) loc[i].x = read(), loc[i].y = read();
	m = read();
	for (int i = 1; i <= m; ++i) bag[i].x = read(), bag[i].y = read();
	Q = read();
	while (Q--){
		int x = read(), y = read(), ans = 0;
		for (int i = 1; i <= m; ++i){
			if (bag[i].x == x && bag[i].y == y){ ++ans; continue; }
			for (int j = 1; j <= n; ++j)
				if (1LL * loc[j].y * (bag[i].x - x) == 1LL * loc[j].x * (bag[i].y - y)){
					++ans; break;
				}
		}
		printf("%d\n", ans);
	}
	return 0;
}
T3

刚读完题想到DP
立即发现不可行,因为体力有上限这个限制,状态的转移比较麻烦且时间复杂度较高
想到 B F S BFS BFS
两维的状态 v i s [ u ] [ h p ] vis[u][hp] vis[u][hp],时间复杂度 O ( V M ) O(VM) O(VM) 70分的范围内可以跑出
往后想依然想不出
70分Code:

#include <bits/stdc++.h>
#define maxn 1010
#define maxm 50010
using namespace std;
struct Edge{
	int to, next, len;
}edge[maxm << 1];
struct node{
	int u, hp, tim;
};
int n, m, M, num, head[maxn], R[maxn], vis[maxn][maxn];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

void addedge(int x, int y, int z){ edge[++num] = (Edge){ y, head[x], z }; head[x] = num; }

int main(){
	n = read(), m = read(), M = read();
	for (int i = 1; i <= n; ++i) R[i] = read();
	for (int i = 1; i <= m; ++i){
		int x = read(), y = read(), z = read();
		addedge(x, y, z); addedge(y, x, z);
	}
	vis[1][M] = 1;
	queue <node> q; q.push((node) {1, M, 0});
	while (!q.empty()){
		node tmp = q.front(); q.pop();
		int u = tmp.u, hp = tmp.hp, tim = tmp.tim;
		for (int i = head[u]; i; i = edge[i].next){
			int v = edge[i].to, Hp = hp - edge[i].len;
			if (Hp <= 0) continue;
			Hp = min(Hp + R[v], M);
			if (!vis[v][Hp]){
				vis[v][Hp] = 1; q.push((node) {v, Hp, tim + 1});
				if (v == n){ printf("%d\n", tim + 1); return 0; }
			}
		}
	}
	puts("-1");
	return 0;
}

T3题解在这里
今天真的是个从天而降的 r k 1 rk1 rk1,本来觉得自己又双叒叕要垫底了。。。
谁能想到呢

7.27

今天的比赛我心态又打崩了,因为我觉得T2T3都是非常的可做,但是我并没有做出来
还是十分无奈的打了三个暴力
得分5+65+50=120
估分非常的准确,但是我还是有rk2是什么情况?
开题顺序321.。。

T1

先打了个暴力,想用暴力找找 F ( x ) F(x) F(x)是不是有啥规律,发现并没有,好吧,放弃,5分
其实还是可以打个 M 为 质 数 M为质数 M的部分分的,但我竟然没想到
Code:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL L, R, M, ans;

LL gcd(LL m, LL n){ return !n ? m : gcd(n, m % n); }

int main(){
	scanf("%lld%lld%lld", &L, &R, &M);
	if (R - L > 1e8) return printf("%lld\n", R - L + 1), 0;
	for (LL i = L; i <= R; ++i){
		LL m = M;
		for (LL j = 0; j <= sqrt(i - 1); ++j){
			m /= gcd(m, (i - j * j));
			if (m == 1) break;
		}
		ans += m == 1;
	}
	printf("%lld\n", ans);
	return 0;
}
T2

这是我觉得最可做的题目
先打了个30分暴力
发现一个性质,挂花一定要挂在叶子上,然后 N &lt; = 50 N&lt;=50 N<=50的部分我采用dfs叶子,复杂度为 O ( 2 叶 子 数 ) O(2^{叶子数}) O(2)
又发现满二叉树的情况其实是叶子取一半
65分到手
其余的情况我都用满二叉树情况骗分了,因为正解没想出来
Code:

#include <bits/stdc++.h>
#define maxn 110
using namespace std;
struct Edge{
	int to, next;
}edge[maxn << 1];
int num, head[maxn], d[maxn], fa[maxn][25], a[maxn], b[maxn], dis[maxn][maxn], vis[maxn], n, ans;
int cnt, leaf[maxn], vis2[maxn];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

void addedge(int x, int y){ edge[++num] = (Edge) {y, head[x]}; head[x] = num; }

void dfs(int u, int pre){
	d[u] = d[pre] + 1, fa[u][0] = pre;
	for (int i = 0; fa[u][i]; ++i) fa[u][i + 1] = fa[fa[u][i]][i];
	int flag = 0;
	for (int i = head[u]; i; i = edge[i].next){
		int v = edge[i].to;
		if (v != pre) dfs(v, u), flag = 1;
	}
	if (!flag) leaf[++cnt] = u;
}

int lca(int u, int v){
	if (d[u] > d[v]) swap(u, v);
	for (int i = 20; i >= 0; --i) if (d[u] <= d[v] - (1 << i)) v = fa[v][i];
	if (u == v) return u;
	for (int i = 20; i >= 0; --i) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
	return fa[u][0];
}

void Do(int sum){
	int tot1 = 0, tot2 = 0;
	for (int i = 1; i <= n; ++i) if (vis[i]) a[++tot1] = i; else b[++tot2] = i;
	for (int i = 1; i <= tot2; ++i)	
		for (int j = i + 1; j <= tot2; ++j){
			int flag = 0;
			for (int k = 1; k <= tot1; ++k)
				if (dis[b[i]][a[k]] != dis[b[j]][a[k]]){ flag = 1; break; }
			if (!flag) return;
		}
/*	printf("modest\n%d\n", tot1);
	for (int i = 1; i <= tot1; ++i) printf("%d ", a[i]); puts("");
	printf("%d\n", tot2);
	for (int i = 1; i <= tot2; ++i) printf("%d ", b[i]); puts("");*/
	ans = sum;
}

void dfs1(int k, int sum){
	if (sum >= ans) return;
	if (k > n) return Do(sum);
	dfs1(k + 1, sum);
	vis[k] = 1;
	dfs1(k + 1, sum + 1);
	vis[k] = 0;
}

void Do2(int sum){
	int tot1 = 0, tot2 = 0;
	for (int i = 1; i <= n; ++i) vis2[i] = 0;
	for (int i = 1; i <= cnt; ++i) if (vis[i]) a[++tot1] = leaf[i], vis2[leaf[i]] = 1;
	for (int i = 1; i <= n; ++i) if (!vis2[i]) b[++tot2] = i;
	for (int i = 1; i <= tot2; ++i)	
		for (int j = i + 1; j <= tot2; ++j){
			int flag = 0;
			for (int k = 1; k <= tot1; ++k)
				if (dis[b[i]][a[k]] != dis[b[j]][a[k]]){ flag = 1; break; }
			if (!flag) return;
		}
/*	printf("modest\n%d\n", tot1);
	for (int i = 1; i <= tot1; ++i) printf("%d ", a[i]); puts("");
	printf("%d\n", tot2);
	for (int i = 1; i <= tot2; ++i) printf("%d ", b[i]); puts("");*/
	ans = sum;
}

void dfs2(int k, int sum){
	if (sum >= ans) return;
	if (k > cnt) return Do2(sum);
	dfs2(k + 1, sum);
	vis[k] = 1;
	dfs2(k + 1, sum + 1);
	vis[k] = 0;
}


int main(){
	n = read();
	if (n > 50){ printf("%d\n", (n + 1) / 4); return 0; }
	for (int i = 1; i < n; ++i){
		int x = read(), y = read();
		addedge(x, y); addedge(y, x);
	}
	dfs(1, 0);
	for (int i = 1; i <= n; ++i)
		for (int j = i + 1; j <= n; ++j)
		if (i != j) dis[i][j] = dis[j][i] = d[i] + d[j] - (d[lca(i, j)] << 1);
	ans = n;
	if (n <= 20) dfs1(1, 0); else
	if (n <= 100) dfs2(1, 0);
	printf("%d\n", ans);
	return 0;
}

题解戳这里

T3

这道题我也觉得非常的可做
想到一个DP的状态
d p [ i ] [ j ] [ k ] [ 0 / 1 / 2 ] [ 0 / 1 / 2 ] dp[i][j][k][0/1/2][0/1/2] dp[i][j][k][0/1/2][0/1/2]表示当前第i列,第一种花用了j朵,第二种花用了k朵,这一列上下两个花的种类分别是啥的方案数
每次分情况转移,然后发现第一维可以滚动掉
时间复杂度 O ( n 3 ) O(n^3) O(n3)常数稍大,但跑不满,估计45~50,最终拿了50
Code:

#include <bits/stdc++.h>
#define maxn 500
#define qy 998244353
using namespace std;
int n, A, B, C, dp[2][maxn][maxn][3][3];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

int main(){
	freopen("ve.in", "r", stdin);
	freopen("ve.out", "w", stdout);
	n = read(), A = read(), B = read(), C = read();
	dp[1][1][0][0][1] = dp[1][0][1][0][2] = dp[1][1][0][1][0] = dp[1][1][1][1][2] = dp[1][0][1][2][0] = dp[1][1][1][2][1] = 1;
	//dp[1][1][0] = dp[1][0][1] = dp[1][1][1] = 2;
	for (int i = 2; i <= n; ++i){
		int now = i & 1, pre = now ^ 1;
		for (int j = 0; j <= A; ++j)
			for (int k = 0; k <= B; ++k){
				if (j && 2 * n - j - k){
					dp[now][j][k][0][1] = (dp[pre][j - 1][k][1][2] + dp[pre][j - 1][k][2][0]) % qy;
					dp[now][j][k][1][0] = (dp[pre][j - 1][k][2][1] + dp[pre][j - 1][k][0][2]) % qy;
				//	(dp[now][j][k] += dp[pre][j - 1][k] * 2) % qy;
				}
				if (k && 2 * n - j - k){
					dp[now][j][k][0][2] = (dp[pre][j][k - 1][1][0] + dp[pre][j][k - 1][2][1]) % qy;
					dp[now][j][k][2][0] = (dp[pre][j][k - 1][0][1] + dp[pre][j][k - 1][1][2]) % qy;
					//(dp[now][j][k] += dp[pre][j][k - 1] * 2) % qy;
				}
				if (j && k){
					dp[now][j][k][1][2] = (dp[pre][j - 1][k - 1][0][1] + dp[pre][j - 1][k - 1][2][0]) % qy;
					dp[now][j][k][2][1] = (dp[pre][j - 1][k - 1][1][0] + dp[pre][j - 1][k - 1][0][2]) % qy;
					//(dp[now][j][k] += dp[pre][j - 1][k - 1] * 2) % qy;
				}
			}
	}
	int ans = 0;
	for (int i = 0; i <= 2; ++i)
	for (int j = 0; j <= 2; ++j) (ans += dp[n & 1][A][B][i][j]) %= qy;
	printf("%d\n", ans);
	return 0;
}

今天的比赛我打成这样竟然还能拿第二名,也是醉了
NOIp模拟赛,两天,Day1rk1,Day2rk2.。。
总分得有机房第一了吧嘿嘿
没想到在绍兴的最后两场比赛能打到第一名啊
没啥遗憾了

集训总结

从2019.7.4~2019.7.27,这么长的时间,收获了许多,做一下总结

时间历程

7.4

初到绍兴,一切都是那么生疏

7.5

第一场NOI模拟赛,90分,状态在线,打得还不错,能拿的分全拿了,满意的一场
期望分=实际分

7.6

第二场NOI模拟赛,42分,NOIAu rk1的zyy出的题,有点难度,暴力没打好,虽然期望分=实际分,但是能达到的分比实际分还要高15分,海星的一场

7.7

第一个休息日,在宾馆却干的事不多,做作业啊,做题啊,玩过学过,也就那样,挺快活的一天

7.8

第三场NOI模拟赛,28分,考的不好,虽然很失落,但是我知道这还是我所能达到的最高分,凸包没学过也没办法,因为期望分=实际分,表明我还是挺稳,但是倒数第二的成绩依然无法接受,失落的一场

7.9

第四场NOI模拟赛,55分,状态在线,暴力打了个满,期望分=实际分,名次也不错,满意的一场

7.10

查漏补缺的一天,在这天,我补上了期望与数学的一部分短板,以避免日后不会遇期望则弃之的窘境,满意的一天

7.11

第五场NOI模拟赛,20分,这是我第一次期望分!=实际分,想着拿50分,结果只有20分,思维产生了小惰性,得改正一下,一般的一天

7.12

第六场NOI模拟赛,50分,小失落,因为暴力没打满,我的水平最高可到70分。但是满意的是自从九下刚开学的学的基环树打过一道题后就没写过,这天我自己乱搞写出了基环树。
期望分=实际分,海星的一场

7.13

第一场NOIp模拟赛,150分,第一次切了一道题,毕竟是NOIp,暴力算是打满了吧,因为期望分=实际分
但是遗憾的是T3本可以正解但是没写,满意并遗憾的一场

7.14

打了luogu月赛,感受到自己的弱小,并且心态出了点小状况,及时调整回来

7.15

学习图论相关,学会Tarjan缩点割点,点双边双什么的还不会

7.16

NOI同步赛D1
得分70+20+28=118
期望分=实际分,满意的一场

7.17

学习数学相关,回顾并没完全掌握的exgcd,终于差不多懂了(汗

7.18

NOI同步赛D2
得分72+10+0=82
期望分=实际分,满意的一场

7.19

第二场NOIp模拟赛,75分,比较失落,因为都不是特别会做,但是期望分=实际分,一般的一场

7.20

第三场NOIp模拟赛,170分,得分100+0+70=170,期望分!=实际分,想打270的,咕了一道,海星的一场

7.21

休息日,写了几道题

7.22

学习树相关,满意的是自己上去切题了,虽然是我写过题解的

7.23

写模板+题目

7.24

学习DP,满意的是自己默默的切掉好多题

7.25

去本校的vj模拟赛凑了凑热闹,花了一个上午AK,当然后面两题看了题解
下午状态不佳,做了一道题

7.26

第四场NOIp模拟赛,190分,满意的是幸运的拿了全场rk1并且期望分=实际分,满意的一场

7.27

第五场NOIp模拟赛,120分,幸运女神再次站到了我旁边,就这分数还能拿第二。。
期望分=实际分,满意的一场

这么多天下来,总共打了13场模拟赛
共有11场期望分=实际分,说明我的暴力十分的稳定,我很满意

OI上的进步

进步不可谓不大

  • 学会写凸包板子
  • 学会期望,摆脱遇期望即弃之的窘境
  • 学会Tarjan缩点割点
  • 对图论,树一类的问题解决能力大大提升,思维拓宽
  • 对DP有了新认知,新理解
  • 对暴力越来越纯熟
  • 学会独立思考,不完全依赖题解,通过的代码
  • 一个多星期的NOI训练使我接触了高深的东西,境界提升
  • 绍兴一中的各位神仙的解题思路、思考方式是跟我不一样的,对我有很大帮助
  • 在我左边做了一个多星期的神仙 m i n a m o t o minamoto minamoto的学习方式对我有很大很大的帮助
  • 绍兴董老师经常挂在嘴边的“想法”一词让我明白有想法就要写一写
  • 实战经验丰富了许多,慢慢的学会打了暴力之后有时也能秒出正解

学习上的进步

  • 每天晚上的1h至少的暑假作业时间使得我有少许进步
  • 在宾馆乱看看完的《红楼梦》也令我感触良多,从一开始对贾林二人吵架和好吵架和好的吐槽,到秦可卿、元妃、尤二姐、晴雯,甚至林黛玉的凄惨下场的叹息唏嘘,感受到封建社会不一样的色彩
  • 学会了两个自我管理的超级武器,自我加分制和 F o r e s t A P P ForestAPP ForestAPP,真的太有效啦哈哈哈,手机放我旁边我也不方

生活上的进步

  • 学会用支付宝
  • 学会洗衣服,先是在学校里学会洗内裤袜子,这里一开始觉得短袖长裤太大了,非常难洗,到现在的熟练
  • 学会一点点调整心态的小技巧

一点感触

我从一开始就没打算把优快云当作严肃认真的计算机博客来写,我想写的就是自己想说的话。
七月份,到目前为止,我已经写了52篇博客,虽然与一些神仙依然相去甚远,但对于我自己是一个大进步
去年,数学竞赛失利的我,想在编程取得好成绩。
去年的七月,八下期末考不错,冲淡了数竞的失落,没认清自己的实力,以为可以冲击AK普及组,结果邹sir一直把我当做提高组训练,我非常疑惑。但我很颓吧,即使xjd学长在,我依然大胆地颓slay
去年的八月,被告知参加提高组,一脸懵逼的我开始蒙头自学训练,一个月34篇博客在一定程度上证明了我的努力
今年的七月,来到全国著名的绍兴一中学习,当然是十分的期待,讲真,对于全国rk1 z y y zyy zyy,仰慕已久的wzp等有点失望。。他们或许很神仙,但是他们并不能让我听懂他们在讲什么,或许是他们长期以来的神仙相处所致
这星期刚遇到的神仙 z h a n 8855 zhan8855 zhan8855我印象最好,文化课神仙%%%
和蔼的钻石教练陈奶奶好久没见了,董老师有点像我外公是什么情况

诶,现在差不多是我与手中的笔记本电脑的最后一点时间了,几年了啊,从我一年级这个电脑就在了,是该退休了。。。想起曾经在这个电脑上打过的游戏,写过的代码,还是非常的感慨
在慈溪中学这样的文化课学校,学竞赛很不容易,特别是信竞。
没错,信竞确实是校长最想扶持的竞赛,但是老师都不看好啊,都知道的,高手被学军杭二镇海抢走了,我们是剩菜剩饭,这样的一群人在机房里追求着高中三年内的梦想,还被老师同学特殊看待,创新班分流一半是搞信息的……
还是珍惜大家在机房里的时间吧,下半年的NOIp一过,大部分人都要离开了,慈溪中学不会允许你做无意义的事,像其他学校整天整天学OI根本不可能,我也只能每天晚上抽出时间……
2012年慈溪中学确实出过Au,但是是人强,并且其他学校训练强度也不高,实力相差不大,现在不一样,我啥都不会,只有一手暴力,能做什么?
但是我还是想拼,弱校高手依然在, h z w e r hzwer hzwer不是一个很好的例子?
争取拿Ag?毕竟今年上Cu线了,差距还是很大,不过拿了Ag配合慈溪中学的文化课还是很妙的

不说了,刚刚是想到什么打什么,毫无逻辑可言,总之,希望我这么久的努力没白费,希望今年下半年的NOIp,依然有幸运女神在我旁边,使我的暴力全过哈哈哈

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值