求助,不知为何 TLE
查看原帖
求助,不知为何 TLE
384779
Grimmer楼主2022/10/3 18:04
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#include<bits/stdc++.h>
using namespace std;
#define rg register
#define ll long long
#define ull unsigned long long
#define lbt(x) (x&(-x))
#define mod 998244353
const short sint=0x3f3f;
const int inf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
inline void file(){
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
}
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,(1<<20)+5,stdin),p1==p2)?EOF:*p1++;}
inline ll read(){
    rg ll res=0;bool sgn=0;char ch=getc();
    while(!isdigit(ch)){if(ch==EOF) exit(0);if(ch=='-') sgn=1;ch=getc();}
    while(isdigit(ch)) res=res*10+ch-48,ch=getc();
    return sgn?-res:res;
}
#define vec vector
#define epb emplace_back
#define pii pair<int,int>
#define mkp make_pair
#define fi first
#define se second
#define szf sizeof
#define rep(i,a,b) for(rg int i=a;i<=b;++i)
#define per(i,a,b) for(rg int i=a;i>=b;--i)
inline int add(const int a,const int b){return a+b>=mod?a+b-mod:a+b;}
inline void sub(int &a,const int b){a=(a-b<0?a-b+mod:a-b);}

const int N=1e6+5;
struct edge{int v,w,nxt;}g[N<<2];
int h[N],cnt=0;
inline void add(int u,int v,int w){g[++cnt]=(edge){v,w,h[u]},h[u]=cnt;}
ll dis[105][105],dist[N];
int tot,n,m,T,pm[N],tag,flag[N];
bool vis[N];
priority_queue<pii>q;
inline void dij(int s){
    rep(i,0,(n+1)*(m+1)) dist[i]=linf,vis[i]=0;
    q.push(mkp(0,s)),dist[s]=0;
    while(!q.empty()){
        pii u=q.top();q.pop();
        if(vis[u.se]) continue;
        vis[u.se]=1;
        if(pm[u.se]) dis[pm[s]][pm[u.se]]=dis[pm[u.se]][pm[s]]=dist[u.se];
        for(rg int i=h[u.se];i;i=g[i].nxt){
        	int v=g[i].v,w=g[i].w;
            if(dist[v]>dist[u.se]+w){
                dist[v]=dist[u.se]+1ll*w;
                q.push(mkp(-dist[v],v));
            }
        }
    }
}
inline int calc1(int x,int y){return (y-1)*(m+1)+x;}
inline pii calc2(int p){
    if(p<=m) return mkp(p,1);p-=m;
    if(p<=n) return mkp(m+1,p);p-=n;
    if(p<=m) return mkp(m+1-p+1,n+1);p-=m;
    return mkp(1,n+1-p+1);
}
struct node{
    int x,p,t;
    bool operator <(const node &o)const{return p<o.p;}
}a[105];
ll dp[205][205];
int mp[105],flg[N];
inline int f(int o){return o>tot?o-=tot:o;}
signed main(){
    file();
    n=read(),m=read(),T=read();
    rep(i,1,n-1) rep(j,1,m){
        int x=read();
        int u=calc1(j,i+1),v=calc1(j+1,i+1);
        add(u,v,x),add(v,u,x);
    }
    rep(i,1,n) rep(j,1,m-1){
        int x=read();
        int u=calc1(j+1,i),v=calc1(j+1,i+1);
        add(u,v,x),add(v,u,x);
    }
    int tag=cnt;
    rep(i,0,(n+1)*(m+1)) flag[i]=h[i];
    while(T--){
        int k=read();
        rep(i,1,k) a[i].x=read(),a[i].p=read(),a[i].t=read();
        sort(a+1,a+1+k);
        rep(i,0,(n+1)*(m+1)) flg[i]=0;
        flg[0]=-1;
        rep(i,1,k){
            pii o=calc2(a[i].p);
            int u=calc1(o.fi,o.se),v;
            if(a[i].p<=m) v=u+1;
            else if(a[i].p<=n+m) v=u+m+1;
            else if(a[i].p<=n+m*2) v=u-1;
            else v=u-m-1;
            add(u,v,a[i].x),add(v,u,a[i].x),flg[u]=1;
            if(a[i-1].t!=a[i].t) mp[++tot]=u;
        }
        vec<int> b;
        b.epb(-1);
        rep(i,1,m+1) b.epb(calc1(i,1));
        rep(i,2,n+1) b.epb(calc1(m+1,i));
        per(i,m,1) b.epb(calc1(i,n+1));
        per(i,n,1) b.epb(calc1(1,i));
        int lst=-2;
        rep(i,1,b.size()-2){
            if(!flg[b[i]]){
                add(b[i],b[i+1],0),add(b[i+1],b[i],0);
            }
        }
        if(a[1].t==a[k].t){
        	rep(i,1,tot-1) mp[i]=mp[i+1];
			--tot;
		}
		rep(i,1,tot) pm[mp[i]]=i;
        rep(i,1,tot) mp[i+tot]=mp[i];
        memset(dis,-1,szf(dis));
        rep(i,1,tot-1) dij(mp[i]);
        rep(i,1,tot*2) dp[i][i]=linf,dp[i][i-1]=0;
        
        for(rg int k=2;k<=tot;k+=2){
            rep(i,1,2*tot-k+1){
                int l=i+k-1;
                if(dis[f(i)][f(l)]=-1) dij(mp[i]);
				dp[i][l]=dp[i+1][l-1]+dis[f(i)][f(l)];
                for(rg int j=i+1;j<l;j+=2) dp[i][l]=min(dp[i][l],dp[i][j]+dp[j+1][l]);
            }
        }
        ll ans=linf;
        rep(i,1,tot) ans=min(ans,dp[i][i+tot-1]);
        printf("%lld\n",ans==linf?0:ans);
        memset(dp,0,szf(dp));tot=0;
        cnt=tag;
        rep(i,0,(n+1)*(m+1)) h[i]=flag[i];
        rep(i,0,(n+1)*(m+1)) pm[i]=0;
    }
    return 0;
}
2022/10/3 18:04
加载中...