Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38225 LYLAKIOI 【BJ】T1 C++ 运行超时 86 2018 MS 160784 KB 5265 2025-07-05 16:47:38

Tests(26/30):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int qp(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} int ret[105][405]; int n,m,M,q; namespace Gao { int row; int t[405][405],res[405],iv[405],loc[405]; void add_row(vector<int>a){ ++row; up(i,1,M+1)t[row][i]=a[i]; up(i,1,row-1){ int _=loc[i]; int val=t[row][_]*1ll*iv[i]%mod; up(j,1,M+1)t[row][j]=add(t[row][j],mod-t[i][j]*1ll*val%mod); } int ps=1; while(!t[row][ps])ps++; loc[row]=ps; iv[row]=qp(t[row][ps],mod-2); } void solve(){ down(i,M,1){ int nw=t[i][M+1]; up(j,1,M)if(j!=loc[i])nw=add(nw,mod-t[i][j]*1ll*res[j]%mod); res[loc[i]]=nw*1ll*iv[i]%mod; } } } namespace DS { vector<vector<int> >Q[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) void modify(int l,int r,int s,int t,int p,vector<int>X){ if(l<=s&&t<=r)return Q[p].p_b(X),void(); int mid=s+t>>1; if(l<=mid)modify(l,r,s,mid,ls(p),X);if(r>mid)modify(l,r,mid+1,t,rs(p),X); } void solve(int s,int t,int p){ int now=Gao::row; for(auto x:Q[p])Gao::add_row(x); if(s==t){ Gao::solve(); up(i,1,M)ret[s][i]=Gao::res[i]; }else { int mid=s+t>>1; solve(s,mid,ls(p));solve(mid+1,t,rs(p)); } Gao::row=now; } } int prob[305][305][4]; const int dx[]={-1,1,0,0}; const int dy[]={0,0,-1,1}; int val[305][305][405],sum[405]; int vis[305][305]; vector<pair<int,pair<pi,pi> > >upd[305][305]; void init(){ memset(Gao::t,0,sizeof(Gao::t)); up(i,1,m)val[1][i][i]=1; up(i,2,n+1){ up(j,1,m){ if(vis[i][j]){ val[i][j][vis[i][j]]=1; upd[i-1][j].p_b(m_p(q+1,m_p(m_p(0,0),m_p(0,0)))); up(k,0,(int)upd[i-1][j].size()-2){ auto it=upd[i-1][j][k]; prob[i-1][j][0]=it.p2.p1.p1,prob[i-1][j][1]=it.p2.p1.p2; prob[i-1][j][2]=it.p2.p2.p1,prob[i-1][j][3]=it.p2.p2.p2; int iv=qp(prob[i-1][j][1],mod-2); up(k,1,M+1){ sum[k]=val[i-1][j][k]; sum[k]=add(sum[k],mod-val[i-1][j-1][k]*1ll*prob[i-1][j][2]%mod); sum[k]=add(sum[k],mod-val[i-1][j+1][k]*1ll*prob[i-1][j][3]%mod); sum[k]=add(sum[k],mod-val[i-2][j][k]*1ll*prob[i-1][j][0]%mod); } sum[M+1]=add(sum[M+1],mod-1); up(k,1,M+1)sum[k]=sum[k]*1ll*iv%mod; sum[vis[i][j]]=add(sum[vis[i][j]],mod-1); vector<int>ve(M+2,0); up(j,1,M+1)ve[j]=sum[j];ve[M+1]=(mod-ve[M+1])%mod; DS::modify(it.p1,upd[i-1][j][k+1].p1-1,0,q,1,ve); } }else { int iv=qp(prob[i-1][j][1],mod-2); up(k,1,M+1){ val[i][j][k]=val[i-1][j][k]; val[i][j][k]=add(val[i][j][k],mod-val[i-1][j-1][k]*1ll*prob[i-1][j][2]%mod); val[i][j][k]=add(val[i][j][k],mod-val[i-1][j+1][k]*1ll*prob[i-1][j][3]%mod); val[i][j][k]=add(val[i][j][k],mod-val[i-2][j][k]*1ll*prob[i-1][j][0]%mod); } val[i][j][M+1]=add(val[i][j][M+1],mod-1); up(k,1,M+1)val[i][j][k]=val[i][j][k]*1ll*iv%mod; } } } up(i,1,m){ vector<int>ve(M+2,0); up(j,1,M+1)ve[j]=val[n+1][i][j]; ve[M+1]=(mod-ve[M+1])%mod; DS::modify(0,q,0,q,1,ve); } } void output(int t){ int ans=0; up(i,1,n)up(j,1,m){ int res=0; up(k,1,M)res=add(res,val[i][j][k]*1ll*ret[t][k]%mod); res=add(res,val[i][j][M+1]); ans=add(ans,res); } printf("%d\n",ans); } void slv(){ n=read(),m=read(),q=read(); up(i,1,n)up(j,1,m)up(k,0,3)prob[i][j][k]=read();M=m; up(i,1,q){ int x=read(),y=read(); if(!vis[x+1][y]){ vis[x+1][y]=++M; upd[x][y].p_b(m_p(0,m_p(m_p(prob[x][y][0],prob[x][y][1]),m_p(prob[x][y][2],prob[x][y][3])))); } up(k,0,3)prob[x][y][k]=read(); upd[x][y].p_b(m_p(i,m_p(m_p(prob[x][y][0],prob[x][y][1]),m_p(prob[x][y][2],prob[x][y][3])))); } init();DS::solve(0,q,1); up(i,0,q)output(i); } int main(){ //freopen("support.in","r",stdin),freopen("support.out","w",stdout); slv(); return 0; }


测评信息: