22.1.18
A
题意:
给你
题解:
我们可以发现,只要不是两个顶点均在长方形的边上,我们就可以沿着这个线段画个轮廓线划过去,也就是说,除了那些两个顶点都在长方形边上的线段,其他的线段对答案是没有一点影响的。那么我们现在来考虑什么情况下会相交。我们可以把这个矩形的四边都标上序号,从 NO ,否则就是 YES。
复杂度分析:
时间复杂度:
空间复杂度:
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int r,c,n,m,p,q,s,t;
stack<int>st;
pair<int,int>a[1001001];
int get(int x,int y)
{
if(x==0||y==c)
return x+y;
else if(y==0||x==r)
return (r+c)*2-x-y;
return -1;
}
signed main()
{
freopen("connect.in","r",stdin);
freopen("connect.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>r>>c>>n;
for(int i=1;i<=n;i++)
{
cin>>p>>q>>s>>t;
int x=get(p,q),y=get(s,t);
if(x>y)
swap(x,y);
if(x>=0)
a[++m]={x,y};
}
sort(a+1,a+m+1);
for(int i=1,top=0;i<=m;i++)
{
while(!st.empty()&&st.top()<a[i].first)
st.pop();
if(!st.empty()&&st.top()<a[i].second)
{
cout<<"NO";
return 0;
}
st.push(a[i].second);
}
cout<<"YES";
return 0;
}
B
题意:
给定一颗
题解:
我们不难看出,
复杂度分析:
时间复杂度:
空间复杂度:
代码:
// ubsan: undefined
// accoders
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,q,dp[201001],b[201001],f[201001][20],fa[201001],val[201001],w[201001],u,v,opt,z;
vector<pair<int,int>>g[201001];
void dfs(int u,int fa,int d)
{
dp[u]=d;
f[u][0]=fa;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].first;
if(v==fa)
continue;
dfs(v,u,d+1);
val[v]=w[g[u][i].second];
b[g[u][i].second]=v;
}
}
int lca(int u,int v)
{
if(dp[u]<dp[v])
swap(u,v);
int t=dp[u]-dp[v];
for(int i=0;i<=17;i++)
if(t&(1<<i))
u=f[u][i];
if(u==v)
return u;
for(int i=17;i>=0;i--)
if(f[u][i]!=f[v][i])
{
u=f[u][i];
v=f[v][i];
}
return f[u][0];
}
int fd(int x)
{
return fa[x]==x?x:fa[x]=fd(fa[x]);
}
signed main()
{
freopen("liveon.in","r",stdin);
freopen("liveon.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1;i<n;i++)
{
cin>>u>>v>>w[i];
g[u].push_back({v,i});
g[v].push_back({u,i});
}
dfs(1,0,0);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=17;i++)
for(int j=1;j<=n;j++)
f[j][i]=f[f[j][i-1]][i-1];
for(int i=1;i<=n;i++)
if(val[i]==1)
fa[i]=f[i][0];
val[1]=1;
while(q--)
{
cin>>opt;
if(opt==1)
{
cin>>u>>v>>z;
int l=lca(u,v);
while(u>0&&z>0)
{
u=fd(u);
if(dp[u]<=dp[l])
break;
z/=val[u];
u=f[u][0];
}
while(v>0&&z>0)
{
v=fd(v);
if(dp[v]<=dp[l])
break;
z/=val[v];
v=f[v][0];
}
cout<<z<<'\n';
}
else
{
cin>>v>>z;
if(z==1)
fa[b[v]]=f[b[v]][0];
else
val[b[v]]=z;
}
}
return 0;
}