大法师与魔法石

思路:

对于一个ai, 它可以构成区间[ai/v, ai]

假设和它相邻的为aj, 那么ai 和 aj 构成的区间为[(ai+aj) / v, ai+aj]

那么这两个区间能合并的条件是 (ai + aj) / v <= ai

即aj <= (v - 1)ai (v >= 2)

又因为(v - 1) ai >= ai

所以aj <= ai

所以把每个ai和它相邻的比它小的数连接起来考虑

用单调栈求出每个位置之前和之后第一个比它大的数就可以了

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(4)
#include<bits/stdc++.h>
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<LL, LL>
#define pli pair<LL, int>
#define pii pair<int, int>
#define piii pair<pii, int>
#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 = 1e5 + 5;
int a[N], pre[N], nxt[N];
pair<LL, LL> q[N];
LL sum[N];
stack<int> st;
int main() {int T, n, v;scanf("%d", &T);while(T--) {scanf("%d %d", &n, &v);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);a[0] = INT_MAX;a[n+1] = INT_MAX;while(!st.empty()) st.pop();st.push(0);for (int i = 1; i <= n; i++) {while(a[st.top()] <= a[i]) st.pop();pre[i] = st.top();st.push(i);}while(!st.empty()) st.pop();st.push(n+1);for (int i = n; i >= 1; i--) {while(a[st.top()] <= a[i]) st.pop();nxt[i] = st.top();st.push(i);}for (int i = 1; i <= n; i++) sum[i] = sum[i-1] + a[i];for (int i = 1; i <= n; i++) {q[i].fi = (a[i] + v - 1) / v;q[i].se = sum[nxt[i]-1] - sum[pre[i]];}sort(q+1, q+1+n);LL ans = 0;q[0].se = -1;for (int i = 1; i <= n; i++) {ans += q[i].se - q[i].fi + 1;if(q[i].fi <= q[i-1].se) ans -= q[i-1].se - q[i].fi + 1;}printf("%lld\n", ans);}return 0;
}

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

牛客OI周赛6-提高组 A 大法师与魔法石相关推荐

  1. 【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)

    A: 链接:https://ac.nowcoder.com/acm/contest/372/A 来源:牛客网 某天,一只可爱的肥橘喵在路上走,突然遇到了一个怪人,那怪人自称PM6,"小肥喵, ...

  2. 牛客OI周赛2-提高组

    A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...

  3. 【牛客 - 371牛客OI周赛7-提高组B】小睿睿的询问(RMQ,ST表维护下标)

    题干: 链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小 ...

  4. 【牛客 - 371牛客OI周赛7-提高组A】小睿睿的等式(dp,暴力 )

    题干: 链接:https://ac.nowcoder.com/acm/contest/371/A 来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如"A+B=n"的等 ...

  5. 牛客OI周赛7-提高组 A 小睿睿的等式

    链接:https://ac.nowcoder.com/acm/contest/371/A 来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如"A+B=n"的等式且使用 ...

  6. 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)

    链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知 ...

  7. 牛客OI周赛15-普及组

    1. 咪咪游戏 bool f1,f2,f; f1用于记录m f2用于记录q f用于判断串的好坏.1为坏,0为好 注意几种情况: mqm mmq 具体看代码: #include<bits/stdc ...

  8. 牛客OI周赛10-提高组:B-Taeyeon的困惑(值域线段树)

    做法 单点加单点删,在值域线段树上直接二分就能求值前\(K\)小的和 Code #include<bits/stdc++.h> typedef long long LL; const LL ...

  9. 牛客OI周赛6-提高组 B 践踏

    践踏 思路: 如果k不为0, 那么就是对k取模意义下的区间更新, 单点查询 否则, 就是普通的区间更新, 单点查询 代码: #pragma GCC optimize(2) #pragma GCC op ...

最新文章

  1. 浏览器本地存储简单了解一下
  2. java集合类详解和使用_Java 集合类详解
  3. CodeForces 361B Levko and Permutation
  4. 0003-Longest Substring Without Repeating Characters(无重复字符的最长子串)
  5. [选拔赛2 NOIP2018雅礼集训 Day3 u,v,w]玩个三角形(二维差分),玩个球(状压DP+map),玩个树(树上DP)
  6. python素描效果_python实现图片素描效果
  7. mysql sql先后执行_MySQL中SQL语句执行顺序
  8. PyTorch学习记录-1PyTorch安装
  9. mysql 主键自增_还再使用数据库自增主键吗?
  10. ACM 竞赛高校联盟 练习赛 第六场 韩梅梅的抽象画(图论水题)
  11. 记一次Spring Batch完整入门实践
  12. jenkins安装与自动部署详细说明
  13. g4600黑苹果efi_在黑苹果系统下挂载和打开EFI(ESP)分区
  14. 混音合成效果器:Cradle The God Particle for Mac
  15. 网盘下载速度慢?不需要开会员也能提速
  16. React Native 每日一学(Learn a little every day)
  17. 安恒6月月赛 DASCTF 6th Re 部分wp
  18. Fiddler+手机模拟器+java采集抖音评论数据
  19. 台式计算机能不能安装蓝牙驱动,台式电脑没有蓝牙该怎么安装?安装台式电脑的蓝牙的方法...
  20. 第三类边界条件 matlab,matlab怎么解偏微分方程

热门文章

  1. idea创建maven空项目注意事项
  2. 彩票算法 编程python_彩票是我学习python的动力之一
  3. 回调函数 同步回调 异步回调
  4. classpath位置问题
  5. Opencv Object Tracking【使用OpenCV目标跟踪模块】
  6. 使用exceljs导出表格文件-简易版
  7. hboot no image!
  8. Activiti工作流之流程分支
  9. LoRa烟雾报警器的安装方式
  10. 剑指offer T58-||