[NOI 2018]情报中心

题意:求最优情报中心的位置使得最大化净收益。

扯淡:

首先\(\%\)一波出题人,实在是神。。。。

其次我发现了有趣的东西:

C 国即将向D 国发动一场秘密袭击。 ---九省联考 秘密袭击

C 国和D 国近年来战火纷飞。最近,C 国成功地渗透进入了D 国的一个城市。 ---NOI2018 情报中心

看来 C 国成功了,嗯。。。

思路:

还没写完,先存一下代码:


#include <bits/stdc++.h>
using namespace std ;
#define ll long long
typedef pair<int,int> P;
#define fir first
#define sec second
const int maxn = 200010;

inline bool cmin(int &x,int &y) {
    return x > y ? x = y,1 : 0;
}

inline bool cmax(int &x,int &y){
    return x < y ? x = y,1 : 0;
}
inline int read() {
    int q=0,f=1;char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;ch=getchar();
    }
    while(isdigit(ch)){
        q=q*10+ch-'0';ch=getchar();
    }
    return q*f;
}

inline int pow(int a,int b) {
    int res = 1;
    while(b){
        if(b & 1) {
            res = (ll)res * a % mod;
        }
        a = (ll)a * a % mod;
        b >>= 1;
    }
    return res;
}
int dep[maxn];
int siz[maxn];
int son[maxn];
int fa[maxn];
int dis[maxn];
int cnt;
inline void dfs1(int x) {
    siz[x] = 1;
    son[x] = 0;
    dep[x] = dep[fa[x]] + 1;
    for(int i = head[x];i;i=e[i].nxt) {
        dis[i] = dis[fa[x]] + e[i].w;
        fa[i] = x;
        dfs1(i);
        siz[x] += siz[i];
        if(siz[i] > siz[son[x]]) {
            son[x] = i;
        }
    }
}
int sa[maxn];
int L[maxn];
int top[maxn];
int R[maxn];
inline void dfs2(int x) {
    sa[L[x] = ++cnt] = x;
    if(!top[x]) top[x] = x;
    if(son[x]) {
        top[son[x]] = top[x];
        dfs2(son[x]);
        for(int i = head[x];i;i=e[i].nxt ) {
            if(i != son[x]) {
                dfs2(i);
            }
        }
    }
    R[x] = cnt;
}
inline int jmp(int x,int y) {
    while(top[x] != top[y]) {
        if(fa[x = top[x]] == y) {
            return x;
        }
        else x = fa[x];
    }
    return son[y];
}

inline int LCA(int x,int y) {
    while(top[x] ^ top[y]) {
        dep[top[x]] > dep[top[y]] ? x = fa[top[x]] : y = fa[top[y]];
    }
    return dep[x] < dep[y] ? x : y;
}

inline void work() { //第一部分 
    dfs1(1);
    cnt = 0;
    dfs2(1);
}

struct ask{
    int a,b,c,d;
    ll val;
}q[maxn];

vector<pair<int,ll>> in[maxn];

int p[maxn];
int st[maxn];
int pos[maxn];
int tid;

struct Segment_Tree{
    ll mx[maxn<<2];
    
    int vis[maxn<<2];
    inline void modify(int l,int r,int now,int _pos,int v) {
        if(vis[i] != tid) {
            vis[i] = tid;
            mx[i] = -INF;
        }
        cmax(mx[i],v);
        if(l == r) {
            cmax(mx[i],v);
        }
        else {
            int mid = (l + r) >> 1;
            if(_pos <= mid) {
                modify(l,mid,now<<1,_pos,v);
            }
            else {
                modify(mid+1,r,now<<1|1,_pos,v);
            }
        }
    }
    
    inline ll query(int l,int r,int now,int L,int R){
        if(vis[i] != tid) {
            return -INF;
        }
        if(L <= l && r <= R ) {
            return mx[i];
        }
        int mid = (l + r) >> 1;
        int res = -INF;
        if(L <= mid) {
            cmax(res,query(l,mid,now<<1,L,R));
        }
        if(mid < R) {
            cmax(res,query(mid+1,r,now<<1|1,L,R));
        }
        return res;
    }
}Tree1,Tree2;

inline ll _function(pair<int,ll> &x,pair<int,ll> &y) {
    return (x.sec + y.sec + dis[x.fir] + dis[y.fir] - (dis[LCA(x.fir,y.fir)] << 1)) >> 1;
}

struct dl{
    pair<int,ll> a,b;
}de[maxn];

int nw;

inline void insert(int x) {
    
}

猜你喜欢

转载自www.cnblogs.com/akoasm/p/9445208.html