• CodeForces 551E GukiZ and GukiZiana


    GukiZ and GukiZiana

    Time Limit: 10000ms
    Memory Limit: 262144KB
    This problem will be judged on CodeForces. Original ID: 551E
    64-bit integer IO format: %I64d      Java class name: (Any)
     

    Professor GukiZ was playing with arrays again and accidentally discovered new function, which he called GukiZiana. For given array a, indexed with integers from 1 to n, and numberyGukiZiana(a, y) represents maximum value of j - i, such that aj = ai = y. If there is no y as an element in a, then GukiZiana(a, y) is equal to  - 1. GukiZ also prepared a problem for you. This time, you have two types of queries:

    1. First type has form l r x and asks you to increase values of all ai such that l ≤ i ≤ r by the non-negative integer x.
    2. Second type has form y and asks you to find value of GukiZiana(a, y).

    For each query of type 2, print the answer and make GukiZ happy!

     

    Input

    The first line contains two integers nq (1 ≤ n ≤ 5 * 105, 1 ≤ q ≤ 5 * 104), size of array a, and the number of queries.

    The second line contains n integers a1, a2, ... an (1 ≤ ai ≤ 109), forming an array a.

    Each of next q lines contain either four or two numbers, as described in statement:

    If line starts with 1, then the query looks like l r x (1 ≤ l ≤ r ≤ n0 ≤ x ≤ 109), first type query.

    If line starts with 2, then th query looks like y (1 ≤ y ≤ 109), second type query.

     

    Output

    For each query of type 2, print the value of GukiZiana(a, y), for y value for that query.

     

    Sample Input

    Input
    4 3
    1 2 3 4
    1 1 2 1
    1 1 1 1
    2 3
    Output
    2
    Input
    2 3
    1 2
    1 2 2 1
    2 3
    2 4
    Output
    0
    -1

    Source

     
    解题:分块搞
     
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 const int maxn = 1010;
     5 LL a[maxn*maxn],lazy[maxn],x;
     6 vector<int>block[maxn];
     7 int b_size,N,pos[maxn*maxn],n,q,cmd,L,R;
     8 bool cmp(const int x,const int y) {
     9     if(a[x] == a[y]) return x < y;
    10     return a[x] < a[y];
    11 }
    12 void update(int L,int R,LL x) {
    13     int k = pos[L],t = pos[R];
    14     if(k == t) {
    15         for(int i = L; i <= R; ++i) a[i] += x;
    16         sort(block[k].begin(),block[k].end(),cmp);
    17         return;
    18     }
    19     for(int i = k + (pos[L-1] == k); i <= t - (pos[R + 1] == t); ++i) lazy[i] += x;
    20     if(pos[L-1] == k) {
    21         for(int i = L; pos[i] == k; ++i) a[i] += x;
    22         sort(block[k].begin(),block[k].end(),cmp);
    23     }
    24     if(pos[R+1] == t) {
    25         for(int i = R; pos[i] == t; --i) a[i] += x;
    26         sort(block[t].begin(),block[t].end(),cmp);
    27     }
    28 }
    29 LL query(LL x) {
    30     int L = -1,R = -1,i;
    31     for(i = 1; i <= N; ++i){
    32         a[0] = x - lazy[i];
    33         vector<int>::iterator it = lower_bound(block[i].begin(),block[i].end(),0,cmp);
    34         if(it == block[i].end()) continue;
    35         if(a[*it] + lazy[i] == x){
    36             L = *it;
    37             break;
    38         }
    39     }
    40     if(L == -1) return -1;
    41     for(int j = N; j >= i; --j){
    42         a[n+1] = x - lazy[j];
    43         vector<int>::iterator it = lower_bound(block[j].begin(),block[j].end(),n+1,cmp);
    44         if(it == block[j].begin()) continue;
    45         --it;
    46         if(a[*it] + lazy[j] == x){
    47             R = *it;
    48             break;
    49         }
    50     }
    51     return R - L;
    52 }
    53 int main() {
    54     ios::sync_with_stdio(false);
    55     cin.tie(0);
    56     cin>>n>>q;
    57     b_size = ceil(sqrt(n*1.0));
    58     for(int i = 1; i <= n; ++i) {
    59         cin>>a[i];
    60         pos[i] = (i - 1)/b_size + 1;
    61         block[pos[i]].push_back(i);
    62     }
    63     N = (n - 1)/b_size + 1;
    64     for(int i = 1; i <= N; ++i) sort(block[i].begin(),block[i].end(),cmp);
    65     while(q--) {
    66         cin>>cmd;
    67         if(cmd == 1) {
    68             cin>>L>>R>>x;
    69             update(L,R,x);
    70         } else {
    71             cin>>x;
    72             cout<<query(x)<<endl;
    73         }
    74     }
    75     return 0;
    76 }
    View Code
  • 相关阅读:
    线程池参数详解
    线程池各个参数详解以及如何自定义线程池
    fastdfs 安装
    SQL 执行顺序
    《SQL 进阶教程》 查找局部不一致的数据
    redis 高性能的原因
    一致性hash
    环境部署数据库报错
    redis 常用命令
    redis 高级学习和应用场景
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4796020.html
Copyright © 2020-2023  润新知