社区讨论
TLE 72 pts,原因:树过高。求优化
P11186三目运算参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m28zn267
- 此快照首次捕获于
- 2024/10/14 20:26 去年
- 此快照最后确认于
- 2025/11/04 17:11 4 个月前
第 4 组大样例超时,TLE 72.
测了样例,发现是树的高度过高导致的。求优化?
代码:
CPP#include<bits/stdc++.h>
using namespace std;
long long n,q;
string s;
long long ntot = 1,ls[10000005],rs[10000005],ret[10000005],num[10000005];
long long addnode(long long u){
ntot++;
if(ls[u]){
rs[u] = ntot;
}else{
ls[u] = ntot;
}
return ntot;
}
long long maketree(long long Start,long long id){
long long End,tp,now = 0;
if(s[Start] != 'x'){
now = 0;
for(long long i = Start; s[i] >= '0' && s[i] <= '9'; i++){
now *= 10;
now += (s[i]-'0');
End = i;
}
ret[id] = 1;
num[id] = now;
}else{
bool flag;
flag = (s[Start+1] == '<');
now = 0;
for(long long i = Start+2; s[i] >= '0' && s[i] <= '9'; i++){
now *= 10;
now += (s[i]-'0');
End = i;
}
if(flag){
num[id] = now;
}else{
num[id] = -now;
}
ret[id] = 0;
for(long long i = End; i <= n; i++){
End = i;
if(s[i] == '?'){
tp = addnode(id);
i = maketree(i+1,tp);
if(i+1 <= n && s[i+1] == ':'){
tp = addnode(id);
i = maketree(i+2,tp);
End = i;
break;
}
}
}
}
return End;
}
long long dfs(long long now,long long x){
if(ret[now]){
return num[now];
}
if(num[now] < 0){
if(x > -num[now]){
return dfs(ls[now],x);
}else{
return dfs(rs[now],x);
}
}else{
if(x < num[now]){
return dfs(ls[now],x);
}else{
return dfs(rs[now],x);
}
}
}
long long bigg = 0;
void debug(long long now,long long dep){
bigg = max(dep,bigg);
if(ret[now]){
return;
}
debug(ls[now],dep+1);
debug(rs[now],dep+1);
return;
}
int main(){
freopen("expr4.in","r",stdin);
// freopen("expr4.out","w",stdout);
scanf("%*d%lld",&q);
cin>>s;
n = s.size();
s = " "+s;
maketree(1,1);
debug(1,1);
printf("%lld %lld",ntot,bigg);
// for(long long i = 1; i <= q; i++){
// static long long tpa;
// scanf("%lld",&tpa);
// printf("%lld\n",dfs(1,tpa));
// }
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...