题意:给出一个数列,要求支持以下两种操作,1)给某区间内的所有数都加上x,2)输出数列中等于y的两个数的最大距离。

比赛的时候没想到这是分块(花式暴力。。),以为是线段书啥的,然后不会。。赛后听说是分块,其实思路一下就想到了(以前照书抄过一个分块题)。。。。然而第一次写的时候脑残完全写错了,发现的时候汗啊。。全删了重写,又写了一个小时左右,wa了两次,修正了两个bug,过了。。。分成若干块,如果改变的区间完全包含一个块,那就直接给总的val加x,不完全包含就o(n)直接处理,查询的时候是二分,其实这个题还是比较简单的分块,因为查询没有区间问题,就是从头到尾,否则查询也比较麻烦。

#include<iostream>
#include<map>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
#include<stack>
#include<functional>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxv=5e5+40;
const int sz=1000;
struct Num{ll o,v;bool operator < (const Num &C)const{if(v!=C.v) return v<C.v;else return o<C.o;}
};
vector<Num> bucket[1000];
ll a[maxv];
ll val[maxv];
int n,q;
void update(int l,int r,ll x){if(l/sz==r/sz){for(int i=l;i<=r;i++) a[i]+=x;bucket[l/sz].clear();for(int i=l/sz*sz;i<l/sz*sz+sz;i++) bucket[l/sz].pb((Num){i,a[i]});sort(bucket[l/sz].begin(),bucket[l/sz].end());}else{for(int i=l/sz+1;i<r/sz;i++) val[i]+=x;update(l,l/sz*sz+sz-1,x);update(r/sz*sz,r,x);}return;
}
bool cmp(Num a,Num b){return a.v<b.v;
}
int quaryl(ll y){for(int i=0;i<=n/sz;i++){Num tar;tar.v=y-val[i];vector<Num>::iterator it=lower_bound(bucket[i].begin(),bucket[i].end(),tar,cmp);if(it!=bucket[i].end()&&(*it).v==tar.v){return (*it).o;}}return -1;
}
int queryr(ll y){for(int i=n/sz;i>=0;i--){Num tar;tar.v=y-val[i];vector<Num>::iterator it=upper_bound(bucket[i].begin(),bucket[i].end(),tar,cmp);if(it!=bucket[i].begin()&&(*(it-1)).v==tar.v){return (*(it-1)).o;}}return -1;
}
int main(){////freopen("/home/files/CppFiles/in","r",stdin);cin>>n>>q;for(int i=0;i<n;i++){scanf("%I64d",&a[i]);bucket[i/sz].pb((Num){i,a[i]});}for(int i=0;i<=n/sz;i++) sort(bucket[i].begin(),bucket[i].end());while(q--){int type;scanf("%d",&type);if(type==1){int l,r,x;scanf("%d%d%d",&l,&r,&x);update(l-1,r-1,x);}else{int y;scanf("%d",&y);int l=quaryl(y);if(l!=-1){printf("%d\n",queryr(y)-l);}else{puts("-1");}}}return 0;
}

View Code

转载于:https://www.cnblogs.com/Cw-trip/p/4575926.html

CodeForces 551E(平方分割相关推荐

  1. POJ2104 (平方分割)二分查找理解。

    题意:任意区间求第k大数 思路: 预处理:利用平方分割(分桶法)把区间切割成B = sqrt(n)大小的一块块,然后每个各自排序. 二分第k大数x,接着就需要求[l,r]区间中x的排名,与k比较,将两 ...

  2. POJ2104 K-th Number (平方分割 + 二分)

    题目链接:传送门 题意:输入n个数,然后进行m次操作,每次操作输入三个数l,r,k,输出在[l,r]区间第k小的数 解题思路:这道题做法倒是挺多的,平方分割可以做,归并树,划分树,主席树都能做,但是本 ...

  3. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  4. 面试高级算法梳理笔记

    作者:尤汐_Jennica 链接: https://www.nowcoder.com/discuss/21253 来源:牛客网 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系 ...

  5. UOJ 152 汉诺塔 分治

    题目链接 题意: 有三根编号为\((1, \, 2, \, 3)\)的柱子,然后第一根柱子上有编号为\(1 \sim n(n \leq 10000)\)的盘子,从上到下第\(i\)个盘子的编号是\(A ...

  6. 挑战程序设计竞赛(第2版)》

    <挑战程序设计竞赛(第2版)> 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787 ...

  7. 挑战程序设计竞赛(第2版)pdf

    下载地址:网盘下载 内容简介  · · · · · · 世界顶级程序设计高手的经验总结 [ACM-ICPC全球总冠军]巫泽俊主译 日本ACM-ICPC参赛者人手一册 本书对程序设计竞赛中的基础算法和经 ...

  8. 概述 - Linux内存管理(一)

    内存管理是从单板上电运行uboot启动引导linux并完成文件系统挂载(文件系统管理Nandflash)过程前两个环节都需要完成的重要工作,并且随着程序推进的内存管理也逐渐完善起来.如果一步到位直接编 ...

  9. Codeforces Round #694 (Div. 2) D. Strange Definition 质因子分解 + 平方数

    传送门 题意: 定义相邻数为lcm(x,y)gcd(x,y)\frac{lcm(x,y)}{gcd(x,y)}gcd(x,y)lcm(x,y)​是一个平方数,则xxx和yyy是相邻的.现在给出q个询问 ...

最新文章

  1. JQuery之ajax异步请求Django后端
  2. 为什么我启动哪一个tomcat都是启动同一个tomcat(tomcat7)
  3. python中常用的推导(字典推导和列表推导)
  4. antd提交表单_表单序列化
  5. blob转成json js_javascript – 文件API – Blob到JSON
  6. 苹果挂端口方法_调音台变身直播声卡的方法
  7. python 构造函数继承_Python多重继承的异构构造器
  8. 看我如何从 icloud.com 中发现存储型 XSS并获$5000奖金
  9. Linux设备驱动——内核定时器
  10. 64位电脑上安装MySQL进行MFC开发的相关问题
  11. html的table的子节点,HTMLTableElement子节点并不如预期
  12. 服务器极光推送消息怎么设置,服务器极光推送消息
  13. 光盘出租系统mysql_数据库课程设计--碟片出租系统
  14. 【WinForm】打字软件
  15. SharePoint Online 触发的Automate工作流的调试
  16. 企业OKR终极目标:让员工成功
  17. 服务器数据抓包(原来微信图片真的可以抓包看的)
  18. java小组的队名,霸气小组队名口号大全
  19. 小程序使用云开发,拍照获取银行卡卡号
  20. 计算机ps二级考试试题,2020年3月计算机等级Photoshop考试模拟试题及答案

热门文章

  1. 有向图的传递闭包实现三种实现(Warshall+DFS+BFS)
  2. mooc中的习题--然后是几点
  3. bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
  4. bzoj 1602: [Usaco2008 Oct]牧场行走(暴力LCA)
  5. 切比雪夫距离(bzoj 3210: 花神的浇花集会)
  6. [PyTorch] reverse the normalization
  7. matlab2c使用c++实现matlab函数系列教程-log函数
  8. matlab2c使用c++实现matlab函数系列教程- polyval函数
  9. zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)
  10. Numpy常用方法和使用技巧