主席树板子求助
查看原帖
主席树板子求助
141335
qwq2519楼主2021/8/29 22:33
#include<iostream>
#include<cstdio>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
using namespace std;
typedef long long lxl;
template<typename T>
inline T  max(T &a, T &b) {
	return a > b ? a : b;
}
template<typename T>
inline T  min(T &a, T &b) {
	return a < b ? a : b;
}

inline char gt() {
	static char buf[1 << 21], *p1 = buf, *p2 = buf;
	return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void  read(T &x) {
	register char ch = gt();
	x = 0;
	int w(0);
	while(!(ch >= '0' && ch <= '9'))w |= ch == '-', ch = gt();
	while(ch >= '0' && ch <= '9')x = x * 10 + (ch & 15), ch = gt();
	w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x) {
	if(x < 0) x = -x, putchar('-');
	char ch[20];
	int num(0);
	while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
	while(num) putchar(ch[num--]);
	putchar('\n');
}
const int N = 5e5 + 79;
const int MI = 207;
int DAY, n, m, q;
#define bug puts("~~~~");




namespace solve1 {
	lxl sum[MI][MI][1007];
	int num[MI][MI][1007];
	lxl p[MI][MI];

	inline lxl getsum(int a, int b, int c, int d, int k) {
		return sum[c][d][k] - sum[a - 1][d][k] - sum[c][b - 1][k] + sum[a - 1][b - 1][k];
	}
	inline int getnum(int a, int b, int c, int d, int k) {
		return num[c][d][k] - num[a - 1][d][k] - num[c][b - 1][k] + num[a - 1][b - 1][k];
	}

	int main() {
		rep(i, 1, n) {
			rep(j, 1, m) {
				read(p[i][j]);
			}
		}

		rep(k, 1, 1007) {
			rep(i, 1, n) {
				rep(j, 1, m) {
					sum[i][j][k] = sum[i - 1][j][k] + sum[i][j - 1][k] - sum[i - 1][j - 1][k] + p[i][j] * (p[i][j] >= k);
					num[i][j][k] = num[i - 1][j][k] + num[i][j - 1][k] - num[i - 1][j - 1][k] + (p[i][j] >= k);
				}
			}
		}
		int x1, x2, y1, y2;
		lxl H;

		while(q--) {
			read(x1);
			read(y1);
			read(x2);
			read(y2);
			read(H);
			if(getsum(x1, y1, x2, y2, 1) < H) {
				puts("Poor QLW");
				continue;
			}
			int l = 1, r = 1000, mid, ans = 0, tot = 0;
			while(l <= r) {
				mid = (l + r >> 1);
				if(getsum(x1, y1, x2, y2, mid) >= H) {
					l = mid + 1;
					ans = mid;
				} else r = mid - 1;
			}
			out(getnum(x1, y1, x2, y2, ans) - (getsum(x1, y1, x2, y2, ans) - H) / ans);
		}
		return 0;
	}
}//СÊý¾Ý

namespace solve2 {
	lxl p[N];
	
	int cnt;
	int rt[N],lc[N<<5],rc[N<<5],sum[N<<5],num[N<<5];
	
	inline void insert(int &now,int pre,int L,int R,int pos,int cntv,int nv){
		now=++cnt;
		lc[now]=lc[pre];
		rc[now]=rc[pre];
		sum[now]=sum[pre]+nv;
		num[now]=num[pre]+cntv;
		if(L==R){
			return;
		}
		int mid(L+R>>1);
		if(pos<=mid) insert(lc[now],lc[pre],L,mid,pos,cntv,nv);
		else insert(rc[now],rc[pre],mid+1,R,pos,cntv,nv);	
	}
	inline int ask(int p,int q,int L,int R,int H){
		if(L==R) return (H-1)/L+1;
		int mid(L+R>>1);
		int rnum=num[rc[q]]-num[rc[p]];
		int rsum=sum[rc[q]]-sum[rc[p]];
		if(H<=rsum) return ask(rc[p],rc[q],mid+1,R,H);//̰ÐÄÕÒ´óµÄ 
		else return ask(lc[p],lc[q],L,mid,H-rsum)+rnum;
	}
	
	int main() {
		
		rep(i, 1, m) {
			read(p[i]);
			insert(rt[i],rt[i-1],1,1007,p[i],1,p[i]);
		}
		int x1, x2, y1, y2;
		lxl H;
		while(q--){
			
			read(x1);
			read(y1);//
			read(x2);
			read(y2);//
			read(H);
			if(sum[rt[x2]]-sum[rt[x1-1]]<H) {
				puts("Poor QLW");
				continue;
			}
			out(ask(rt[x1-1],rt[x2],1,1007,H));
		}
		return 0;
	}
}


int main() {
	read(n);
	read(m);
	read(q);
	if(n == 1)
		solve2::main();
	else
		solve1::main();

	return 0;
}

后面50tps全部输出Poor..

2021/8/29 22:33
加载中...