how T1
  • 板块学术版
  • 楼主canwen
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/5 18:34
  • 上次更新2025/8/5 18:47:10
查看原帖
how T1
1284815
canwen楼主2025/8/5 18:34
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pc putchar
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
int in() {
	char a=getchar();
	int k=0,kk=1;
	while(!(a>='0'&&a<='9')) {
		if(a == '-') kk = -1;
		a = getchar();
	}
	while(a>='0'&&a<='9') k = k*10 + a - '0', a = getchar();
	return k*kk;
}
void out(int a) {
	if(a < 0) pc('-'), a= -a;
	if(a > 9) out(a/10);
	pc('0'+a%10);
}

const int N = 1e5 + 5;
int n,s,L,R;
struct node {
	int a,x;
} e[N];
bool cmp(node q,node p) {
	return q.a <= p.a;
}
signed main() {
	n = in(), s = in();
	L = in(), R = in();
	_rep(i,1,n) {
		e[i].a = in(), e[i].x = in();
	}
	sort(e+1,e+1+n,cmp);
	int nn = 0;
	_rep(i,1,n) {
		e[++nn].a = e[i].a, e[nn].x = e[i].x;
		while(i < n && e[i+1].a == e[i].a) {
			e[nn].x += e[++i].x;
		}
		if(e[nn].x == 0) --nn;
	}
	n = nn;
	int k = 0, ans = 0;
	while(s >= L && s <= R && k <= n) {
		s += e[++k].x;
	}
	for(int i=k; i<=n;) {
		++ans;
		int j = i, sum = 0;
		while(j<=n && ( (L+sum >= L && L+sum <= R || L - sum >= L && L-sum <= R ||  R+sum >= L && R+sum <= R || R - sum >= L && R-sum <= R) ) ){
			sum += e[++j].x;
		}
		i = j;
	}
	out(ans);
	return 0;
}

这份代码能够过 Sub 1 和 Sub 2,Sub 0 WA 2。

缝合后才可以通过。

想问是不是正解。

第二个问题,以上这份代码下面这样就 sub 2 能过,sub 0 WA on 3,sub 1 全错。应该跟很多人包括我赛时一直 5050 pts 有关,大数据过了,小数据错了,是数据水?

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pc putchar
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
int in() {
	char a=getchar();
	int k=0,kk=1;
	while(!(a>='0'&&a<='9')) {
		if(a == '-') kk = -1;
		a = getchar();
	}
	while(a>='0'&&a<='9') k = k*10 + a - '0', a = getchar();
	return k*kk;
}
void out(int a) {
	if(a < 0) pc('-'), a= -a;
	if(a > 9) out(a/10);
	pc('0'+a%10);
}

const int N = 1e5 + 5;
int n,s,L,R;
struct node {
	int a,x;
} e[N];
bool cmp(node q,node p) {
	return q.a <= p.a;
}
signed main() {
	n = in(), s = in();
	L = in(), R = in();
	_rep(i,1,n) {
		e[i].a = in(), e[i].x = in();
	}
	sort(e+1,e+1+n,cmp);
	int nn = 0;
	_rep(i,1,n) {
		e[++nn].a = e[i].a, e[nn].x = e[i].x;
		while(i < n && e[i+1].a == e[i].a) {
			e[nn].x += e[++i].x;
		}
		if(e[nn].x == 0) --nn;
	}
	n = nn;
	int k = 0, ans = 0;
	while(s >= L && s <= R && k <= n) {
		s += e[++k].x;
	}
	for(int i=k; i<=n;) {
		++ans;
		int j = i, sum = 0;
		while(j<=n && ( (sum >= 0 && L + sum <= R || sum < 0 && R - sum >= L) )/*改了这部分,原先的和现在的不应该是等价的吗*/ ){
			sum += e[++j].x;
		}
		i = j;
	}
	out(ans);
	return 0;
}

其实我感觉我写的不是正解(大雾)。

2025/8/5 18:34
加载中...