• 2017BAPC初赛A(思维,无序图,向量)


    #include<bits/stdc++.h>
    using namespace std;
    string goods,sister[100010];
    int x,m;
    unordered_map<string,int>mp;
    vector<int>g[100010],great,les;
    int road()
    {
        great.push_back(1);
        les.push_back(1);
        int shopping=0;//正序从商店开始浏览
        for(int i=1;i<=m;i++)
        {
            vector<int>&tmp=g[mp[sister[i]]];//列举包含该商品的所有商店
            int pos=lower_bound(tmp.begin(),tmp.end(),shopping)-tmp.begin();//找到第一次出现该商品的商店位置
            if(pos>=(int)tmp.size())//该商品在未访问的商店没有的卖
                return 0;
            shopping=tmp[pos];//出现该商品的商店,每次移动到这位置
            great.push_back(shopping);//添加进入正序商店路线
        }
        int rshopping=*g[mp[sister[m]]].rbegin();//找到最后一件购买的商品有卖的最远的商店
        for(int i=m;i>=1;i--)
        {
            vector<int>&tmp=g[mp[sister[i]]];
            int pos=upper_bound(tmp.begin(),tmp.end(),rshopping)-tmp.begin()-1;//尽可能选择高的路径(在一家商店连续购买【反序购买】),如果和原本路径一致则答案唯一
            rshopping=tmp[pos];
            les.push_back(rshopping);
        }
        for(int i=1;i<=m;i++)
            if(great[i]!=les[m-i+1])//路线不一致
                return 2;
        return 1;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        int n;
        cin>>n;
        int k;
        cin>>k;
        int cnt=1;
        for(int i=1;i<=k;i++)
        {
            cin>>x>>goods;
            if(!mp.count(goods))//如果这个商品第一次出现
                mp[goods]=cnt++;//给它一个编号
            g[mp[goods]].push_back(x);//将这个商店的位置放入商品编号的向量中
        }
        for(int i=1;i<cnt;i++)
            sort(g[i].begin(),g[i].end(),less<int>());//升序排序,和正常访问商店顺序一致
        cin>>m;
        int flag=0;
        for(int i=1;i<=m;i++)
        {
            cin>>sister[i];
            if(!mp.count(sister[i]))//商店里没有列表商品
                flag=1;
        }
        if(flag==1||road()==0)
            printf("impossible");
        else if(road()==1)
            printf("unique");
        else
            printf("ambiguous");
        return 0;
    }

    /*less<int>升序排列,不写默认升序,greater<int>降序排列,不写就排反了,lower_bound大于等于的第一个地址,upper_bound严格大于的第一个地址,如果用begin()和end()会返回迭代器(我也不知道迭代器是啥)数组的话可以直接+下标,查询区间是左闭右开区间*/

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    CSS3实战:让我们尽情的圆角吧
    IE9、 Firefox、Safari, Chrome的CSS3圆角属性
    css清除浮动的几种方法整理
    display:inline-block的深入理解
    CSS display 属性详解
    ul 、ol li 继承原有样式的问题
    CSS的继承性
    CSS文档流与块级元素和内联元素(文档)
    HTML5 中的块级链接
    常用icon以及color颜色RGB值和对应颜色效果图
  • 原文地址:https://www.cnblogs.com/ldudxy/p/9533025.html
Copyright © 2020-2023  润新知