Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38230 baka24 【BJ】T1 C++ 通过 100 658 MS 300404 KB 5426 2025-07-05 20:26:21

Tests(30/30):


#include<bits/stdc++.h> #include<bits/extc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=410,inf=1e18,Mod=1e9+7; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod,y>>=1;}return rt;} int n,m,q,p[MAXN][MAXN][4],as[MAXN],mx[4]={-1,1,0,0},my[4]={0,0,-1,1}; void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;}int Add(int x,int y){return x+y>=Mod?x+y-Mod:x+y;} int mp(int x,int y){return (x-1)*m+y;} struct node{ int x,y,a,b,c,d; }s[MAXN]; int vis[MAXN][MAXN],tim[MAXN][MAXN],k; struct fx{ int x[MAXN],y; fx operator+(const fx&G)const{ fx res=G; for(int i=1;i<=k;i++)add(res.x[i],x[i]); add(res.y,y); return res; } fx operator-(const fx&G)const{ fx res; for(int i=1;i<=k;i++)res.x[i]=Add(x[i],Mod-G.x[i]); res.y=Add(y,Mod-G.y); return res; } fx operator+(const int&G)const{ fx res; for(int i=1;i<=k;i++)res.x[i]=x[i]; res.y=Add(y,G); return res; } fx operator-(const int&G)const{ fx res; for(int i=1;i<=k;i++)res.x[i]=x[i]; res.y=Add(y,Mod-G); return res; } fx operator*(const int &G)const{ fx res; for(int i=1;i<=k;i++)res.x[i]=x[i]*G%Mod; res.y=y*G%Mod; return res; } void prt(){ for(int i=1;i<=k;i++)cout<<x[i]<<" ";cout<<" "<<y<<endl; } }x[MAXN][MAXN],a[MAXN],b[MAXN],res; int t; bool vs[MAXN]; int stk[MAXN]; void insert(fx x){ for(int i=1;i<=k;i++)if(vs[i]){ int inv=Pow(a[i].x[i],Mod-2); if(x.x[i]){ int tmp=Mod-x.x[i]*inv%Mod; for(int o=i;o<=k;o++)x.x[o]=(x.x[o]+tmp*a[i].x[o])%Mod; x.y=(x.y+tmp*a[i].y)%Mod; } } for(int i=1;i<=k;i++)if(!vs[i]&&x.x[i]){ a[i]=x,stk[++t]=i,vs[i]=1; return; } } void pop(){ vs[stk[t]]=0; t--; } int Geass(){ for(int i=1;i<=t;i++)b[i]=a[i]; for(int i=t;i>=1;i--){ int inv=Pow(b[i].x[i],Mod-2); b[i].y=b[i].y*inv%Mod,b[i].x[i]=1; for(int j=1;j<i;j++){ int tmp=Mod-b[j].x[i]; b[j].x[i]=0; b[j].y=(b[j].y+tmp*b[i].y)%Mod; } } int ans=res.y; // cout<<"Geass:"; for(int i=1;i<=t;i++)add(ans,res.x[i]*b[i].y%Mod);//,cout<<b[i].y<<" ";cout<<endl; return ans; } void init(){ for(int j=1;j<=m;j++)x[1][j].x[j]=1; for(int i=1;i<n;i++) for(int j=1;j<=m;j++) if(!tim[i][j]){ x[i+1][j]=(x[i][j]-x[i-1][j]*p[i][j][0]-x[i][j-1]*p[i][j][2]-x[i][j+1]*p[i][j][3]-1)*Pow(p[i][j][1],Mod-2); } else x[i+1][j].x[vis[i][j]]=1; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){ res=res+x[i][j]; // cout<<i<<","<<j<<":"<<endl; // x[i][j].prt(); } for(int j=1;j<=m;j++)if(!tim[n][j]){ fx tmp=x[n][j]-x[n-1][j]*p[n][j][0]-x[n][j-1]*p[n][j][2]-x[n][j+1]*p[n][j][3]-1; tmp.y=Mod-tmp.y; insert(tmp); } } void ins(node X){ int i=X.x,j=X.y,p0=X.a,p1=X.b,p2=X.c,p3=X.d; // cout<<"ins: "<<i<<" "<<j<<" "<<p0<<" "<<p1<<" "<<p2<<" "<<p3<<endl; fx tmp=x[i][j]-x[i-1][j]*p0-x[i+1][j]*p1-x[i][j-1]*p2-x[i][j+1]*p3-1; // tmp.prt(); tmp.y=Mod-tmp.y; insert(tmp); } struct segtree{ #define lson (pos<<1) #define rson (pos<<1|1) vector<node>t[MAXN<<2]; void update(int pos,int l,int r,int ql,int qr,node x){ // if(pos==1)cout<<ql<<" "<<qr<<" "<<x.a<<" "<<x.x<<endl; if(ql<=l&&qr>=r){ t[pos].pb(x); return; } int mid=(l+r)>>1; if(ql<=mid)update(lson,l,mid,ql,qr,x); if(qr>mid)update(rson,mid+1,r,ql,qr,x); } void build(int pos,int l,int r){ for(auto o:t[pos])ins(o); if(l==r){ as[l]=Geass(); for(auto o:t[pos])pop(); return; } int mid=(l+r)>>1; build(lson,l,mid),build(rson,mid+1,r); for(auto o:t[pos])pop(); } }T; void slv(){ n=read(),m=read(),q=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) p[i][j][0]=read(),p[i][j][1]=read(),p[i][j][2]=read(),p[i][j][3]=read(); for(int i=1;i<=q;i++){ s[i].x=read(),s[i].y=read(),s[i].a=read(),s[i].b=read(),s[i].c=read(),s[i].d=read(); if(tim[s[i].x][s[i].y])T.update(1,0,q,tim[s[i].x][s[i].y],i-1,s[tim[s[i].x][s[i].y]]); else T.update(1,0,q,0,i-1,{s[i].x,s[i].y,p[s[i].x][s[i].y][0],p[s[i].x][s[i].y][1],p[s[i].x][s[i].y][2],p[s[i].x][s[i].y][3]}); tim[s[i].x][s[i].y]=i; } k=m; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(tim[i][j]){ if(i!=n)vis[i][j]=++k; T.update(1,0,q,tim[i][j],q,s[tim[i][j]]); } init(); // cout<<k<<endl; T.build(1,0,q); for(int i=0;i<=q;i++)printf("%lld\n",as[i]); } signed main(){ // freopen("support.in","r",stdin);freopen("support.out","w",stdout); slv(); //cerr<<(clock()*1.0)/CLOCKS_PER_SEC<<"s"<<endl; return 0; }


测评信息: