7.11 NOI模拟赛 qiqi20021026的T1 四个指针莫队 trie树
LINK:qiqi20021026的T1


考场上只拿到了50分的\(nq\)暴力。
考虑一个区间和一个区间配对怎么做 二分图最大带权匹配复杂度太高。
先考虑LCS的问题 常见解决方法是后缀数组/trie树.
一个贪心是 每次让贡献最大的一对配对是最优的策略。
具体证明可以利用扰动法 或者观察法。
即设\(p,q,l,r\) 分类讨论一下情况就行辣 怎么证明全局最优?可以发现任意两个匹配都是这样最优 交换会变得更差 这样应该可以说明全局最优了吧?
这个贪心直接做复杂度还是很高 可以考虑trie树上做 那么就是在LCA处匹配 匹配不了到父亲处.
这样复杂度就是\(n\cdot q\)的了.
考虑正解:写完暴力我一度认为这题感觉是一个二维莫队。
但是我发现每次多加一个字符串的贡献非常难处理 所以就不会了。
一个非常套路 且我见过很多次就是没反应过来的套路 是 观察这个贡献 后缀长度 其实可以均摊到路径上的节点上.
即对于每个节点取 min(a,b)即可得到贡献。
这样一个串就对应到了一条路径上 且每个节点的min(a,b)这种贡献都是可以O(1)计算的。
然后考虑莫队 直接 序列上(trie树此时其实也是一个序列)莫队+序列上莫队 这样一共存在四个指针。
分块的大小要调整好 可以奇偶优化分块 复杂度不太清楚 (反正轻轻松松跑过5e5
code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-4
#define sq sqrt
#define S second
#define F first
#define mod 1000000007
#define len(x) t[x].len
using namespace std;
//无奈 太菜了 签到题都只能暴力 我真是个弱智./kk
const int MAXN=10010,maxn=500010;
int n,Q,len,cnt,ans,id=1,B=100;
int t[MAXN][26],pos[MAXN],sum[maxn],wl[MAXN],wr[MAXN],c[MAXN];
struct wy{int l,r,L,R,id;}q[maxn];
string a;
inline void insert()
{
int now=1;
vep(0,a.size(),i)
{
int ww=a[i]-'a';
if(!t[now][ww])t[now][ww]=++id;
now=t[now][ww];pos[++cnt]=now;
}
}
inline int cmp(wy a,wy b)
{
if(a.l/B!=b.l/B)return a.l<b.l;
if(a.r/B!=b.r/B)return a.l/B&1?a.r<b.r:a.r>b.r;
if(a.L/B!=b.L/B)return a.r/B&1?a.L<b.L:a.L>b.L;
return a.L/B&1?a.R<b.R:a.R>b.R;
}
inline void add(int x)
{
++c[pos[x]]>0?++ans:--ans;
}
inline void del(int x)
{
--c[pos[x]]<0?++ans:--ans;
}
int main()
{
//freopen("1.in","r",stdin);
freopen("qiqi.in","r",stdin);
freopen("qiqi.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>Q;
rep(1,n,i)
{
a="";cin>>a;
reverse(a.begin(),a.end());
wl[i]=cnt+1;insert();wr[i]=cnt;
}
rep(1,Q,i)
{
int l,r;cin>>l>>r;
q[i].l=wl[l];q[i].r=wr[r];
sum[i]+=wr[r]-wl[l]+1;
cin>>l>>r;q[i].id=i;
q[i].L=wl[l];q[i].R=wr[r];
sum[i]+=wr[r]-wl[l]+1;
}
sort(q+1,q+1+Q,cmp);
int l=1,r=0,L=1,R=0;
rep(1,Q,i)
{
while(l>q[i].l)add(--l);
while(l<q[i].l)del(l),++l;
while(L>q[i].L)del(--L);
while(L<q[i].L)add(L),++L;
while(r<q[i].r)add(++r);
while(r>q[i].r)del(r),--r;
while(R<q[i].R)del(++R);
while(R>q[i].R)add(R),--R;
sum[q[i].id]-=ans;
}
rep(1,Q,i)put(sum[i]>>1);
return 0;
}
7.11 NOI模拟赛 qiqi20021026的T1 四个指针莫队 trie树的更多相关文章
- 7.11 NOI模拟赛 graph 生成函数 dp 多项式
LINK:graph HDU题库里的原题 没做过自闭. 考虑dp 设\(f_{i,j}\)表示前i个点构成j个联通块是树的方案数. 对于一次询问答案即为\(\sum_{j}f_{n,j}j^k\) 考 ...
- 9.11 myl模拟赛
9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...
- 「CSP-S模拟赛」2019第四场
「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...
- NOI模拟赛 Day1
[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
- NOI模拟赛Day5
T1 有and,xor,or三种操作,每个人手中一个数,求和左边进行某一种运算的最大值,当t==2时,还需要求最大值的个数. test1 20% n<=1000 O(n^2)暴力 test2 2 ...
- 【2018.12.17】NOI模拟赛4
题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...
- NOI.AC省选模拟赛第一场 T1 (树上高斯消元)
link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
随机推荐
- Java实现 第十一届蓝桥杯——走方格(渴望有题目的大佬能给小编提供一下题目,讨论群:99979568)
走方格 问题描述在平面上有一些二维的点阵. 这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第1 至第 m 列,每一个点可以用行号和列号来表示. 现在有个人站在第 ...
- 转载之html特殊字符的html,js,css写法汇总
箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ ⇠ \u21E0 \21E0 ⇢ ⇢ \u21E2 \21E ...
- 查看mysql所有命令
- Java集合类初探
目录 概述 Iterable和Iterator Collection List Queue Set Map 概述 Java中基本的常用的集合类,主要包含: List Set Queue Map 这 ...
- 机器学习实战基础(二十六):sklearn中的降维算法PCA和SVD(七) 附录
- Elasticsearch恢复备份的数据
1.恢复备份好的snapshot 1.1恢复snapshot_1下的所有index POST _snapshot/my_backup/snapshot_1/_restore 1.2恢复snapshot ...
- 微信小程序wx.switchTab跳转到tab页面后onLoad里面的方法不执行
相信大家在做小程序的时候启动页跳转到tab首页会用到switchTab 但是在跳转后发现页面模块不全,后面console.log()后发现是onLoad里面的方法不执行 解决这种问题的方法页有很多中, ...
- 公众号迁移 原有数据库openid 更新主体openid
今天一个两年前做的公众号项目 要更改主体,随之而来的是公众号的迁移. 公众号迁移后关注的粉丝也会对应的进行迁移,还会给粉丝发送相关通知. 大体流程如下图 迁移的具体步骤我就不细说了.今天主要说的是 迁 ...
- 【RPA Starter第三课】第一个Uipath项目:HelloWord
最后是一个小项目,开启使用Uipath.Uipath云平台,Uipath Orchestrator,Uipath Studio,发布项目.怎么启动机器人.都有详细的步骤. Uipath 的账号是通用的 ...
- Linux下显示运行时链接(运行时加载)
目录 介绍 如何加载动态库 dlopen() 第一个参数: 被加载动态库的路径 第二个参数: flag表示函数符号的解析方式 dlopen 返回值 dlsym() 参数: 返回值 符号优先级 dler ...