分块10pts求调,只过了#2和#11
查看原帖
分块10pts求调,只过了#2和#11
1023919
a1874658776楼主2024/3/16 23:08

代码如下:

#include <bits/stdc++.h>
#define MAX 100010
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll n,m,len;
int light[MAX];
#define loc(x) (x-1)/len+1
typedef struct nodes
{
    ll l,r,num,flag;
}Node;
Node N[MAX];
void opt(ll l,ll r)
{
    ll x=loc(l),y=loc(r);
    if(x==y)
    {
        for(int i=l;i<=r;i++)
        {
            light[i]*=-1;
            N[x].num+=light[i];
        }
        return ;
    }
    for(int i=l;i<=N[x].r;i++)
    {
        light[i]*=-1;
        N[x].num+=light[i]*N[x].flag;
    }
    for(int i=N[y].l;i<=r;i++)
    {
        light[i]*=-1;
        N[y].num+=light[i]*N[y].flag;
    }
    for(int i=x+1;i<y;i++)
    {
        N[i].flag*=-1;
        N[i].num=len-N[i].num;
    }
}
void query(ll l,ll r)
{
    ll x=loc(l),y=loc(r);
    ll ans=0,tmp;
    if(x==y)
    {
        tmp=0;
        for(int i=l;i<=r;i++)
        {
            if(light[i]==1) tmp++;
        }
        if(N[x].flag==-1) ans=(r-l+1)-tmp;
        else ans=tmp;
        cout<<ans<<endl;
        return ;
    }
    tmp=0;
    for(int i=l;i<=N[x].r;i++)
    {
        if(light[i]==1) tmp++;
    }
    if(N[x].flag==-1) ans+=(N[x].r-l+1)-tmp;
    else ans+=tmp;
    tmp=0;
    for(int i=N[y].l;i<=r;i++)
    {
        if(light[i]==1) tmp++;
    }
    if(N[y].flag==-1) ans+=(r-N[y].l+1)-tmp;
    else ans+=tmp;
    for(int i=x+1;i<y;i++) ans+=N[i].num;
    cout<<ans<<endl;
    return ;
}
int main ()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=n;i++) light[i]=-1;
    len=sqrt(n);
    for(int i=1;i<=n/len+1;i++)
    {
        N[i].l=len*(i-1)+1;
        N[i].r=len*i;
        N[i].num=0;
        N[i].flag=1;
    }
    int c,a,b;
    for(int i=0;i<m;i++)
    {
        cin>>c>>a>>b;
        if(!c) opt(a,b);
        else if(c) query(a,b);
    }
    return 0;
}
2024/3/16 23:08
加载中...