题解 | #[NOIP2007]字符串的展开#

货物种类

https://ac.nowcoder.com/acm/problem/202498

采用差分数组的解法网上已经有很多了,这里我不再赘述。
这里采用的方式是差分数组离散化的思想,针对每个端点仓库进行记录。
每次进货产生左右两个端点进货信息。

#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
struct temp//定义一个结构体,存储每次进货信息
{
    int pos;//端点仓库编号
    ll d;//进货商品编号
    int state;//左端点为+1,右端点为-1
}a[200005];
bool comp(temp a,temp b)
{
    if(a.pos<b.pos) return 1;//按仓库编号对进货信息升序
    else if(a.pos==b.pos) return a.state<b.state;//如果两次进货信息端点仓库编号相同应先处理上一次进货信息的右端点,避免多算
    else return 0;
}
int main()
{
    int n,m,j=1;
    int l,r;ll d;
    cin>>n>>m;
    for(int i = 1;i<=m;i++)
    {
        scanf("%d %d %lld",&l,&r,&d);
        a[j].pos = l;a[j].d = d;a[j].state = 1;//录入本次进货左端点信息
        j += 1; 
        a[j].pos = r+1;a[j].d = d;a[j].state = -1;//录入本次进货右端点信息
        j += 1;
    }
    sort(a+1,a+1+2*m,comp);
    int cnt = 0,max = 0,max_pos = 0,size;
    map <ll,int> s;//存储每个商品进货次数,以便遇到右端点处理时减去,最开始是用set来写的,没存储进货次数,导致商品在遇到第一个右端点时就找不到了,后面本来可以覆盖的也覆盖不到了
    map <ll,int> :: iterator it;
    for(int i = 1;i<=2*m;i++)
    {
		size = s.size();//记录本次进货前商品种类数
        if(a[i].state==1)//进货左端点
        {
           it=s.find(a[i].d);
           if(it!=s.end()) it->second = it->second+1;//判断是否已进过本商品,进过则次数加一
           else 
		   {
			   s.insert({a[i].d,1});//没进过则记录该商品,并将进货次数置为1
		       if((cnt =s.size())>size)//判断商品种类数是否增大,(这里可以删除)
		        {
		            if(cnt>max)//判断进完该商品,商品种类数是否大于最大值,是则更新最大值信息
		            {
		            	max =cnt;
		            	max_pos = a[i].pos;
		            }
		        }
		   }
        }
        else//进货右端点
        {
           it=s.find(a[i].d);
           if(it!=s.end()) it->second = it->second-1;//找到该商品并将进货次数-1
            if(it->second==0)//如果此时进货次数为零,意味着从该位置开始后面的仓库不再有该商品
            {
                s.erase(it);//删除该商品信息
                cnt--;当前商品种类数-1
            }
        }
    }
    cout<<max_pos;
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 17:40
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务