Submission #3249092
Source Code Expand
#include <bits/stdc++.h>
typedef long long ll;
const int INF = 1e9;
const int MOD = 1e9+7;
const ll LINF = 1e18;
using namespace std;
#define dump(x) cout << #x << " = " << (x) << endl;
#define YES(n) cout << ((n) ? "YES" : "NO" ) << endl
#define Yes(n) cout << ((n) ? "Yes" : "No" ) << endl
#define POSSIBLE(n) cout << ((n) ? "POSSIBLE" : "IMPOSSIBLE" ) << endl
#define Possible(n) cout << ((n) ? "Possible" : "Impossible" ) << endl
#define possible(n) cout << ((n) ? "possible" : "impossible" ) << endl
#define SANKOU(n,a,b) cout << ((n) ? (#a) : (#b) ) << endl
#define FOR(i,a,b) for(ll i=(a);i<(b);++i)
#define REP(i,n) for(ll i=0;i<(n);++i)
#define REPR(i,n) for(ll i=n;i>=0;i--)
#define FOREACH(x,a) for(auto&& (x) : (a) )
#define WFA(d,v) REP(k,v)REP(i,v)REP(j,v)d[i][j]=min(d[i][j],d[i][k]+d[k][j])
#define SCOUT(x) cout<<(x)<<" "
#define ENDL cout<<endl
#define VECCIN(x) for(auto&youso_: (x) )cin>>youso_
#define VECIN2(x,y) REP(i,x.size())cin>>x[i]>>y[i]
#define VECCOUT(x) if(1){for(auto tt=x.begin();tt!=x.end();tt++){if(tt!=x.begin())cout<<" ";cout<<(*tt);}cout<<endl;}
#define ALL(obj) (obj).begin(),(obj).end()
#define EXIST(n,x) (find(ALL(n),x)!=n.end())
#define UNIQUE(obj) sort(ALL( obj )); obj.erase(unique(ALL(obj)),obj.end())
#define EN(x) if(1){cout<<#x<<endl;return 0;}
#define COUT(x) cout<<(x)<<endl
void CINT(){}
template <class Head,class... Tail>
void CINT(Head&& head,Tail&&... tail){
cin>>head;
CINT(move(tail)...);
}
#define CIN(...) int __VA_ARGS__;CINT(__VA_ARGS__)
#define LCIN(...) ll __VA_ARGS__;CINT(__VA_ARGS__)
#define SCIN(...) string __VA_ARGS__;CINT(__VA_ARGS__)
template <class T = ll>
T IN(){T x;cin>>x;return (x);}
template <class Head>
void VT(Head head){}
template <class Head,class Seco,class... Tail>
void VT(Head&& head,Seco&& seco,Tail&&... tail){
seco.resize(head);
VT(head,move(tail)...);
}
void VT2(){}
template <class Head,class... Tail>
void VT2(Head&& head,Tail&&... tail){
VECCIN(head);
VT2(move(tail)...);
}
template <class Head>
void VT3(Head&& head){}
template <class Head,class Seco,class... Tail>
void VT3(Head&& head,Seco&& seco,Tail&&... tail){
seco[head]=IN();
VT3(head,move(tail)...);
}
#define VC1(n,...) V __VA_ARGS__;VT(n,__VA_ARGS__);VT2(__VA_ARGS__); //aaabbbccc
#define VC2(n,...) V __VA_ARGS__;VT(n,__VA_ARGS__);REP(i,n)VT3(i,__VA_ARGS__); //abcabcabc
// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision; // cpp_int
#define P pair<ll,ll>
#define V vector<ll>
#define M map<ll,ll>
#define S set<ll>
#define pb(a) push_back(a)
#define mp make_pair
class LazySegmentTree{//遅延セグ木 初期値0で総和を出すやつ
public:
LazySegmentTree(int n,V v);
void addVal(int st,int en,int val,int k,int l,int r);
int calcVal(int st,int en,int k,int l,int r);//半開区間 3,6なら3,4,5の総和
void eval(int k,int l,int r);
V elements,lazy;
int pnum;
};
LazySegmentTree::LazySegmentTree(int n,V v){
pnum=1;while(pnum<n)pnum*=2;
elements=V(pnum*2-1,0);
lazy=V(pnum*2-1,0);
REP(i,n)
elements[i+pnum-1] = v[i];
REPR(i,pnum-2)
elements[i]=elements[i*2+1]+elements[i*2+2];
}
void LazySegmentTree::addVal(int st,int en,int val,int k=0,int l=0,int r=-1){
if(r<0)r=pnum;
eval(k,l,r);
if(en<=l || r<=st) return ;
if(st<=l && r<=en){
lazy[k] += (r-l) * val;
eval(k,l,r);
}else{
addVal(st,en,val,2*k+1,l,(l+r)/2);
addVal(st,en,val,2*k+2,(l+r)/2,r);
elements[k]=elements[2*k+1]+elements[2*k+2];
}
}
void LazySegmentTree::eval(int k,int l,int r){
if(!lazy[k])return ;
elements[k]+=lazy[k];
if(r-l>1){
lazy[2*k+1]+=lazy[k]/2;
lazy[2*k+2]+=lazy[k]/2;
}
lazy[k]=0;
}
int LazySegmentTree::calcVal(int st,int en,int k=0,int l=0,int r=-1) {
if(r<0)r=pnum;
eval(k,l,r);
if(en<=l || r<=st)return 0;
if(st<=l && r<=en)return elements[k];
int vl = calcVal(st,en,2*k+1,l,(l+r)/2);
int vr = calcVal(st,en,2*k+2,(l+r)/2,r);
return vl + vr;
}
class HeavyLightDecomposition{
public:
int n;
vector<V> g;
V rev, in, out, nxt, rin, size, depth;
LazySegmentTree lazy;
HeavyLightDecomposition(vector<V>& inp) :
n(inp.size()),
g(n),
rev(n, 0),
in(n, 0),
out(n, 0),
nxt(n, 0),
rin(n, 0),
size(n, 0),
depth(n, -1),
lazy(inp.size(), V(inp.size(), 0))
{
function<void(int, int)> dfs_ed = [&](int pos, int dep){
depth[pos]=dep;
for(auto ed : inp[pos])
if(depth[ed] == -1){
g[pos].pb(ed);
rev[ed] = pos;
dfs_ed(ed, dep + 1);
}
};
dfs_ed(0, 0);
function<void(int)> dfs_sz = [&](int v){
size[v] = 1;
for(auto &u: g[v]){
dfs_sz(u);
size[v] += size[u];
if(size[u] > size[g[v][0]])
swap(u, g[v][0]);
}
};
dfs_sz(0);
int t = 0;
function<void(int)> dfs_hld = [&](int v){
in[v] = t++;
rin[in[v]] = v;
for(auto u: g[v]){
nxt[u] = (u == g[v][0] ? nxt[v] : u);
dfs_hld(u);
}
out[v] = t;
};
dfs_hld(0);
}
P subtree(int x){
return make_pair(in[x], out[x]);
}
V subtree_path(int x){
return V(next(rin.begin(), in[x]), next(rin.begin(), out[x]));
}
P subsegment(int x){
return make_pair(in[nxt[x]], in[x] + 1);
}
V subsegment_path(int x){
return V(next(rin.begin(), in[nxt[x]]), next(rin.begin(), in[x] + 1));
}
vector<P> root_path_query(int x){
vector<P> ret;
ret.emplace_back(subsegment(x));
while(ret.back().first)
ret.emplace_back(subsegment(rev[rin[ret.back().first]]));
return ret;
}
int lca(int x, int y){
int sx = rin[subsegment(x).first];
int sy = rin[subsegment(y).first];
while(sx != sy){
if(depth[sx] > depth[sy])
x = rev[sx];
else
y = rev[sy];
sx = rin[subsegment(x).first];
sy = rin[subsegment(y).first];
}
return depth[x] < depth[y] ? x : y;
}
void add(int x){
lazy.addVal(in[x], in[x]+1, 1);
}
void sub(int x){
lazy.addVal(in[x], in[x]+1, -1);
}
int sum(int x){
P p = subtree(x);
return lazy.calcVal(p.first, p.second);
}
};
int main(){
CIN(n);
vector<V> v(n);
REP(i,n-1){
CIN(a,b);
v[a-1].pb(b-1);
v[b-1].pb(a-1);
}
HeavyLightDecomposition hld(v);
CIN(q);
int m = n + 100;//最大でいくつ先を見るか(木なら最大の深さ…etc)
int t = 1;
for(int i=1;i<=m;i<<=1)t++;
t--;
vector<V> next(n,V(t,-1));
auto dub = [&]{//ダブリングの下準備
auto func = [&](int pos,int num){
if(!num)return hld.rev[pos];//ここを適当に変えてください
return (next[pos][num-1]==-1?-1:next[next[pos][num-1]][num-1]);
};
REP(i,t)
REP(j,n)
next[j][i]=func(j,i);
};
auto calcdub = [&](int pos,int num){
//posからnum個先を計算する
int p = pos;
REP(i,t){
if(num & (1<<i) && p!=-1)
p = next[p][i];
}
return p;
};
dub();
REP(kk,q){
CIN(m,k);
VC1(m,v);
FOREACH(xx,v)
--xx;
FOREACH(xx,v)
hld.add(xx);
ll ans = 0;
FOREACH(xx,v){
int st = 0; int en = hld.depth[xx] + 1;
while(en - st > 1){
// depth:num
int num = (st + en) / 2;
// hld.depth[xx] - (hld.depth[xx] - num) -> num
int pos = calcdub(xx, hld.depth[xx] - num);
(hld.sum(pos) >= k ? st : en ) = num;
}
ans = max(ans, 1LL*st);
}
FOREACH(xx,v)
hld.sub(xx);
COUT(ans);
}
}
Submission Info
Submission Time |
|
Task |
F - 根付き木のみさわさん |
User |
shibh308 |
Language |
C++14 (GCC 5.4.1) |
Score |
130 |
Code Size |
8440 Byte |
Status |
AC |
Exec Time |
1210 ms |
Memory |
45808 KB |
Judge Result
Set Name |
Sample |
Subtask1 |
Subtask2 |
Score / Max Score |
0 / 0 |
20 / 20 |
110 / 110 |
Status |
|
|
|
Set Name |
Test Cases |
Sample |
sample_01.txt, sample_02.txt, sample_03.txt |
Subtask1 |
sample_01.txt, sample_02.txt, sample_03.txt, subtask_01_01.txt, subtask_01_02.txt, subtask_01_03.txt, subtask_01_04.txt, subtask_01_05.txt, subtask_01_06.txt, subtask_01_07.txt, subtask_01_08.txt, subtask_01_09.txt, subtask_01_10.txt, subtask_01_11.txt, subtask_01_12.txt, subtask_01_13.txt, subtask_01_14.txt, subtask_01_15.txt, subtask_01_16.txt, subtask_01_17.txt, subtask_01_18.txt, subtask_01_19.txt, subtask_01_20.txt, subtask_01_21.txt, subtask_01_22.txt, subtask_01_23.txt, subtask_01_24.txt, subtask_01_25.txt, subtask_01_26.txt |
Subtask2 |
sample_01.txt, sample_02.txt, sample_03.txt, subtask_01_01.txt, subtask_01_02.txt, subtask_01_03.txt, subtask_01_04.txt, subtask_01_05.txt, subtask_01_06.txt, subtask_01_07.txt, subtask_01_08.txt, subtask_01_09.txt, subtask_01_10.txt, subtask_01_11.txt, subtask_01_12.txt, subtask_01_13.txt, subtask_01_14.txt, subtask_01_15.txt, subtask_01_16.txt, subtask_01_17.txt, subtask_01_18.txt, subtask_01_19.txt, subtask_01_20.txt, subtask_01_21.txt, subtask_01_22.txt, subtask_01_23.txt, subtask_01_24.txt, subtask_01_25.txt, subtask_01_26.txt, subtask_02_01.txt, subtask_02_02.txt, subtask_02_03.txt, subtask_02_04.txt, subtask_02_05.txt, subtask_02_06.txt, subtask_02_07.txt, subtask_02_08.txt, subtask_02_09.txt, subtask_02_10.txt, subtask_02_11.txt, subtask_02_12.txt, subtask_02_13.txt, subtask_02_14.txt, subtask_02_15.txt, subtask_02_16.txt, subtask_02_17.txt, subtask_02_18.txt, subtask_02_19.txt, subtask_02_20.txt, subtask_02_21.txt, subtask_02_22.txt, subtask_02_23.txt, subtask_02_24.txt, subtask_02_25.txt, subtask_02_26.txt |
Case Name |
Status |
Exec Time |
Memory |
sample_01.txt |
AC |
1 ms |
256 KB |
sample_02.txt |
AC |
1 ms |
256 KB |
sample_03.txt |
AC |
1 ms |
256 KB |
subtask_01_01.txt |
AC |
1 ms |
256 KB |
subtask_01_02.txt |
AC |
1 ms |
256 KB |
subtask_01_03.txt |
AC |
1 ms |
256 KB |
subtask_01_04.txt |
AC |
4 ms |
256 KB |
subtask_01_05.txt |
AC |
50 ms |
256 KB |
subtask_01_06.txt |
AC |
1 ms |
256 KB |
subtask_01_07.txt |
AC |
3 ms |
256 KB |
subtask_01_08.txt |
AC |
41 ms |
256 KB |
subtask_01_09.txt |
AC |
1 ms |
256 KB |
subtask_01_10.txt |
AC |
4 ms |
256 KB |
subtask_01_11.txt |
AC |
55 ms |
256 KB |
subtask_01_12.txt |
AC |
1 ms |
256 KB |
subtask_01_13.txt |
AC |
3 ms |
256 KB |
subtask_01_14.txt |
AC |
46 ms |
256 KB |
subtask_01_15.txt |
AC |
1 ms |
256 KB |
subtask_01_16.txt |
AC |
5 ms |
256 KB |
subtask_01_17.txt |
AC |
47 ms |
256 KB |
subtask_01_18.txt |
AC |
1 ms |
256 KB |
subtask_01_19.txt |
AC |
4 ms |
256 KB |
subtask_01_20.txt |
AC |
62 ms |
256 KB |
subtask_01_21.txt |
AC |
3 ms |
384 KB |
subtask_01_22.txt |
AC |
4 ms |
256 KB |
subtask_01_23.txt |
AC |
47 ms |
256 KB |
subtask_01_24.txt |
AC |
1 ms |
256 KB |
subtask_01_25.txt |
AC |
3 ms |
256 KB |
subtask_01_26.txt |
AC |
64 ms |
256 KB |
subtask_02_01.txt |
AC |
360 ms |
37232 KB |
subtask_02_02.txt |
AC |
359 ms |
36592 KB |
subtask_02_03.txt |
AC |
382 ms |
36592 KB |
subtask_02_04.txt |
AC |
284 ms |
37488 KB |
subtask_02_05.txt |
AC |
290 ms |
36848 KB |
subtask_02_06.txt |
AC |
309 ms |
36848 KB |
subtask_02_07.txt |
AC |
955 ms |
43888 KB |
subtask_02_08.txt |
AC |
1005 ms |
41328 KB |
subtask_02_09.txt |
AC |
992 ms |
41200 KB |
subtask_02_10.txt |
AC |
799 ms |
38768 KB |
subtask_02_11.txt |
AC |
839 ms |
38128 KB |
subtask_02_12.txt |
AC |
800 ms |
38128 KB |
subtask_02_13.txt |
AC |
393 ms |
37360 KB |
subtask_02_14.txt |
AC |
382 ms |
36848 KB |
subtask_02_15.txt |
AC |
401 ms |
36720 KB |
subtask_02_16.txt |
AC |
951 ms |
45808 KB |
subtask_02_17.txt |
AC |
992 ms |
45168 KB |
subtask_02_18.txt |
AC |
1014 ms |
45040 KB |
subtask_02_19.txt |
AC |
427 ms |
37360 KB |
subtask_02_20.txt |
AC |
435 ms |
36720 KB |
subtask_02_21.txt |
AC |
454 ms |
36592 KB |
subtask_02_22.txt |
AC |
1102 ms |
42864 KB |
subtask_02_23.txt |
AC |
1210 ms |
45040 KB |
subtask_02_24.txt |
AC |
1171 ms |
41200 KB |
subtask_02_25.txt |
AC |
580 ms |
36848 KB |
subtask_02_26.txt |
AC |
1158 ms |
45552 KB |