你说的对,可是玄关!
查看原帖
你说的对,可是玄关!
817925
whileAK楼主2024/8/22 20:15

调不出来一点,数据又不容易造的很强卡掉自己QAQ,求助大神!悬赏关注!码风易调是整体二分写法。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rd(int &p){
	p=0;int f(0);char z=getchar();
	while(z>'9'||z<'0'){if(z=='-')f^=1;z=getchar();}
	while(z>='0'&&z<='9')p=(p<<1)+(p<<3)+z-'0',z=getchar();
	if(f)p=-p;
}
void rdl(ll &p){
	p=0;int f(0);char z=getchar();
	while(z>'9'||z<'0'){if(z=='-')f^=1;z=getchar();}
	while(z>='0'&&z<='9')p=(p<<1)+(p<<3)+z-'0',z=getchar();
	if(f)p=-p;
}
const int N=550;
int n,m;
ll t[N][N];
inline void add(int x,int y,int z){
	for(int i(x);i<=n;i+=i&-i){
		for(int j(y);j<=m;j+=j&-j){
			t[i][j]+=(ll)z;
		}
	}
}
inline ll ask0(int x,int y){
	ll ans(0);
	for(int i(x);i;i-=i&-i){
		for(int j(y);j;j-=j&-j){
			ans+=t[i][j];
		}
	}return ans;
}
inline ll ask(int x0,int y0,int x1,int y1){
	return ask0(x1,y1)-ask0(x0-1,y1)-ask0(x1,y0-1)+ask0(x0-1,y0-1);
}
struct farm{
	int x0,y0,x1,y1;
	ll b;
}a[N*100];
struct wea{
	int x,y,z;
}e[N*200];
int id[N*100],q,T,w,s[N*100],ans[N*100],c[N*100],d[N*100];
inline void solve(int l,int r,int L,int R){
//	printf("l:%d r:%d L:%d R:%d\n",l,r,L,R);
//	for(int i(L);i<=R;++i)printf("%d ",id[i]);cout<<endl;
//	for(int i(1);i<=q;++i)printf("%d ",id[i]);cout<<endl;
	if(L>R){
		for(int i(l);i<=r;++i)add(e[i].x,e[i].y,-e[i].z);
		return;
	}
	if(l==r){
		for(int i(L);i<=R;++i){
			ans[id[i]]=l;
		}add(e[l].x,e[l].y,-e[l].z);
		return;
	}int mid=l+r>>1;
	for(int i(l);i<=mid;++i)add(e[i].x,e[i].y,-e[i].z);
	int tp1(0),tp2(0);
	for(int j(L),i;j<=R;++j){
		i=id[j];
		if(ask(a[i].x0,a[i].y0,a[i].x1,a[i].y1)>=a[i].b)d[++tp2]=i;
		else c[++tp1]=i;
	}
	for(int i(0);i<tp1;++i)id[L+i]=c[i+1];
	for(int i(tp1);i<tp1+tp2;++i)id[L+i]=d[i-tp1+1];
	for(int i(l);i<=mid;++i)add(e[i].x,e[i].y,e[i].z);
	solve(l,mid,L,L+tp1-1);solve(mid+1,r,L+tp1,R);
}
int main(){
	rd(n);rd(m);
	for(int i(1);i<=n;++i){
		for(int j(1),x;j<=m;++j){
			rd(x);add(i,j,x);
		}
	}rd(q);
	for(int i(1);i<=q;++i){
		rd(a[i].x0);rd(a[i].y0);rd(a[i].x1);rd(a[i].y1);
		rdl(a[i].b);id[i]=i;
	}
	rd(T);
	for(int i(1),p,u(0);i<=T;++i){
		rd(p);
		for(int j(1);j<=p;++j){
			++u;s[u]=i;
			rd(e[u].x);rd(e[u].y);rd(e[u].z);
		}w=u;
	}e[0].x=e[0].y=1;e[0].z=0;
	e[w+1].x=e[w+1].y=1;e[w+1].z=0;
	for(int i(0);i<=w+1;++i)assert(e[i].x<=n&&e[i].y<=m);
	solve(0,w+1,1,q);
	for(int i(1);i<=q;++i){
		if(ans[i]>w)printf("-1 ");
		else printf("%d ",max(1,s[ans[i]])-1);
	}
	return 0;
}
2024/8/22 20:15
加载中...