上接集训记,最后的两场模拟赛,我当做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
<
=
50
N<=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,依然有幸运女神在我旁边,使我的暴力全过哈哈哈
502

被折叠的 条评论
为什么被折叠?



