求助月赛T2
  • 板块学术版
  • 楼主GoPoux4
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/10/6 18:38
  • 上次更新2023/11/5 11:47:43
查看原帖
求助月赛T2
224236
GoPoux4楼主2020/10/6 18:38

只过了Subtask#4可能是什么情况啊/kk

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#define Rint register int
#define INF 0x3f3f3f3f
using namespace std;
typedef long long lxl;
const int maxn=1e5+5;

template <typename T>
inline void read(T &x)
{
	x=0;T f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	x*=f;
}

int n,m;
lxl v,c;
vector<pair<lxl,int> > vec1[maxn],vec2[maxn];
vector<pair<lxl,int> >::iterator it1,it2;
int ope[maxn];
pair<lxl,int> st[maxn];
int top;

inline lxl solve(int i)
{
	lxl res=0;
	top=0;
	sort(vec1[i].begin(), vec1[i].end());
	sort(vec2[i].begin(), vec2[i].end());
	it1=vec1[i].begin(),it2=vec2[i].begin();
	while(it2!=vec2[i].end())
	{
		while(it1!=vec1[i].end()&&it1->first<it2->first)
			st[++top]=(*it1),++it1;
		if(it1==vec1[i].end())
		{
			res-=c;
			if(!top) ope[it2->second]=-1;
			else res+=st[top].first,ope[it2->second]=st[top].second,--top;
		}
		else res+=c+it1->first,ope[it2->second]=it1->second,++it1;
		++it2;
	}
	return res;
}

int main()
{
	freopen("T146197.in","r",stdin);
	// freopen("T146197.out","w",stdout);
	read(n),read(m),read(c),read(v);
	for(int i=1,a,b;i<=n;++i)
	{
		read(a),read(b);
		vec1[a].push_back(make_pair(b,i));
	}
	for(int i=1,a,b;i<=m;++i)
	{
		read(a),read(b);
		vec2[a].push_back(make_pair(b,i));
	}
	for(int i=1;i<maxn;++i)
	{
		// puts("------");
		// for(auto v:vec1[i]) printf("%lld %d\n",v.first,v.second);
		// puts("");
		// for(auto v:vec2[i]) printf("%lld %d\n",v.first,v.second);
		// puts("------");
		v+=solve(i);
	}
	printf("%lld\n",v);
	for(int i=1;i<=m;++i)
		printf("%d\n",ope[i]);
	return 0;
}

2020/10/6 18:38
加载中...