10-17

两个月没写过博客的辣鸡回来写博客了(逃)

和别的学校连考第二天,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分会写,但是当时心态太浮躁了,一心想写正解,结果就没拿到分。

posted @ 2017-10-17 17:01  assassin灬  阅读(116)  评论(0编辑  收藏  举报