杭电ACM-LCY算法进阶培训班-专题训练(02-06-10-14)
1019 这是真正的水题
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
//#define ll long long
#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=1e9+7;
const int M=1e8+5;
const int N=1e4+5;//?????????? 4e8
int n,m,q;
int tree[N];
void bulid()
{
for(m=1;m<=n+1;m<<=1);
for(re i=m+1;i<=m+n;i++) scanf("%lld",&tree[i]);
for(re i=m-1;i;i--) tree[i]=max(tree[ls(i)],tree[rs(i)]);
}
int ask(int l,int r)
{
int ans=-1e18;
for(l=l+m-1,r=r+m+1;l^r^1;l>>=1,r>>=1)
{
if(~l&1) ans=max(tree[l^1],ans);
if(r&1) ans=max(tree[r^1],ans);
}
return ans;
}
void solve()
{
cin>>n;
bulid();
cin>>q;
while(q--)
{
int x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(x,y));
}
}
signed main()
{
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case #%d: ",index);
solve();
// puts("");
}
return 0;
}
/*
1
3
5 18 2
5 8 2
4 11 2
*/
1020 CD操作
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
#define inf 0x7fffffff
//#define ll long long
#define int long long
//#define double long double
#define re register int
#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define P pair < int , int >
#define mk make_pair
using namespace std;
const int mod=1e9+7;
const int M=1e8+5;
const int N=2e5+5;//?????????? 4e8
int n,m;
struct node
{
int ver,next;
}e[N];
int tot,head[N];
int cnt;
map < string , int > mp;
int t,dep[N],f[N][65];
int in[N];
void add(int x,int y)
{
e[++tot].ver=y;
e[tot].next=head[x];
head[x]=tot;
}
void addedge(int x,int y)
{
add(x,y);add(y,x);
}
void init()
{
for(re i=1;i<=n+1;i++) head[i]=dep[i]=in[i]=0;
memset(f,0,sizeof(f));
cnt=tot=0;
mp.clear();
}
void bfs(int s)
{
queue < int > q;
q.push(s);
dep[s]=1;
while(q.size())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].ver;
if(dep[y]) continue;
dep[y]=dep[x]+1;
f[y][0]=x;
for(int j=1;j<=t;j++) f[y][j]=f[f[y][j-1]][j-1];
q.push(y);
}
}
}
int lca(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
for(int i=t;i>=0;i--) if(dep[f[y][i]]>=dep[x]) y=f[y][i];
if(x==y) return x;
for(int i=t;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
void solve()
{
cin>>n>>m;
t=(int)(log(n)/log(2))+1;
init();
for(re i=1;i<n;i++)
{
string a,b;
cin>>a>>b;
if(!mp[a]) mp[a]=++cnt;
if(!mp[b]) mp[b]=++cnt;
// addedge(mp[a],mp[b]);
add(mp[b],mp[a]);
in[mp[a]]++;
}
for(re i=1;i<=n;i++) if(!in[i]) bfs(i);
for(re i=1;i<=m;i++)
{
string a,b;
cin>>a>>b;
int x=mp[a];
int y=mp[b];
int ans=0;
int LCA=lca(x,y);
if(x==y) ans=0;
else if(LCA==x) ans=1;
else if(LCA==y) ans=dep[x]-dep[y];
else ans=dep[x]-dep[LCA]+1;
printf("%lld\n",ans);
}
}
signed main()
{
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
// printf("Case #%d: ",index);
solve();
// puts("");
}
return 0;
}
/*
1
3
5 18 2
5 8 2
4 11 2
*/