两个月没写过博客的辣鸡回来写博客了(逃)
和别的学校连考第二天,100/300,完美被虐。
先说第一天的题吧。
T1:次芝麻
题面:小x有n个芝麻,小k有m个芝麻,两人中芝麻数较小的人会从另一个人手里抢走自己有的那么多芝麻,若两人的芝麻数相同,则小x拿走小k的芝麻,k个回合后两人会吃掉自己剩的芝麻,求两人谁吃的最少。
哎哟我去!良心出题人啊!完美的NOIPday1t1难度啊,这么水的模拟么!不多BB,看数据量马上A掉。
对于30%的数据,n<=10^5,m<=10^5,k<=10^5;
对于60%的数据,,n<=10^5,m<=10^5,k<=10^9;
对于100%的数据,n<=10^9,m<=10^9,k<=10^9;
凉心出题人啊!太凉心了!拿了60分滚粗,没有推出来正解。
正解:对于任意一个状态(n,m),若n<m,则有(2*n,m-n),有(n+m)*2%(n+m)=0,且2*n%(m+n)=2*n,则2*m%(m+n)=m-n。那么对于k次操作来说,最小值为min(n*2^k&(m+n),m*2^k%(m+n))
T2:给一个数列,称{xi,xj}为坏对,当i<j,且xi%xj==k的时候,求有多少个子数组中不包含坏对。
emmmm给出的正解太短,一句话题解,看不懂,不过帆神的想法还是很牛逼的。
记录对于每个数位置为i来说,左边最靠近他的坏对的做左端点x,则存在以i为结尾的子数组x-i个其中不存在坏对。
求坏对:非常玄学的一个时间复杂度,也就是找x的因数,类似于筛法,比筛法慢,但绝对比枚举到sqrt(x)要快得多。
struct one { int y,next; }; one e[5000000]; void insert(int aa,int bb) { e[++len].next=lin[aa]; lin[aa]=len; e[len].y=bb; } for(int i=1;i<=n;i++) { scanf("%d",&a[i]); maxn=max(a[i],maxn);
} for(int i=1;i<=maxn;i++) { for(int j=1;i*j<=maxn;j++) { insert(i*j,i);
} }
T3:怎么感觉像是要表白?
题面:有一个圣诞树有N层,每层有Ai个位置能放置礼物,有M种不同颜色的礼物可被选择,为了让我的刀娘喜欢(手动滑稽),同层相邻的两个礼物颜色不能一样,相邻两层的颜色集合不能一样,求方案数。
题解......dp,看不懂。
day1就拿了T1的60分,T2的30分会写,但是当时心态太浮躁了,一心想写正解,结果就没拿到分。