2 seconds
256 megabytes
standard input
standard output
A way to make a new task is to make it nondeterministic or probabilistic. For example, the hard task of Topcoder SRM 595, Constellation, is the probabilistic version of a convex hull.
Let's try to make a new task. Firstly we will use the following task. There are n people, sort them by their name. It is just an ordinary sorting problem,
but we can make it more interesting by adding nondeterministic element. There are n people, each person will use either his/her first name or last name
as a handle. Can the lexicographical order of the handles be exactly equal to the given permutation p?
More formally, if we denote the handle of the i-th person as hi,
then the following condition must hold: .
The first line contains an integer n (1 ≤ n ≤ 105) —
the number of people.
The next n lines each contains two strings. The i-th
line contains strings fi and si (1 ≤ |fi|, |si| ≤ 50) —
the first name and last name of the i-th person. Each string consists only of lowercase English letters. All of the given 2n strings
will be distinct.
The next line contains n distinct integers: p1, p2, ..., pn (1 ≤ pi ≤ n).
If it is possible, output "YES", otherwise output "NO".
3 gennady korotkevich petr mitrichev gaoyuan chen 1 2 3
NO
3 gennady korotkevich petr mitrichev gaoyuan chen 3 1 2
YES
2 galileo galilei nicolaus copernicus 2 1
YES
10 rean schwarzer fei claussell alisa reinford eliot craig laura arseid jusis albarea machias regnitz sara valestin emma millstein gaius worzel 1 2 3 4 5 6 7 8 9 10
NO
10 rean schwarzer fei claussell alisa reinford eliot craig laura arseid jusis albarea machias regnitz sara valestin emma millstein gaius worzel 2 4 9 6 5 7 1 3 8 10
YES
In example 1 and 2, we have 3 people: tourist, Petr and me (cgy4ever). You can see that whatever handle is chosen, I must be the first, then tourist and Petr must be the last.
In example 3, if Copernicus uses "copernicus" as his handle, everything will be alright.
题解
字符串模拟,话说字符串函数很好用的说。
唉!话说那个……题意开始没理解,白扔了很多分。
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<cmath> #include<algorithm> using namespace std; int n,p[100002]; char a[100002][2][55],c[55]; void init() { scanf("%d",&n); int i; for(i=1;i<=n;i++) {scanf("%s%s",a[i][0],a[i][1]); if(strcmp(a[i][0],a[i][1])==1) {strcpy(c,a[i][0]); strcpy(a[i][0],a[i][1]); strcpy(a[i][1],c);} } //for(i=1;i<=n;i++) {puts(a[i][0]); puts(a[i][1]);} for(i=1;i<=n;i++) scanf("%d",&p[i]); } void work() { int i,x=p[1],y=0; for(i=2;i<=n;i++) {if(strcmp(a[p[i]][1],a[x][y])==-1) {printf("NO\n"); return ;} if(strcmp(a[p[i]][0],a[x][y])==1) {x=p[i]; y=0;} else {x=p[i]; y=1;} } printf("YES\n"); } int main() { init(); work(); return 0; }