E. GukiZ and GukiZiana

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://codeforces.com/contest/551/problem/E

Description

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 number y, GukiZiana(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:

First type has form 1 l r x and asks you to increase values of all ai such that l ≤ i ≤ r by the non-negative integer x.
    Second type has form 2 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 n, q (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 1 l r x (1 ≤ l ≤ r ≤ n, 0 ≤ x ≤ 109), first type query.

If line starts with 2, then th query looks like 2 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

4 3
1 2 3 4
1 1 2 1
1 1 1 1
2 3

Sample Output

2

HINT

题意

一堆数,俩操作

[l,r]区间的数都加 v

查询最大的j-i,要求满足a[j]=a[i]=v

题解:

时间10s,这就是明摆着告诉我们这道题是分块,然后我们就分块乱搞就好了……

二分写挂的都是傻逼(没错就是我!

代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define test freopen("test.txt","r",stdin)
#define maxn 2000001
#define mod 10007
#define eps 1e-9
const int inf=0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fLL;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
//************************************************************************************** ll n,q,m,block;
ll a[],b[],pos[],add[];
void reset(ll x)
{
ll l=(x-)*block+,r=min(x*block,n);
for(ll i=l;i<=r;i++)
b[i]=a[i];
sort(b+l,b+r+);
}
ll find(ll x,ll v)
{
ll l=(x-)*block+,r=min(x*block,n);
ll last=r;
while(l<r)
{
ll mid=(l+r)>>;
if(b[mid]<v)l=mid+;
else
r=mid;
if(b[mid]==v)
return ;
}
if(b[l]==v||b[r]==v)
return ;
return ;
}
void update(ll x,ll y,ll v)
{
if(pos[x]==pos[y])
{
for(int i=x;i<=y;i++)a[i]=a[i]+v;
}
else
{
for(int i=x;i<=pos[x]*block;i++)a[i]=a[i]+v;
for(int i=(pos[y]-)*block+;i<=y;i++)a[i]=a[i]+v;
}
reset(pos[x]);reset(pos[y]);
for(int i=pos[x]+;i<pos[y];i++)
add[i]+=v;
}
ll query(ll x,ll y,ll v)
{
ll sum=;
if(pos[x]==pos[y])
{
for(int i=x;i<=y;i++)if(a[i]+add[pos[i]]==v)sum++;
}
else
{
for(int i=x;i<=pos[x]*block;i++)
if(a[i]+add[pos[i]]==v)sum++;
for(int i=(pos[y]-)*block+;i<=y;i++)
if(a[i]+add[pos[i]]==v)sum++;
}
for(int i=pos[x]+;i<pos[y];i++)
sum+=find(i,v-add[i]); //cout<<sum<<endl;
return sum;
}
ll deall(ll x,ll y,ll v)
{
ll sum=;
if(pos[x]==pos[y])
{
for(int i=x;i<=y;i++)if(a[i]+add[pos[i]]==v)return i;
}
else
{
for(int i=x;i<=pos[x]*block;i++)
if(a[i]+add[pos[i]]==v)return i;
for(int i=pos[x]+;i<pos[y];i++)
{
int d=find(i,v-add[i]);
if(d>)
{
for(int j=i*block-block+;j<=i*block;j++)
if(a[j]+add[pos[j]]==v)
return j;
}
}
for(int i=(pos[y]-)*block+;i<=y;i++)
if(a[i]+add[pos[i]]==v)return i;
}
}
ll dealr(ll x,ll y,ll v)
{
ll sum=;
if(pos[x]==pos[y])
{
for(int i=y;i>=x;i--)if(a[i]+add[pos[i]]==v)return i;
}
else
{
for(int i=y;i>=(pos[y]-)*block+;i--)
if(a[i]+add[pos[i]]==v)
return i; for(int i=pos[y];i>=pos[x]+;i--)
{
int d=find(i,v-add[i]);
if(d>)
{
for(int j=i*block;j>=i*block-block;j--)
if(a[j]+add[pos[j]]==v)
return j;
}
}
for(int i=pos[x]*block;i>=x;i--)
if(a[i]+add[pos[i]]==v)return i; }
}
int ask(ll cc)
{
int aa=query(,n,cc);
if(aa==)
return -;
return dealr(,n,cc)-deall(,n,cc);
}
int main()
{
//test;
n=read(),q=read();
block=int(sqrt(n));
for(int i=;i<=n;i++)
{
a[i]=read();
pos[i]=(i-)/block+;
b[i]=a[i];
}
int x,y,v,ch;
if(n%block)m=n/block+;
else m=n/block;
for(int i=;i<=m;i++)reset(i);
for(int i=;i<=q;i++)
{
ch=read();
if(ch==)
{
x=read(),y=read(),v=read();
update(x,y,v);
}
else
{
int p;
p=read();
printf("%d\n",ask(p));
}
}
return ;
}

Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana 分块的更多相关文章

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

    E. GukiZ and GukiZiana time limit per test 10 seconds memory limit per test 256 megabytes input stan ...

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

    题目地址:http://codeforces.com/contest/551/problem/E 将n平均分成sqrt(n)块,对每一块从小到大排序,并设置一个总体偏移量. 改动操作:l~r区间内,对 ...

  3. 水题 Codeforces Round #307 (Div. 2) A. GukiZ and Contest

    题目传送门 /* 水题:开个结构体,rk记录排名,相同的值有相同的排名 */ #include <cstdio> #include <cstring> #include < ...

  4. Codeforces Round #307 (Div. 2) C. GukiZ hates Boxes 贪心/二分

    C. GukiZ hates Boxes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/ ...

  5. Codeforces Round #307 (Div. 2) A. GukiZ and Contest 水题

    A. GukiZ and Contest Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/ ...

  6. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations 矩阵快速幂优化dp

    D. GukiZ and Binary Operations time limit per test 1 second memory limit per test 256 megabytes inpu ...

  7. Codeforces Round #307 (Div. 2) C. GukiZ hates Boxes 二分

    C. GukiZ hates Boxes time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)

    题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...

  9. Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations

    得到k二进制后,对每一位可取得的方法进行相乘即可,k的二进制形式每一位又分为2种0,1,0时,a数组必定要为一长为n的01串,且串中不出现连续的11,1时与前述情况是相反的. 且0时其方法总数为f(n ...

随机推荐

  1. rand.Read() 和 io.ReadFull(rand.Reader) 的区别?

    golang的随机包 rand.go 中我们可以看到 rand.Read 其实是调用的io.Reader.Read() 1: // Package rand implements a cryptogr ...

  2. 软件推荐列表(Recommand Software)

    1.Nutstore(https://jianguoyun.com/) Nutstore是一款云端同步软件.类似的有微软的OneDrive(旧名SkyDrive).Google Cloud Drive ...

  3. UI控件入门

    其实整个学习过程.确实有点儿混乱,因为不懂的东西太多,一会儿看这,一会儿看那,马上就乱了. 还是先做点儿简单的事儿,说控件,但不会说完全,只是入个门,知道怎么学控件,具体要学好每一个控件需要项目中磨练 ...

  4. python 数字和字符串转换问题

    一.python中字符串转换成数字 (1)import string tt='555' ts=string.atoi(tt) ts即为tt转换成的数字 转换为浮点数 string.atof(tt) ( ...

  5. C#入门基础

    那么由 = 连接起来的这个式子 就叫赋值表达式 解决异常的 办法 for循环 常量 常量在程序中  怎么定义: const 类型   常量名= 值; 在程序中可以改变常量的值吗  不可以  一旦改变  ...

  6. LeetCode Database: Rank Scores

    Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ra ...

  7. SQLyog Enterprise 8.14

    用户名:yunjian注册码:81f43d3dd20872b6 下载地址:SQLyog Enterprise 8.14

  8. 关闭HTML5只能提示(form上新增novalidate)

    <form novalidate>    <input type="text" required />    <input type="su ...

  9. mac机器下远程仓库添加完毕之后,却无法上传应有的内容。

    Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you ha ...

  10. Python和Django的Third Libraby分类汇总

    这些第三方包与Python和Django一起构成了强大的生态系统,自己在开发时大大减小工作难度和工作量, 这些包基本上能满足我们的大部分需求.人与人的差距,其中一点是你知道的比他多,这样你就能大大提高 ...