QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#454187#8528. Chordsucup-team1525#TL 0ms0kbC++203.0kb2024-06-24 17:22:592024-06-24 17:22:59

Judging History

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

  • [2024-06-24 17:22:59]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2024-06-24 17:22:59]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
mt19937_64 rnd(time(0));
#define ull unsigned long long
struct dt
{
    int l,r,len;
    ull v;
    bool operator<(const dt &a)const
    {
        return (len==a.len?l<a.l:len<a.len);
    }
}a[N];
ull f[N*2];
int n;
inline void ins(int x,ull y)
{
    for (;x<=n*2;x+=x&(-x))
        f[x]^=y;
}
inline int ask(int x)
{
    int ans=0;
    for (;x;x-=x&(-x))
        ans^=f[x];
    return ans;
}
int g[N],h[N];
void raodong(int mx)
{
    for (int i=1;i<=100;++i)
    {
        g[i]=rnd()%mx+1;
        int q=min(n-g[i]+1,max(mx/2,20));
        h[i]=g[i]+rnd()%q;
        // h[i]=rnd()%n+1;
        // while (g[i]==h[i])
        // {
        //     h[i]=rnd()%n+1;
        // }
        swap(a[g[i]],a[h[i]]);
    }
}
void roll_back()
{
    for (int i=100;i;--i)
    {
        swap(a[g[i]],a[h[i]]);
    }
}
map<ull,int> mp;
int in[N];
int main()
{
    clock_t bg=clock();
    scanf("%d",&n);
    for (int i=1;i<=n;++i)
    {
        scanf("%d%d",&a[i].l,&a[i].r);
        a[i].len=a[i].r-a[i].l;
        a[i].len=min(a[i].len,n*2-a[i].len);
        a[i].v=rnd();
        while(!mp[a[i].v])
            a[i].v=rnd();
        mp[a[i].v]=i;
        // a[i+n]={a[i].r,a[i].l,n*2-a[i].len};
    }
    sort(a+1,a+1+n);
    int ans=0;
    for (int i=1;i<=n;++i)
        if (ask(a[i].l-1)==ask(a[i].r))
        {
            ++ans;
            in[i]=1;
            ins(a[i].l,a[i].v);
            ins(a[i].r,a[i].v);
        }
    while (clock()-bg<=2.9*CLOCKS_PER_SEC)
    {
        int x=rnd()%n+1;
        if (!in[x])
        {
            int o=ask(a[x].l-1)^ask(a[x].r);
            if (o==0)
            {
                ++ans;
            }
            else
            {
                int tmp=mp[o];
                if (tmp)
                {
                    in[tmp]=0;
                    ins(a[tmp].l,a[tmp].v);
                    ins(a[tmp].r,a[tmp].v);
                }
                else
                    continue;
            }
                in[x]=1;
                ins(a[x].l,a[x].v);
                ins(a[x].r,a[x].v);
        }
    }
    // int mx=max(1,n/4);
    // while (clock()-bg<=2.9*CLOCKS_PER_SEC)
    // // for (int t=1;t<=100;++t)
    // {
    //     int sum=0;
        // for (int i=1;i<=n;++i)
        //     if (ask(a[i].l-1)==ask(a[i].r))
        //     {
        //         ++sum;
                // ins(a[i].l,a[i].v);
                // ins(a[i].r,a[i].v);
        //     }
    //     if (sum>ans)
    //     {
    //         ans=sum;
    //     }
    //     else
    //     {
    //         if (sum<ans)
    //         {
    //             roll_back();
    //             mx+=n/40;
    //             mx=min(n,mx);
    //         }
    //     }
    //     if (n==1)
    //         break;
    //     raodong(mx);
    //     for (int i=1;i<=2*n;++i)
    //         f[i]=0;
    // }
    printf("%d\n",ans);
    return 0;
}

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

5
1 2
4 10
7 9
3 5
6 8

output:


result: