zoukankan      html  css  js  c++  java
  • [hdu4123]dfs区间化+RMQ

    题意:给一个树编号0~n-1,一个数组a[i]为节点i在树上走的最大距离(不重复点),然后求最大的区间,使得区间最大差异小于某个值。dfs求出每个数组,同时区间化。枚举区间左边界,右边界同样递增,类似单调队列,区间最值用RMQ查询(常数小)。

      1 #pragma comment(linker, "/STACK:10240000,10240000")
      2 
      3 #include <iostream>
      4 #include <cstdio>
      5 #include <algorithm>
      6 #include <cstdlib>
      7 #include <cstring>
      8 #include <map>
      9 #include <queue>
     10 #include <deque>
     11 #include <cmath>
     12 #include <vector>
     13 #include <ctime>
     14 #include <cctype>
     15 #include <set>
     16 
     17 using namespace std;
     18 
     19 #define mem0(a) memset(a, 0, sizeof(a))
     20 #define lson l, m, rt << 1
     21 #define rson m + 1, r, rt << 1 | 1
     22 #define define_m int m = (l + r) >> 1
     23 #define Rep(a, b) for(int a = 0; a < b; a++)
     24 #define lowbit(x) ((x) & (-(x)))
     25 #define constructInt4(name, a, b, c, d) name(int a = 0, int b = 0, int c = 0, int d = 0): a(a), b(b), c(c), d(d) {}
     26 #define constructInt3(name, a, b, c) name(int a = 0, int b = 0, int c = 0): a(a), b(b), c(c) {}
     27 #define constructInt2(name, a, b) name(int a = 0, int b = 0): a(a), b(b) {}
     28 
     29 typedef double db;
     30 typedef long long LL;
     31 typedef pair<int, int> pii;
     32 typedef multiset<int> msi;
     33 typedef multiset<int>::iterator msii;
     34 typedef set<int> si;
     35 typedef set<int>::iterator sii;
     36 typedef vector<int> vi;
     37 
     38 const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
     39 const int dy[8] = {0, -1, 0, 1, -1, 1, 1, -1};
     40 const int maxn = 1e5 + 7;
     41 const int maxm = 1e5 + 7;
     42 const int maxv = 1e7 + 7;
     43 const int MD = 1e9 +7;
     44 const int INF = 1e9 + 7;
     45 const double PI = acos(-1.0);
     46 const double eps = 1e-10;
     47 
     48 template<class T> struct MonotoneQueue{
     49     deque<T> Q;
     50     MonotoneQueue<T>() { Q.clear(); }
     51     void clear() { Q.clear(); }
     52     bool empty() { return Q.empty(); }
     53     void add_back(T x) { while (!Q.empty() && !(Q.back() < x)) Q.pop_back(); Q.push_back(x); }
     54     void pop_front() { Q.pop_front(); }
     55     T back2() { if(Q.size() < 2) return T(); return *(Q.end() - 2); }
     56     T front() { return Q.front(); }
     57 };
     58 
     59 template<class edge> struct Graph {
     60     vector<vector<edge> > adj;
     61     Graph(int n) { adj.clear(); adj.resize(n + 5); }
     62     Graph() { adj.clear(); }
     63     void resize(int n) { adj.resize(n + 5); }
     64     void add(int s, edge e){ adj[s].push_back(e); }
     65     void del(int s, edge e) { adj[s].erase(find(iter(adj[s]), e)); }
     66     void clear() { adj.clear(); }
     67     vector<edge>& operator [](int t) { return adj[t]; }
     68 };
     69 
     70 Graph<int> G, W;
     71 
     72 
     73 
     74 int maxd, id, d, n, m;
     75 int dis[maxn], t[maxn], maxf[maxn][20], minf[maxn][20];
     76 bool vis[maxn];
     77 
     78 void DFS(int node) {
     79     vis[node] = true;
     80     dis[node] = max(dis[node], d);
     81     if (d > maxd) {
     82         maxd = d;
     83         id = node;
     84     }
     85     for (int i = 0; i < G[node].size(); i++) {
     86         int u = G[node][i];
     87         if (!vis[u]) {
     88             d += W[node][i];
     89             DFS(u);
     90             d -= W[node][i];
     91         }
     92     }
     93 }
     94 
     95 void InitRMQ() {
     96     for (int i = 1; i <= n; i++) maxf[i][0] = minf[i][0] = dis[i];
     97     for (int j = 1; (1 << j) <= n; j++) {
     98         for (int i = 1; i + (1 << j) - 1 <= n; i++) {
     99             maxf[i][j] = max(maxf[i][j - 1], maxf[i + (1 << (j - 1))][j - 1]);
    100             minf[i][j] = min(minf[i][j - 1], minf[i + (1 << (j - 1))][j - 1]);
    101         }
    102     }
    103 }
    104 int RMQ_max(int L, int R) {
    105     int x = t[R - L + 1];
    106     return max(maxf[L][x], maxf[R - (1 << x) + 1][x]);
    107 }
    108 int RMQ_min(int L, int R) {
    109     int x = t[R - L + 1];
    110     return min(minf[L][x], minf[R - (1 << x) + 1][x]);
    111 }
    112 
    113 int solve(int q) {
    114     int L = 1, ans = 0;
    115     for (int R = 1; R <= n; R++) {
    116         while (RMQ_max(L, R) - RMQ_min(L, R) > q) L++;
    117         ans = max(ans, R - L + 1);
    118     }
    119     return ans;
    120 }
    121 
    122 int main() {
    123     //freopen("in.txt", "r", stdin);
    124     for (int i = 1; i <= 50000; i++) {
    125         int j = 0;
    126         while ((1 << (j + 1)) <= i) j++;
    127         t[i] = j;
    128     }
    129     while (cin >> n >> m, n || m) {
    130         G.clear(); G.resize(n);
    131         W.clear(); W.resize(n);
    132         for (int i = 1, u, v, w; i < n; i++) {
    133             scanf("%d%d%d", &u, &v, &w);
    134             G.add(u, v);
    135             W.add(u, w);
    136             G.add(v, u);
    137             W.add(v, w);
    138         }
    139         mem0(vis);
    140         maxd = -1;
    141         DFS(1);
    142         int node1 = id;
    143         mem0(vis);
    144         maxd = -1;
    145         DFS(id);
    146         int node2 = id;
    147         mem0(dis);
    148         mem0(vis);
    149         DFS(node1);
    150         mem0(vis);
    151         DFS(node2);
    152         InitRMQ();
    153         for (int i = 0, q; i < m; i++) {
    154             scanf("%d", &q);
    155             printf("%d
    ", solve(q));
    156         }
    157     }
    158     return 0;
    159 }
    View Code
  • 相关阅读:
    时空地图TimeGIS 可编辑ArcGIS的Shape矢量文件的地理信息系统
    快手 KSCAD 5.0 矢量图形设计软件
    DWG2SHP DXF2SHP 如何把AutoCAD的DWG,DXF文件转换为Esri ArcGIS的Shape文件
    火了网址
    GIS 网站参考
    快手4.0 (KSCAD)
    用词法分析器Flex过滤日志
    编译器工具 Flex Bison for Windows 简单入门例子
    针对于网络安全领域中基于PCAP流量的数据集
    RBAC权限框架_MVC权限框架
  • 原文地址:https://www.cnblogs.com/jklongint/p/4418993.html
Copyright © 2011-2022 走看看