题意:求最优情报中心的位置使得最大化净收益。
扯淡:
首先\(\%\)一波出题人,实在是神。。。。
其次我发现了有趣的东西:
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) {
}