zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    单链表
    顺序表
    关于传输协议的简单了解
    URL/URI/URN
    点击图片弹出轮播图 -- 插件
    nodeJs中系统模块的常用方法和自定义模块暴露
    Buffer
    Sublime Text 3 安装Package Control
    npm的简单使用
    scrollTop()和document.body.scrollTop的区别
  • 原文地址:https://www.cnblogs.com/lhclqslove/p/8400985.html
Copyright © 2011-2022 走看看