A、C题:马鸿儒
A题解:
#include <bits/stdc++.h> using namespace std; typedef long long ll; int bk[1005][1005]; int main() { ios::sync_with_stdio(0); int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { int l,r; cin>>l>>r; for(int j=l;j<r;j++) bk[j][j+1]++; } for(int i=0;i<m;i++) if(!bk[i][i+1]) return cout<<"NO",0; cout<<"YES"; }
C题解:
#include <bits/stdc++.h> using namespace std; int a[100005]; int main() { ios::sync_with_stdio(0); int n,f=0,sum=0,ff=0; cin>>n; for(int i=0;i<=n;i++) { cin>>a[i]; sum+=a[i]; if(a[i]>1) { if(!f) f=i; } } for(int i=0;i<n;i++) if(a[i]>=2&&a[i+1]>=2) ff=1; if(!f||!ff) cout<<"perfect"; else { cout<<"ambiguous "; for(int i=0;i<=1;i++) for(int j=1;j<=a[i];j++) cout<<i<<" "; int maxn=0; for(int i=2;i<=n;i++) { maxn+=a[i-2]; for(int j=1;j<=a[i];j++) cout<<maxn+1<<" "; } cout<<" "; for(int i=0;i<=1;i++) for(int j=1;j<=a[i];j++) cout<<i<<" "; maxn=1; for(int i=2;i<=n;i++) { int r1=maxn+a[i-1]; int r2=maxn+1,r3=maxn+1; for(int j=1;j<=a[i];j++) { if(r3>r1) r3=r2; cout<<r3<<" "; r3++; } maxn+=a[i-1]; } } }
B题:苏用
题解:
#include <iostream> #include <cstdio> #include <algorithm> const int maxn=1e4+10; using namespace std; int n,a[maxn],b[maxn],ans; int main(){ cin>>n; for (int i=2; i<=n; i++) { int x;cin>>x; a[i]=x; } for (int i=1; i<=n; i++) { int x;cin>>x; b[i]=x; } for (int i=2; i<=n; i++) { if (a[i]!=0&&b[i]!=b[a[i]]) ans++; } cout<<ans+1<<endl; } //考虑到从最后开始的过程,我们将从树中“删除”任何子树,其最高顶点的祖先的颜色与最高顶点的颜色不同, //并且子树中所有顶点的颜色都是相同的。因此,我们可以证明,答案是边的数目,其末端有不同的颜色+ 1。