Codeforces Round #307 (Div. 2)E. GukiZ and GukiZiana

题目链接:E. GukiZ and GukiZiana

题解:分块处理,更新处理用lazy数组具体过程看代码,用结构体保存位置和值,重载一下运算符按值小的优先,值相同按位置小的优先,用pair也可以,对每一块里的结构体都sort一次,然后从前往后在没一块里二分找第一个位置,找不到就输出-1,然后从后往前找最后一个,这里要注意,我们前面排序是按位置小的放前面我们还要往后判对应位置上时候也是Y,如果是就继续往后找,最用第二个位置减第一个位置就是答案

#include<bits/stdc++.h>
#include<set>
#include<iostream>
#include<string>
#include<iomanip>
#include<vector>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define ll long long
#define PI 3.14159265
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define eps 1e-7
typedef unsigned long long ull;
const int mod=1e9+7;
const int maxn=5e5+5;
const ll inf=0x3f3f3f3f;
using namespace std;
ll a[maxn],n,m;
ll block,num,belong[maxn],l[maxn],r[maxn],lazy[1000];
struct node
{
    ll id,x;
    bool operator<(const node b)const
    {
        if(x!=b.x)return x<b.x;
        return id<b.id;
    }
}st[maxn];
void built()
{
    block=sqrt(n);
    num=n/block;if(n%block)num++;
    for(int i=1;i<=n;i++)
    {
        belong[i]=(i-1)/block+1;
    }
    for(int i=1;i<=num;i++)
    {
        l[i]=(i-1)*block+1;r[i]=i*block;
    }
    r[num]=n;
    for(int i=1;i<=n;i++)
    {
        st[i].id=i;st[i].x=a[i];
    }
    for(int i=1;i<=num;i++)
    {
        sort(st+l[i],st+r[i]+1);
    }
}
void update(int _l,int _r,int w)
{
    if(belong[_l]==belong[_r])
    {
        for(int i=_l;i<=_r;i++)
        {
            a[i]+=w;
        }
        for(int i=l[belong[_l]];i<=r[belong[_l]];i++)
        {
            st[i].id=i;st[i].x=a[i];
        }
        sort(st+l[belong[_l]],st+r[belong[_l]]+1);
        return;
    }
    for(int i=l[belong[_l]];i<=r[belong[_l]];i++)a[i]+=lazy[belong[_l]];
    lazy[belong[_l]]=0;
    for(int i=_l;i<=r[belong[_l]];i++)a[i]+=w;
    for(int i=l[belong[_l]];i<=r[belong[_l]];i++)
    {
        st[i].id=i;st[i].x=a[i];
    }
    sort(st+l[belong[_l]],st+r[belong[_l]]+1);
    for(int i=l[belong[_r]];i<=r[belong[_r]];i++)a[i]+=lazy[belong[_r]];
    lazy[belong[_r]]=0;
    for(int i=l[belong[_r]];i<=_r;i++)a[i]+=w;
    for(int i=l[belong[_r]];i<=r[belong[_r]];i++)
    {
        st[i].id=i;st[i].x=a[i];
    }
    sort(st+l[belong[_r]],st+r[belong[_r]]+1);
    for(int i=belong[_l]+1;i<belong[_r];i++)lazy[i]+=w;
}
int slove(int x)
{
    bool flag=false;
    int p1,p2;
    for(int i=1;i<=num;i++)
    {
        node tmp;
        tmp.id=0;tmp.x=x-lazy[i];
        node* pp=lower_bound(st+l[i],st+r[i],tmp);
        if(pp->x==x-lazy[i])
        {
            p1=pp->id;flag=true;break;
        }
    }
    if(!flag)return -1;
    for(int i=num;i>=1;i--)
    {
        node tmp;
        tmp.id=0;tmp.x=x-lazy[i];
        int pp=lower_bound(st+l[i],st+r[i],tmp)-(st+l[i]);
        if(st[l[i]+pp].x==x-lazy[i])
        {
            while(pp<r[i]-l[i]&&st[l[i]+pp+1].x==x-lazy[i])pp++;
            p2=st[l[i]+pp].id;break;
        }
    }
    return p2-p1;
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
     built();
    while(m--)
    {
        int op,_l,_r,w;
        cin>>op;
        if(op==1)
        {
            cin>>_l>>_r>>w;
            update(_l,_r,w);
        }
        else
        {
            cin>>w;
            cout<<slove(w)<<endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/lhclqslove/p/8400985.html