2024.11.12 鲜花

news/2024/11/14 22:41:53/文章来源:https://www.cnblogs.com/xrlong/p/18542529

P11270 【MX-S5-T4】魔法少女们 题解

这世界那么多人
这世界有那么多人
人群里 敞着一扇门
我迷朦的眼睛里长存
初见你蓝色清晨
这世界有那么多人
多幸运 我有个我们
这悠长命运中的晨昏
常让我 望远方出神
灰树叶飘转在池塘
看飞机轰的一声去远乡
光阴的长廊 脚步声叫嚷
灯一亮 无人的空荡
晚风中闪过 几帧从前啊
飞驰中旋转 已不见了吗
远光中走来 你一身晴朗
身旁那么多人 可世界不声 不响
这世界有那么多人
多幸运 我有个我们
这悠长命运中的晨昏
常让我 望远方出神
灰树叶飘转在池塘
看飞机轰的一声去远乡
光阴的长廊 脚步声叫嚷
灯一亮 无人的空荡
晚风中闪过 几帧从前啊
飞驰中旋转 已不见了吗
远光中走来 你一身晴朗
身旁那么多人 可世界不声 不响
笑声中浮过 几张旧模样
留在梦田里 永远不散场
暖光中醒来 好多话要讲
世界那么多人 可是它不声 不响
这世界有那么个人
活在我 飞扬的青春
在泪水里浸湿过的长吻
常让我 想啊想出神

最近都在写多项式卷积,换换脑子,写点一点也不清新的逆天题。

首先先去除不合法的 \(S,T\),具体的就是不能通过在后面/前面加右/左括号变成合法括号序的。

考虑经典做法,设 (\(-1\))\(1\),设一个括号序 \(X\) 的值 \(V(X)\) 为其所有括号的值和。

首先我会暴力,考虑枚举 \(S,T\) 分别做前后缀,统计个数。分讨:\(|S|+|T|\le k\)\(|S|+|K|>k\)\(|S|+|K|>k\) 能成立当且仅当它们相交的部分相同,且拼成的括号序合法,因为前后缀分别合法,所以括号序合法等价于拼成的值为 \(0\),维护 \(S,T\) 的 hash 和 \(V\) 的前缀轻松判。

\(|S|+|T|\le k\) 略微困难,考虑中间空余填法方案,其相当于是从 \(a \to b\),每次 \(\pm 1\),在任意时刻前缀和 \(\le 0\),这是经典格路计数,可以直接上卡特兰数/反射容斥,单次查询可以做到 \(O(1)\)

现在复杂度是 \(n^2\) 的,实现精细可以过 \(56pts\),考虑优化。

\(|S|+|K|>k\) 依然比较简单,考虑将后缀 hash,长度和 \(V\) 做成三元组扔进 hash 表,前缀直接查。

\(|S|+|T|\le k\) 考虑一个括号序的长度和值完全一样显然是没有区别的,将它们扔进一个等价类一起算,题解说是 \(L^{\frac{2}{3}}\) 种等价类,不会正,但因为总长和单个长度的限制确实不会太多,于是有了 \(84pts\)

考虑继续优化 \(|S|+|T|\le k\),发现对于 \((l,s)\) 的二元等价类,\(l\) 是长度,\(s\) 是值,显然可以拆成 \((l+1,s+1),(l+1,s-1)\),即考虑填上一个括号,于是根号分治,直接将 \(l<\sqrt L\) 的都推到 \(\sqrt L\),显然复杂度是 \(\mathcal{O}((\sqrt L)^2+(\sqrt L+\frac{L}{\sqrt L})^2)=\mathcal{O}(L)\)

一些细节:\(|S|+|K|>k\) 需要卡场,可以枚举断点,这样可以往 hash 表少扔几个元素,实在不行手写,\(|S|+|T|\le k\) 部分推到根号是要考虑有的前缀和后缀的匹配会被推成相交,在恰好接上时计算贡献即可。阈值分治的阈值开小点跑的比较快,算 hash 和 \(V\) 的时候不建议用 vector,反正我的暴力改成拼多多(开一个大数组动态分配空间)直接 \(44pts\to 56pts\)

Code
#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
using llt=long long;
using llf=long double;
using ull=unsigned long long;
#define endl '\n'
#define Il __always_inline
#ifdef LOCALFILE *InFile=freopen("in_out/in.in","r",stdin),*OutFile=freopen("in_out/out.out","w",stdout);
#elseFILE *InFile=stdin,*OutFile=stdout;
#endifconst int N=2e5+3,M=5e5+3,S=1e7+3,HBs=2333,MOD=1e9+7;
int Add(int a,int b){return (a+=b)>=MOD?a-MOD:a;}
int Sub(int a,int b){return (a-=b)<0?a+MOD:a;}int n,m,ck,ans,fac[M],ivf[M],mln; ull hpw[M];namespace Node{ull chs[S+N<<1],*hp=chs; int csm[S+N<<1],*sp=csm;struct Nd{ull *hs; int *sm; int len,sum;Il void In(const string &s){len=s.size(); hs=hp,hp+=len+2,sm=sp,sp+=len+2; mln=max(mln,len);hs[0]=0,sm[0]=0,sum=0; int p=0; ull hsh=0;for(auto c:s) ++p,hs[p]=hsh=hsh*HBs+c,sm[p]=sum+=c=='('?1:-1;}Il int Sm()const{return sum;}Il ull Hs(int l,int r){return hs[r]-hs[l-1]*hpw[r-l+1];}};
}using Node::Nd;
Nd s[N],t[N]; int lns,lnt;Il int C(int a,int b){return a<b||b<0?0:1ll*fac[a]*ivf[b]%MOD*ivf[a-b]%MOD;}
Il int P(int a,int b,int c,int d){return C(c-a+d-b,d-b);}
Il int Cat(int a,int b,int c,int d){return Sub(P(a,b,c,d),P(a,b,d-1,c+1));}
Il int Cnt(int x,int y,int l){int a=(y-x+l)>>1,b=(x-y+l)>>1; return a+b==l?Cat(x,0,x+a,b):0;}Il bool Chkl(const string &a){int sum=0;for(auto c:a) if((sum+=c=='('?1:-1)<0) return 0;return 1;
}
Il bool Chkr(const string &a){int sum=0;for(auto c=a.rbegin();c!=a.rend();++c) if((sum+=*c==')'?1:-1)<0) return 0;return 1;
}Il size_t Hash(const tuple<ull,int,int> &p){return get<0>(p)+hash<int>()(get<1>(p))*HBs^hash<int>()(get<2>(p));};
struct Map{static const int MMOD=10000019;struct O{tuple<ull,int,int> v; int w,t;}o[200050];int n,c,w,h[MMOD],p[200050];void Clr(){for(int i=1;i<=w;++i) h[p[i]]=0; c=w=0;}void Ins(const tuple<ull,int,int> &x){int u=Hash(x)%MMOD;for(int i=h[u];i;i=o[i].t) if(o[i].v==x) return ++o[i].w,void();o[++c]={x,1,h[u]},h[u]=c,p[++w]=u;}int Get(const tuple<ull,int,int> &x){int u=Hash(x)%MMOD;for(int i=h[u];i;i=o[i].t) if(o[i].v==x) return o[i].w;return 0;}
} mp;
Il void Slv1(){sort(s+1,s+lns+1,[](const Nd &a,const Nd &b){return a.len==b.len?a.Sm()<b.Sm():a.len>b.len;});sort(t+1,t+lnt+1,[](const Nd &a,const Nd &b){return a.len==b.len?a.Sm()<b.Sm():a.len>b.len;});for(int i=1;i<=ck;++i){mp.Clr();for(int j=1;j<=lnt;++j){if(t[j].len<i) break;mp.Ins({t[j].hs[i],-t[j].Sm(),ck-t[j].len});}for(int j=1;j<=lns;++j){if(s[j].len<i) break;int l=s[j].len,p=l-i;ans=Add(ans,mp.Get({s[j].Hs(p+1,l),s[j].sm[p],p}));}}
}Il void Slv2(){map<pair<int,int>,int> cs,ct; int B=min({ck/2-1,600,mln});map<pair<int,int>,int> cv;for(int i=1;i<=lns;++i) ++cs[{s[i].len,s[i].Sm()}];for(int i=1;i<=lnt;++i) ++ct[{t[i].len,t[i].Sm()}];for(auto k=cs.begin();k!=cs.end();){int l=k->first.first,s=k->first.second,t=k->second;if(l>=B) break; if(ct.count({ck-l,-s})) ans=(ans+1ll*ct[{ck-l,-s}]*t%MOD)%MOD;(cs[{l+1,s+1}]+=t)%=MOD; if(s>0) (cs[{l+1,s-1}]+=t)%=MOD; k=cs.erase(k);}for(auto k=ct.begin();k!=ct.end();){int l=k->first.first,s=k->first.second,t=k->second;if(l>=B) break; if(cs.count({ck-l,-s})) ans=(ans+1ll*cs[{ck-l,-s}]*t%MOD)%MOD;if(s<0) (ct[{l+1,s+1}]+=t)%=MOD; (ct[{l+1,s-1}]+=t)%=MOD; k=ct.erase(k);}for(auto l:cs) for(auto r:ct){int ll=l.first.first,rl=r.first.first,ls=l.first.second,rs=r.first.second,lt=l.second,rt=r.second;if(ll+rl<=ck) ans=(ans+1ll*Cnt(ls,-rs,ck-ll-rl)*lt%MOD*rt)%MOD;}
}int main(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);hpw[0]=1; for(int i=1;i<=M-3;++i) hpw[i]=hpw[i-1]*HBs;fac[0]=1; for(int i=1;i<=M-3;++i) fac[i]=1ll*fac[i-1]*i%MOD;ivf[M-3]=329292354; for(int i=M-3;i;--i) ivf[i-1]=1ll*ivf[i]*i%MOD;int cccc; cin>>cccc>>n>>m>>ck;for(int i=1;i<=n;++i){string a; cin>>a; if(Chkl(a)) s[++lns].In(a);}for(int i=1;i<=m;++i){string a; cin>>a; if(Chkr(a)) t[++lnt].In(a);}Slv1(); Slv2(); cout<<ans<<endl;
}
P


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832454.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java代码实现行列转换

本代码想要达到的效果 测试完整代码如下(copy直接运行): public class TestConvert { public static void main(String[] args) { ArrayList<Attribute> sourceList = new ArrayList<>(); for (int i = 0; i < 3; i++) { for (i…

SS241112A. 定向越野(walk)

这道题目要求找到从起点出发遍历所有点并回到起点的最小路径长度,路径必须直角拐弯。文章证明了答案是有理数,并通过直观分析和大胆猜测得出初始方向必须是某一个向量的方向,最终使用状压 DP 解决问题,时间复杂度为 $O(n^4 2^n)$。SS241112A. 定向越野(walk) 题意 给你 \…

第六课 Python之模块

一、模块的介绍 (1)python模块,是一个python文件,以一个.py文件,包含了python对象定义和pyhton语句 (2)python对象定义和python语句 (3)模块让你能够有逻辑地组织你的python代码段。 (4)把相关的代码分配到一个模块里能让你的代码更好用,更易懂 (5)模块能定义函数…

redis集群搭建 - cluster模式

搭建一套redis cluster集群。概述 搭建一套redis cluster集群。架构 192.168.0.21:6379 主 192.168.0.23:6380 从 192.168.0.22:6379 主 192.168.0.21:6380 从 192.168.0.23:6379 主 192.168.0.22:6380 从 修改这三台服务器的host文件(选做) vim /etc/hosts192.168.0.21 node…

推荐一个Elasticsearch ES可视化客户端工具:ES-King

ES-King:开源免费,一个现代、实用的ES GUI客户端,支持多平台。 下载地址:https://github.com/Bronya0/ES-King 功能清单 详尽的集群信息:节点信息、堆内存占用、总内存占用、cpu占用、磁盘占用、网络流量、节点角色、集群健康、5分钟负载、每个节点的字段缓存、段缓存、查…

Kafka怎么配置SASL用户名密码认证

服务端配置(server.properties):# 开启SASL认证 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN# 配置JAAS文件路径 listeners=SASL_PLAINTEXT://localhost:9092 sasl.enabled.mechanisms=PLAIN listener.name.sasl_plaintext.plain.sasl.jaas.config=org.apache.kafk…

数据采集与融合技术第四次实践作业

gitee链接: https://gitee.com/zxbaixuexi/2024scrapy/tree/master/第四次实践 作业①: 1) 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。 候选网站:东方财富网: http://quote.eastmoney.com/cen…

项目冲刺11.12

这个作业属于哪个课程 计科22级34班这个作业要求在哪里 作业要求这个作业的目标 进行为期七天的项目冲刺并记录前言 本篇博客是项目冲刺的第四篇,七篇博客的汇总如下:博客汇总第一篇博客第二篇博客第三篇博客第四篇博客第五篇博客第六篇博客第七篇博客团队简介队名 拖延是你不…

快速修改kafka的broker配置或topic配置

下载开源的kafka界面客户端KafkaKing:https://github.com/Bronya0/Kafka-King 连接后,双击broker配置,或者双击topic配置:修改好后回车保存就行。有些配置是改不了的。

mysql创建表

创建表 创建表要先选中数据库名 create table 表名(列名 类型)来进行创建,列名可以存在多个,表名和列名不可以一样,想要一样的话就要使用反引号把表名和列名引起来 列名在前面,类型在后面查看所有表 show tables查看当前数据库所有表查看指定表的结构 desc 表名;把表的特…

《会计原来这么有趣》——中级实务篇(刘海涛)

第一章:存货核算 1.1存货定义:存货是指企业在日常活动中持有以备出售的产成品或商品、处在生产过程中的在产品、在生产过程或提供劳务过程中耗用的材料或物料等,包括各类材料、在产品、半成品、产成品或库存商品以及包装物、低值易耗品、委托加工物资等。 参考(https://bai…