求乙個被memset卡時的人的心理陰影面積
嗯。。多叉樹。。考試的時候想成二叉樹了
兩個人肯定盡量去堵對方的路
所以他們一定會在乙個點相遇
如果這個點還有其他分枝,按最優原則分配給兩個人:
如果兩個人走過的總邊數為奇數,那麼相遇後,下乙個選擇的人是yjq,反之為hja。每個人選擇當前可以選擇的分枝中子樹權值最大的乙個。所以預處理以每個點為根的子樹的大小
這個題最麻煩的是分類求相遇點。。
總的思路:
求lca得到經過的邊數
找相遇點以及到達相遇點上一步兩個人所處的點
分配答案
分配答案的函式裡我加了乙個memset。。然後tle了4個點。。。其實每次都修改,sort的時候只sort當前區間,是不用memset的。。。
**:
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=100000+10;
int n,m,cnt,ans,index;
int fist[maxn],nxt[maxn<<1],fa[maxn][22],deep[maxn],rank[maxn];
int zi[maxn];
struct hh
e[maxn<<1];
int dfs(int f,int t,int v)
void done()
int make_lca(int x,int y)
return fa[x][0];
}void build(int f,int t,int v)
; nxt[cnt]=fist[f];
fist[f]=cnt;
}int get_fa(int x,int j)
bool cmp(int x,int y)
void ask_ans(int mid,int x,int y,int lca,int first)
if(t==fa[mid][0]) rank[++cnt1]=zi[1]-zi[lca];
else rank[++cnt1]=zi[t]+e[i].v;
}sort(rank+1,rank+cnt1+1,cmp);
int i=2;
if(first) i=1;
for(;i<=cnt1;i+=2) ans+=rank[i];
}int main()
dfs(0,1,0);
done();
for(int i=1;i<=m;++i)
else
if(a==where) ka=0;
if(b==where) kb=0;
if(a==b) ka=kb=0;
ask_ans(where,ka,kb,lca,first);
printf("%d\n",ans);
}return
0;}
11 08隊內胡策
總結就是t3想錯直接翻車233.第二題給你兩個日期,問這兩個日期差了多少毫秒。兩行,每行乙個日期,日期格式保證為 yyyy mm dd hh mm ss這種形式。第二個日期時間一定比第乙個日期時間要大兩個日期的年份一定都是 21 世紀的年份。一行乙個整數代表毫秒數。2000 01 01 00 00 ...
隊內胡策 2017 10 15
輸入描述 乙個數 t 接下來 t 行,每行乙個長度為 n 的 01 串 輸出描述 乙個數 p 表示 dqs 消耗的神力 樣例輸入 2 000011 0101 樣例輸出 26 10 資料範圍及提示 1 t 50 60 1 n 1000 100 1 n 100000 純暴力,沒什麼技術含量,但是在這道題...
隊內胡策 2017 10 12
t1 t2 狀壓dp t3 原創題 函式求和 題目描述 有乙個含有 n 個數字的序列 a,元素標號 1 到 n。同時你有 n 個函式,標號為 1 到 n。第 i 個函式函式值為序列中下標為 li 到 ri 的元素和。現在你需要維護以下兩種操作 1 x y 將序列中下標為 x 的元素修改為 y2 s ...