其他分享
首页 > 其他分享> > agc002 E - Candy Piles

agc002 E - Candy Piles

作者:互联网

题意:

n 堆石子,两个人轮流操作,每次操作可以拿完最多的一堆或者每堆拿一个。拿走最后一个石子的人

\(n\le 1e5,a_i\le 1e9\)

思路:

把 \(a[]\) 从大到小排序。转化一下题中的操作:拿完最多的一堆就是删除最左的那列,就是往右走一步;每堆拿一个就是删除最下的那行,就是往上走一步。画图一直画到没有石子的状态(称为空点),考虑边界点的状态怎么确定(这里认为空点在边界之外):若某点的上、右邻点均为空点,那他就是必败点,在图上这种点位于 “\(\neg\) 形拐角” 处;否则它的状态取决于往上到拐角点和往右到拐角点的距离的奇偶性。

知道了边界点的状态就可以推出其他所有点的状态。但是把所有点都推出来太慢了。实际上每条 左下-右上 45度线上的点的状态都一样。所以只需关心从起点出发一直45度往右上走到的那个边界点是什么状态

void sol() {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];

    sort(a + 1, a + 1 + n, greater<int>());

    int x = 1, y = 1; while(a[x+1] >= y+1) x++, y++;

    bool s1 = (a[x]-x)%2, s2 = 0;
    while(a[x+1] >= y) x++, s2 ^= 1;

    cout << (s1 || s2 ? "First" : "Second");
}

标签:拐角,agc002,Piles,状态,++,Candy,边界点,往右,空点
来源: https://www.cnblogs.com/wushansinger/p/16474998.html