WA + TLE 求调
查看原帖
WA + TLE 求调
999274
CNS_5t0_0r2楼主2024/7/26 15:04
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9,SqrtN = 359,INF = 2e9 + 2e4 + 9;
inline char gc(){
    static char buf[10000005],*t1 = buf,*t2 = buf;
    return t1 == t2 && (t2 = (t1 = buf) + fread(buf,1,1000000,stdin),t1 == t2) ? EOF : *t1++;
}
int read(){
	char c = gc();
	int x = 0,f = 1;
	while(c < '0' || c > '9'){
		if (c == '-')
			f = -1;
		c = gc();
	}
	while(c >= '0' && c <= '9'){
		x = (x << 3) + (x << 1) + c - 48;
		c = gc();
	}
	return x * f;
}

int n,q;
int a[N],tmp[N];
struct block{
	int l,r,add;
} b[SqrtN];
int belong[N];
int block_cnt,block_len;
void block_sort1(int block_id){
	int l = b[block_id].l,r = b[block_id].r;
	for(int i = l;i <= r;i++)
		tmp[i] = a[i];
	sort(tmp + l,tmp + r + 1);
}
void block_sort2(int block_id,int pos){
	int i = b[block_id].l,j = pos + 1;
	for(int k = b[block_id].l;k <= b[block_id].r;k++){
		if(j > b[block_id].r || i <= pos && a[i] < a[j])
            tmp[k] = a[i++];
        else
            tmp[k] = a[j++];
	}
}
void build_block(){
	block_cnt = block_len = sqrt(n);
	for(int i = 1;i <= block_cnt;i++){
		b[i].l = b[i - 1].r + 1;
		b[i].r = b[i].l + block_len - 1;
	}
	b[block_cnt].r = n;
	for(int i = 1;i <= block_cnt;i++){
		block_sort1(i);
		for(int j = b[i].l;j <= b[i].r;j++)
			belong[j] = i;
	}
}
void update(int l,int r,int k){
	int pos_l = belong[l],pos_r = belong[r];
	if(pos_l == pos_r){
		for(int i = l;i <= r;i++)
			a[i] += k;
		block_sort1(pos_r);
		return;
	}
	for(int i = l;i <= b[pos_l].r;i++)
		a[i] += k;
	for(int i = b[pos_r].l;i <= r;i++)
		a[i] += k;
	for(int i = pos_l + 1;i <= pos_r - 1;i++)
		b[i].add += k;
	block_sort2(pos_r,r);
}
int query(int l,int r,int k){
	int ret = 0;
	int pos_l = belong[l],pos_r = belong[r];
	if(pos_l == pos_r){
		for(int i = l;i <= r;i++)
			if(a[i] + b[pos_l].add <= k)
				ret++;
		return ret;
	}
	for(int i = l;i <= b[pos_l].r;i++)
		if(a[i] + b[pos_l].add <= k)
			ret++;
	for(int i = b[pos_r].l;i <= r;i++)
		if(a[i] + b[pos_r].add <= k)
			ret++;
	for(int i = pos_l + 1;i <= pos_r - 1;i++){
		int L = b[i].l,R = b[i].r;
		while(L < R){
			int mid = (L + R + 1) >> 1;
			if(tmp[mid] + b[i].add <= k)
				L = mid;
			else
				R = mid - 1;
		}
		ret += L - b[i].l + 1;
	}
	return ret;
}
int query_min(int l,int r){
	int ret = INF;
	int pos_l = belong[l],pos_r = belong[r];
	if(pos_l == pos_r){
		for(int i = l;i <= r;i++)
			ret = min(ret,a[i] + b[pos_l].add);
		return ret;
	}
	for(int i = l;i <= b[pos_l].r;i++)
		ret = min(ret,a[i] + b[pos_l].add);
	for(int i = b[pos_r].l;i <= r;i++)
		ret = min(ret,a[i] + b[pos_l].add);
	for(int i = pos_l + 1;i <= pos_r - 1;i++)
		ret = min(ret,tmp[b[i].l] + b[pos_l].add);
	return ret;
}
int query_max(int l,int r){
	int ret = -INF;
	int pos_l = belong[l],pos_r = belong[r];
	if(pos_l == pos_r){
		for(int i = l;i <= r;i++)
			ret = max(ret,a[i] + b[pos_l].add);
		return ret;
	}
	for(int i = l;i <= b[pos_l].r;i++)
		ret = max(ret,a[i] + b[pos_l].add);
	for(int i = b[pos_r].l;i <= r;i++)
		ret = max(ret,a[i] + b[pos_l].add);
	for(int i = pos_l + 1;i <= pos_r - 1;i++)
		ret = max(ret,tmp[b[i].r] + b[pos_l].add);
	return ret;
}
int main(){
	ios::sync_with_stdio(false);
	cout.tie(0);
	n = read();q = read();
	for(int i = 1;i <= n;i++)
		a[i] = read();
	build_block();
	for(int i = 1;i <= q;i++){
		int op = read();
		int l = read(),r = read(),k = read();
		if(op == 2)
			update(l,r,k);
		else{
			int L = query_min(l,r),R = query_max(l,r),ans = -1;
			while(L <= R){
				int mid = (L + R) >> 1;
				if(query(l,r,mid) >= k){
					ans = mid;
					R = mid - 1;
				}
				else
					L = mid + 1;
			}
			cout << ans << '\n';
		}
	}
	return 0;
}
2024/7/26 15:04
加载中...