1 条题解
-
0
#include<bits/stdc++.h>//sscanf非常耗时间(70分): using namespace std; #define lc(p) tr[p].ls #define rc(p) tr[p].rs const int N=1e5+10; char s[1110000],ss[110],cc; struct node { int op,ls,rs,t,d,ck; }tr[2*N];int trlen,n; int sta[2*N];int tp; void predfs(int p) { if(p<=n) return ; predfs(lc(p));predfs(rc(p)); int d1=tr[lc(p)].d ^ tr[lc(p)].t; int d2=tr[rc(p)].d ^ tr[rc(p)].t; tr[p].d=(tr[p].op==1)?(d1 & d2):(d1 | d2); } void dfs(int p,int fa) { tr[p].ck+=tr[fa].ck; if(p<=n){return ;} int d1=tr[lc(p)].d ^ tr[lc(p)].t; int d2=tr[rc(p)].d ^ tr[rc(p)].t; if(tr[p].op==1 && d1==0) tr[rc(p)].ck++; if(tr[p].op==1 && d2==0) tr[lc(p)].ck++; if(tr[p].op==2 && d1==1) tr[rc(p)].ck++; if(tr[p].op==2 && d2==1) tr[lc(p)].ck++; dfs(lc(p),p);dfs(rc(p),p); } int main() { memset(tr,0,sizeof(tr)); cin.getline(s,1000010); scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&tr[i].d); trlen=n;char *st=s; int len=strlen(s); while(st<s+len) { sscanf(st,"%s",ss); if(ss[0]=='x') { int x;sscanf(ss,"%c%d",&cc,&x); ++tp;sta[tp]=x; } else if(ss[0]=='!') tr[sta[tp]].t^=1; else if(ss[0]=='&') { ++trlen;tr[trlen]={1,sta[tp],sta[tp-1],0,0,0}; tp--; tp--; ++tp;sta[tp]=trlen; } else if(ss[0]=='|') { ++trlen;tr[trlen]={2,sta[tp],sta[tp-1],0,0,0}; tp--; tp--; ++tp;sta[tp]=trlen; } st+=strlen(ss)+1; } predfs(trlen); dfs(trlen,0); int q;scanf("%d",&q); int ans=tr[trlen].d ^ tr[trlen].t; while(q--) { int x;scanf("%d",&x); if(tr[x].ck) printf("%d\n",ans); else printf("%d\n",!ans); } return 0; }#include<bits/stdc++.h>//标程 using namespace std; #define lc(p) tr[p].ls #define rc(p) tr[p].rs const int N=1e5+10; char s[1110000],ss[110],cc; struct node { int op,ls,rs,t,d;bool ck; }tr[2*N];int trlen,n; void predfs(int p) { if(p<=n) return ; predfs(lc(p));predfs(rc(p)); int d1=tr[lc(p)].d ^ tr[lc(p)].t; int d2=tr[rc(p)].d ^ tr[rc(p)].t; tr[p].d=(tr[p].op==1)?(d1 & d2):(d1 | d2); } void dfs(int p,int fa) { tr[p].ck|=tr[fa].ck; if(p<=n){return ;} int d1=tr[lc(p)].d ^ tr[lc(p)].t; int d2=tr[rc(p)].d ^ tr[rc(p)].t; if(tr[p].op==1) { if(d1==0) tr[rc(p)].ck=1; if(d2==0) tr[lc(p)].ck=1; } if(tr[p].op==2) { if(d1==1) tr[rc(p)].ck=1; if(d2==1) tr[lc(p)].ck=1; } dfs(lc(p),p);dfs(rc(p),p); } int main() { memset(tr,0,sizeof(tr)); cin.getline(s,1000010); scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&tr[i].d); trlen=n; stack<int> sta; for(int i=0;s[i];i++) { if(s[i]=='x') { i++; int x=0;while(s[i]!=' ')x=x*10+s[i]-'0',i++; sta.push(x); } else if(s[i]=='!') tr[sta.top()].t^=1,i++; else if(s[i]=='&') { int x=sta.top();sta.pop(); int y=sta.top();sta.pop(); tr[++trlen]={1,x,y,0,0,0}; sta.push(trlen); i++; } else if(s[i]=='|') { int x=sta.top();sta.pop(); int y=sta.top();sta.pop(); tr[++trlen]={2,x,y,0,0,0}; sta.push(trlen); i++; } } predfs(trlen); dfs(trlen,0); int q;scanf("%d",&q); int ans=tr[trlen].d ^ tr[trlen].t; while(q--) { int x;scanf("%d",&x); if(tr[x].ck) printf("%d\n",ans); else printf("%d\n",!ans); } return 0; }
- 1
信息
- ID
- 2006
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 63
- 已通过
- 21
- 上传者