调不出来一点,数据又不容易造的很强卡掉自己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;
}