BZOJ1103[POI2007]大都市meg 题解

题目大意:

  有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和;2.将一条边的权值改为0.

思路:

  用dfs序将树化为序列,在dfs序中我们会保存节点i进入时间come[i]和出去时间leave[i],这两个数之间的区间即为其子树。询问实为前缀和,可用树状数组记录。修改只会影响其子树(即区间),其他部分并不会改变(+1-1抵消了)。

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #define M 300000
 4 using namespace std;
 5
 6 int n,m,cnt,dfn,to[M],next[M],head[M],c[M],come[M],leave[M];
 7
 8 int read()
 9 {
10     int x=0,y=1;
11     char ch=getchar();
12     while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) y=-1;ch=getchar();}
13     while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-48;ch=getchar();}
14     return x*y;
15 }
16
17 void ins(int x,int y)
18 {
19      to[++cnt]=y,next[cnt]=head[x],head[x]=cnt;
20 }
21
22 void dfs(int x)
23 {
24      come[x]=++dfn;
25      for (int i=head[x];i;i=next[i]) dfs(to[i]);
26      leave[x]=dfn;
27 }
28
29 void add(int x,int y)
30 {
31      for (;x<=n;x+=x&-x) c[x]+=y;
32 }
33
34 int sum(int x)
35 {
36     int ans=0;
37     for (;x;x-=x&-x) ans+=c[x];
38     return ans;
39 }
40
41 int main()
42 {
43     int i,j,x,y;
44     n=read();
45     for (i=1;i<n;i++) x=read(),y=read(),ins(x,y);
46     dfs(1);
47     m=read();
48     for (i=2;i<=n;i++) add(come[i],1),add(leave[i]+1,-1);
49     for (i=1;i<n+m;i++)
50     {
51         char ch=getchar();
52         while (ch<‘A‘ || ch>‘Z‘) ch=getchar();
53         if (ch==‘W‘) printf("%d\n",sum(come[read()]));
54         else x=read(),y=read(),add(come[y],-1),add(leave[y]+1,1);
55     }scanf("%d",&n);
56     return 0;
57 }
时间: 2024-08-06 07:56:06

BZOJ1103[POI2007]大都市meg 题解的相关文章

bzoj1103[POI2007]大都市meg

bzoj1103[POI2007]大都市meg 题意: 一个n点树,根节点为1,初始时全部边为土路,共n-m+1次操作,每次可将一条边改为公路或求根节点到某个节点要几个多少土路.n,m≤250000 题解: 先求出DFS序,进入节点在时间点的权值为1,离开节点在时间点的权值为-1,如果把公路转成土路就将这条边的左端点的进入时间权值和离开时间权值都置为0,如果询问则输出节点进入时间前缀和.求前缀和及修改的操作可以用树状数组维护. 代码: 1 #include <cstdio> 2 #includ

[bzoj1103][POI2007]大都市meg(树状数组+dfs序)

1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2031  Solved: 1069[Submit][Status][Discuss] Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路.从每个村庄都恰好有一条路径到

BZOJ-1103 [POI2007]大都市meg 【DFS序+树状数组】

Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双 向的土路.从每个村庄都恰好有一条路径到达村庄1(即比特堡).并且,对于每个村庄,它到比特堡的路径恰好 只经过编号比它的编号小的村庄.另外,对于所有道路而言,它们都不在除村庄以外的其他地点相遇.在这个未开 化的地方,从来没有过高架桥和地下铁道.随着时间的推移,越来

【dfs序】【树状数组】bzoj1103 [POI2007]大都市meg

预处理出每个点到根节点的土路数,插到一个树状数组里,然后每次修改只会对子树中的节点造成影响,于是相当于区间修改.点查询了. #include<cstdio> using namespace std; #define N 250001 int n,en,v[N<<1],next[N<<1],first[N],m; void AddEdge(const int &U,const int &V) { v[++en]=V; next[en]=first[U];

【BZOJ 1103】 [POI2007]大都市meg

1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1292  Solved: 660 [Submit][Status] Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路.从每个村庄都恰好有一条路径到达村庄1(即比特

bzoj 1103: [POI2007]大都市meg

1103: [POI2007]大都市meg Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双 向的土路.从每个村庄都恰好有一条路径到达村庄1(即比特堡).并且,对于每个村庄,它到比特堡的路径恰好 只经过编号比它的编号小的村庄.另外,对于所有道路而言,它们都不在除村庄以外的其他地点相遇.在这个未开 化的地方,从来

【BZOJ-1103】大都市meg 树状数组 + DFS序

1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2009  Solved: 1056[Submit][Status][Discuss] Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双向的土路.从每个村庄都恰好有一条路径到

数据结构(线段树):BZOJ 1103 [POI2007]大都市meg

1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1791  Solved: 925[Submit][Status][Discuss] Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双 向的土路.从每个村庄都恰好有一条路径

BZOJ 1103: [POI2007]大都市meg( 树链剖分 )

早上数学考挂了...欲哭无泪啊下午去写半个小时政治然后就又可以来刷题了.. 树链剖分 , 为什么跑得这么慢... --------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #define rep( i , n ) for( int