自己出题恶心自己Day4
  • 板块灌水区
  • 楼主Lingyu_fly
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/20 09:15
  • 上次更新2024/7/20 10:23:35
查看原帖
自己出题恶心自己Day4
1015796
Lingyu_fly楼主2024/7/20 09:15

题目

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e4+10;
int n,s,t;
int a[N];
struct tr{
	int l,r,lazy;
	double sum,fac,minn=0x3f3f3f3f;
}tree[N*4];
void pushup(int u){
	tree[u].sum=tree[u<<1].sum+tree[u<<1|1].sum;
	tree[u].minn=min(tree[u<<1].minn,tree[u<<1|1].minn);
}
void build(int u,int l,int r){
	tree[u].l=l;tree[u].r=r;
	if(l==r){
		tree[u].sum=a[l];
		tree[u].minn=a[r];
		return ;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void pushdown1(int u){
	if(tree[u].fac&&tree[u].lazy){
		tree[u<<1].sum=tree[u<<1].sum*(tree[u<<1].r-tree[u<<1].l+1)*tree[u].fac;
		tree[u<<1|1].sum=tree[u<<1|1].sum*(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].fac;
		tree[u<<1].fac=tree[u<<1].fac*(0.1*tree[u].fac);
		tree[u<<1|1].fac=tree[u<<1|1].fac*(0.1*tree[u].fac);
		tree[u].fac=0;
	}
	if(tree[u].lazy){
		tree[u<<1].sum-=(tree[u<<1].r-tree[u<<1].l+1)*tree[u].lazy;
		tree[u<<1|1].sum-=(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].lazy;
		tree[u<<1].lazy+=tree[u].lazy;
		tree[u<<1|1].lazy+=tree[u].lazy;
		tree[u].lazy=0;
	}
}
void modify1(int u,int l,int r,int k){
	if(l<=tree[u].l&&tree[u].r<=r){
		tree[u].sum-=(tree[u].r-tree[u].l+1)*k;
		tree[u].minn-=k;
		tree[u].lazy+=k;
		return ;
	}
	pushdown1(u);
	int mid=(tree[u].l+tree[u].r)>>1;
	if(l<=mid) modify1(u<<1,l,r,k);
	if(mid<r) modify1(u<<1|1,l,r,k);
	pushup(u);
}
void pushdown2(int u){
	if(tree[u].fac){
		tree[u<<1].sum=tree[u<<1].sum*(tree[u<<1].r-tree[u<<1].l+1)*tree[u].fac;
		tree[u<<1|1].sum=tree[u<<1|1].sum*(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u].fac;
		tree[u<<1].fac=tree[u<<1].fac*(0.1*tree[u].fac);
		tree[u<<1|1].fac=tree[u<<1|1].fac*(0.1*tree[u].fac);
		tree[u].fac=0;
		pushup(u);
	}
}
void modify2(int u,int l,int r,int k){
	if(l<=tree[u].l&&tree[u].r<=r){
		tree[u].sum=tree[u].sum*(tree[u].r-tree[u].l+1)*(0.1*k);
		tree[u].fac=tree[u].fac*(0.1*k);
		return ;
	}
	pushdown2(u);
	int mid=(tree[u].l+tree[u].r)>>1;
	if(l<=mid) modify2(u<<1,l,r,k);
	if(mid<r) modify2(u<<1|1,l,r,k);
	pushup(u);
}
double query1(int u,int l,int r){
	if(l<=tree[u].l&&tree[u].r<=r){
		return tree[u].sum;
	}
	int mid=(tree[u].l+tree[u].r)>>1;
	double ans=0;
	if(l<=mid) ans+=query1(u<<1,l,r);
	if(mid<r) ans+=query1(u<<1|1,l,r);
	return ans;
}
double query2(int u,int l,int r){
	if(l<=tree[u].l&&tree[u].r<=r){
		return tree[u].minn;
	}
	int mid=(tree[u].l+tree[u].r)>>1;
	double ans=0x3f3f3f3f;
	if(l<=mid) ans=min(query2(u<<1,l,r),ans);
	if(mid<r) ans=min(query2(u<<1|1,l,r),ans);
	return ans;
}
signed main(){
	scanf("%lld%lld",&n,&s);
	for(int i=1;i<=n;i++) scanf("%lld",a+i);
	scanf("%lld",&t);
	build(1,1,n);
	while(t--){
		int op,x,y,k;
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op==1){
			scanf("%lld",&k);
			modify1(1,x,y,k);
		}else if(op==2){
			scanf("%lld",&k);
			modify2(2,x,y,k);
		}else if(op==3){
			double ans=query1(1,x,y),mi=query2(1,x,y);
			if(ans<=s) printf("You know I can do it!\n%.2lf\n",ans);
			else printf("That's ok for me.\n%.2lf\n",ans-mi);
//			printf("%.2lf\n",ans-mi);
		}
	}
	return 0;
}

个人感觉应该是在打折上面出了问题。。。

求调j

sto sto sto 巨佬 orz orz orz

2024/7/20 09:15
加载中...