首页 > 其他分享 >CF380C Sereja and Brackets 题解 数列分块

CF380C Sereja and Brackets 题解 数列分块

时间:2022-10-24 11:03:12浏览次数:70  
标签:cnt CF380C int 题解 Brackets stk bl blo vec

题目链接:​​https://codeforces.com/contest/380/problem/C​

题目大意:给定长度为 \(n(\le 10^6)\) 的一个括号序列,有 \(m(\le 10^5)\) 次询问,每次询问给定一个区间 \([l,r]\),你需要回答出区间 \([l,r]\)

解题思路:

首先,无论在哪个区间范围内,每一个 ')' 所匹配的 '(' 都是固定的。

我们可以用 \(f[i]\) 表示下标为 \(i\)

对于每次询问的 \(l\) 和 \(r\),问题就变成了询问区间 \([l,r]\) 范围内存在多少 \(f[i]\) 满足 \(f[i] \ge l\)。

这个问题用 分块 是很好解决的,对于完整的分开,只需要初始时对每个分块的 \(f[i]\) 排序,然后查询的时候就可以二分查找 \(\le l\)

时间复杂度是 \(O(m \cdot \sqrt{n} \cdot \log n)\),但是因为常数比较小(这里的 \(\log n\) 其实是 \(\log \sqrt{n} = \frac{1}{2} \log n\),然后不匹配的状态 \(f[i]\)

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
char s[maxn];
int n, m, l, r, f[maxn];
int blo, bl[maxn];
vector<int> vec[1010];

void init() {
stack<int> stk;
for (int i = 1; i <= n; i++) {
if (s[i] == '(') stk.push(i);
else if (!stk.empty()) {
f[i] = stk.top();
stk.pop();
}
}
blo = sqrt(n);
for (int i = 1; i <= n; i++) {
bl[i] = (i - 1) / blo + 1;
if (f[i]) vec[bl[i]].push_back(f[i]);
}
for (int i = 1; i <= bl[n]; i++)
sort(vec[i].begin(), vec[i].end());
}

int solve(int l, int r) {
int cnt = 0;
for (int i = l; i <= min(bl[l]*blo, r); i++) if (f[i] >= l) cnt++;
if (bl[l] != bl[r]) {
for (int i = (bl[r]-1)*blo+1; i <= r; i++) if (f[i] >= l) cnt++;
}
for (int i = bl[l]+1; i < bl[r]; i++) {
int num = vec[i].end() - lower_bound(vec[i].begin(), vec[i].end(), l);
cnt += num;
}
return cnt * 2;
}

int main() {
scanf("%s%d", s+1, &m);
n = strlen(s+1);
init();
while (m--) {
scanf("%d%d", &l, &r);
printf("%d\n", solve(l, r));
}
return 0;
}



标签:cnt,CF380C,int,题解,Brackets,stk,bl,blo,vec
From: https://blog.51cto.com/u_13536312/5788868

相关文章

  • SP685 SEQPAR - Partition the sequence 题解
    SP685SEQPAR-PartitionthesequenceSolution目录SP685SEQPAR-PartitionthesequenceSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进......
  • ABC246Ex 01? Queries 题解
    ABC246Ex01?QueriesSolution目录ABC246Ex01?QueriesSolution更好的阅读体验戳此进入浅谈DDP与广义矩阵乘法(戳此进入)引入例题#1广义矩阵乘法DDP例题#0例题#0.5......
  • ABC246F typewriter 题解
    ABC246FtypewriterSolution目录ABC246FtypewriterSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定$n$个字符串,字符集为小......
  • ABC246D 2-variable Function 题解
    ABC246D2-variableFunctionSolution目录ABC246D2-variableFunctionSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面存在函数$f......
  • ABC246E Bishop 2 题解
    ABC246EBishop2Solution目录ABC246EBishop2Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定有障碍的网格图,.为空地,#为障碍......
  • LG-P5104 红包发红包 题解
    LG-P5104红包发红包Solution目录LG-P5104红包发红包Solution更好的阅读体验戳此进入UPD更好的阅读体验戳此进入(建议您从上方链接进入我的个人网站查看此Blog,在Luo......
  • ABC246C Coupon 题解
    ABC246CCouponSolution目录ABC246CCouponSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面$n$个物品第$i$个价格为$a_i$,......
  • The 18th Zhejiang Provincial Collegiate Programming Contest题解
    A.LeagueofLegends水题。点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglonginta[6];intb[6];signedmain(){for(......
  • ABC274 题解
    A题目:给定\(A,B\)输出\({B}\over{A}\)保留\(3\)位小数。简答题,和A+Bproblem一样,除一除,保留一下小数。B题目:给定一个\(n\)行\(m\)列由'.'和'#'的方阵,求每列......
  • 【题解】The 2021 ICPC Asia Macau Regional Contest - E Pass The Ball
    问题描述解释相当于给定一个置换群,求\(\sum\limits_{i=1}^{n}i*b_{i}\)题目分析本题这种传球的关系显然是存在循环节的,先考虑一个大小为\(m\)的环,显然我们可以用......