月赛的时候打出80分,在subtask3: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
求助 先蟹蟹大佬们了