Codeforces 549F Yura and Developers
题意
给定一个序列和一个mod值,定义[l,r]合法当l到r的全部元素和减去当中的最大值的结果能够整除mod。问共同拥有多少区间合法。
思路
一開始想的分治。
对于一个[l,r]我们能够把这之中最大的求出来,然后以这个数作为分界,把这个区间分成两部分,对于分布在两个区间中的答案,我们能够通过lowerbound和upperbunder在O(log(n))的时间下求出,然后递归求解。
然而对于这题,这样的做法的下界会达到O(n2)。所以这样做不行。
。
看了题解,题讲解能够直接枚举那个最大值,然后把满足的区间找出来然后求出来。豁然开朗。这样我们仅仅须要把原数组进行排序,并记录每一个数的左右界。
从最小的開始。在计算答案的同一时候去更新这个左右界。
这样能够在O(nlog(n))的复杂度下求出答案。
一道不错的题。希望以后能够坚持把每次做的比赛的题目补完。
AC代码
/*************************************************************************
> File Name: pf.cpp
> Author: znl1087
> Mail: loveCJNforever@gmail.com
> Created Time: 四 6/11 16:36:14 2015
************************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
using namespace std;
int n,k;
LL s[300005];
vector<int> f[1000005];
LL num[300005];
int pre[300005],nxt[300005];
LL ask(int l,int r,LL in){
return upper_bound(f[in].begin(),f[in].end(),r)-lower_bound(f[in].begin(),f[in].end(),l);
}
LL cal(int m){
int l = pre[m]+1,r = nxt[m]-1;
LL maxn = num[m];
LL ans = 0;
if( r - m < m - l){
for(int i=m+1;i<=r;i++)
ans+=(ask(l-1,m-1,(s[i]-maxn%k+k)%k));
ans+=(ask(l-1,m-2,(s[m]-maxn%k+k)%k));
}else{
for(int i=l;i<m;i++)
ans+=(ask(m,r,(s[i-1]+maxn)%k));
ans+=(ask(m+1,r,(s[m-1]+maxn)%k));
}
pre[nxt[m]] = pre[m];
nxt[pre[m]] = nxt[m];
return ans;
}
int ord[300005];
int cmp(int a,int b){
return num[a]<num[b];
}
int main(){
cin>>n>>k;
s[0] = 0;
for(int i=1;i<=n;i++){
cin>>num[i],s[i] = (s[i-1]+num[i])%k,ord[i] = i;
pre[i] = i-1;
nxt[i] = i+1;
}
nxt[0] = 1;
nxt[n] = n+1;
pre[n+1] = n;
for(int i=0;i<=n;i++)f[s[i]].push_back(i);
sort(ord+1,ord+n+1,cmp);
LL ans = 0;
for(int i=1;i<=n;i++){
int pos = ord[i];
ans+=cal(pos);
}
cout<<ans<<endl;
return 0;
}
Codeforces 549F Yura and Developers的更多相关文章
- codeforces 549F Yura and Developers(分治、启发式合并)
codeforces 549F Yura and Developers 题意 给定一个数组,问有多少区间满足:去掉最大值之后,和是k的倍数. 题解 分治,对于一个区间,找出最大值之后,分成两个区间. ...
- ●CodeForces 549F Yura and Developers
题链: http://codeforces.com/problemset/problem/549/F题解: 分治,链表. 考虑对于一个区间[L,R],其最大值在p位置, 那么答案的贡献就可以分为3部分 ...
- Looksery Cup 2015 F - Yura and Developers 单调栈+启发式合并
F - Yura and Developers 第一次知道单调栈搞出来的区间也能启发式合并... 你把它想想成一个树的形式, 可以发现确实可以启发式合并. #include<bits/stdc+ ...
- 【Codeforces549F】Yura and Developers [单调栈][二分]
Yura and Developers Time Limit: 20 Sec Memory Limit: 512 MB Description Input Output Sample Input 4 ...
- Codeforces刷题计划
Codeforces刷题计划 已完成:-- / -- [Codeforces370E]370E - Summer Reading:构造:(给定某些数,在空白处填数,要求不下降,并且相邻差值<=1 ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- Looksery Cup 2015 Editorial
下面是题解,做的不好.下一步的目标是rating涨到 1800,没打过几次cf A. Face Detection Author: Monyura One should iterate through ...
- Codeforces Round #Pi (Div. 2) B. Berland National Library set
B. Berland National LibraryTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...
- Codeforces Beta Round #69 (Div. 1 Only) C. Beavermuncher-0xFF 树上贪心
题目链接: http://codeforces.com/problemset/problem/77/C C. Beavermuncher-0xFF time limit per test:3 seco ...
随机推荐
- js中的referrer使用,返回上一页
js完整代码: <script language="javascript"> var refer=document. referrer ; document.g ...
- <经验杂谈>C#/.Net中xml的Serialization序列化与DeSerializetion反序列化
1.先讲概念:.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象.Serializ ...
- FineUI页面布局
使用布局的优势 相对于为控件设置固定的宽度和高度,布局的重要意义在于子控件可以根据父控件的尺寸自动设置自己的尺寸,在页面尺寸改变时同样有效.如果你在项目中遇到类似如下的需求,就需要考虑布局了: 面板填 ...
- txt 分割程序
网上有很多 分割程序 ,但是他们都没有满足实际的用户要求 ,大家当然是希望看文章小说 一章节一章节的看 并非是那些传统意义上的按照文件的大小切割 所以 我特写本文研究下 这个简单的算法该怎样设计 说白 ...
- C#如何设置下拉COMMBOX为不可输入,只有下拉条目
设置下拉框的DropDownStyle属性为DropDownList
- 【android】修改android默认应用图标
我自己做的一个小程序,想更改程序安装后的默认显示图片,但是我发现只能改一次,以后再改还是显示第一次更改后的图片(此时我已把最后一次更改前的全部图片都删除了,所以不会是名称填错),这是为什么??求高人指 ...
- WordPress插件制作教程(六): 插件函数之动作(Actions)函数
这一篇为大家说一下WordPress插件函数吧,要制作插件,了解这些函数是非常有必要的 WordPress插件函数分为“动作”(Actions)和过滤器”(Filters),WordPress 使用这 ...
- Python之路第二天,基础(2)-基本数据类型
一.Python数据类型 数 在Python中有4种类型的数,整数,长整数,浮点数和复数. 2是一个整数的例子 长整数不过是大一点的整数 3.23和52.3E是浮点数的例子.E标记表示10的幂.52. ...
- 异步编程设计模式Demo - PrimeNumberCalculator
using System; using System.Collections; using System.Collections.Specialized; using System.Component ...
- 小SQL大作用
从DBA那问来的,备份现有数据库表: create table B select * from A ; 删除,重建数据库主键 alter table book_order drop primary k ...