QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#401706#8553. Exchanging KubicmarherWA 0ms3784kbC++142.8kb2024-04-29 10:33:462024-04-29 10:33:49

Judging History

你现在查看的是最新测评结果

  • [2024-04-29 10:33:49]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3784kb
  • [2024-04-29 10:33:46]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e3+500,inf=1e9;

struct node
{
    int l,r,w;

    friend bool operator<(node a,node b)
    {
        return a.l<b.l;
    }
};

int T,n,a[N];
set<node>s;

int b[N],res[50][50],fir[N];

int ask(int l,int r)
{
    return res[l][r];
    cout<<"? "<<l<<' '<<r<<endl;
    int ans;cin>>ans;return ans;
}

int merge(set<node>::iterator p1,set<node>::iterator p2,set<node>::iterator p3)
{
    auto x=*p1,y=*p2,z=*p3;
    int w=ask(x.l,z.r);
    if(w==max(x.w,z.w))
    {
        if((p1==s.begin()&&w==z.w)||(p3==(--s.end())&&w==x.w))
        {
            a[y.l]=-1000000000000000ll;
            if(p1==s.begin())s.erase(p1,p3);
            else s.erase(p2,s.end());
            return 1;
        }
        return 0;
    }
    a[y.l]=w-x.w-z.w;s.erase(p1,++p3);s.insert((node){x.l,z.r,w});
    return 1;
}

int mergefir(set<node>::iterator pos)
{
    auto p1=pos;pos++;
    if(pos==s.end())return 0;
    auto p2=pos,p3=++pos;
    return merge(p1,p2,p3);
}

int mergelas(set<node>::iterator pos)
{
    if(pos==s.begin())return 0;
    auto p1=pos,p2=--pos,p3=--pos;
    return merge(p3,p2,p1);
}

mt19937 rad(time(0));

void init(int f=1)
{
    n=20;
    for(int i=1;i<=n;i++)
    {
        if(f)b[i]=uniform_int_distribution<int>(-inf,inf)(rad);
        fir[i]=fir[i-1]+b[i],res[i][i]=max(0ll,b[i]);
    }
    for(int i=2;i<=n;i++)for(int j=1;j+i-1<=n;j++)
    {
        int l=j,r=i+j-1;
        res[l][r]=max(fir[r]-fir[l-1],max(res[l+1][r],res[l][r-1]));
    }
}

void chk()
{
    int d[50][50];swap(d,res);swap(a,b);
    init(0);
    for(int l=1;l<=n;l++)for(int r=l;r<=n;r++)if(d[l][r]!=res[l][r])
    {
        for(int i=1;i<=n;i++)cout<<a[i]<<' ';
        puts("");
        for(int i=1;i<=n;i++)cout<<b[i]<<' ';
        puts("");
        cout<<l<<' '<<r<<'\n';cout<<d[l][r]<<' '<<res[l][r]<<'\n';
        exit(0);
    }
    // puts("AC");
}

void sol()
{
    // init();
    cin>>n;
    for(int i=1;i<=n;i++)a[i]=ask(i,i);
    for(int i=1;i<=n;i++)
    {
        int pos=i,sum=0;
        while(pos<=n&&(a[pos]==0)==(a[i]==0))sum+=a[pos++];
        if(sum||(i>1&&pos<=n))s.insert((node){i,pos-1,sum});
        i=pos-1;
    }
    while(s.size()>1)
    {
        auto pos=s.begin(),x=s.begin();
        while(x!=s.end())
        {
            if((*x).w&&(*x).w<(*pos).w)pos=x;
            ++x;
        }
        if(mergefir(pos)||mergelas(pos))continue;
        auto A=pos,B=pos;A--;B++;auto C=B;C++;
        a[(*B).l]=-(*pos).w;node p=(node){(*A).l,(*B).r,0};
        s.erase(A,C);s.insert(p);
    }
    cout<<"! ";
    for(int i=1;i<=n;i++)cout<<a[i]<<' ';cout<<endl;
    // chk();
    s.clear();
}

main()
{
    // freopen("in.txt","r",stdin);
    cin>>T;
    // T=100000;
    while(T--)sol();
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3784kb

input:

2
3

output:

! 0 0 0 

result:

wrong answer mss of [1, 1] is incorrect, expected=1, found=0 (test case 1)