题目链接:https://codeforces.com/problemset/problem/549/F

题目大意:

给定一个序列和一个mod值,定义[l,r]合法当lr的所有元素和减去其中的最大值的结果能够整除mod。问共有多少区间合法。

题目思路:

好像可以直接分治写的.. 不过启发式的思路应该相同

考虑枚举每一个最大值控制的范围,枚举小的一侧的长度,另一侧二分或者主席树求解即可

这个地方的复杂度要记住了:nlogn当且仅当单调栈一侧不相等,一侧相等时

Code:

/*** keep hungry and calm CoolGuang!  ***/
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
#include<iostream>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define d(x) printf("%lld\n",x);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const ll INF= 1e17;
const ll maxn = 3e5+700;
const int mod= 998244353;
const int up = 1e9;
template<typename T>inline void read(T &a){char c=getchar();T x=0,f=1;while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;}
ll n,m,p;
ll num[maxn],sum[maxn];
ll pre[maxn],suf[maxn];
int st[maxn];
vector<int>v[maxn*10];
int solve(int s,int t,int x){return upper_bound(v[x].begin(),v[x].end(),t) - lower_bound(v[x].begin(),v[x].end(),s);
}
int main(){read(n);read(m);v[0].push_back(0);for(int i=1;i<=n;i++){read(num[i]);sum[i] = sum[i-1] + num[i];v[sum[i]%m].push_back(i);}int s = 0;for(int i=1;i<=n;i++){while(s && num[i]>=num[st[s]]) s--;pre[i] = st[s]+1;st[++s] = i;}st[s = 0] = n+1;for(int i=n;i>=1;i--){while(s && num[i]>num[st[s]]) s--;suf[i] = st[s]-1;st[++s] = i;}ll ans = 0;for(int i=1;i<=n;i++){if(suf[i]-i > i-pre[i]){for(int k=pre[i]-1;k<i;k++){ans += solve(i,suf[i],(sum[k]+num[i])%m);}}else{for(int k=i;k<=suf[i];k++){ans += solve(pre[i]-1,i-1,(sum[k]-num[i])%m);}}}printf("%lld\n",ans-n);return 0;
}/***
8
0 1 1 2 2 3 5 5
10
***/

【Codeforces 549F】Yura and Developers | 单调栈、启发式合并、二分相关推荐

  1. Looksery Cup 2015 F - Yura and Developers 单调栈+启发式合并

    F - Yura and Developers 第一次知道单调栈搞出来的区间也能启发式合并... 你把它想想成一个树的形式, 可以发现确实可以启发式合并. #include<bits/stdc+ ...

  2. codeforces 549F Yura and Developers(分治、启发式合并)

    codeforces 549F Yura and Developers 题意 给定一个数组,问有多少区间满足:去掉最大值之后,和是k的倍数. 题解 分治,对于一个区间,找出最大值之后,分成两个区间. ...

  3. 【Codeforces549F】Yura and Developers [单调栈][二分]

    Yura and Developers Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 4 ...

  4. ●CodeForces 549F Yura and Developers

    题链: http://codeforces.com/problemset/problem/549/F 题解: 分治,链表. 考虑对于一个区间[L,R],其最大值在p位置, 那么答案的贡献就可以分为3部 ...

  5. Codeforces 549F Yura and Developers

    Description 有一个长度为n的数组a,现在要找一个长度至少为2的子段,求出这一子段的和,然后减去最大值,然后对k取余结果为0. 问这样的子段有多少个 题面 Solution 考虑分治,普遍的 ...

  6. [分治] 51Nod1472 Codeforces #549F. Yura and Developers

    分治学傻的我只会无脑分治-- 题意就是求满足 sum≡maxsum \equiv max 的区间.反正就是按套路搞. 注意计数的数组不能每次 clearclear ,要开时间戳. #include&l ...

  7. CodeForces - 1484E Skyline Photo(dp+单调栈)

    题目链接:点击查看 题目大意:给出 nnn 个建筑,每个建筑有一个高度和一个美丽值,现在要求划分为数个连续的区间,使得所有区间的贡献之和最大,其中每个区间的贡献值为,区间中高度最低的建筑物的美丽值 题 ...

  8. CodeForces - 1407D Discrete Centrifugal Jumps(单调栈+dp)

    题目链接:点击查看 题目大意:给出 n 个大楼的高度记为 h,现在需要从第一个大楼到达第 n 个大楼,问最小步数是多少,只有满足以下条件时才能从 i 移动到 j ,设 i < j: 题目分析:无 ...

  9. CodeForces - 1313C2 Skyscrapers (hard version)(单调栈+dp/分治)

    题目链接:点击查看 题目大意:给出 n 块连续的空地可以建造摩天大楼,政府有规定,每块地最高只能建 a[ i ] 的高度,同时每栋大楼需要满足一个规则,即每栋大楼的两侧不允许同时存在比自己高的大楼,输 ...

最新文章

  1. nod找不到服务器,node.js – 带有nodejs child_process的ssh,在服务器上找不到命令
  2. 80%的人都混淆的BI和报表之不同
  3. 深入理解 Java 泛型擦除机制
  4. Java多线程之Synchronized和Lock的区别
  5. 深入理解gradle中的task
  6. Quartz.net基于数据库的任务调度管理(Only.Jobs)
  7. MySQL函数笔记_MySQL笔记之数学函数详解
  8. 【转】JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
  9. gitlab ci 自动化部署_lt;为什么准备使用GitLab做CICD流水线?/gt;
  10. 《101 Windows Phone 7 Apps》读书笔记-TODO LIST
  11. 微信公众平台 微信网页授权
  12. 在Office 2013(64bit)下破解VBA工程密码
  13. Kata Containers及相关vmm介绍
  14. android 7 评测,iQOO 7 评测:性能出众,操控全面升级的横屏旗舰
  15. 朋友间相处的七项法则
  16. python笔记更新(正则表达式)
  17. Android:Fragment生命周期(结合Activity的生命周期进行分析)
  18. 基于 LSTM-Attention 的中文新闻文本分类
  19. 【MacOS 配置网络访问公司内网】
  20. Delphi中BPL包的使用,个人经验

热门文章

  1. 线性方程组(五)- 线性方程组的解集
  2. blackjack算法java_[CareerCup] 8.1 Implement Blackjack 实现21点纸牌
  3. Android支付接入(七):Googlenbsp;In-app-Billing
  4. (Model-Contrastive Federated Learning)模型对比联邦学习
  5. Java实现QQ第三方登录
  6. 漫谈深度学习时代点击率预估技术进展
  7. 四、TCP中的流量控制和拥塞控制
  8. 实习随笔3( 辗转,终到,这一天)
  9. python怎么设置窗口大小_python – 如何找出所需的窗口大小?
  10. 集成电路设计学习笔记(二)基于IC617反相器设计之原理图绘制