牛客OI周赛6-提高组 A 大法师与魔法石
大法师与魔法石
思路:
对于一个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 大法师与魔法石相关推荐
- 【牛客OI周赛7-普及组ABCD 非官方题解】暴力,二分,KMP,尺取(STL或Hash)
A: 链接:https://ac.nowcoder.com/acm/contest/372/A 来源:牛客网 某天,一只可爱的肥橘喵在路上走,突然遇到了一个怪人,那怪人自称PM6,"小肥喵, ...
- 牛客OI周赛2-提高组
A.游戏 链接:https://www.nowcoder.com/acm/contest/210/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他 ...
- 【牛客 - 371牛客OI周赛7-提高组B】小睿睿的询问(RMQ,ST表维护下标)
题干: 链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小 ...
- 【牛客 - 371牛客OI周赛7-提高组A】小睿睿的等式(dp,暴力 )
题干: 链接:https://ac.nowcoder.com/acm/contest/371/A 来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如"A+B=n"的等 ...
- 牛客OI周赛7-提高组 A 小睿睿的等式
链接:https://ac.nowcoder.com/acm/contest/371/A 来源:牛客网 小睿睿在游戏开始时有n根火柴棒,他想知道能摆成形如"A+B=n"的等式且使用 ...
- 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)
链接:https://ac.nowcoder.com/acm/contest/371/B 来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知 ...
- 牛客OI周赛15-普及组
1. 咪咪游戏 bool f1,f2,f; f1用于记录m f2用于记录q f用于判断串的好坏.1为坏,0为好 注意几种情况: mqm mmq 具体看代码: #include<bits/stdc ...
- 牛客OI周赛10-提高组:B-Taeyeon的困惑(值域线段树)
做法 单点加单点删,在值域线段树上直接二分就能求值前\(K\)小的和 Code #include<bits/stdc++.h> typedef long long LL; const LL ...
- 牛客OI周赛6-提高组 B 践踏
践踏 思路: 如果k不为0, 那么就是对k取模意义下的区间更新, 单点查询 否则, 就是普通的区间更新, 单点查询 代码: #pragma GCC optimize(2) #pragma GCC op ...
最新文章
- 浏览器本地存储简单了解一下
- java集合类详解和使用_Java 集合类详解
- CodeForces 361B 	Levko and Permutation
- 0003-Longest Substring Without Repeating Characters(无重复字符的最长子串)
- [选拔赛2 NOIP2018雅礼集训 Day3 u,v,w]玩个三角形(二维差分),玩个球(状压DP+map),玩个树(树上DP)
- python素描效果_python实现图片素描效果
- mysql sql先后执行_MySQL中SQL语句执行顺序
- PyTorch学习记录-1PyTorch安装
- mysql 主键自增_还再使用数据库自增主键吗?
- ACM 竞赛高校联盟 练习赛 第六场 韩梅梅的抽象画(图论水题)
- 记一次Spring Batch完整入门实践
- jenkins安装与自动部署详细说明
- g4600黑苹果efi_在黑苹果系统下挂载和打开EFI(ESP)分区
- 混音合成效果器:Cradle The God Particle for Mac
- 网盘下载速度慢?不需要开会员也能提速
- React Native 每日一学(Learn a little every day)
- 安恒6月月赛 DASCTF 6th Re 部分wp
- Fiddler+手机模拟器+java采集抖音评论数据
- 台式计算机能不能安装蓝牙驱动,台式电脑没有蓝牙该怎么安装?安装台式电脑的蓝牙的方法...
- 第三类边界条件 matlab,matlab怎么解偏微分方程