多好的莫队啊
2025-10-18 17:30:22
发布于:云南
9阅读
0回复
0点赞
不用可惜了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int c[200005];
vector<int> ve[200005];
int n,q,in[200005],out[200005],posc[200005],ts,fr[200005],cn[200005];
bool vis[200005];
struct node{
int l,r,t,idx;
}qry[200005];
int bs,ans[200005];
bool cmp(node a,node b){
if(a.l / bs != b.l / bs) return a.l < b.l;
return (a.l / bs % 2) ? (a.r > b.r) : (a.r < b.r);
}
stack<pair<int,int>> st;
void dfs(int rt){
st.push({rt,-1});
ts = 0;
memset(vis,0,sizeof vis);
while(!st.empty()){
auto [u,p] = st.top();
if(!vis[u]){
vis[u] = 1;
in[u] = ++ts;
posc[ts] = c[u];
for(auto v : ve[u]){
if(v != p) st.push({v,u});
}
}else{
out[u] = ts;
st.pop();
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
for(int i = 1;i <= n;i++) cin >> c[i];
for(int i = 1;i < n;i++){
int u,v; cin >> u >> v;
ve[u].push_back(v);
ve[v].push_back(u);
}
dfs(1);
for(int i = 1;i <= q;i++){
int u, t;
cin >> u >> t;
qry[i] = {in[u],out[u],t,i};
}
bs = sqrt(n) + 1;
sort(qry + 1,qry + q + 1,cmp);
int cl = 1,cr = 0;
for(int i = 1;i <= q;i++){
int l = qry[i].l,r = qry[i].r;
int t = qry[i].t,idx = qry[i].idx;
while(cl > l){
cl--;
int x = posc[cl];
int of = fr[x];
fr[x]++;
cn[of + 1]++;
}
while(cr < r){
cr++;
int x = posc[cr];
int of = fr[x];
fr[x]++;
cn[of + 1]++;
}
while(cl < l){
int x = posc[cl];
int of = fr[x];
cn[fr[x]]--;
fr[x]--;
cl++;
}
while(cr > r){
int x = posc[cr];
int of = fr[x];
cn[of]--;
fr[x]--;
cr--;
}
ans[idx] = (t > (r - l + 1)) ? 0 : cn[t];
}
for(int i = 1;i <= q;i++) cout << ans[i] << "\n";
return 0;
}
全部评论 3
诶我曹怎么实现的这个
6天前 来自 广东
0(纯恶意
6天前 来自 广东
0超我题解有意思吗(
6天前 来自 广东
0并没超((
5天前 来自 云南
0纯恶意(((
5天前 来自 广东
0












有帮助,赞一个