BZOJ 1432 [ZJOI2009]Function

【题解】

  明显是道数学题。

  需要在草稿纸上写写画画,在这里我只写一些结论。

  首先我们可以发现,当k恒定时,不管n增加到多大,第k层的最少段数都是不变的。因为我们必定可以找到一种加入一条新的直线的方式,使得这条直线与之前的n条直线的n个交点中,n-1个在第k层的上方,1个在第k层上,且使得原来第k层最左边或者最右边的一个交点不再属于第k层。这样的话,第k层上面的交点数量不变,段数也就不变。

  接着我们可以发现,当直线数是偶数的时候,第k层的最左边与最右边的两条线段的斜率一定不同,所以我们可以通过加入一条直线,使这条直线与第k层只有两个交点,且这两个交点处于最左边与最右边。这样第k层将变为第k+1层,同时段数增加2.

  那么考虑我们逐步添加直线构造符合的图形,我们在奇数条直线的时候通过结论1增加一条直线,使得线段条数变为偶数且某一层的段数不变。在偶数条线段的时候我们可以根据结论2把这一层上推一层或者仅仅是根据结论2增加一条直线。这取决于k的大小。

  

#include<cstdio>
#include<algorithm>
using namespace  std;
int n,k;
inline int read(){
    int k=0,f=1; char c=getchar();
    while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
    return k*f;
}
int main(){
    n=read(); k=read();
    if(n==1) puts("1");
    else printf("%d\n",2*min(k,n-k+1));
    return 0;
}

  

posted @ 2018-03-01 18:35  Driver_Lao  阅读(110)  评论(0编辑  收藏  举报