A. Three Pairwise Maximums
题意:给出x,y,z,其中x=max(a,b),y=max(a,c),z=max(b,c),能否求出a,b,c.
题解:发现若a,b,c存在,则有x<y=z的大小关系,a,b,c中的最大值和次大值就知道了。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int T;
int main()
{
cin>>T;
while(T--)
{
int a[4];
cin>>a[1]>>a[2]>>a[3];
sort(a+1,a+3+1);
if(a[3]!=a[2])
{
cout<<"NO
";
continue;
}
cout<<"YES
";
cout<<a[3]<<" "<<a[1]<<" "<<"1
";
}
return 0;
}
B. Restore the Permutation by Merger
拿个桶判断 没出现输出就行
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n;
int vis[55];
int main()
{
cin>>T;
while(T--)
{
cin>>n;
n=n*2;
int x;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
cin>>x;
if(!vis[x])
{
cout<<x<<" ";
vis[x]=true;
}
}
cout<<endl;
}
return 0;
}
C. Make It Good
题意:删除字符串a最小前缀,满足被删前缀后的字符串a,每次从头或尾取字符组成的字符串c不减。
题解:若c不减,则a必须是先递增再递减的形式,即是单峰。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200009
using namespace std;
int T;
int n;
int a[N];
int main()
{
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int now=n;
for(int i=n;i>=1;i--)
{
if(a[i]<=a[i-1]) now--;
else break;
}
int tmp=now;
for(int i=tmp;i>=1;i--)
{
if(a[i]>=a[i-1]) now--;
else break;
}
if(now)now--;
cout<<now<<endl;
}
return 0;
}
D. a-Good String
最少修改多少次,让字符串变为a-good string
.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 131077
using namespace std;
int T;
int n,len,ans;
char s[N];
int a[30][N];
//12345678
void slove(int l,int r,int tp,int now)
{
if(l==r)
{
if(s[l]-'a'+1!=tp) now++;
ans=min(ans,now);
return ;
}
int mid=(l+r)>>1;
slove(mid+1,r,tp+1,now+(mid-l+1)-(a[tp][mid]-a[tp][l-1]));
slove(l,mid,tp+1,now+(r-mid)-(a[tp][r]-a[tp][mid]));
}
int main()
{
cin>>T;
while(T--)
{
cin>>n;
scanf("%s",s+1);
len=strlen(s+1);ans=len;
for(int i=1;i<=len;i++)
{
for(int j=1;j<=26;j++)
{
a[j][i]=a[j][i-1];
}
a[s[i]-'a'+1][i]++;
}
slove(1,len,1,0);
cout<<ans<<endl;
}
return 0;
}
E. Directing Edges.
题目大意:给你一张图,只有部分边确定方向,有的边没有确定方向,有没有一种确定方向的方法,让这张图为有向无环图。
题解:先在有向边的基础上跑拓扑排序,无向边使拓扑序小的指向拓扑序大的。
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define N 200009
using namespace std;
queue<int>q;
int T,js;
bool flag;
int n,m;
int sumedge;
int head[N],xx[N],yy[N],vis[N],col[N],In_du[N],dep[N];
struct Edge
{
int x,y,nxt;
Edge(int x=0,int y=0,int nxt=0):
x(x),y(y),nxt(nxt){}
}edge[N];
void add(int x,int y)
{
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
}
void Clear_Init()
{
memset(In_du,0,sizeof(In_du));
memset(head,0,sizeof(head));
while(!q.empty()) q.pop();
sumedge=0;flag=true;js=0;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int p,x,y;
cin>>p>>x>>y;
if(p==1)
{
add(x,y);
In_du[y]++;
}
xx[i]=x,yy[i]=y;
}
}
bool DFS(int x)
{
vis[x]=true;
col[x]=0;
for(int i=head[x];i;i=edge[i].nxt)
{
int v=edge[i].y;
if(col[v]==0) return false;
else if(col[v]==-1&&!DFS(v)) return false;
}
col[x]=1;
return true;
}
void pre_slove()
{
for(int i=1;i<=n;i++)
{
if(!vis[i]&&!DFS(i))
{
cout<<"NO
";
flag=false;
return ;
}
}
}
void Top_sort()
{
for(int i=1;i<=n;i++)
{
if(!In_du[i]) q.push(i);
}
while(!q.empty())
{
int now=q.front();q.pop();
dep[now]=++js;
for(int i=head[now];i;i=edge[i].nxt)
{
int v=edge[i].y;
In_du[v]--;
if(!In_du[v]) q.push(v);
}
}
}
void Put()
{
cout<<"YES
";
for(int i=1;i<=m;i++)
{
int x=xx[i],y=yy[i];
if(dep[x]<dep[y]) cout<<x<<" "<<y<<endl;
else cout<<y<<" "<<x<<endl;
}
}
int main()
{
cin>>T;
while(T--)
{
Clear_Init();
//pre_slove();
//if(!flag) continue;
Top_sort();
if(js<n) cout<<"NO
";
else Put();
}
return 0;
}