洛谷神仙评测机
查看原帖
洛谷神仙评测机
1547772
oabaijnaw楼主2024/11/18 16:30

这是我AC代码:

#include<bits/stdc++.h>
#define int  long long
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
int n,k,L,R,sum[500005],ans;
struct node{
	int o,l,r,t;
	friend bool operator < (const node &a,const node &b){
		return sum[a.t]-sum[a.o]<sum[b.t]-sum[b.o];
	}
};
priority_queue<node>q;
struct ST{
	int l,r,mxid;
}t[2000005];
void build(int id,int l,int r){
	t[id].l=l;
	t[id].r=r;
	if(l==r){
		t[id].mxid=l;
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	if(sum[t[ls].mxid]<sum[t[rs].mxid])t[id].mxid=t[rs].mxid;
	else t[id].mxid=t[ls].mxid;
}
int query(int id,int l,int r){
	if(t[id].l>r||t[id].r<l)return n+1;
	if(t[id].l>=l&&t[id].r<=r){
		return t[id].mxid;
	}
	int ld=query(ls,l,r),rd=query(rs,l,r);
	if(sum[ld]<sum[rd])return rd;
	else return ld;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
	cin>>n>>k>>L>>R;
	for(int i=1,a;i<=n;i++){
		cin>>a;
		sum[i]=sum[i-1]+a;
	}
	sum[n+1]=-1e18;
	build(1,1,n);
	for(int i=1;i<=n;i++){
		int o=i-1,l=i+L-1,r=min(i+R-1,n),t=query(1,l,r);
		if(l>n)continue;
		q.push({o,l,r,t});
	}
	for(int i=1;i<=k;i++){
		auto x=q.top();
		q.pop();
		int o=x.o,l=x.l,r=x.r,t=x.t,lt,rt;
		ans+=sum[t]-sum[o];
		if(l!=t){
			lt=query(1,l,t-1);
			q.push({o,l,t-1,lt});
		}
		if(r!=t){
			rt=query(1,t+1,r);
			q.push({o,t+1,r,rt});
		} 
	}
	cout<<ans;
}

这是我20分代码:

#include<bits/stdc++.h>
#define int  long long
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
int n,k,L,R,sum[500005],ans;
struct node{
	int o,l,r,t;
	friend bool operator < (const node &a,const node &b){
		return sum[a.t]-sum[a.o]<sum[b.t]-sum[b.o];
	}
};
priority_queue<node>q;
struct ST{
	int l,r,mxid;
}t[2000005];
void build(int id,int l,int r){
	t[id].l=l;
	t[id].r=r;
	if(l==r){
		t[id].mxid=l;
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	if(sum[t[ls].mxid]<sum[t[rs].mxid])t[id].mxid=t[rs].mxid;
	else t[id].mxid=t[ls].mxid;
}
int query(int id,int l,int r){
	if(t[id].l>r||t[id].r<l)return n+1;
	if(t[id].l>=l&&t[id].r<=r){
		return t[id].mxid;
	}
	int ld=query(ls,l,r),rd=query(rs,l,r);
	if(sum[ld]<sum[rd])return rd;
	else return ld;
}
void read(int &x) {
    char c;
    do {
        c = getchar();
    } while (c == ' ' || c == '\n');
    x = 0;
    int w = 1;
    if (c == '-') {
        w = -1;
        c = getchar();
    }
    do {
        x = (x << 1) + (x << 3) + c - '0';
        c = getchar();
    } while (c != ' ' && c != '\n');
    x *= w;
}
signed main(){
	read(n);
	read(k);
	read(L);
	read(R);
	for(int i=1,a;i<=n;i++){
		read(a);
		sum[i]=sum[i-1]+a;
	}
	sum[n+1]=-1e18;
	build(1,1,n);
	for(int i=1;i<=n;i++){
		int o=i-1,l=i+L-1,r=min(i+R-1,n),t=query(1,l,r);
		if(l>n)continue;
		q.push({o,l,r,t});
	}
	for(int i=1;i<=k;i++){
		auto x=q.top();
		q.pop();
		int o=x.o,l=x.l,r=x.r,t=x.t,lt,rt;
		ans+=sum[t]-sum[o];
		if(l!=t){
			lt=query(1,l,t-1);
			q.push({o,l,t-1,lt});
		}
		if(r!=t){
			rt=query(1,t+1,r);
			q.push({o,t+1,r,rt});
		} 
	}
	cout<<ans;
}

可以清晰的看出这两个代码只是一个用cin+关流同步,另一个用快读。

然额当我傻乎乎下载第一个数据时,发现:

灵异事件!

2024/11/18 16:30
加载中...