社区讨论
关于时间复杂度
P3250[HNOI2016] 网络参与者 2已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mlungohy
- 此快照首次捕获于
- 2026/02/20 16:50 3 周前
- 此快照最后确认于
- 2026/02/20 17:07 3 周前
这段代码的时间复杂度为啥能过
CPP/*
* @Author: china_banana
* @Date: 2026-02-20 09:57:49
* @LastEditTime: 2026-02-20 11:27:34
*/
#include <bits/stdc++.h>
using namespace std;
#define N 100005
#define V 262145
#define M 200005
int n,m;
vector<int>G[N];
int dep[N],siz[N],wson[N],fa[N];
void dfs1(int u,int fath)
{
siz[u]=1;
fa[u]=fath;
dep[u]=dep[fath]+1;
for(auto v:G[u])
{
if(v==fath) continue;
else {
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[wson[u]]) wson[u]=v;
}
}
}
int dfn[N],id,top[N];
void dfs2(int u,int ltop)
{
dfn[u]=++id;
top[u]=ltop;
if(wson[u]) dfs2(wson[u],ltop);
for(auto v:G[u])
{
if(v==wson[u]||v==fa[u]) continue;
else dfs2(v,v);
}
}
namespace seg
{
struct node {
int l,r;
priority_queue<int>add,del;
}tr[V];
#define mid ((tr[root].l+tr[root].r)>>1)
#define ls(x) x<<1
#define rs(x) x<<1|1
void build(int root,int l,int r)
{
tr[root].l=l,tr[root].r=r;
tr[root].add.push(-1);
if(l==r) return;
else
{
build(ls(root),l,mid);
build(rs(root),mid+1,r);
}
}
void update(int root,int ql,int qr,int type,int v)
{
if(ql<=tr[root].l&&qr>=tr[root].r)
{
if(type==0) tr[root].add.push(v);
else tr[root].del.push(v);
}else
{
if(ql<=mid) update(ls(root),ql,qr,type,v);
if(qr>mid) update(rs(root),ql,qr,type,v);
}
}
void change(int root)
{
while(!tr[root].add.empty()&&!tr[root].del.empty()&&tr[root].add.top()==tr[root].del.top())
{
tr[root].add.pop();
tr[root].del.pop();
}
}
int query(int root,int x)
{
change(root);
if(tr[root].l==tr[root].r) return tr[root].add.top();
else {
int v=tr[root].add.top();
if(x<=mid) return max(query(ls(root),x),v);
else return max(query(rs(root),x),v);
}
}
}
pair<int,int>line[N];
using namespace seg;
void update_path(int a,int b,int v,int type)
{
int len=0;
while(top[a]!=top[b])
{
if(dep[top[a]]<dep[top[b]]) swap(a,b);
line[++len]={dfn[top[a]],dfn[a]},a=fa[top[a]];
}
if(dep[a]>dep[b]) swap(a,b);
line[++len]={dfn[a],dfn[b]};
sort(line+1,line+len+1);
for(int i=1;i<=len;++i)
if(line[i-1].second+1<=line[i].first-1) update(1,line[i-1].second+1,line[i].first-1,type,v);
if(line[len].second+1<=n) update(1,line[len].second+1,n,type,v);
}
struct question {
int a,b,v;
}ques[M];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<n;++i)
{
int u,v;cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
for(int i=1;i<=m;++i)
{
int type;cin>>type;
if(type==0) {
int a,b,v;cin>>a>>b>>v;
update_path(a,b,v,type);
ques[i]={a,b,v};
}else if(type==1) {
int t;cin>>t;
int a,b,v;
a=ques[t].a,b=ques[t].b,v=ques[t].v;
update_path(a,b,v,type);
}else {
int x;cin>>x;
cout<<query(1,dfn[x])<<"\n";
}
}
return 0;
}
```cpp
回复
共 6 条回复,欢迎继续交流。
正在加载回复...