• Nozaki_Chiyo的代码盒


      1 #include<iostream>
      2 #include<cstdio>
      3 #include<string>
      4 #include<cstring>
      5 #include<queue>
      6 using namespace std;
      7 const int N = 5005;
      8 const int INF = 1e9+7;
      9 inline int read() {
     10     int x = 0; char ch = getchar();
     11     while(ch<'0' || ch>'9') ch = getchar();
     12     while(ch>='0' && ch<='9') x = x*10+ch-'0', ch = getchar();
     13     return x;
     14 }
     15 
     16 int n;
     17 struct node{
     18     int y, z, nxt;
     19 }e[N << 1];
     20 int h[N], tot=0;
     21 inline void ad(int x, int y, int z){
     22     ++tot; 
     23     e[tot].y = y; e[tot].z = z; e[tot].nxt = h[x]; h[x] = tot;
     24 }
     25 
     26 int Dl,Dr;
     27 int dis[N], vis[N];
     28 queue<int> q;
     29 inline void bfs(int now) {
     30     memset(vis,0,sizeof(vis));
     31     dis[now] = 0; 
     32     q.push(now); vis[now] = 1;
     33     while(!q.empty()) {
     34         int x = q.front(); q.pop();
     35         for(int i = h[x]; i; i = e[i].nxt){
     36             int y = e[i].y; if(vis[y])continue;
     37             dis[y] = dis[x] + e[i].z;
     38             vis[y] = 1; q.push(y);
     39         }
     40     }
     41 }
     42 inline void Get_d() {
     43     bfs(1);
     44     Dl=Dr=0;
     45     for(int i=1; i<=n; ++i) if(dis[i] >= dis[Dl])Dl=i;
     46     bfs(Dl);
     47     for(int i=1; i<=n; ++i) if(dis[i] >= dis[Dr])Dr=i;
     48 }
     49 
     50 struct D_edge{
     51     int o,len;
     52 }sew[N];
     53 int t_sew=0;
     54 inline bool dfs(int st, int ed, int f) {
     55     if(st == ed) {
     56         ++t_sew; sew[t_sew].o=st; return true;
     57     }
     58     for(int i=h[st]; i; i=e[i].nxt) {
     59         int y = e[i].y; if(y == f)continue;
     60         if(dfs(y,ed,st)) {
     61             ++t_sew;
     62             sew[t_sew].o=st; sew[t_sew].len=e[i].z;
     63             return true;
     64         }
     65     }
     66     return false;
     67 }
     68 
     69 inline int son_d(int o) {
     70     q.push(o); vis[o]=1;
     71     int mx=0;
     72     while(!q.empty()) {
     73         int x=q.front(); q.pop();
     74         mx = max(mx, dis[x]);
     75         for(int i=h[x]; i; i=e[i].nxt) {
     76             int y = e[i].y;
     77             if(!vis[y]) {
     78                 vis[y]=1; q.push(y);
     79                 dis[y] = dis[x]+e[i].z;
     80             }
     81         }
     82     }
     83     return mx;
     84 }
     85 
     86 struct son_tree{
     87     int d,r;
     88 }str[N],sdr[N];
     89 
     90 inline void draw(){
     91     memset(dis,0,sizeof(dis));
     92     memset(vis,0,sizeof(vis));
     93     for(int i=1; i <= t_sew; ++i) vis[sew[i].o]=1;
     94 }
     95 
     96 int main() {
     97     n=read();
     98     for(int i=1; i<n; ++i) {
     99         int x,y,z;
    100         x=read(); y=read(); z=read();
    101         ad(x,y,z); ad(y,x,z);
    102     }
    103     Get_d();
    104     dfs(Dl,Dr,Dl);
    105     draw();
    106     int mid=1;
    107     for(int i=2; i<=t_sew; ++i) {
    108         int o = sew[i].o;
    109         dis[o] = dis[ sew[i-1].o ]+sew[i].len;
    110         int Di = son_d(o);
    111         if(Di <= str[ sew[i-1].o ].d) {
    112             str[o]=str[ sew[i-1].o ];
    113         } else {
    114             int pos0 = sew[mid].o, pos1 = sew[mid+1].o;
    115             while(mid<i && max( Di-dis[pos0], dis[pos0] ) > max( Di-dis[pos1], dis[pos1] )){
    116                 ++mid;
    117                 pos0 = pos1;
    118                 pos1 = sew[mid+1].o;
    119             }
    120             str[o].r = max(dis[sew[mid].o],Di-dis[sew[mid].o]);
    121             str[o].d = Di;
    122         }
    123     }
    124     draw();
    125     mid = t_sew;
    126     for(int i=t_sew-1; i>=1; --i) {
    127         int o=sew[i].o;
    128         dis[o] = dis[ sew[i+1].o ] + sew[i+1].len;
    129         int Di = son_d(o);
    130         if(Di <= sdr[ sew[i+1].o ].d) {
    131             sdr[ sew[i].o ] = sdr[ sew[i+1].o ];
    132         } else {
    133             int pos0 = sew[mid].o, pos1 = sew[mid-1].o;
    134             while(mid>i && max( Di-dis[pos0], dis[pos0] ) > max( Di-dis[pos1], dis[pos1] )) {
    135                 --mid;
    136                 pos0 = pos1;
    137                 pos1 = sew[mid-1].o;
    138             }
    139             sdr[o].d = Di;
    140             sdr[o].r = max( dis[ sew[mid].o ], Di-dis[ sew[mid].o ] );
    141         }
    142     }
    143     int minn=INF;
    144     for(int i=1; i<=t_sew; ++i) {
    145         int t_d=str[ sew[i].o ].r + sdr[ sew[i+1].o ].r + sew[i+1].len;
    146         minn=min(minn, max( t_d, max(str[sew[i].o].d, sdr[sew[i+1].o].d) ));
    147     }
    148     printf("%d",minn);
    149 }
    150  

    运输计划

    tywz day3 排队

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #define int long long
    using namespace std;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
        while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    const int N=125;
    const int mod=1e9+7;
    int n,a,b,c,d,e,mx;
    int f[N][2],g[N][2];
    int s[N],tot=0;
    struct matrix{
        int m[N][N];
    }x;
    
    matrix mul(matrix A,matrix B){
        matrix C;
        for(int i=1;i<=mx*4;++i)
            for(int j=1;j<=mx*4;++j){
                C.m[i][j]=0;
                for(int k=1;k<=mx*4;++k)
                    C.m[i][j]+=A.m[i][k]*B.m[k][j];
            }
        return C;
    }
    
    matrix qpow(matrix A,int y){
        matrix res;
        memset(res.m,0,sizeof(res.m));
        for(int i=1;i<=120;++i){
            res.m[i][i]=1;
        }
        for(;y;){
            if(y&1)res=mul(res,A);
            A=mul(A,A);y>>=1;
        }
        return res;
    }
    
    signed main(){
        n=read();a=read();b=read();c=read();d=read();e=read();
        mx=max(a,max(b,c));f[0][1]=d;f[0][0]=e;g[0][0]=1,g[0][1]=1;
        for(int i=1;i<=mx;++i){
            if(i>=a)
                f[i][1]+=f[i-a][1]+d*g[i-a][1],g[i][1]+=g[i-a][1];
            f[i][0]%=mod;f[i][1]%=mod;g[i][0]%=mod;g[i][1]%=mod;
            if(i>=b)f[i][0]+=f[i-b][1]+e*g[i-b][1],g[i][0]+=g[i-b][1],
                    f[i][1]+=f[i-b][0]+d*g[i-b][0],g[i][1]+=g[i-b][0];
            f[i][0]%=mod;f[i][1]%=mod;g[i][0]%=mod;g[i][1]%=mod;
            if(i>=c)f[i][0]+=f[i-c][0]+e*g[i-c][0],g[i][0]+=g[i-c][0];
            f[i][0]%=mod;f[i][1]%=mod;g[i][0]%=mod;g[i][1]%=mod;
            s[++tot]=f[i][0];s[++tot]=g[i][0];s[++tot]=f[i][1];s[++tot]=g[i][1];
        }
        if(n<=mx){
            printf("%lld",(f[n][0]+f[n][1])%mod);
            return 0;
        }
        memset(x.m,0,sizeof(x.m));
        for(int i=1;i<=(mx-1)*4;++i){
            x.m[i][i+4]=1;
        }
        x.m[(mx-1)*4+1][(mx-b)*4+3]=1;x.m[(mx-1)*4+1][(mx-b)*4+4]=e;
        x.m[(mx-1)*4+1][(mx-c)*4+1]=1;x.m[(mx-1)*4+1][(mx-c)*4+2]=e;
        x.m[(mx-1)*4+2][(mx-b)*4+4]=1;x.m[(mx-1)*4+2][(mx-c)*4+2]=1;
        x.m[(mx-1)*4+3][(mx-a)*4+3]=1;x.m[(mx-1)*4+3][(mx-a)*4+4]=d;
        x.m[(mx-1)*4+3][(mx-b)*4+1]=1;x.m[(mx-1)*4+3][(mx-b)*4+2]=d;
        x.m[(mx-1)*4+4][(mx-a)*4+4]=1;x.m[(mx-1)*4+4][(mx-b)*4+2]=1;
        matrix p=qpow(x,n-mx);
        int ans=0;
        for(int i=1;i<=mx*4;++i){
            if(i%2==0)continue;
            ans+=s[i]*p.m[(mx-1)*4+1][i];ans%=mod;
            ans+=s[i]*p.m[(mx-1)*4+3][i];ans%=mod;
        }
        cout<<ans;
    }
  • 相关阅读:
    git stash 一个场景 mark
    sendBeacon 使用
    【踩坑笔记】layui之单选和复选框不显示
    wordpress后台管理超时没反应:load-scripts.php载入缓慢出错
    MySQL_Sql_打怪升级_进阶篇_测试: SQL随机生成测试数据
    MySQL_Sql_打怪升级_进阶篇_测试: 游标应用
    MySQL8.0新特性_01_JSON数据格式的支持
    MySQL_Sql_打怪升级_进阶篇_进阶19: 函数
    MySQL_Sql_打怪升级_进阶篇_进阶18: 存储过程
    MySQL_Sql_打怪升级_进阶篇_进阶17: 变量
  • 原文地址:https://www.cnblogs.com/chiyo/p/11291797.html
Copyright © 2020-2023  润新知