嗯...

题目链接:https://loj.ac/problem/6279

这道题在分块的基础上用vc数组记录,然后最后分三块,两边暴力枚举找前驱,中间lower_bound找前驱。

AC代码:

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector> using namespace std; const int maxn = ;
const int N = ;
const int INF = 0x3f3f3f3f; int a[maxn], belong[maxn];
int L[N], R[N], add[N];
int block, num;
vector<int> vc[N]; inline void build(int n){
block = sqrt(n);
num = ceil(n * 1.0 / block);
for(int i = ; i <= n; i++){
belong[i] = (i - ) / block + ;
vc[belong[i]].push_back(a[i]);
}
for(int i = ; i <= num; i++){
L[i] = R[i - ] + ;
R[i] = i * block;
sort(vc[i].begin(), vc[i].end());
}
R[num] = n;
} inline void update(int pos){
vc[pos].clear();
for(int i = L[pos]; i <= R[pos]; i++) vc[pos].push_back(a[i]);
sort(vc[pos].begin(), vc[pos].end());
} inline void modify(int l, int r, int c){
for(int i = l; i <= min(r, R[belong[l]]); i++) a[i] += c;
update(belong[l]);
if(belong[l] != belong[r]){
for(int i = L[belong[r]]; i <= r; i++) a[i] += c;
update(belong[r]);
}
for(int i = belong[l] + ; i < belong[r]; i++) add[i] += c;
} inline int query(int l, int r, int c){
int ans = -INF;
for(int i = l; i <= min(r, R[belong[l]]); i++)
if(a[i] + add[belong[i]] < c) ans = max(ans, a[i] + add[belong[i]]);
if(belong[l] != belong[r]){
for(int i = L[belong[r]]; i <= r; i++)
if(a[i] + add[belong[i]] < c) ans = max(ans, a[i] + add[belong[i]]);
}
for(int i = belong[l] + ; i < belong[r]; i++){
if(vc[i][] + add[i] >= c) continue;
int k = lower_bound(vc[i].begin(), vc[i].end(), c - add[i]) - vc[i].begin();
ans = max(ans, vc[i][k - ] + add[i]);
}
return ans;
} int main(){
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
build(n);
for(int i = ; i <= n; i++){
int opt, l, r, c;
scanf("%d%d%d%d", &opt, &l, &r, &c);
if(opt == ) modify(l, r, c);
else{
int k = query(l, r, c);
if(k == -INF) printf("-1\n");
else printf("%d\n", k);
}
}
return ;
}

AC代码

最新文章

  1. Java集合框架练习-计算表达式的值
  2. 好股Android客户端开发
  3. iOS工作小技巧及填坑记录
  4. http协议(四)http状态码
  5. ADO.NET数据库操作助手类
  6. Swift3.0基础语法学习&lt;三&gt;
  7. centos7 安装 mariadb 的正确命令
  8. cocos引擎v2.1版本android 编译问题解决办法 (cocos2d-x-3.4rc1)
  9. 换成gnome3桌面后国际版qq不能输入中文问题
  10. python 日期、时间戳转换
  11. HDU4850 构造一个长度n串,它需要随机长度4子是不相同
  12. Milo的游戏开发的一些链接资料
  13. php 执行效率
  14. javaWeb学习总结(8)- jsp指令(3)
  15. Vue2.0 v-for 中 :key 到底有什么用?
  16. myeclipse8.5打包jar并引入第三方jar包
  17. 【HAOI2009】毛毛虫
  18. 使用Myeclipse10.0自动生成搭建SSH框架(数据库表自动反向转换成Hibernate实体)实现用户登陆
  19. webservice生成客户端代码
  20. PHP输出中文乱码问题解决

热门文章

  1. TP5和TP3.2的使用区别
  2. C++-指针阅读能力提升
  3. ORA-00928: missing SELECT keyword
  4. python3练习100题——026
  5. 并查集-G - 食物链
  6. java+layui的Excel导入导出
  7. 如何删除github中的repository
  8. 2.7.2 元素定位:frame 内定位 driver.switch_to.frame()
  9. Eqaulize Prices
  10. PTPX-功耗分析总结