BZOJ3764 : Petya的序列
首先如果一段连续子序列里没有任何幸运数,那么显然可以缩成一个点。
设幸运数个数为$m$,那么现在序列长度是$O(m)$的,考虑暴力枚举$R_1$,然后从右往左枚举$L_1$。
每次碰到一个幸运数,就将它删去,维护出被删的数它左边右边连续能到的位置,然后用组合数计算贡献。
考虑给每个被删数字一个删除时间$b_i$,那么等价于询问它左边右边第一个$b$小于$b_i$的位置,可以通过两遍单调栈得到。
时间复杂度$O(m^2)$。
#include<cstdio>
#include<algorithm>
typedef unsigned long long ll;
const int N=2005,M=100010;
int n,m,p,lim,i,j,a[N],v[N],s[N],g[M],nxt[N],vis[M];
int b[N],c[N],cnt,pos[N],ex,L[N],R[N],q[N],t;
ll f[M],C[M][5],sum[N],ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int trans(int x){
if(x==0)return -1;
int t=x;
while(x){
int y=x%10;
if(y!=4&&y!=7)return -1;
x/=10;
}
return t;
}
inline int lower(int x){
int l=1,r=n,mid,t;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline int add(int x,int y){nxt[y]=g[x];g[x]=y;}
inline void del(int x){
if(x<0)return;
if(vis[x])return;
vis[x]=1;
for(int i=g[x];i;i=nxt[i])if(i>lim){
b[i]=++cnt;
c[cnt]=i;
if(i<ex)ex=i;
}
}
inline ll cal(int l,int x,int r){return f[s[x-1]-s[l-1]]+f[s[r]-s[x]]-f[s[r]-s[l-1]];}
int main(){
read(n);
for(i=1;i<=n;i++)f[i]=1ULL*i*(i+1)/2ULL;
for(i=1;i<=n;i++){
C[i][1]=i;
if(i<=4)C[i][i]=1;
for(j=2;j<=4&&j<i;j++)C[i][j]=C[i-1][j-1]+C[i-1][j];
}
while(n--){
read(i);
i=trans(i);
if(~i||a[m]>=0)a[++m]=i;else a[m]--;
}
for(i=1;i<=m;i++){
if(a[i]>0)b[++p]=a[i],v[i]=1;else v[i]=-a[i];
s[i]=s[i-1]+v[i];
}
if(p>1)for(std::sort(b+1,b+p+1),n=0,i=1;i<=p;i++)if(b[i]!=b[i-1])b[++n]=b[i];
for(i=1;i<=m;i++)if(a[i]>0)add(a[i]=lower(a[i]),i);
for(lim=1;lim<=m;lim++){
for(cnt=i=0;i<=n;i++)vis[i]=0;
ex=m+1;
for(i=lim+1;i<=m;i++)b[i]=N;
for(i=lim;i;i--){
del(a[i]);
pos[i]=cnt;
if(i<lim){
ans+=(C[v[lim]][3]+C[v[lim]][2]*(s[ex-1]-s[lim]+1))*v[i];
}else{
ans+=C[v[i]][2]+C[v[i]][3]*2ULL+C[v[i]][4];
ans+=(C[v[i]][2]+C[v[i]][3])*(s[ex-1]-s[lim]);
}
}
for(b[q[t=0]=lim]=0,i=lim+1;i<=m;q[++t]=i++){
while(b[q[t]]>=b[i])t--;
L[i]=q[t]+1;
}
for(b[q[t=0]=m+1]=0,i=m;i>lim;q[++t]=i--){
while(b[q[t]]>=b[i])t--;
R[i]=q[t]-1;
}
sum[0]=f[s[m]-s[lim]];
for(i=1;i<=cnt;i++)sum[i]=sum[i-1]+cal(L[c[i]],c[i],R[c[i]]);
ans+=sum[pos[lim]]*f[v[lim]];
for(i=lim-1;i;i--)ans+=sum[pos[i]]*v[i]*v[lim];
}
return printf("%llu",ans),0;
}
BZOJ3764 : Petya的序列的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- codevs3250 操作序列
题目描述 Description Petya是一个非常好玩孩子.他很无聊,因此他开始玩下面的游戏: 他得到一个长度为N的整数序列,他会对这些数字进行操作,他可以把某个数的数值加1或者减1(当然他可以对 ...
- 数学 - Codeforces Round #319 (Div. 1)A. Vasya and Petya's Game
Vasya and Petya's Game Problem's Link Mean: 给定一个n,系统随机选定了一个数x,(1<=x<=n). 你可以询问系统x是否能被y整除,系统会回答 ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...
- Windows10-UWP中设备序列显示不同XAML的三种方式[3]
阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...
- 软件工程里的UML序列图的概念和总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- BZOJ 1251: 序列终结者 [splay]
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3778 Solved: 1583[Submit][Status][Discu ...
- 最长不下降序列nlogn算法
显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...
随机推荐
- 二、JavaScript语言--JS实践--商城分类导航效果
商城类导航菜单制作(以京东为例--竖向列表横向伸缩) 可以用两种方式来实现:用CSS实现和用JS实现 方法一:用CSS实现(要点:使用hover) <!DOCTYPE html PUBLIC & ...
- 重温WCF之群聊天程序(十)
完成的效果图: 服务器端代码: using System; using System.Collections.Generic; using System.Linq; using System.Serv ...
- HTTP中302与301的区别以及在ASP.NET中如何实现
一.官方说法301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently Moved).302 re ...
- Java程序员要求具备的10项技能
1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:a ...
- poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 30529 Accep ...
- html5 Canvas绘制图形入门详解
html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome. ...
- POJ2762 Going from u to v or from v to u(单连通 缩点)
判断图是否单连通,先用强连通分图处理,再拓扑排序,需注意: 符合要求的不一定是链拓扑排序列结果唯一,即在队列中的元素始终只有一个 #include<cstdio> #include< ...
- js判断访问的当前设备是手机还是电脑
function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...
- Intellij Idea 使用
一.使用前需要修改的配置: 1.当类实现Serializable接口时,自动生成 serialVersionUID 1)Setting->Inspections->java->Ser ...
- PRD产品需求文档
什么是PRD? PRD是Product Requirement Document的英文缩写,即产品需求文档的意思.PRD昰产品流程中的最后一步工作,是将原型中的功能.界面具象化描述,是提交给设计(UI ...