传送门

模拟赛的时候纯暴力竟然骗了\(70\)分……

首先对于一堆\(g\)怎么计算概率应该很好想,用总的区间数减去不合法的区间数就行了,简而言之对\(g\)排个序,每一段长为\(d\)的连续序列的区间有\(\frac{d(d+1)}{2}\),那么对于每一个\([g_{i-1}+1,g_{i}-1]\)的区间,把它能贡献的子区间减去就行了

其次它是询问,而且不强制在线,那么很容易想到莫队

然而单纯的莫队不可做,因为很有可能加一个字符串会导致好几个长度满足条件,这样一次转移就不是\(O(1)\)的了

这个问题也不难解决,我们把所有的字符串首尾相接看做一个字符串,那么每一次转移只会加上一个前缀,转移就可以做到\(O(1)\)了。对于\(g\)开一个\(set\),加入数字的时候查一下前驱\(pre\)和后继\(next\),把\([next+1,pre-1]\)的贡献删掉,同时把\([next+1,g-1]\)和\([g+1,pre-1]\)的贡献加上去。删除数字的时候同理

\(ok\)到了现在交上去发现还是\(T\),因为\(set\)有一个\(\log\),还是不够

我们发现\(set\)可以用链表优化,链表的删除是\(O(1)\)的,撤销也是\(O(1)\)的

但是莫队除了删除还有插入,这个时候就需要用到一个叫做回滚莫队的黑科技了

简单来说,我们在对询问排序的时候先按左端点所在块从小到大排序,再按右端点(不是所在块!)从大到小排序。对于左端点在同一块内的询问,右端点是递减的,那么每一次删除的复杂度是\(O(1)\),暴力删除右端点的贡献是\(O(n)\),这一部分的复杂度是\(O(n\sqrt{n})\)。对于左端点,每一次都从该块的最左端一直删除到左端点,每一次复杂度为\(O(\sqrt{n})\),这一部分的府再度也是\(O(n\sqrt{n})\)

所以最后的复杂度是\(O(n\sqrt{n})\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
//char buf[1<<21],*p1=buf,*p2=buf;
//inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
#define getc() getchar()
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0'){(ch=='-')&&(f=-1);if(ch==EOF)return EOF;}
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
int read(char *s){
R int len=0;R char ch;while((ch=getc())>'z'||ch<'a');
while(s[++len]=ch,((ch=getc())>='a'&&ch<='z'));return s[len+1]=0,len;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R ll x){
if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=3e5+5;
int a[N],len[N],ch[N][26],pos[N],v[N],dep[N];
int bl[N],g[N],ls[N],rs[N],st[N],cnt[N];
struct node{
int l,r,id;
inline bool operator <(const node &b)const{return bl[l]==bl[b.l]?r>b.r:bl[l]<bl[b.l];}
}q[N];
char s[N];ll F[N],ans[N],res,d,qwq;
int n,m,tot,top,num,A,B,C,mx,l,r,S;
inline bool ck(R ll f,R int len){return f?f*B+1ll*A*len>=C:0;}
inline ll calc(R int x){return 1ll*x*(x+1)>>1;}
void ins(char *s,int vva,int len){
int p=0;
fp(i,1,len){
int c=s[i]-'a';
if(!ch[p][c])ch[p][c]=++num,dep[num]=dep[p]+1;
p=ch[p][c],pos[++tot]=p,v[tot]=vva;
}
}
void del(R int i){
int x=pos[i];
if(ck(F[x],dep[x])&&!ck(F[x]-v[i],dep[x])&&!--cnt[g[dep[x]]]){
int k=g[dep[x]],l=ls[k],r=rs[k];
ls[r]=l,rs[l]=r,res-=calc(r-k-1),res-=calc(k-l-1),res+=calc(r-l-1);
}F[x]-=v[i];
}
void add(R int i){
int x=pos[i];
if(!ck(F[x],dep[x])&&ck(F[x]+v[i],dep[x])&&!cnt[g[dep[x]]]++){
int k=g[dep[x]],l=ls[k],r=rs[k];
ls[r]=rs[l]=k,res-=calc(r-l-1),res+=calc(r-k-1),res+=calc(k-l-1);
}F[x]+=v[i];
}
int main(){
// freopen("testdata.in","r",stdin);
// freopen("string.in","r",stdin);
// freopen("string.out","w",stdout);
n=read(),A=read(),B=read(),C=read();fp(i,1,n)a[i]=read();
fp(i,1,n)cmax(mx,len[i]=read(s)),ins(s,a[i],len[i]),len[i]+=len[i-1];
S=sqrt(tot);fp(i,1,tot)bl[i]=(i-1)/S+1;
fp(i,1,mx)g[i]=read();
m=read(),qwq=calc(mx);
fp(i,1,m){
l=read(),r=read();
q[i].l=len[l-1]+1,q[i].r=len[r],q[i].id=i;
}
sort(q+1,q+1+m);
for(R int i=1,x=pos[i];i<=tot;F[x]+=v[i],x=pos[++i])
if(!ck(F[x],dep[x])&&ck(F[x]+v[i],dep[x])&&!cnt[g[dep[x]]]++)
st[++top]=g[dep[x]];
st[++top]=0,st[++top]=mx+1,sort(st+1,st+1+top);
fp(i,1,top)ls[st[i]]=st[i-1],rs[st[i]]=st[i+1];
fp(i,2,top)res+=calc(st[i]-st[i-1]-1);
for(R int i=1,j=S,t=1,l=i,r=tot;t<=m&&i<=tot;i+=S,j+=S){
while(t<=m&&q[t].l>=i&&q[t].l<=j){
while(r>q[t].r)del(r--);while(l<q[t].l)del(l++);
ans[q[t].id]=qwq-res;while(l>i)add(--l);++t;
}while(r<tot)add(++r);while(l<=j)del(l++);
}fp(i,1,m){
d=__gcd(qwq,ans[i]);
print(ans[i]/d),sr[K]='/',print(qwq/d);
}
return Ot(),0;
}

loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)的更多相关文章

  1. 「雅礼集训 2018 Day5」Convex 凸包、莫队

    LOJ 看到离线区间操作仍然考虑莫队,然后可以发现:我们对于原来的凸包集合按照极角序维护一个链表,那么删除一个位置可以\(O(1)\),撤回删除操作也可以\(O(1)\)(因为原来的链表结构中当前节点 ...

  2. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  3. [LOJ 6031]「雅礼集训 2017 Day1」字符串

    [LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...

  4. 【loj - 6516】「雅礼集训 2018 Day11」进攻!

    目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...

  5. LOJ #6509. 「雅礼集训 2018 Day7」C

    神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...

  6. loj 6051 「雅礼集训 2017 Day11」PATH - 多项式 - 钩子公式

    题目传送门 传送门 设 $m = \sum_{i = 1}^{n} a_i$. 总方案数显然等于 $\frac{m!}{\prod_{i = 1}^{n} a_i!}$. 考虑这样一个网格图,第 $i ...

  7. LOJ #6051. 「雅礼集训 2017 Day11」PATH

    完了感觉最近留了好多坑的说,这题也是模模糊糊地会一点 首先我们发现题目要求的是单调不上升的序列个数,那么一个套路就是用值减去下标 然后考虑连续位置的限制,这个我们做一个置换然后尽量向后取 这样拿值和位 ...

  8. LOJ #6050. 「雅礼集训 2017 Day11」TRI

    完全不会的数学神题,正解留着以后填坑 将一个口胡的部分分做法,我们考虑计算格点多边形(包括三角形)面积的皮克公式: \[S=a+\frac{1}{2}b-1\text({a为图形内部节点个数,b为边界 ...

  9. LOJ #6052. 「雅礼集训 2017 Day11」DIV

    完了我是数学姿势越来越弱了,感觉这种CXRdalao秒掉的题我都要做好久 一些前置推导 首先我们很容易得出\((a+bi)(c+di)=k \Leftrightarrow ac-bd=k,ad+bc= ...

随机推荐

  1. PHP面试题,自己几斤几两,看看就知道了

    0.简单做一下自我介绍,? 然后谈一下近三年来你的得意之作? 1.面试官看过你的简历,会问一些你做的项目的用户量.pv.吞吐量.相关难点和解决方法等 2.数据库设计经验,为什么进行分表? 分库? 一般 ...

  2. kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了

    先看数据: 特征如下: Time Number of seconds elapsed between each transaction (over two days) numeric V1 No de ...

  3. Android之setContentView和LayoutInflater

    setContentView: 1.常用的构造函数: 1)setContentView(int layoutResID) 2)setContentView(View view) 3)setConten ...

  4. 机器学习 Logistic Regression

    Logistic Regression 之前我们讨论过回归问题,并且讨论了线性回归模型.现在我们来看看分类问题,分类问题与回归问题类似,只不过输出变量一个是离散的,一个是连续的.我们先关注二分类问题, ...

  5. 【leetcode刷题笔记】Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  6. CodeForces - 1019D(BZOJ3707圈地):Large Triangle (几何,找面积为S的三角形)

    题意:给定平面上N个点,问是否存在三角形,其面积为S. 思路:选择Y轴,枚举这个Y轴,面积大小只与|y-Y|有关,然后二分,具体的可以先去做BZOJ3707. 具体的: 1,先对点排序,X坐标为第一关 ...

  7. NOIP2018爆炸记

    又是一年\(NOIP\),可能是梦结束的地方? 之所以咕了这么久是得先确定自己不会退役,因为分太低了. 和去年一样在学校门前照了相,然后上车走了.高三回来考的只剩下\(p2oileen\)学姐了.新一 ...

  8. PLSQL Developer安装、配置、连接oracle数据库

    0.资源准备 1) PLSQL Developer安装包(由于安装包超过10M,无法上传,请自行下载) 2) instantclient_11_2安装包(由于安装包超过10M,无法上传,请自行下载) ...

  9. oracle单实例12.2.0.1安装

    说明:本文描述oracle linux 6.8 安装 oracle 12.2.0.1 0. 查看操作系统版本 [root@12c01 ~]# cat /etc/os-release NAME=&quo ...

  10. Android 开发:开源库Speex支持arm64的动态库文件

    随着处理器制造工艺的不断进步,和Android系统的不断发展,最近出了arm64-v8a的架构,由于项目中用到了speex的第三方语音编解码的动态库,其他架构的处理器暂不用说,一切正常,唯独到arm6 ...