#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 全错。应该跟很多人包括我赛时一直 50 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;
}
其实我感觉我写的不是正解(大雾)。