标签:
8 10 bannerofcommand 600 2 aegisofthelegion fiendishcodex aegisofthelegion 400 2 nullmagicmantle crystallinebracer fiendishcodex 465 1 amplifyingtome nullmagicmantle 450 0 crystallinebracer 100 2 rubycrystal rejuvenationbead amplifyingtome 435 0 rubycrystal 400 0 rejuvenationbead 150 0 B crystallinebracer Q fiendishcodex Q bannerofcommand B nullmagicmantle Q aegisofthelegion B aegisofthelegion Q bannerofcommand Q crystallinebracer B bannerofcommand Q bannerofcommand
900 2350 400 1500 650 3000
思路:
这题很难写,用了dfs序搞出每件装备的范围建线段树,然后线段树实现区间赋0,记录区间和
购买一件装备时把他管辖的区间全都标记为拥有,然后区间赋0,向上更新(不用向下管了,不会查询到的)
预处理每件装备的总钱数
然后查询时如果装备已经拥有,就输出预处理得到的总钱数,如果没有则区间查询它所管辖的区间
970ms险过。。
/* *********************************************** Author :devil Created Time :2016/5/31 10:58:16 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; const int N=10010; int n,m,r,ys[N],tree[N<<2]; map<string,int>mp; string s; bool ru[N]; struct wq { bool f; int v; int sum; int l,r; }u[N]; vector<int>eg[N]; void dfs(int x) { u[x].l=++r; int ans=u[x].v; ys[r]=x; for(int i=0;i<eg[x].size();i++) { dfs(eg[x][i]); ans+=u[eg[x][i]].sum; } u[x].r=r; u[x].sum=ans; } void build(int node,int l,int r) { if(l==r) { tree[node]=u[ys[l]].v; return ; } int m=(l+r)>>1; build(node<<1,l,m); build(node<<1|1,m+1,r); tree[node]=tree[node<<1]+tree[node<<1|1]; } void update(int node,int l,int r,int L,int R) { if(l>=L&&r<=R) { tree[node]=0; return ; } int m=(l+r)>>1; if(m>=L) update(node<<1,l,m,L,R); if(m<R) update(node<<1|1,m+1,r,L,R); tree[node]=tree[node<<1]+tree[node<<1|1]; } int query(int node,int l,int r,int L,int R) { if(l>=L&&r<=R) return tree[node]; int m=(l+r)>>1,ans=0; if(m>=L) ans+=query(node<<1,l,m,L,R); if(m<R) ans+=query(node<<1|1,m+1,r,L,R); return ans; } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&m)) { mp.clear(); r=0; memset(ru,0,sizeof(ru)); for(int i=1;i<=n;i++) eg[i].clear(); int cnt=0,k; for(int i=0;i<n;i++) { cin>>s; if(mp.find(s)==mp.end()) mp[s]=++cnt; int p=mp[s]; u[p].f=0; scanf("%d",&u[p].v); scanf("%d",&k); while(k--) { cin>>s; if(mp.find(s)==mp.end()) mp[s]=++cnt; eg[p].push_back(mp[s]); ru[mp[s]]=1; } } for(int i=1;i<=n;i++) if(!ru[i]) dfs(i); build(1,1,n); char str[2]; while(m--) { scanf("%s",str); cin>>s; int p=mp[s]; if(str[0]==‘B‘) { if(u[u[p].l].f) continue; for(int i=u[p].l;i<=u[p].r;i++) u[i].f=1; update(1,1,n,u[p].l,u[p].r); } else { if(u[u[p].l].f) printf("%d\n",u[p].sum); else printf("%d\n",query(1,1,n,u[p].l,u[p].r)); } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/d-e-v-i-l/p/5545154.html