• P3258 [JLOI2014]松鼠的新家 (简单的点差分)


    https://www.luogu.org/problemnew/show/P3258

    注意开始和最后结尾

      1 #include <bits/stdc++.h>
      2 #define read read()
      3 #define up(i,l,r) for(register int i = (l);i <= (r);i++)
      4 #define down(i,l,r) for(register int i = (l);i >= (r);i--)
      5 #define traversal_vedge(i) for(register int i = head[u]; i ;i = e[i].nxt)
      6 #define ll long long
      7 using namespace std;
      8 int read
      9 {
     10     int x = 0, f = 1; char ch = getchar();
     11     while(ch < 48 || ch > 57) {if(ch == '-')f = -1; ch = getchar();}
     12     while(ch >=48 && ch <=57) {x = 10 * x + ch - 48;ch = getchar();}
     13     return x * f; 
     14 }
     15 //--------------------------------------------------------------------
     16 const int N = 300005;
     17 int n,a[N];
     18 struct edge{
     19     int v,nxt;
     20 }e[N<<1]; int tot,head[N];
     21 void add(int u,int v) {e[++tot] = (edge){v,head[u]};head[u] = tot;}
     22 
     23 int dep[N],size[N],fa[N],top[N];
     24 int cnt[N];
     25 
     26 void dfs(int u)
     27 {
     28     dep[u] = dep[fa[u]]+1;
     29     size[u] = 1;
     30     top[u] = u;
     31     int hson_id = 0,hson_size = 0;
     32     traversal_vedge(i)
     33     {
     34         int v = e[i].v;
     35         if(v == fa[u]) continue;
     36         fa[v] = u;
     37         dfs(v);
     38         size[u] += size[v];
     39         if(size[v] > hson_size) hson_id = v,hson_size = size[v];
     40     }
     41     if(hson_id) top[hson_id] = u;
     42 }
     43 
     44 int find(int u)
     45 {
     46     if(top[u] == u) return u;
     47     top[u] = find(top[u]);
     48     return top[u];
     49 }
     50 
     51 int lca(int x,int y)
     52 {
     53     if(find(x) != find(y))
     54     {
     55         if(dep[top[x]] > dep[top[y]]) return lca(fa[top[x]],y);
     56         else return lca(x,fa[top[y]]);
     57     }
     58     return dep[x] > dep[y] ? y : x;
     59 }
     60 
     61 void dfs_tree(int u)
     62 {
     63     traversal_vedge(i)
     64     {
     65         int v = e[i].v;
     66         if(v == fa[u]) continue;
     67         dfs_tree(v);
     68         cnt[u] += cnt[v];
     69     }
     70 }
     71 
     72 void readdata()
     73 {
     74     n = read;
     75     up(i,1,n) a[i] = read;
     76     up(i,1,n-1)
     77     {
     78         int u = read, v = read;
     79         add(u,v);
     80         add(v,u);
     81     }
     82     dfs(1);
     83     up(i,1,n-1)
     84     {
     85         int u = a[i], v = a[i+1];
     86         //cnt[u]++; 
     87         cnt[fa[u]]++;
     88         cnt[v]++;
     89         int LCA = lca(u,v);
     90         cnt[LCA]--; cnt[fa[LCA]]--;
     91     }
     92     dfs_tree(1);
     93     up(i,1,n) 
     94     {
     95         if(i == a[1]) cnt[i]++;
     96         else if(i == a[n]) cnt[i]--;
     97         printf("%d
    ",cnt[i]);
     98     }
     99 }
    100 
    101 int main()
    102 {
    103     readdata();
    104     return 0;
    105 }
  • 相关阅读:
    WPF复杂形状按钮
    (WPF)360安全卫士界面设计
    WPF图标拾取器
    WPF透明窗体制作
    空间分析开源库GEOS
    GIS开源程序收集
    flask 链接 url_for()
    自定制404错误页码
    Flask 模板语言
    flask路由和视图和cookie
  • 原文地址:https://www.cnblogs.com/mzg1805/p/10416942.html
Copyright © 2020-2023  润新知