Codeforces Round #620 Div. 2
比赛链接 https://codeforces.com/contest/1304
比赛记录 https://blog.csdn.net/cheng__yu_/article/details/105395197
B. Longest Palindrome
题意:给最长回文
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10,inf=1e9;
int n,m;
map<string,bool> mp;
string s,a,b,c;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>s;
string t=s;
reverse(t.begin(),t.end());
if(mp.count(t))
{
a+=s;
c+=s;
mp.erase(t);
}
else mp[s]=true;
}
string b;
int len=0;
for(auto i : mp)
{
string s=i.first;
string t=s;
reverse(t.begin(),t.end());
if(s==t&&s.size()>b.size())
b=s,len=s.size();
}
reverse(c.begin(),c.end());
string ans=a+b+c;
cout<<ans.size()<<"\n";
cout<<ans<<"\n";
return 0;
}
C. Air Conditioner
题意:是否能够维持给客人适合的温度区间
思路:双指针维护区间交
#include <bits/stdc++.h>
#define ll long long
#define int ll
using namespace std;
const int maxn=100+10,inf=1e9;
int q,n,m;
struct People
{
int t,l,r;
bool operator<(const People & b) const
{
return t<b.t;
}
}p[maxn];
main()
{
cin>>q;
while(q--)
{
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>p[i].t>>p[i].l>>p[i].r;
sort(p+1,p+1+n);
bool ok=true;
int l=m,r=m,now=0;
for(int i=1;i<=n;++i)
{
int t=p[i].t-now;
now=p[i].t;
l-=t,r+=t;
l=max(l,p[i].l);
r=min(r,p[i].r);
if(l>r)
{
ok=false;
break;
}
}
puts(ok?"YES":"NO");
}
}
D. Shortest and Longest LIS(构造)
题意:给定一个排列,构造最长和最短上升子序列
思路:贪心构造
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10,inf=1e9;
int t,n;
string s;
int a[maxn],b[maxn];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>s;
int l=0,num=n;
for(int i=0;i<n;++i)
{
if(i==n-1||s[i]=='>')
{
for(int j=i;j>=l;--j)
a[j]=num--;
l=i+1;
}
}
l=0,num=1;
for(int i=0;i<n;++i)
{
if(i==n-1||s[i]=='<')
{
for(int j=i;j>=l;--j)
b[j]=num++;
l=i+1;
}
}
for(int i=0;i<n;++i)
printf("%d%c",a[i],i==n-1?'\n':' ');
for(int i=0;i<n;++i)
printf("%d%c",b[i],i==n-1?'\n':' ');
}
return 0;
}
E. 1-Trees and Queries
题意:给定一个无向图。问在x,y中添加一条边,问能不能从 a 到 b 走恰好 k 步
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10,inf=1e9;
namespace LCA
{
const int N=20;
int head[maxn],cnt;
struct Edge
{
int nxt,to;
}edges[maxn<<1];
void add(int u,int v)
{
edges[++cnt].to=v;
edges[cnt].nxt=head[u];
head[u]=cnt;
}
int fa[maxn][N+10],depth[maxn];
void init()
{
memset(head,-1,sizeof(head));
cnt=-1;
}
void dfs(int u,int f)
{
fa[u][0]=f;
depth[u]=depth[fa[u][0]]+1;
for(int i=1;i<=N;++i)
fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=head[u];i!=-1;i=edges[i].nxt)
{
int v=edges[i].to;
if(v!=f) dfs(v,u);
}
}
int lca(int u,int v)
{
if(depth[u]>depth[v]) swap(u,v);
int dis=depth[v]-depth[u];
for(int j=0;dis;j++)
{
if(dis&1) v=fa[v][j];
dis>>=1;
}
if(u==v) return u;
for(int i=N;i>=0;--i)
{
if(fa[u][i]!=fa[v][i])
u=fa[u][i],v=fa[v][i];
}
return fa[u][0];
}
int getdis(int u,int v)
{
return depth[u]+depth[v]-2*depth[lca(u,v)];
}
};
using namespace LCA;
int n,q;
int x,y,a,b,k;
bool check(int x,int k)
{
return x<=k&&!(k-x&1);
}
int main()
{
init();
scanf("%d",&n);
for(int i=1;i<=n-1;++i)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
dfs(1,0);
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d%d%d",&x,&y,&a,&b,&k);
bool ok=0;
ok|=check(getdis(a,b),k);
ok|=check(getdis(a,x)+getdis(y,b)+1,k);
ok|=check(getdis(a,y)+getdis(x,b)+1,k);
puts(ok?"YES":"NO");
}
return 0;
}