題目:
題解:其實看到和路徑有關的就應該想到點分治。
我們找出重心之後遍歷每一棵子樹得到它的
然後我們按x排序,維護兩個頭尾指標不斷把滿足條件的加入trie,然後把左邊的放進trie裡查詢。
但是還有乙個問題,所取的兩個點不能位於同一棵子樹!!!
我yy了乙個做法。我們在用三元組來記錄
然後往trie裡插的時候,每條邊保留兩個ch表示有哪個子樹的點從trie往下經過了這裡。必須保證這兩個ch不同。
然後查詢的時候就判斷就行了。注意任何時刻往下走的時候都要判斷可行性,否則直接返回-1.
**:
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #includeview code10 #include11 #include
12#define inf 1000000000
13#define maxn 250000+5
14#define maxm 8000000+5
15#define eps 1e-10
16#define ll long long
17#define ull unsigned long long
18#define pa pair19
#define for0(i,n) for(int i=0;i<=(n);i++)
20#define for1(i,n) for(int i=1;i<=(n);i++)
21#define for2(i,x,y) for(int i=(x);i<=(y);i++)
22#define for3(i,x,y) for(int i=(x);i>=(y);i--)
23#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
24#define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
25#define mod 1000000007
26#define lch k<<1,l,mid
27#define rch k<<1|1,mid+1,r
28#define sqr(x) (x)*(x)
29using
namespace
std;
30 inline int
read()
3134
while(ch>='
0'&&ch<='9')
35return x*f;36}
37int n,m,k,cnt,tot,head[maxn],v[maxn],w[maxn],t[maxm][2][3],s[maxn],f[maxn],sum,rt,ans=-1;38
bool
del[maxn];
39struct edgee[2*maxn];
40struct reca[maxn];
41 inline bool cmp(rec a,rec b)
42 inline void add(int x,int
y)43
;head[x]=tot;
45 e[++tot]=(edge);head[y]=tot;46}
47 inline void insert(int y,int
ch)4857}
58 inline int query(int y,int
ch)5971}
72return
ret;
73}
74 inline void getdep(int x,int fa,int w1,int w2,int
w3)75
;77 for4(i,x)if(!del[y]&&y!=fa)getdep(y,x,w1+v[y],w2^w[y],w3);78}
79 inline void getrt(int x,int
fa)80
88 f[x]=max(f[x],sum-s[x]);
89if(f[x]x;90}
91 inline void work(int
x)92
102 for1(i,cnt)if(a[i].x>=k)ans=max(ans,a[i].y);
103 for0(i,tot)t[i][0][0]=t[i][0][1]=t[i][0][2]=t[i][1][0]=t[i][1][1]=t[i][1][2]=0
;104 tot=0
;105 for4(i,x)if(!del[y])
106111
}
112int
main()
113
Tsinsen A1486 樹 樹分治 字典樹
傳送門 tsinsen a1486.樹 題意 給你一棵樹 n 1e5 每個點有乙個權值和喜歡不喜歡之分,找出一條路徑至少包含k個喜歡的點,而且異或和最大 思路 樹分治,同時維護字典樹 字典樹每個點維護乙個喜歡的點數的最大值 時間複雜度 nlogn 30 include using namespace...
1486 陣列異或操作
題目描述 給你兩個整數,n 和 start 陣列 nums 定義為 nums i start 2 i 下標從 0 開始 且 n nums.length 請返回 nums 中所有元素按位異或 xor 後得到的結果。示例 1 輸入 n 5,start 0 輸出 8 解釋 陣列 nums 為 0,2,4,...
1486 陣列異或操作
給你兩個整數,n 和 start 陣列 nums 定義為 nums i start 2 i 下標從 0 開始 且 n nums.length 請返回 nums 中所有元素按位異或 xor 後得到的結果。示例 1 輸入 n 5,start 0 輸出 8 解釋 陣列 nums 為 0,2,4,6,8 其...