zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【ansible】 笔记 (1)
    centos 把网卡名称修改为 eth0
    服务器从购买到交付使用流程
    (转载) Linux IO模式及 select、poll、epoll详解
    孤儿进程、僵尸进程和守护进程
    (转载)linux下各个文件夹的作用
    缓存穿透与缓存雪崩
    SpringCloud核心组件在微服务架构中的作用
    双十一电商Java开发聊聊秒杀限流的多种实现
    localhost 和 127.0.0.1 的区别
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4796020.html
Copyright © 2011-2022 走看看