CSP-S 2020游记
NXYorz
2020-11-08 15:21:36
### $Day\ 0$
早晨起晚了$qwq$,不过应该没有太大关系吧毕竟没有人查。穿好衣服之后强忍想要出门的欲望站在屋子里想是否忘了什么事情,没有想起来就出门了,到了机房,高二的被教导员喊走了,就剩下我一个人。过了一会,$zzh$进门的一瞬间,我就想起来忘了给我妈说发健康码的事情了。等到$zp$一来,我就去给我妈打电话了$emmm$。
$9:00$准时出发,和$zhs$坐在了一起$qwq$,有一点晕车,所以大部分时间不是吃就是睡,$zp$说$5h$就可以到日照了,结果到了下午$5:00$才刚进酒店(由于疫情的原因,宿舍不让用了$emmm$,只好集体住酒店喽$qwq$,$zp$和$yp$去找了大约$15min$才回来,他们说是新开的,还没有挂牌,~~淦!~~ 当时我脑海里浮现出来的画面只有那种路边开的,环境卫生很差的偏远小宾馆,结果我被狠狠的打脸了,~~好爽。~~ 酒店非常棒!学$OI$的两年以来,第一次住这么好的宾馆,让我不禁怀疑这到底是不是$140$一晚上的两人标准间:
房间在顶楼, ~~刚开始觉得很安静~~ 一进门,巨大的落地窗映入眼帘(夜景一定超级棒),落地窗旁边有一个长长的小沙发,感觉也很棒,沙发旁有一台电脑桌(不过没有电脑),还有一把看上去不怎么专业的电竞椅?桌子上有插头和花,还有一个神秘的需要扫码的~~小~~盒子。里面装了什么?我不知道,隐约看到了$DLS$,~~咱也不知道,咱也不敢问。~~ 卫生间很干净。
收拾完,$zp$把我们叫过去了,他就在$715$,我在$727$,我们对面。说了一些注意事项。$yp$突然说电视别看太晚,结果$zp$直接说不准看电视,$9:30$睡觉,明天$8:00$起床。
回到房间,发现还有抽烟机和洗衣机?!$zhs$趴在窗户旁边不知道在看些什么,只听见他说:
>唔!看对面有一个小女孩在跳舞!
>
>跳得不错!
>
>她在对着镜子自己跳。
>
>不对,她妈妈在教她。
>
>此女必成大器
>
>跳的不错qwq
过了一会,$zy$来了,臭小子竟然想霸弓硬上王?$zy$说:"插头里面可能有摄像头啊!"把正在从壁画里找摄像头的$zhs$说了一愣(细思极恐),他是怎么知道的,~~咱也不知道,咱也不敢问~~。
快睡觉的时候,和$zhs$下了几盘五子棋,~~好玩~~。
还是很紧张,复习去了。
### $Day\ 1$
下午要考试了,紧张...心里一直默默回顾自己的作战计划:
>2:30~2:50读题
>
>2:50~4:00打暴力
>
>4:00~6:20优化暴力
>
>6:20~6:30检查
醒来去洗漱,没想到水龙头是有热水的,满足$qwq$,昨天晚上睡得不太好,醒了好几次。$8:10$的时候,$zp$喊我们吃饭,腿有点酸$emmm$昨晚和$zhs$聊了好久,没想到这个家伙睡觉打呼噜。
吃完饭,$zp$说不能睡觉现在,等吃完午饭再睡,昏昏欲睡的我只好去看书,发现了很多以前忽视但实质上是最重要的东西——思维。书里会给你提供一些做题的思路,但以前急功近利的我却忽视了这些东西,现在说什么都已经晚了。
他们几个说宾馆隔音效果不太好,可以听到奇怪的声音,具体是什么,~~咱也不知道,咱也不敢问~~。
吃完饭,应该去睡一会了,还是很紧张...
呼,考完了,崩了,$T1$是一个模拟,赶紧打完暴力,好像会超时,不过没管,按照计划先把暴力打完再去优化,$T2$先写了暴力,$T3$发现是一个$DAG$,想跑拓扑排序,但是优先级的问题貌似有些难处理,于是先打了暴力。$T4$看着像博弈论,果断放弃,回去调$T1$,$T2$了。当时已经$4:30$了,发现$T1$可以分段讨论,讨论完之后稀里糊涂的过了大样例,~~大样例真水啊~~。事后发现好多边界没有判,甚至把十月当成了三十天来算都没出错。$T1$对拍上来就已经$5:30$了,接着看$T2$,发现可以按位讨论,每一位只有$2$或者$1$两种情况,容斥一下过了大样例。对拍时出了一点锅,发现暴力数组开小了,处理完已经$6:20$了。~~事后发现数组$a_i$忘了开```ull```,含泪60$points$~~,不甘心啊!但转念一想,如果交暴力,也许$20points$也没有,心里就好受了很多了。
剩下$10min$去检查文件名了。
晚上出来之后,发现大家都崩了,心里就不是那么难受了,回酒店的路上,发现了找了好久的万达广场,原来它在东面,于是就决定去那里吃饭,在四楼吃了自助餐,$axy$说这是提前欢迎我们回归文化课,欠揍。终于吃完了之后,在下楼的路上发现了电玩城,$zy$,$sjy$等人像饿狼一般扑了上去,我本不想去,可$zhs$说要不要...给她抓一个娃娃?于是立马就把我说服了,一共买了$80RMB$的游戏币,结果...铩羽而归,很遗憾。从万达出来时,已经快$10:00$了,于是八个人向疯子一样狂奔。突然$szz$大吽了一声,所有人都笑了。$wqy$说了一句什么,我没听清,$zzh$开始狂笑。
也许,这才是学$OI$该有的样子叭。
### $Day\ 2$
老实点,回家了。
依稀记得昨晚和$zhs$玩了三局旗,很开心。然后看黑豹,由于我看过所以看了一半睡着了,$zhs$说他看完了,~~(漫威真香)~~
晚上快吃饭的时候,源代码下来了,从洛谷民间数据测了一下:$90+65+25+5=185$。$T1$忘了开$ll$了啊含泪$90pts$,$T2$果不其然爆炸了。$T3$按照$20pts$打的没想到多过了一个点...挂了$45pts$,感觉很难受。
牛客:$90+95+25+0=210$,貌似没卡我?
-----
### $For\ a\ long\ time$
官方成绩:$90+60+25+0=175$,$SD\ rk81$
屑代码:
$T1$
```cpp
#include<cstdio>
using namespace std;
const int d1 = 365;//平年
const int d2 = 366;//闰年
const int T = 1461;
int q;
bool v[13];
bool pd(int x)
{
if(x <= 1582)
{
if(x > 0 && x % 4 == 0)
return true;
if(x < 0 && (x + 1) % 4 == 0)
return true;
}
if(x > 1582 && ((x % 400 == 0) || (x % 4 == 0 && x % 100 != 0))) return true;
return false;
}
void cl(int ri , int &month , int &day , int &year)
{
for(year;;)
{
if(year == 0) year++;
if(pd(year))
{
if(ri >= d2) ri -= d2 , year++;
else break;
}
else
{
if(year != 1582)
{
if(ri >= d1) ri -= d1 , year++;
else break;
}
else
{
if(ri >= d1 - 10) ri -= d1 - 10 , year++;
else break;
}
}
if(ri == 0) break;
}
if(year == 0) year++;
for(month;;)
{
if(month == 2)
{
if(pd(year))
{
if(ri >= 29) ri -= 29 , month++;
else break;
}
else
{
if(ri >= 28) ri -= 28 , month++;
else break;
}
}
else
{
if(v[month])
{
if(ri >= 30) ri -= 30 , month++;
else break;
}
else
{
if(year != 1582 || month != 10)
{
if(ri >= 31) ri -= 31 , month++;
else break;
}
else
{
if(ri >= 21) ri -= 21 , month++;
else break;
}
}
}
if(ri == 0) break;
}
if(year == 1582 && month == 10 && ri >= 4)
day = ri + 11;
else day = ri + 1;
}
void work()
{
int ri; scanf("%d",&ri);
if(ri <= 1721424) //[-4713 , -1]
{
int year = -4713 , day = 1 , month = 1;
int k = ri / T , r = ri % T;
year += k * 4;
cl(r , month , day , year);
if(year == 0) year++;
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
else
{
ri -= 1721424;
if(ri < 577095)//[1 , 1580]
{
int year = 1 , day = 1 , month = 1;
int k = ri / T , r = ri % T;
year += k * 4;
cl(r , month , day , year);
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
else
{
ri -= 577095;
if(ri <= 365 * 2 - 10)
{
int year = 1581 , day = 1 , month = 1;
cl(ri , month , day , year);
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
else
{
int year = 1583 , day = 1 , month = 1;
ri -= 365 * 2 - 10;
int k = ri / 146097 , r = ri % 146097;
year += k * 400;
cl(r , month , day , year);
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
}
}
}
int main()
{
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
v[4] = v[6] = v[9] = v[11] = 1;
scanf("%d",&q);
while(q--)
work();
return 0;
}
```
$T2$
```cpp
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 1e6 + 1;
const int M = 1e8 + 1;
const int Bit = 64;
int n,m,c,k;
unsigned long long ans = 1;
int a[N];
bool v[Bit],b[Bit];
void cl(int x)
{
int bit = 0;
while(x)
{
if((x & 1) && b[bit])
v[bit] = 1;
x >>= 1;bit++;
}
}
int main()
{
freopen("zoo.in","r",stdin);
freopen("zoo.out","w",stdout);
scanf("%d %d %d %d",&n,&m,&c,&k);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
for(int i = 1; i <= m; i++)
{
int pi,qi; scanf("%d%d",&pi,&qi);
b[pi] = 1;
}
for(int i = 1; i <= n; i++)
cl(a[i]);
for(int i = 0; i < k; i++)
{
if(!v[i] && b[i]) ans *= 1;
else ans *= 2;
}
cout<<ans - n;return 0;
}
```
$T3$
```cpp
#include<cstdio>
using namespace std;
typedef long long ll;
const int N = 2e4 + 10;
const int mod = 998244353;
ll cj = 1;
int n,m,q,sum;
int first[N];
ll a[N];
struct E
{
int next;
int to;
void add(int x , int y)
{
next = first[x];
to = y;
first[x] = sum;
}
}e[N];
struct NO
{
int ti;
int p,v;
}Node[N];
struct Sig
{
int l;
int r;
int w;
int lazy;
};
void dfs(int x)
{
if(Node[x].ti == 1 || Node[x].ti == 2)
{
if(Node[x].ti == 1)
{
for(int i = 1; i <= n; i++)
a[i] = (a[i] * cj) % mod;
a[Node[x].p] += Node[x].v; a[Node[x].p] %= mod;
cj = 1;
}
else cj = (cj * Node[x].v) % mod;
}
else
{
int b[N];b[0] = 0;
for(int i = first[x]; i ; i = e[i].next)
{
int to = e[i].to;
b[++b[0]] = to;
}
for(int i = b[0]; i >= 1; i--)
dfs(b[i]);
}
}
int main()
{
freopen("call.in","r",stdin);
freopen("call.out","w",stdout);
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%lld",&a[i]);
scanf("%d",&m);
for(int i = 1; i <= m; i++)
{
int op,pi,vi,ci; scanf("%d",&op);
switch(op)
{
case 1:
scanf("%d%d",&pi,&vi);
Node[i] = (NO){op,pi,vi};
break;
case 2:
scanf("%d",&vi);
Node[i] = (NO){op,0,vi};
break;
case 3:
scanf("%d",&ci);
for(int j = 1; j <= ci; j++)
{
int ui; scanf("%d",&ui);
e[++sum].add(i , ui);
}
Node[i] = (NO){op,0,0};
break;
break;
}
}
scanf("%d",&q);
for(int i = 1; i <= q; i++)
{
int fi; scanf("%d",&fi);
dfs(fi);
}
for(int i = 1; i <= n; i++)
a[i] = (a[i] * cj) % mod;
for(int i = 1; i <= n; i++)
printf("%lld ",a[i]);
return 0;
}
```
经过小修小补,很快就把$T1,T2$的锅修好了emmmm。
现在终于把$T3$调过了。
修改之后的代码:
$T1$
```cpp
#include<cstdio>
using namespace std;
const int d1 = 365;//平年
const int d2 = 366;//闰年
const int T = 1461;
int q;
bool v[13];
bool pd(int x)
{
if(x <= 1582)
{
if(x > 0 && x % 4 == 0)
return true;
if(x < 0 && (x + 1) % 4 == 0)
return true;
}
if(x > 1582 && ((x % 400 == 0) || (x % 4 == 0 && x % 100 != 0))) return true;
return false;
}
void cl(int ri , int &month , int &day , int &year)
{
for(year;;)
{
if(year == 0) year++;
if(pd(year))
{
if(ri >= d2) ri -= d2 , year++;
else break;
}
else
{
if(year != 1582)
{
if(ri >= d1) ri -= d1 , year++;
else break;
}
else
{
if(ri >= d1 - 10) ri -= d1 - 10 , year++;
else break;
}
}
if(ri == 0) break;
}
if(year == 0) year++;
for(month;;)
{
if(month == 2)
{
if(pd(year))
{
if(ri >= 29) ri -= 29 , month++;
else break;
}
else
{
if(ri >= 28) ri -= 28 , month++;
else break;
}
}
else
{
if(v[month])
{
if(ri >= 30) ri -= 30 , month++;
else break;
}
else
{
if(year != 1582 || month != 10)
{
if(ri >= 31) ri -= 31 , month++;
else break;
}
else
{
if(ri >= 21) ri -= 21 , month++;
else break;
}
}
}
if(ri == 0) break;
}
if(year == 1582 && month == 10 && ri >= 4)
day = ri + 11;
else day = ri + 1;
}
void work()
{
long long ri; scanf("%lld",&ri);
if(ri <= 1721424) //[-4713 , -1]
{
int year = -4713 , day = 1 , month = 1;
int k = ri / T , r = ri % T;
year += k * 4;
cl(r , month , day , year);
if(year == 0) year++;
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
else
{
ri -= 1721424;
if(ri < 577095)//[1 , 1580]
{
int year = 1 , day = 1 , month = 1;
int k = ri / T , r = ri % T;
year += k * 4;
cl(r , month , day , year);
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
else
{
ri -= 577095;
if(ri <= 365 * 2 - 10)
{
int year = 1581 , day = 1 , month = 1;
cl(ri , month , day , year);
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
else
{
int year = 1583 , day = 1 , month = 1;
ri -= 365 * 2 - 10;
int k = ri / 146097 , r = ri % 146097;
year += k * 400;
cl(r , month , day , year);
if(year < 0) printf("%d %d %d BC\n",day , month , -year);
else printf("%d %d %d\n",day , month , year);
}
}
}
}
int main()
{
// freopen("julian.in","r",stdin);
// freopen("julian.out","w",stdout);
v[4] = v[6] = v[9] = v[11] = 1;
scanf("%d",&q);
while(q--)
work();
return 0;
}
```
$T2$
```cpp
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const int Bit = 101;
const unsigned long long inf = 18446744073709551615;
int n,m,c,k;
unsigned long long a[N];
ll ans = 1;
bool v[Bit] , b[Bit] ,flag;
void cl(unsigned long long x)
{
int bit = 0;
while(x)
{
if(x & 1) v[bit] = 1;
x >>= 1; bit++;
}
}
int main()
{
// freopen("aa.in","r",stdin);
scanf("%d %d %d %d",&n,&m,&c,&k);
for(int i = 1; i <= n; i++)
cin>>a[i];
for(int i = 1; i <= m; i++)
{
int pi,qi; scanf("%d %d",&pi,&qi);
b[pi] = 1;
}
for(int i = 1; i <= n; i++)
cl(a[i]);
for(int i = 0; i < k; i++)
if(!v[i] && b[i]) ans *= 1 ,flag = 1;
else ans *= 2;
if(!flag && k == 64)
{
if(n == 0)
printf("18446744073709551616");
else cout<<inf - n + 1;
}
else cout<<ans - n;
return 0;
}
```
$T3$
```cpp
#include<cstdio>
using namespace std;
const int N = 1e5 + 10;
const int M = 1e6 + 10;
const int mod = 998244353;
typedef long long ll;
int n,m,q,sum;
int f[M],first[M],inn[M];
ll a[N],mult,_mult[N],Add[N];
bool v[N];
struct NO
{
int ty;
int p;
int v;
ll mul;
ll w;
}Node[M];
struct E
{
int next;
int to;
void add(int x , int y)
{
next = first[x];
to = y;
first[x] = sum;
}
}e[M * 2];
struct queue
{
int head,tail;
int a[M];
void clear()
{head = tail = 0;}
void push(int x)
{a[tail++] = x;}
void pop()
{head++;}
int front()
{return a[head];}
bool empty()
{return head == tail ? true : false;}
}qu;
void in(int &x)
{
x = 0; char ee = getchar();
while(ee < '0' || ee > '9') ee = getchar();
while(ee >= '0' && ee <= '9') x = (x << 1) + (x << 3) + ee - '0' , ee = getchar();
}
void dfs(int x)
{
if(Node[x].ty == 1 || Node[x].ty == 2)
{
if(Node[x].ty == 2)
_mult[x] = Node[x].v;
return;
}
for(int i = first[x]; i ; i = e[i].next)
{
int to = e[i].to;
if(!v[to]) dfs(to) , v[to] = 1;
_mult[x] *= _mult[to] , _mult[x] %= mod;
}
}
void topo_sort()
{
for(int i = 1; i <= m; i++)
if(!inn[i]) qu.push(i);
while(!qu.empty())
{
int now = qu.front(); qu.pop();
if(Node[now].ty == 1) Add[Node[now].p] += Node[now].v * Node[now].w , Add[Node[now].p] %= mod;
ll k = Node[now].w;
for(int i = first[now]; i ; i = e[i].next)
{
int to = e[i].to;
inn[to]--; if(!inn[to]) qu.push(to);
Node[to].w += k , Node[to].w %= mod;
k *= _mult[to] , k %= mod;
}
}
}
int main()
{
// freopen("aa.in","r",stdin);
// freopen("aa.out","w",stdout);
in(n);
for(int i = 1; i <= n; i++) scanf("%lld",&a[i]);
in(m);
for(int i = 1; i <=m; i++)
{
int tye; in(tye); _mult[i] = 1;
switch(tye)
{
int pi , vi , ci;
pi = 0 , vi = 0 , ci = 0;
case 1:
in(pi);in(vi);
Node[i] = (NO){tye,pi,vi,1,0};
break;
case 2:
in(vi);
Node[i] = (NO){tye,pi,vi,1,0};
break;
case 3:
in(ci);
for(int j = 1; j <= ci; j++)
{
int gi; in(gi);
inn[gi]++;
Node[i] = (NO){tye,pi,vi,1,0};
e[++sum].add(i , gi);
}
break;
break;
}
}
in(q);mult = 1;
for(int i = 1; i <= q; i++)
in(f[i]);
for(int i = 1; i <= m; i++)
if(!inn[i]) dfs(i);
for(int i = q; i >= 1; i--)
{
int id = f[i];
if(Node[id].ty == 1) Node[id].w += mult;
else if(Node[id].ty == 2) mult *= _mult[id] , mult %= mod;
else Node[id].w += mult , mult *= _mult[id] , mult %= mod;
}
topo_sort();
for(int i = 1; i <= n; i++)
printf("%lld ",((a[i] * mult) % mod + Add[i] % mod) % mod);
return 0;
}
```
---------
吐槽:$T1$卡```int```,$T2$卡```ull```,不愧是你。$CCF$。