CodeForces 551E(平方分割
题意:给出一个数列,要求支持以下两种操作,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(平方分割相关推荐
- POJ2104 (平方分割)二分查找理解。
题意:任意区间求第k大数 思路: 预处理:利用平方分割(分桶法)把区间切割成B = sqrt(n)大小的一块块,然后每个各自排序. 二分第k大数x,接着就需要求[l,r]区间中x的排名,与k比较,将两 ...
- POJ2104 K-th Number (平方分割 + 二分)
题目链接:传送门 题意:输入n个数,然后进行m次操作,每次操作输入三个数l,r,k,输出在[l,r]区间第k小的数 解题思路:这道题做法倒是挺多的,平方分割可以做,归并树,划分树,主席树都能做,但是本 ...
- 《挑战程序设计竞赛(第2版)》习题册攻略
本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...
- 面试高级算法梳理笔记
作者:尤汐_Jennica 链接: https://www.nowcoder.com/discuss/21253 来源:牛客网 1.1 说明 本篇为<挑战程序设计竞赛(第2版)>读书笔记系 ...
- UOJ 152 汉诺塔 分治
题目链接 题意: 有三根编号为\((1, \, 2, \, 3)\)的柱子,然后第一根柱子上有编号为\(1 \sim n(n \leq 10000)\)的盘子,从上到下第\(i\)个盘子的编号是\(A ...
- 挑战程序设计竞赛(第2版)》
<挑战程序设计竞赛(第2版)> 基本信息 作者: (日)秋叶拓哉 岩田阳一 北川宜稔 译者: 巫泽俊 庄俊元 李津羽 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787 ...
- 挑战程序设计竞赛(第2版)pdf
下载地址:网盘下载 内容简介 · · · · · · 世界顶级程序设计高手的经验总结 [ACM-ICPC全球总冠军]巫泽俊主译 日本ACM-ICPC参赛者人手一册 本书对程序设计竞赛中的基础算法和经 ...
- 概述 - Linux内存管理(一)
内存管理是从单板上电运行uboot启动引导linux并完成文件系统挂载(文件系统管理Nandflash)过程前两个环节都需要完成的重要工作,并且随着程序推进的内存管理也逐渐完善起来.如果一步到位直接编 ...
- 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个询问 ...
最新文章
- JQuery之ajax异步请求Django后端
- 为什么我启动哪一个tomcat都是启动同一个tomcat(tomcat7)
- python中常用的推导(字典推导和列表推导)
- antd提交表单_表单序列化
- blob转成json js_javascript – 文件API – Blob到JSON
- 苹果挂端口方法_调音台变身直播声卡的方法
- python 构造函数继承_Python多重继承的异构构造器
- 看我如何从 icloud.com 中发现存储型 XSS并获$5000奖金
- Linux设备驱动——内核定时器
- 64位电脑上安装MySQL进行MFC开发的相关问题
- html的table的子节点,HTMLTableElement子节点并不如预期
- 服务器极光推送消息怎么设置,服务器极光推送消息
- 光盘出租系统mysql_数据库课程设计--碟片出租系统
- 【WinForm】打字软件
- SharePoint Online 触发的Automate工作流的调试
- 企业OKR终极目标:让员工成功
- 服务器数据抓包(原来微信图片真的可以抓包看的)
- java小组的队名,霸气小组队名口号大全
- 小程序使用云开发,拍照获取银行卡卡号
- 计算机ps二级考试试题,2020年3月计算机等级Photoshop考试模拟试题及答案
热门文章
- 有向图的传递闭包实现三种实现(Warshall+DFS+BFS)
- mooc中的习题--然后是几点
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
- bzoj 1602: [Usaco2008 Oct]牧场行走(暴力LCA)
- 切比雪夫距离(bzoj 3210: 花神的浇花集会)
- [PyTorch] reverse the normalization
- matlab2c使用c++实现matlab函数系列教程-log函数
- matlab2c使用c++实现matlab函数系列教程- polyval函数
- zynq开发系列5:通过AXI GPIO的中断实现PL端按键控制PS端LED(SDK开发详解)
- Numpy常用方法和使用技巧