E Eyjafjalla
主席树二分加树上倍增
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 100005
int n;
int t[N];
vector<int>g[N];
vector<int> v;
int get_id(int x){
return lower_bound(v.begin(),v.end(),x) - v.begin() + 1;
}
struct PresidentTree {
int cntNodes, root[N];
struct node {
int l, r;
int cnt;
} tr[4 * N + 17 * N];
void modify(int &u, int v, int l, int r, int x) {
u = ++cntNodes;
tr[u] = tr[v];
tr[u].cnt++;
if (l == r) return;
int mid = (l + r) / 2;
if (x <= mid)
modify(tr[u].l, tr[v].l, l, mid, x);
else
modify(tr[u].r, tr[v].r, mid + 1, r, x);
}
int kth(int u, int v, int l, int r, int k) {
if (l == r) return l;
int res = tr[tr[v].l].cnt - tr[tr[u].l].cnt;
int mid = (l + r) / 2;
if (k <= res)
return kth(tr[u].l, tr[v].l, l, mid, k);
else
return kth(tr[u].r, tr[v].r, mid + 1, r, k - res);
}
}st;
int lg[N];
int val[N][32];
int dep[N];
int l[N],r[N];
int id[N];
int cnt=0;
void dfs(int x,int fa){
id[++cnt]=t[x];
l[x]=cnt;
val[x][0]=fa;
dep[x]=dep[fa]+1;
for(int i=1;i<=lg[dep[x]];i++){
val[x][i]=val[val[x][i-1]][i-1];
}
for(int v:g[x]){
if(v==fa) continue;
dfs(v,x);
}
r[x]=cnt;
}
int find(int x,int r){
for(int k=lg[dep[x]];k>=0;k--){
if(t[val[x][k]]<=r){
x=val[x][k];
}
}
return x;
}
void solve(){
cin>>n;
for (int i = 1; i <= n; i++) { //预处理 log
lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=1;i<=n;i++){
cin>>t[i];
v.push_back(t[i]);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
t[0]=INT_MAX;
dfs(1,0);
for(int i=1;i<=n;i++){
// cout<<id[i]<<'\n';
st.modify(st.root[i],st.root[i-1],1,n,get_id(id[i]));
}
int q;
cin>>q;
while(q--){
int x,le,re;
cin>>x>>le>>re;
if(t[x]>=le&&t[x]<=re){
// cout<<find(x,re)<<'\n';
x=find(x,re);
int sum=r[x]-l[x]+1;
int ll=1,rr=sum;
while(ll<=rr){
int mid=(ll+rr)/2;
int k=mid;
if(v[st.kth(st.root[l[x]-1],st.root[r[x]],1,n,k)-1]<le){
ll=mid+1;
}
else{
rr=mid-1;
}
}
cout<<sum-(ll-1)<<'\n';
}
else{
cout<<0<<'\n';
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
solve();
}
H Happy Number
模拟一下三进制即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100];
// 1 2 3 11 12 13 21 22 23
int n;//2 3 6 22 23 26 32 33 36
void solve(){
cin>>n;
int i=0;
while(n){
n-=1;
a[++i]=n%3+1;
n/=3;
}
map<int,int>mp;
mp[1]=2;
mp[2]=3;
mp[3]=6;
for(int j=i;j>=1;j--){
cout<<mp[a[j]];
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t=1;
// cin>>t;
while(t--){
solve();
}
}