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树的更多相关文章

  1. 7.11 NOI模拟赛 graph 生成函数 dp 多项式

    LINK:graph HDU题库里的原题 没做过自闭. 考虑dp 设\(f_{i,j}\)表示前i个点构成j个联通块是树的方案数. 对于一次询问答案即为\(\sum_{j}f_{n,j}j^k\) 考 ...

  2. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  3. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  4. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  5. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  6. NOI模拟赛Day5

    T1 有and,xor,or三种操作,每个人手中一个数,求和左边进行某一种运算的最大值,当t==2时,还需要求最大值的个数. test1 20% n<=1000 O(n^2)暴力 test2 2 ...

  7. 【2018.12.17】NOI模拟赛4

    题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...

  8. NOI.AC省选模拟赛第一场 T1 (树上高斯消元)

    link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...

  9. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

随机推荐

  1. CSS-界面滚动时不显示滚动条

    设置滚动条的样式: div::-webkit-scrollbar { width: ; }   关于::-webkit-scrollbar ::-webkit-scrollbar CSS伪类选择器影响 ...

  2. 使用 PostCSS 进行 CSS 处理

    在 Web 应用开发中,CSS 代码的编写是重要的一部分.CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演化之中.这给开发人员带来了效率上 ...

  3. mongodb安装与mongo vue的使用

    首先,下载mongodb,然后安装 http://downloads.mongodb.com/win32/mongodb-win32-x86_64-enterprise-windows-64-2.6. ...

  4. i++ & ++i不看字节码是真的难懂

    package club.interview.base; /** * ++i 先"++"后赋值 * i++ 先赋值后"++" * i++ 局部变量表的值会改变, ...

  5. Java嵌套类,内部类和外部类

    1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类 ...

  6. Code Forces 833 A The Meaningless Game(思维,数学)

    Code Forces 833 A The Meaningless Game 题目大意 有两个人玩游戏,每轮给出一个自然数k,赢得人乘k^2,输得人乘k,给出最后两个人的分数,问两个人能否达到这个分数 ...

  7. day23 常用模块(中)

    目录 一.json&pickle模块 1 什么是序列化 2 为什么要序列化 2.1 持久保存状态 2.2 跨平台数据交互 3 如何序列化 二.shelve模块 三.configparser模块 ...

  8. (数据科学学习手札89)geopandas&geoplot近期重要更新

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 最近一段时间(本文写作于2020-07-1 ...

  9. 媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^

    ​ 之前我媳妇儿让我给她找一个PDF转WORD的免费工具,在网上找了半天发现要不就是收费,要不就是转化的格式混乱.既然网上不能找到好用的免费工具那就直接来写一个吧.人生苦短,我用python. 万能的 ...

  10. PHP中使用 TUS 协议来实现可恢复文件上传

    曾经尝试过用PHP上传大文件吗?想知道您是否可以从上次中断的地方继续上传,而不会在遇到任何中断的情况下再次重新上传整个数据?如果您觉得这个场景很熟悉,请接着往下阅读. 文件上传是我们几乎所有现代Web ...