D0
下午1点出发,在地铁上站了一个多小时来到万达,然后在万达门前站了近1h等房卡。
接着和小伙伴们走路去看考场,我边走边肝炉石,jjc打了7胜。
回来后草草地在金拱门吃,晚上向hzh低头,玩了两把狮子狗。
回去洗完澡后躺在床上把Angel beats看完了,
突然想起千珏的一句台词,真正的死亡,是从未活过…。
感觉有点虐,不敢看另一个结局,再看了集四月就睡了。
D1
吃完早餐后企图骑共享单车去考场,骑到一半发现全是上坡,果断扔掉单车走路了。
T1根据“数学上来先打表”并没有看出什么,用exgcd推了半个小时也没有结果。
T2是个模拟,结合两个样例用1个小时打出了一个精巧的程序。
看T3,刚开始沉迷进一个奇怪的地方,后来发现这不是个很套路的最短路计数吗。
于是根据“图论就是套模板”,飞快地打完了建图,spfa,dfs找环与拓扑。
发现大数据错了,一直怀疑是上面某个算法打错了。
而dp的计数方法是这题的核心,是我某瞬间的灵感产生的,再由此推出整道题。
我丝毫没有怀疑,一直检查程序,一直很紧张很慌。
还剩半个小时,T3暴力也想不出来,就放弃T3了。
T1发现好像是b*(a-1)-a,跟暴力对拍错了很多。
于是保留了暴力,再打了个优化的暴力(二分+exgcd检查100000个),对拍又错了…
然后交了暴力和b*(a-1)-a。(我们仍未知道那天我打的暴力为何这么牛B)。
考完之后深知考炸了,一直很慌,下午去玩了场密室逃脱,晚上玩了2把lol就洗洗睡了。
D2
T1打n^2搜索应该没问题吧,15分钟打完了。
不知为什么就没考虑到爆longlong和纵坐标<0的情况。
T2大概想了一下,并没有任何头绪,但有一个奇怪的念头觉得这题肯定能想出来。
T3画了下图,10分钟左右,觉得离散化后300001棵Splay可以做。
想到标程没有数据结构,推出了一个二分+BIT的方法,深信这就是正解。
然后再想暴力,打了个50分的。
看到有20分我只会用splay实现,不如打正解。
但那个念头驱使我去想T2,想了半个小时才发现看错题了,原来代价是点的数量×长度,而不是长度×长度。
但依然没想到,70分都不会,打了个n!水40。
还有1个小时多一点,开始打T3,哼,调不出来,交了50分暴力。
出来由于没饭票,自己走去万达吃饭,听CSH讲了T2,拍照也没兴趣。
吃完饭后买了罐啤酒,低着头喝了0.5h。后来看到老师也躲着,跟在队伍后面回到学校。
这次noip告诉我,我确实连L指导(shengdui)一半水平都没有。
再简单规范,也有很多我想不到的题。
暴力确实重要,暴力打满也是要实力和运气的。
更重要的心理素质和考试心态,想清楚有把握再打。
思维要保持连续,广泛地搜索可能出现的情况,不能只靠灵感和做过的套路。
只能选择相信自己的知识和写下的代码。
让我知道这些也是有代价的,也许就是退役。
两天都没有200,可能比去年还差。
幻想着ak,交的程序全都是暴力,没有用到任何高中学的知识。
noip比别人低了200分,等于省选要高85分。
暑假时听保送大佬说他们noip都没有打暴力,还真的觉得自己最多只有1题不会。
noip前几天15分钟1A天天爱跑步,就真的觉得我能ak,
甚至还担心蚯蚓这种题想不出怎么办。
我看骗分导论,作者主张扩大部分分,梯度更平缓。我还有点反感,特别是省选,觉得强省就应该有强省的样子。
但听老师号召,回归基础算法,我也搞了个计划
但唯一用到的只有最后一行“对拍”,炸了我D1T1。
我也跟着老师做了50套模拟,但大多都是套路题,改编题,老题。
要么是已经熟悉的套路,甚至是做过的题,要么和旁边讨论出套路。
或者觉得是偏题,noip出了出题人会被骂的题,就弃了。
建这个博客才3个月,如果确实退役了,也许就不再有人点开了。
可能自己也会嫌弃这三个月,有空写博客不如肝炉石。
回到班上都是陌生的同学,不敢面对的老师。
noip时他们去露营做饭了,还用班会课来分享,而我从广州二中带回去的只有一堆脏衣服。
如果我还是高一多好。记得高一期末考的作文,要写一部艺术作品。
我写了《悠久之翼》,正是我noip时看的。
结合我noip时对oi的粗鄙看法,拿了48分,是我作文拿过的最高分。想来还是很有爱的。
虽然现在鄙视无忧无虑的快乐,但依旧痛心无法回到从前了。
现在只能想到写在在1检总结结尾的那句
而后的冬天——从天而降的积雪,掩盖了所有的罪。
不久的春天——所有的惩罚,都与积雪的融化一同降临。
D1T3公园
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long LL;
const int nn=300001,N=3000030,oo=1e9+7;
int T,n,m,k,P;
int x[N],y[N],len[N];
int head[N],nex[N],to[N],val[N],cnt;
int q[N],d1[N],d2[N];
int w[N],times;
int f[N][52];
bool ok,in[N],vis[N];
void add(int u,int v,int w)
{
to[++cnt]=v;
val[cnt]=w;
nex[cnt]=head[u];
head[u]=cnt;
}
void spfa(int *d,int s)
{
for(int i=1;i<=n;i++)
d[i]=oo;
d[s]=0;
q[1]=s;
int hh=1,tt=1;
while(hh<=tt)
{
int hy=q[hh%nn];
hh++;
in[hy]=0;
for(int h=head[hy];h;h=nex[h])
if(d[to[h]]>d[hy]+val[h])
{
d[to[h]]=d[hy]+val[h];
if(!in[to[h]])
{
in[to[h]]=1;
tt++;
q[tt%nn]=to[h];
if(d[q[tt%nn]]<d[q[hh%nn]])
swap(q[tt%nn],q[hh%nn]);
}
}
}
}
void dfs(int x)
{
vis[x]=1;
in[x]=1;
for(int h=head[x];h;h=nex[h])
if(d1[to[h]]==d1[x]+val[h])
{
if(in[to[h]])
{
if(d1[x]+d2[x]<=d1[n]+k)
ok=false;
}
if(!vis[to[h]])
dfs(to[h]);
}
in[x]=0;
w[++times]=x;
}
int main()
{
cin>>T;
while(T--)
{
ok=1;
times=cnt=0;
mmst(head,0);
mmst(vis,0);
cin>>n>>m>>k>>P;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&x[i],&y[i],&len[i]);
for(int i=1;i<=m;i++)
add(y[i],x[i],len[i]);
spfa(d2,n);
times=cnt=0;
mmst(head,0);
for(int i=1;i<=m;i++)
add(x[i],y[i],len[i]);
spfa(d1,1);
dfs(1);
if(!ok)
{
cout<<-1<<endl;
continue;
}
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++)
f[i][j]=0;
f[1][0]=1;
for(int j=0;j<=k;j++)
{
for(int i=times;i>=1;i--)
for(int h=head[w[i]];h;h=nex[h])
if(d1[to[h]]==d1[w[i]]+val[h])
f[to[h]][j]=(f[to[h]][j]+f[w[i]][j])%P;
for(int i=1;i<=m;i++)
if(d1[x[i]]+len[i]>d1[y[i]]&&d1[x[i]]+len[i]-d1[y[i]]+j<=k)
f[y[i]][d1[x[i]]+len[i]-d1[y[i]]+j]=(f[y[i]][d1[x[i]]+len[i]-d1[y[i]]+j]+f[x[i]][j])%P;
}
int ans=0;
for(int j=0;j<=k;j++)
ans=(ans+f[n][j])%P;
cout<<ans<<endl;
}
return 0;
}
D2T2宝藏
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define mmst(a, b) memset(a, b, sizeof(a))
#define mmcp(a, b) memcpy(a, b, sizeof(b))
typedef long long LL;
const int N=15,M=5050,mm=10000100,oo=1e9+7;
int n,m,ans=oo;
int map[N][N];
int er[N],head[M],nex[mm],val[mm],b[mm],cnt;
int f[15][M];
void add(int u,int v,int w)
{
b[++cnt]=v;
val[cnt]=w;
nex[cnt]=head[u];
head[u]=cnt;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
map[i][j]=oo;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
map[y][x]=map[x][y]=min(map[x][y],z);
}
er[0]=1;
for(int i=1;i<=15;i++)
er[i]=er[i-1]*2;
int tu=er[n]-1;
for(int i=1;i<=tu;i++)
for(int j=i;j;j=(j-1)&i)
if(j!=i)
{
int sum=0;
for(int jj=1;jj<=n;jj++)
if(er[jj-1]&j)
{
int mi=oo;
for(int ii=1;ii<=n;ii++)
if(er[ii-1]&(i-j))
mi=min(mi,map[ii][jj]);
if(mi==oo)
sum=oo;
else
sum+=mi;
}
if(sum<oo)
add(i,j,sum);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
for(int k=0;k<=tu;k++)
f[j][k]=oo;
f[1][er[i-1]]=0;
for(int j=2;j<=n;j++)
for(int k=1;k<=tu;k++)
for(int h=head[k];h;h=nex[h])
f[j][k]=min(f[j][k],f[j-1][k-b[h]]+val[h]*(j-1));
for(int j=1;j<=n;j++)
ans=min(ans,f[j][tu]);
}
cout<<ans<<endl;
return 0;
}