UPC2018组队训练赛第三场
Posted scott527407973
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UPC2018组队训练赛第三场相关的知识,希望对你有一定的参考价值。
题目来自BAPC2017 Preliminaries
最后输入的m个字符串是sister按顺序买的物品(保证买的物品不重复),首先输入的k行数据(i,s)代表第i个商店所卖的物品s,保证每个商店卖的物品不同。问sister买的物品所在的商店的编号是不是一个非递减的序列。如果不是输出"impossible",如果是并且这个商店的编号序列是唯一的,输出"unique",否则输出"ambiguous".
我们可以首先对商店的信息按照商店的编号从小到大排序,用a[]数组存储每个商店第一件物品的下标,用b[]数组存储每个商店最后一件物品的下标
第一次首先按照sister的顺序对她买的物品去寻找商店的编号,记下当前商店第一件物品的下标,下次寻找时,从该下标开始往后寻找。如果当前寻找操作找不到对应的商店,则输出“impossible”。否则再倒着按着sister的顺序倒着去寻找商店的编号。如果两次寻找后的序列一样,输出“unique”,否则输出“ambiguous".
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct node 4 { 5 int pos; 6 string s; 7 }mp[100005]; 8 bool cmp(node a,node b) 9 { 10 return a.pos<b.pos; 11 } 12 int n,k,m; 13 string t[100005]; 14 int a[100005],b[100005],Left[100005],Right[100005]; 15 int main() 16 { 17 // freopen("in.txt","r",stdin); 18 ios::sync_with_stdio(false); 19 cin.tie(0); 20 cin>>n>>k; 21 for(int i=0;i<k;i++) 22 { 23 cin>>mp[i].pos>>mp[i].s; 24 } 25 sort(mp,mp+k,cmp); 26 for(int i=k-1;i>=0;i--) 27 a[mp[i].pos]=i; 28 for(int i=0;i<k;i++) 29 b[mp[i].pos]=i; 30 cin>>m; 31 int now=a[0],flag,ff=0; 32 for(int i=0;i<m;i++) 33 { 34 cin>>t[i]; 35 if(ff) continue; 36 flag=0; 37 for(int j=now;j<k;j++) 38 { 39 if(t[i]==mp[j].s) 40 { 41 Left[i]=mp[j].pos; 42 now=a[mp[j].pos]; 43 flag=1; 44 break; 45 } 46 } 47 if(!flag) ff=1; 48 } 49 if(ff) 50 { 51 cout<<"impossible"<<endl; 52 return 0; 53 } 54 now=k-1; 55 for(int i=m-1;i>=0;i--) 56 { 57 for(int j=now;j>=0;j--) 58 { 59 if(t[i]==mp[j].s) 60 { 61 Right[i]=mp[j].pos; 62 now=b[mp[j].pos]; 63 break; 64 } 65 } 66 if(Right[i]!=Left[i]) 67 { 68 cout<<"ambiguous"<<endl; 69 return 0; 70 } 71 } 72 cout<<"unique"<<endl; 73 return 0; 74 }
以上是关于UPC2018组队训练赛第三场的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019赛季多校联合新生训练赛第三场(2018/12/8)补题题解