【Google kick start】Fesitival

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
    int t,n,d,k;
    scanf("%lld",&t);
    for(int p=1;p<=t;p++)
    {
        printf("Case #%lld: ",p);
        multiset<int>s;
		multiset<int, greater<int>>s2;
        vector<int> startday[300010],endday[300010];
        int happy,from,to;
		long long happysum=0,maxhappy=0;
        scanf("%lld%lld%lld",&n,&d,&k);
        while(d--)
        {
            scanf("%lld%lld%lld",&happy,&from,&to);
            startday[from].push_back(happy);
            endday[to].push_back(happy);
        }
        for(int i=1;i<=n;i++)
        {
			for(auto x:startday[i])
			{
				if(s.size()<k)
				{
					s.insert(x);
					happysum+=x;
				}
				else
				{
					int s_min=*s.begin();
					if(s_min<x)
					{
						s2.insert(*s.begin());
						s.erase(s.begin());
						s.insert(x);
						happysum-=s_min;
						happysum+=x;
					}
					else
					{
						s2.insert(x);
					}
				}
			}
			
            if(maxhappy<happysum)maxhappy=happysum;
            
			for(auto x:endday[i])
			{
				if(s.find(x)!=s.end())
				{
					s.erase(s.find(x));
					happysum-=x;
					if(s2.size()>0)
					{
						s.insert(*s2.begin());
						happysum+=*s2.begin();
						s2.erase(s2.begin());
					}
				}
				else
				{
					s2.erase(s2.find(x));
				}
			}
        }
        printf("%lld\n",maxhappy);
    }
    return 0;
}
上一篇:CF549G Happy Line


下一篇:happy math