博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 551 E - GukiZ and GukiZiana
阅读量:6297 次
发布时间:2019-06-22

本文共 2200 字,大约阅读时间需要 7 分钟。

思路:分块, 块内二分

代码:

#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#include
using namespace std;#define fi first#define se second#define pi acos(-1.0)#define LL long long//#define mp make_pair#define pb push_back#define ls rt<<1, l, m#define rs rt<<1|1, m+1, r#define ULL unsigned LL#define pll pair
#define pli pair
#define pii pair
#define piii pair
#define mem(a, b) memset(a, b, sizeof(a))#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout);//headconst int N = 5e5 + 10, M = 750;const int INF = 0x3f3f3f3f;int bl[N], blo, n;LL tmp[M], a[N];vector
block[M];void reset(int x) { block[x].clear(); for (int i = (x-1)*blo + 1; i <= min(x*blo, n); i++) block[x].pb({a[i], i}); sort(block[x].begin(), block[x].end());}void update(int l, int r, int x) { if(bl[l] == bl[r]) { for (int i = l; i <= r; i++) a[i] += x; reset(bl[l]); return ; } for (int i = l; i <= bl[l]*blo; i++) a[i] += x; reset(bl[l]); for (int i = bl[l]+1; i <= bl[r]-1; i++) tmp[i] += x; for (int i = (bl[r]-1)*blo+1; i <= r; i++) a[i] += x; reset(bl[r]);}int query(int x) { int l = -1, r = -1; for (int i = 1; i <= bl[n]; i++) { LL t = x - tmp[i]; auto it = lower_bound(block[i].begin(), block[i].end(), pii{t, 0}); if(it != block[i].end() && (*it).fi == t) { if(l == -1) l = r = (*it).se; else r = (*it).se; } it = upper_bound(block[i].begin(), block[i].end(), pii{t, INF}); it--; if((*it).fi == t) { if(l == -1) l = r = (*it).se; else r = (*it).se; } } if(l == -1) return -1; else return r - l;}int main() { int q, ty, l, r, x; scanf("%d %d", &n, &q); blo = sqrt(n); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); for (int i = 1; i <= n; i++) bl[i] = (i-1)/blo + 1; for (int i = 1; i <= n; i++) block[bl[i]].pb({a[i], i}); for (int i = 1; i <= bl[n]; i++) sort(block[i].begin(), block[i].end()); while(q--) { scanf("%d", &ty); if(ty == 1) { scanf("%d %d %d", &l, &r, &x); update(l, r, x); } else { scanf("%d", &x); printf("%d\n", query(x)); } } return 0;}

 

转载于:https://www.cnblogs.com/widsom/p/9544602.html

你可能感兴趣的文章
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>