QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#245109 | #7106. Infinite Parenthesis Sequence | Edwin_VanCleef | RE | 6ms | 19992kb | C++23 | 2.4kb | 2023-11-09 18:53:40 | 2023-11-09 18:53:41 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
namespace my_IO{
#define ll long long
#define ull unsigned long long
#define ld long double
#define spc putchar(' ')
#define et putchar('\n')
template<class T>
void read(T &num){
T x=0,f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<3)+(x<<1)+c-48;
c=getchar();
}
num=f*x;
}
template<class T>
void write(T x){
static char buf[40];
static int len=-1;
if(x<0) putchar('-'),x=-x;
do{
buf[++len]=x%10+48;
x/=10;
}while(x);
while(len>=0) putchar(buf[len--]);
}
}
using namespace my_IO;
const int inf=1e9;
const int maxn=1e5+10;
int n,m,F[maxn<<1][20],lg[maxn<<1];
char s[maxn];
int query(int l,int r){
// cout<<l<<" "<<r<<"\n";
int k=lg[r-l+1];
return min(F[l][k],F[r-(1<<k)+1][k]);
}
int que(int l,int r){
// cout<<l<<" "<<r<<"\n";
int k=l/m;
int nl=l%m,nr=nl+r-l,res=(n-2*m)*k;
if(nl<0) nl+=m,nr+=m,res-=n-2*m;
// cout<<nl<<" "<<nr<<" "<<res<<"\n";
return query(nl,nr)+res;
}
int f(int k,int i){
// cout<<k<<" "<<i<<":\n";
if(k<=m) return que(i,i+k)+2*i+k;
if(n>=2*m) return que(i,i+m-1)+2*i+k;
return que(i+k-m+1,i+k)+2*i+k;
}
int g(int k,int p){
// cout<<k<<" "<<p<<"\n";
int l=-inf,r=inf,res=0;
while(l<=r){
int mid=(l+r)>>1;
// cout<<mid<<":\n";
if(f(k,mid)<=p){
// cout<<"yes\n";
res=mid;
l=mid+1;
}
else r=mid-1;
}
// cout<<res<<"\n";
return res;
}
void solve(){
memset(F,0x3f,sizeof(F));
scanf("%s",s);
n=strlen(s);
int cnt=-1;
for(int i=0;i<n;i++){
if(s[i]=='('){
cnt++;
F[cnt][0]=i-2*cnt;
}
}
m=cnt+1;
for(int i=0;i<m;i++) F[i+m][0]=F[i][0]+n-2*m;
for(int j=1;j<=19;j++) for(int i=0;i+(1<<j)-1<=2*m-1;i++) F[i][j]=min(F[i][j-1],F[i+(1<<(j-1))][j-1]);
int q;
read(q);
while(q--){
int l,r,k;
read(k),read(l),read(r);
write(g(k,r)-g(k,l-1)),et;
}
}
int main(){
for(int i=2;i<maxn<<1;i++) lg[i]=lg[i>>1]+1;
int t=1;
read(t);
while(t--) solve();
}
详细
Test #1:
score: 100
Accepted
time: 6ms
memory: 19992kb
input:
3 (()) 3 0 -3 2 1 -2 3 2 0 0 ))()( 3 0 -3 4 2 1 3 3 -4 -1 ))()(()( 4 1234 -5678 9012 123 -456 789 12 -34 56 1 -2 3
output:
3 3 0 4 1 1 7345 623 45 3
result:
ok 10 lines
Test #2:
score: -100
Runtime Error
input:
5564 ()()(((() 16 0 -825489608 537105171 0 481386502 824237183 0 -32590250 515314371 0 -634830457 908018223 3 -494274112 299679416 125527658 81646800 208166552 632660143 -774899605 -551752339 4 -874787302 127206822 4 -102348267 122390255 2 -881139944 898929361 0 -656262874 -233671414 111787130 -5925...