已AC,但有个疑问
查看原帖
已AC,但有个疑问
964876
_maple_leaf_楼主2024/8/9 22:14

rt,这份 10pts 代码

#include<bits/stdc++.h>
//#define int long long
using namespace std;
inline int read(){
	char c=getchar();
	int ret=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ret=(ret<<3)+(ret<<1)+c-'0';
		c=getchar();
	}return ret*f;
}
inline void write(int x,int op){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10,0);
	putchar((char)(x%10+'0'));
	if(op){
		if(op>0)puts("");
		if(op<0)putchar(' ');
		if(op==0)puts("114514");
	}
}
const int N=114514;
int n;
int cnt1,cnt2;
int f[N],b[N];
int l[N],r[N];
struct node{
	int l,r;
}a[N];
bool cmp(node x,node y){
	return x.r==y.r?x.l<y.l:x.r<y.r;
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		int x=read(),y=read();
		if(x+y>=n)continue;
		a[++cnt1].l=x+1,a[cnt1].r=n-y;
	}sort(a+1,a+1+cnt1,cmp);
	for(int i=1;i<=cnt1;i++){
        b[((a[i].l!=a[i-1].l||a[i].r!=a[i-1].r)?++cnt2:cnt2)]=min(b[cnt2]+1,a[i].r-a[i].l+1);
        l[cnt2]=a[i].l,r[cnt2]=a[i].r;
	}
    for(int i=1,j=1;i<=n;i++){
        f[i]=f[i-1];
        while(j<=cnt2&&r[j]==i)f[i]=max(f[i],f[l[j]-1]+b[j++]);
    }
    write(n-f[n],0);
	return 0;
}

与这个 100pts 代码

#include<bits/stdc++.h>
//#define int long long
using namespace std;
inline int read(){
	char c=getchar();
	int ret=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		ret=(ret<<3)+(ret<<1)+c-'0';
		c=getchar();
	}return ret*f;
}
inline void write(int x,int op){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10,0);
	putchar((char)(x%10+'0'));
	if(op){
		if(op>0)puts("");
		if(op<0)putchar(' ');
		if(op==0)puts("114514");
	}
}
const int N=114514;
int n;
int cnt1,cnt2;
int f[N],b[N];
int l[N],r[N];
struct node{
	int l,r;
}a[N];
bool cmp(node x,node y){
	return x.r==y.r?x.l<y.l:x.r<y.r;
}
signed main(){
	n=read();
	for(int i=1;i<=n;i++){
		int x=read(),y=read();
		if(x+y>=n)continue;
		a[++cnt1].l=x+1,a[cnt1].r=n-y;
	}sort(a+1,a+1+cnt1,cmp);
	for(int i=1;i<=cnt1;i++){
		if(a[i].l!=a[i-1].l||a[i].r!=a[i-1].r)++cnt2;
        b[cnt2]=min(b[cnt2]+1,a[i].r-a[i].l+1);
        l[cnt2]=a[i].l,r[cnt2]=a[i].r;
	}
    for(int i=1,j=1;i<=n;i++){
        f[i]=f[i-1];
        while(j<=cnt2&&r[j]==i)f[i]=max(f[i],f[l[j]-1]+b[j++]);
    }
    write(n-f[n],0);
	return 0;
}

有什么区别?

2024/8/9 22:14
加载中...