UOJ Logo WeLikeStudying的博客

博客

#573 CSP-S 2020 贪吃蛇 错解求 hack

2022-09-17 07:32:49 By WeLikeStudying

在 $O(n\log n)$ 的贪心基础上我们发现重点就是模拟每只蛇都要吃的情况,看看谁吃谁。

然后我假定蛇的体力值单调不增(显然是错的),得到了以下代码,它可以通过 UOJ 目前的数据(而且是最短解),请问能否把它 hack 掉。

感谢!link

#include<bits/stdc++.h>
const int N=22e6;
using namespace std;
int T,n,a[N],w[N],c[N],u[N],v[N];
bool ok[N];
bool cmp(int x,int y)
{
    return w[x]==w[y]?x<y:w[x]<w[y];
}
void solve()
{
    int l=1,r=n,x=0,y=-1;
    copy(a,a+n+1,w),fill(ok,ok+n+1,0);
    for(int i=1;i<n;++i)
    {
        v[i]=(l<=r&&(x>y||cmp(l,c[y])))?l++:c[y--],
        u[i]=(l<=r&&(x>y||cmp(c[x],r)))?r--:c[x++],
        w[u[i]]-=w[v[i]],
        c[++y]=u[i];
        if(x<y)if(!cmp(c[y],c[y-1]))swap(c[y],c[y-1]);
    }
    r=0;
    for(int i=n-1;i>=1;--i)
        if(ok[u[i]])
        {
            for(int j=0;j<r;++j)
                ok[c[j]]=0;
            r=0;
        }
        else ok[v[i]]=1,c[r++]=v[i];
    cout<<n-r<<endl;
}
int main()
{
    cin>>T>>n;
    for(int i=1;i<=n;++i)cin>>a[i];
    solve();
    while(--T)
    {
        int k;cin>>k;
        for(int i=1,x,y;i<=k;++i)
            cin>>x>>y,a[x]=y;
        solve();
    }
    return 0;
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。