又是被水题卡
这题可以抽象成 给你许多区间,然后有一系列询问,问[ L , R ]这段区间包含多少给出的区间
对应的括号就是给定的区间,虽然最后输出的答案是输出长度,但是因为每一对括号都有占有两个单位
所以把个数乘二就行了(在一点卡了...
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
#define CLR(x,y) memset(x,y,sizeof(x))
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define eps 1e-9
#define INF 0x3f3f3f3f
#define LLINF 1LL<<62
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef complex<ld> point;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef vector<int> vi;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1;
char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
template <class T>
inline void write(T n)
{
if(n < 0)
{
putchar('-');
n = -n;
}
int len = 0,data[20];
while(n)
{
data[len++] = n%10;
n /= 10;
}
if(!len) data[len++] = 0;
while(len--) putchar(data[len]+48);
}
//-----------------------------------
#define lowbit(x) (x&(-x))
const int MAXN=1000100;
struct BIT
{
int size;
int c[MAXN];
void init(int n)
{
size=n;
CLR(c,0);
}
void update(int x,int v)
{
while(x<=size)
{
c[x]+=v;
x+=lowbit(x);
}
}
int getsum(int x)
{
int ans=0;
while(x)
{
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
} bit;
struct Node
{
int l,r,id;
void input(int i)
{
id=i;
read(l),read(r);
}
bool operator < (const Node &x) const
{
return r<x.r || (r==x.r&&l<x.l);
}
} q[MAXN/8];
int n,a[MAXN];
char s[MAXN];
stack<int>S;
int ans[MAXN/8];
int main()
{
gets(s);
int len=strlen(s);
CLR(a,-1);
for(int i=0;i<len;i++)
{
if(s[i]=='(') S.push(i);
else
{
if(!S.empty())
{
a[i+1]=S.top()+1;
S.pop();
}
}
}
read(n);
for(int i=0;i<n;i++)
q[i].input(i);
sort(q,q+n);
bit.init(len);
int j=1;
for(int i=0;i<n;i++)
{
while(j<=q[i].r && j<=len)
{
if(a[j]!=-1)
bit.update(a[j],1);
j++;
}
ans[q[i].id]=bit.getsum(q[i].r)-bit.getsum(q[i].l-1);
}
for(int i=0;i<n;i++)
write(ans[i]<<1),putchar('\n');
return 0;
}