求助数据生成器
  • 板块学术版
  • 楼主chlchl
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/12/14 18:27
  • 上次更新2023/10/24 07:42:53
查看原帖
求助数据生成器
363036
chlchl楼主2022/12/14 18:27

rt,这代码本地运行不了……他不仅不生成数据,还让我输入……

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int rnd(int l, int r){
	return 1LL * rand() * RAND_MAX * RAND_MAX % (r - l + 1) + l;
}

const int N = 1e5 + 10;
const int M = N << 2;
int n, q;
int ans[M], lans[M], rans[M];
ll h[N], tag[M], pl[M], pr[M];
struct node{
	int res, lres, rres;
	ll pl, pr;
};

#define ls(o) (o << 1)
#define rs(o) (o << 1 | 1)

void pushup(int o, int l, int r){
	int mid = (l + r) >> 1;
	pl[o] = pl[ls(o)], pr[o] = pr[rs(o)];
	lans[o] = lans[ls(o)], rans[o] = rans[rs(o)];
	if(lans[o] == (mid - l + 1) && max(pr[ls(o)], pl[rs(o)]) <= 2 * min(pr[ls(o)], pl[rs(o)]))
		lans[o] += lans[rs(o)];
	if(rans[o] == (r - mid) && max(pr[ls(o)], pl[rs(o)]) <= 2 * min(pr[ls(o)], pl[rs(o)]))
		rans[o] += rans[ls(o)];
	ans[o] = max(ans[ls(o)], ans[rs(o)]);
	if(max(pr[ls(o)], pl[rs(o)]) <= 2 * min(pr[ls(o)], pl[rs(o)]))
		ans[o] = max(ans[o], rans[ls(o)] + lans[rs(o)]);
}

void pushdown(int o){
	pl[ls(o)] += tag[o], pl[rs(o)] += tag[o];
	pr[ls(o)] += tag[o], pr[rs(o)] += tag[o];
	tag[ls(o)] += tag[o], tag[rs(o)] += tag[o];
	tag[o] = 0;
}

void build(int o, int l, int r){
	if(l == r){
		ans[o] = lans[o] = rans[o] = 1;
		pl[o] = pr[o] = h[l];
		return ;
	}
	int mid = (l + r) >> 1;
	build(ls(o), l, mid);
	build(rs(o), mid + 1, r);
	pushup(o, l, r);
}

void update(int o, int l, int r, int s, int t, ll x){
	if(l >= s && r <= t){
		pl[o] += x, pr[o] += x;
		tag[o] += x;
		return ;
	}
	int mid = (l + r) >> 1;
	pushdown(o);
	if(s <= mid)
		update(ls(o), l, mid, s, t, x);
	if(t > mid)
		update(rs(o), mid + 1, r, s, t, x);
	pushup(o, l, r);
}

node query(int o, int l, int r, int s, int t){
	if(l >= s && r <= t)
		return (node){ans[o], lans[o], rans[o], pl[o], pr[o]};
	int mid = (l + r) >> 1;
	pushdown(o);
	if(t <= mid)
		return query(ls(o), l, mid, s, t);
	if(s > mid)
		return query(rs(o), mid + 1, r, s, t);
	node p = query(ls(o), l, mid, s, t);
	node q = query(rs(o), mid + 1, r, s, t);
	node now;
	now.pl = p.pl, now.pr = q.pr;
	now.lres = p.lres, now.rres = q.rres;
	if(now.lres == (mid - l + 1) && max(p.pr, q.pl) <= min(p.pr, p.pl) * 2)
		now.lres += q.lres;
	if(now.rres == (r - mid) && max(p.pr, q.pl) <= min(p.pr, p.pl) * 2)
		now.rres += p.rres;
	now.res = max(p.res, q.res);
	if(max(p.pr, q.pl) <= min(p.pr, p.pl) * 2)
		now.res = max(now.res, p.rres + q.lres);
	return now;
}

int main(){
	srand(time(0));
	for(int T=1;T<=4;T++){
		string in = "stair" + to_string(T) + ".in";
		freopen(in.c_str(), "w", stdout);
		n = rnd(10, 1000), q = rnd(10, 1000);
		printf("%d %d\n", n, q);
		for(int i=1;i<=n;i++)
			printf("%d ", rnd(1, 10000));
		for(int i=1;i<=q;i++){
			int op = rnd(1, 2);
			printf("%d ", op);
			if(op == 1){
				int l = rnd(1, n - 5), k = rnd(1, 10000);
				printf("%d %d %d\n", l, rnd(l, n), k);
			}else{
				int l = rnd(1, n - 5);
				printf("%d %d\n", l, rnd(l, n));
			}
		}
		fclose(stdout);
		
		string out = "stair" + to_string(T) + ".out";
		freopen(in.c_str(), "r", stdin);
		freopen(out.c_str(), "w", stdout);
		scanf("%d%d", &n, &q);
		for(int i=1;i<=n;i++)
			scanf("%lld", &h[i]);
		build(1, 1, n);
		while(q--){
			int op, l, r; ll k;
			scanf("%d%d%d", &op, &l, &r);
			if(op == 1){
				scanf("%lld", &k);
				update(1, 1, n, l, r, k);
			}
			else
				printf("%d\n", query(1, 1, n, l, r).res);
		}
	}
}
2022/12/14 18:27
加载中...