在比赛开始30分钟内依次A了10,7,3,一个小时左右A了11,然后就再也没有写出任何一道题。。。
其实比赛过程中心态有很大的问题,我一直在5上面钻牛角尖,耗费了太多时间。
基本上比赛后半程三个人都在看2,5两道题,其他题目几乎没看。
到最后基本没有做下去的欲望了,可能是因为是女队压力比较小吧(不,是因为我比较菜)。。
以及网络赛的排行榜真的很迷。。第2题min25筛一堆人过。。然而队里三个人甚至都没有听说过这玩意。。
(226大佬7题,ORZ)
1002 Graph Theory Class
题意:在一个有n个点的图中,图中点1~n编号。对于i,j之间的一条边,它的权重为lcm(i+1,j+1),求这个图的最小生成树大小。
思路:很明显对于(j+1)为质数的情况,j应该与1连接,权重为2*(j+1);
对于(j+1)不是质数的情况,j可以与任意一个满足i+1==factor(j+1)的i连接,factor(j+1)指j+1的因子,权重为j+1。
于是最小生成树的大小为(3~n+1以内所有质数)*2+(3~n+1以内所有非合数),即(3~n+1所有数之和)+(3~n+1以内所有质数之和)
前者可以用等差数列求和计算,(n+4)*(n-1)/2;由于n<=1010,后者可以使用min25筛计算。
min25筛,可以在的前缀和。
(积性函数,指对于所有互质的整数a和b有性质f(ab)=f(a)f(b)的函数)
(代码待补充
1003 Express Mail Taking
题意:有n个保险柜,编号为1~n,每两个相邻编号的保险柜之间的距离为1,第k个保险柜用来打开其他保险柜(每次只能同时打开一个保险柜)。从1出发,需要从m个保险柜中取东西后再从1离开。问距离最短的路线长度。
思路:一开始理解错了题意,以为只要到达第k保险柜后其他保险柜就打开了,就WA了一次。
对于m个要取东西的柜子,除了最后一个柜子有可能不需要返回k柜,对于其他柜子,都必须在该柜子与k柜之间走一个来回。
于是找到m个柜子中最小的一个x,若x比k小,则将该点删去(在回1点的路上就可到达,对距离无贡献)
接着对剩下的每个柜子i,贡献2*abs(i-k)的答案。
再加上出发和结束的2*(k-1),就是答案。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=2000005; int a[maxn]; int main() { int i,T,n,m,k,mi; ll ans; scanf("%d",&T); while (T--) { scanf("%d%d%d",&n,&m,&k); ans=2ll*(k-1); mi=k; for (i=1;i<=m;i++) { scanf("%d",&a[i]); ans+=2ll*abs(a[i]-k); if (a[i]<mi) mi=a[i]; } if (mi!=k) ans-=2ll*abs(mi-k); printf("%lld\n",ans); } return 0; }