Codeforces Round #223 (Div. 1) C. Sereja and Brackets 离线树状数组

C. Sereja and Brackets

题意:

给你一个只包含 '(' 和 ')' 的字符串,由m个询问,每次询问给定一个区间,求区间内 '(' 和 ')' 匹配的个数。

思路:

观察发现每个 ')' 匹配的 ’(’ 的位置是一定的,我们可以将每一个与之匹配的 ‘(’ 的位置保存起来,将询问按照右端点排序。边更新边查询,在区间范围内被标记点的个数即为括号匹配的对数。(因为在存位置时 保存的是与右括号 ‘) ’匹配的左括号 '(' 的位置,更新时是按照右括号添加左括号的位置。所以如果左括号在区间内,则于他相匹配的右括号一定也在区间内)

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mod 1000000007
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
struct node
{
    int l,r;
    int id;
}q[maxn];
char s[maxn];
int c[maxn],res[maxn],n,m;
int pos[maxn];   //记录与 ')' 匹配的 '(' 的位置
stack st;

bool cmp(node a,node b)
{
    return a.r

 

你可能感兴趣的:(数据结构-----树状数组,思维)