LUOGU T12607

lt2025 攀爬者
排序以后大力模拟即可,水题,没什么好讲的。

lt2027 蜈蚣
暴力的做法是维护前缀异或和然后大力DP
注意\(f_{i}{0}\)是不可选取的。
还有注意卡常。

lt2005 区间方差
简单于lp1471 方差,注意多膜。
传参数的时候注意参数的位置。

lt2061 最大差值
找到后缀最大值,找到前缀最小值,扫一遍求差。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
/*
lt2025 攀爬者
*/
struct data{
	int x;
	int y;
	int z;
	bool operator<(const data &B)const{
		return z<B.z;
	}
}a[50005];
inline double calc(int A,int B){
	return sqrt((a[A].x-a[B].x)*(a[A].x-a[B].x)+(a[A].y-a[B].y)*(a[A].y-a[B].y)+(a[A].z-a[B].z)*(a[A].z-a[B].z));
}
int n;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
	}
	sort(a+1,a+1+n);
	double ans=0;
	for(int i=1;i<n;++i){
		ans+=calc(i,i+1);
	}
	printf("%.3lf",ans);
}

 

#include<iostream>
#include<cstdio>
using namespace std;
#define INF 1000000000
/*
lp2027 蜈蚣
*/
int n,m,a[1005],f[1005][105],sm[1005];
inline int Max(int A,int B){
	return A>B?A:B;
}
inline int Min(int A,int B){
	return A<B?A:B;
}
void init(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	sm[0]=0;
	for(int i=1;i<=n;++i){
		sm[i]=sm[i-1]^a[i];
		f[i][0]=-INF;
	}
	int mn;
	for(register int i=1;i<=n;++i){
		mn=Min(i,m);
		for(register int j=1;j<=mn;++j){
			for(register int k=j-1;k<i;++k){
				f[i][j]=Max(f[i][j],f[k][j-1]+(sm[i]^sm[k]));
				//printf("[%d,%d,%d]%d ",i,j,k,f[i][j]);
			}
			//printf(",");
		}
		//puts("");
	}
	printf("%d\n",f[n][m]);
}
int main(){
	init();
	return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
#define LEN (R-L+1)
#define MID ((L+R)>>1)
#define LLEN (MID-L+1)
#define RLEN (R-MID)
#define LS (X<<1)
#define RS (X<<1|1)
#define cIz 1000000007
/*
lt2005 区间方差
*/ 
typedef long long ll;
struct data{
	ll sm;
	ll sm2;
}tr[270005];//262141

inline ll pw(ll X,ll A){
	ll rt=1;
	while(X){
		if(X&1){
			rt*=A;
			rt%=cIz;
		}
		X>>=1;
		A*=A;
		A%=cIz;
	}
	return rt;
}
inline ll inv(ll X){
	return pw(cIz-2,X);
}
inline void updt(int X){
	tr[X].sm2=(tr[LS].sm2+tr[RS].sm2)%cIz;
	tr[X].sm=(tr[LS].sm+tr[RS].sm)%cIz;
}
inline void chg(int X,int L,int R,int A,ll K){
	if(L==R){
		tr[X].sm=K;
		tr[X].sm2=K*K%cIz;
		return;
	}
	if(A<=MID){
		chg(LS,L,MID,A,K);
	}else{
		chg(RS,MID+1,R,A,K);
	}
	updt(X);
}
inline ll qrySm(int X,int L,int R,int A,int B){
	if(L>=A&&R<=B){
		return tr[X].sm;
	}
	ll rt=0;
	if(A<=MID){
		rt+=qrySm(LS,L,MID,A,B);
	}
	if(B>MID){
		rt+=qrySm(RS,MID+1,R,A,B);
	}
	return rt%cIz;
}
inline ll qrySm2(int X,int L,int R,int A,int B){
	if(L>=A&&R<=B){
		return tr[X].sm2;
	}
	ll rt=0;
	if(A<=MID){
		rt+=qrySm2(LS,L,MID,A,B);
	}
	if(B>MID){
		rt+=qrySm2(RS,MID+1,R,A,B);
	}
	return rt%cIz;
}
int n,m;
ll a[100005];
inline void build(int X,int L,int R){
	if(L==R){
		tr[X].sm=a[L];
		tr[X].sm2=(a[L]*a[R])%cIz;
		return;
	}
	build(LS,L,MID);build(RS,MID+1,R);
	updt(X);
}
void init(){
	scanf("%d%d",&n,&m);
	ll x;
	for(int i=1;i<=n;++i){
		scanf("%d",a+i);
	}
	build(1,1,n);
	int op,loc,l,r;
	while(m--){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%lld",&loc,&x);
			chg(1,1,n,loc,x);
		}else if(op==2){
			scanf("%d%d",&l,&r);
			x=qrySm(1,1,n,l,r);
			printf("%lld\n",(qrySm2(1,1,n,l,r)-x*x%cIz*inv(r-l+1)%cIz+cIz)*inv(r-l+1)%cIz);
		}
	}
}
int main(){
	init();
	return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
/*
lt2061 最大差值 
*/
inline int Max(int A,int B){
	return A>B?A:B;
}
inline int Min(int A,int B){
	return A<B?A:B;
}
int n,a[1000005],mx[1000005],mn[1000005],ans=0;
void init(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	memset(mn,0x3f,sizeof(mn));
	for(int i=1;i<=n;++i){
		mn[i]=Min(mn[i-1],a[i]);
	}
	for(int i=n;i>=1;--i){
		mx[i]=Max(mx[i+1],a[i]); 
	}
	for(int i=1;i<=n;++i){
		ans=Max(mx[i]-mn[i],ans);
	}
	printf("%d",ans);
}
int main(){
	init();
	return 0;
}

 

发表评论

您的电子邮箱地址不会被公开。