玄关(6点以后统一关注,有课)P10473 40分QAQAQAQ
  • 板块学术版
  • 楼主____QAQ____
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/4 15:50
  • 上次更新2024/10/4 17:25:13
查看原帖
玄关(6点以后统一关注,有课)P10473 40分QAQAQAQ
1123756
____QAQ____楼主2024/10/4 15:50

记录1

#include<bits/stdc++.h>
using namespace std;
struct tree {
	long long ls;
	long long rs;
	char op='A';
	long long num=pow(2,50)+1;
} node[50];
struct Nxt {
	char op;
	long long id;
} nxt[50];
long long qaq[50];
long long poo[50];
long long top=1;
string s;
bool check(long long id){
	if(s[id]=='('||s[id]==')')return true;
	else return false;
}
long long find(long long l,long long r){
	long long k=0;
	for(long long i=l;i<=r;i++){
		if(s[i]=='('){i=qaq[i];continue;}
		if(s[i]=='-'&&!(s[i-1]<='9'&&s[i-1]>='0'))continue;
		if(s[i]=='+'||s[i]=='-')k=i;
	}
	if(k)return k;
	for(long long i=l;i<=r;i++){
		if(s[i]=='('){i=qaq[i];continue;}
		if(s[i]=='*'||s[i]=='/')k=i;
	}
	if(k)return k;
	for(long long i=l;i<=r;i++){
		if(s[i]=='('){i=qaq[i];continue;}
		if(s[i]=='^')k=i;
	}
	return k;
}
long long getnum(long long l,long long r){
	long long num=0;
	for(long long i=l;i<=r;i++){
		num=num*10+s[i]-'0';
	}
	return num;
}
void buildtree(long long fa,long long l,long long r,long long id) {
	long long k,l1=l,r1=r;
	while(s[l1]=='('&&qaq[l1]==r1)l1++,r1--;
	k=find(l1,r1);
	if(s[l1]=='-'){
		node[id].num=0-getnum(l1+1,r1);
		return ;
	}
//	cout<<l1<<" "<<r1<<endl<<k<<endl;
	if(k==0){
//		cout<<l1<<" "<<r1<<endl;
		node[id].num=getnum(l1,r1);
		return ; 
	}
	node[id].op=s[k];
	node[id].ls=++top;
	buildtree(id,l1,k-1,top);
	node[id].rs=++top;
	buildtree(id,k+1,r1,top);
}
void del() {
	long long l=0,r=s.size()-1;
	stack<Nxt> st;
	for(long long i=l; i<=r; i++) {
		if(!check(i))continue;
		if(!st.empty()) {
			char op1=s[i];
			Nxt op2=st.top();
			qaq[op2.id]=i;
			if(int(op1)-int(op2.op)!=0) {
				st.pop();
				if(s[op2.id+1]=='('&&s[i-1]==')')poo[op2.id]=1,poo[i]=1;
			}
			else st.push({s[i],i});
		}
		else st.push({s[i],i});
	}
	string s2="";
	for(long long i=l; i<=r; i++) {
		if(!poo[i])s2+=s[i];
	}
	s=s2;
}
long long cal(long long a,long long b,char op){
	if(op=='+')return a+b;
	if(op=='-')return a-b;
	if(op=='*')return a*b;
	if(op=='/')return a/b;
	if(op=='^')return pow(a,b);
}
long long bfstree(long long root){
	if(root==0)return 0;
	if(node[root].ls==0&&node[root].rs==0)return node[root].num;
	return cal(bfstree(node[root].ls),bfstree(node[root].rs),node[root].op);
}
bool kong(tree A){
	if(A.num==pow(2,50)+1&&A.op=='A'&&A.ls==0&&A.rs==0)return true;
	else return false;
}
signed main() {
	cin>>s;
	del();
	buildtree(0,0,s.size()-1,1);
//	for(int i=1;!kong(node[i]);i++){
//		cout<<i<<":"<<node[i].op<<" "<<node[i].num<<" "<<node[i].ls<<" "<<node[i].rs<<endl;
//	}
	long long ans=bfstree(1);
	cout<<ans;
	return 0;
}

思路

建表达式树

采用特判处理负数

递归求解数值

2024/10/4 15:50
加载中...