整体二分求调,玄关qwq
查看原帖
整体二分求调,玄关qwq
581316
small_john楼主2023/12/5 10:51
#include <bits/stdc++.h>
#define int long long
#define y1 ________
#define y2 __________ 
using namespace std;
const int N = 5e2+5,M = 1e6+5;
int n,m,a[N][N];
struct node{
	int t,op,x1,y1,x2,y2,k;
}q[M],ql[M],qr[M];
int t[N][N];
#define lowbit(x) (x&(-x))
inline void add(int x,int y,int v)
{
	for(int i = x;i<=n;i+=lowbit(i))
		for(int j = y;j<=n;j+=lowbit(j))
			t[i][j]+=v;
}
inline int ask(int x,int y)
{
	int res = 0;
	for(int i = x;i;i-=lowbit(i))
		for(int j = y;j;j-=lowbit(j))
			res+=t[x][y];
	return res;
}
int cnt,ans[M];
void solve(int l,int r,int x,int y)
{
	if(l==r)
	{
		for(int i = x;i<=y;i++)
			if(q[i].op==1) ans[q[i].t] = l;
		return;
	}
	int mid = (l+r)/2;
	int cntl = 0,cntr = 0,tmp;
	for(int i = x;i<=y;i++)
	{
		if(q[i].op==0)
		{
			if(q[i].k<=mid) ql[++cntl] = q[i],add(q[i].x1,q[i].y1,1);
			else qr[++cntr] = q[i];
		}
		else
		{
			tmp = ask(q[i].x2,q[i].y2)-ask(q[i].x2,q[i].y1-1)-ask(q[i].x1-1,q[i].y2)+ask(q[i].x1-1,q[i].y1-1);
			if(tmp<q[i].k) q[i].k-=tmp,qr[++cntr] = q[i];
			else ql[++cntl] = q[i];
		}
	}
//	cout<<"ok\n";
	for(int i = 1;i<=cntl;i++)
	{
		q[x+i-1] = ql[i];
		if(ql[i].op==0) add(ql[i].x1,q[i].y1,-1);
	}
	for(int i = 1;i<=cntr;i++)
		q[x+cntl+i-1] = qr[i];
	if(cntl) solve(l,mid,x,x+cntl-1);
	if(cntr) solve(mid+1,r,x+cntl,y);
}
signed main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i = 1;i<=n;i++)
		for(int j = 1;j<=n;j++)
			cin>>a[i][j],q[++cnt] = (node){0,0,i,j,i,j,a[i][j]};
	for(int i = 1;i<=m;i++)
	{
		int a,b,c,d,k;
		cin>>a>>b>>c>>d>>k;
		q[++cnt] = (node){i,1,a,b,c,d,k};
	}
	solve(0,1e9,1,cnt);
	for(int i = 1;i<=m;i++)
		cout<<ans[i]<<'\n';
	return 0;
}

全 WA,对了半天题解也没找到问题。

2023/12/5 10:51
加载中...