UPC2018组队训练赛第三场

Posted scott527407973

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UPC2018组队训练赛第三场相关的知识,希望对你有一定的参考价值。

题目来自BAPC2017 Preliminaries


A题:Abandoned Animal

最后输入的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 }
View Code

 

以上是关于UPC2018组队训练赛第三场的主要内容,如果未能解决你的问题,请参考以下文章

UPC2018组队训练赛第九场

UPC2018组队训练赛第七场

备战省赛组队训练赛第十六场(UPC)

2018-2019赛季多校联合新生训练赛第三场(2018/12/8)补题题解

问题 L: An Invisible Hand - (2018年第二阶段个人训练赛第三场)

Contest1593 - 2018-2019赛季多校联合新生训练赛第三场(部分题解)