全世界就我一个80?求助
  • 板块P6851 onu
  • 楼主wisdom_grass
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/10/7 13:31
  • 上次更新2023/11/5 11:42:50
查看原帖
全世界就我一个80?求助
23842
wisdom_grass楼主2020/10/7 13:31

月赛的时候打出80分,在subtask3:c=0subtask3:c = 0的地方挂了

数组调大、全开longlong都没用=_=

改了小D的排序顺序,subtask3的数据点输出的小D的糖果数(由洛谷的测试点详细信息得知)变了,感觉是数组越界(或其他玄学错误),但是并没有发现问题

不知道有什么问题,感觉c就一个常量对我的程序没有影响?

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

typedef long long LL;
const int MAXN = 500007;
LL N, M, C, V;
struct ovo {
	LL col, poi, id;// 
//	bool operator < (const ovo x) const {return poi > x.poi;}
}dc[MAXN], cc[MAXN];//dc为小D的的牌,cc为小C的牌
vector <ovo> a[MAXN];//a[i]表示小D的花色为i的牌
LL tot[MAXN], siz[MAXN];
LL anssum;
LL ans[MAXN];
LL book;

bool Cmp1(const ovo &a, const ovo &b) {return a.poi < b.poi;}
bool Cmp2(const ovo &a, const ovo &b) {return a.poi > b.poi;}
int main() {
	#ifdef test
		freopen("test.txt", "r", stdin);
//		freopen("testout.txt", "w", stdout);
	#endif
	cin >> N >> M >> C >> V;
	anssum = V;
	for(int i = 1; i <= N; i++) {
		scanf("%lld %lld", &dc[i].col, &dc[i].poi);
		dc[i].id = i;
	}
	anssum = V;
	sort(dc + 1, dc + N + 1, Cmp1);
	for(int i = 1; i <= M; i++) {
		scanf("%lld %lld", &cc[i].col, &cc[i].poi);
		cc[i].id = i;
	}
	sort(cc + 1, cc + M + 1, Cmp2);
	for(int i = 1; i <= M; i++)
		a[dc[i].col].push_back(dc[i]); //排序后按牌大的点数到小的点数插入
	for(int i = 1; i <= MAXN - 7; i++)
		tot[i] = a[i].size();
		
	for(int i = 1; i <= M; i++) {
		int co = cc[i].col, po = cc[i].poi;
		int id = tot[co];
		if(id == 0) {
			anssum -= C;
			ans[cc[i].id] = -1;
			continue;
		}
		ovo h = a[co][id - 1];
		if(po <= h.poi) {
			
			tot[co]--;
			anssum += C;
			anssum += h.poi;
			ans[cc[i].id] = h.id;
			continue;
		} else {
			anssum -= C;
			ans[cc[i].id] = -1;
		}
	}
	for(int i = 1; i <= M; i++) {
		if(ans[cc[i].id] != -1) continue;
		int co = cc[i].col;
		int id = tot[co];
		if(id == 0) continue;
		ovo h = a[co][id - 1];
		
		tot[co]--;
		anssum += h.poi;
		ans[cc[i].id] = h.id;
		continue;
	}
	
	cout << anssum << endl;
	for(int i = 1; i <= M; i++)
		printf("%lld\n", ans[i]);
	return 0;
}
```cpp
求助 先蟹蟹大佬们了
2020/10/7 13:31
加载中...