20160817训练记录

 

类似生成树的做法去边权降序的前k或n-1条边

T2

发现这个东西可以转化成上一行的前缀积乘上行号

质因数肯定是小于n的职数 每个数的指数是一个组合数的形式

XJB算一下好了

#include<cstdio>
#include<time.h>
#include<assert.h>
#include<iostream>
#define mod 1000000009
using namespace std;
int n,k;int g[2333][2333],G[2333][2333];
long long _pow(int a,int n){
    if(!n)return 1;
    long long t=_pow(a,n/2);
    if(n&1)return t*t*a%mod;
    else return t*t%mod;
}
long long ba[2333],li[2333],li2[2333],_li=0;
void fenjie(int a,int n){
    _li=0;
    int p=2;
    while(a>1){
        if(!(a%p)){
            li[++_li]=p;
            li2[_li]=0;
            while(!(a%p)){
                ++li2[_li];
                a/=p;
            }
        }
        ++p;
    }
    for(int i=1;i<=_li;i++){
        ba[li[i]]=(ba[li[i]]+li2[i]*n)%mod;
    }
}
int main(){
    freopen("calc.in","r",stdin);
    freopen("calc.out","w",stdout);
    cin>>n>>k;
    for(int i=0;i<=2332;i++)g[i][1]=i;
    for(int j=0;j<=2332;j++)g[j][j]=g[j][0]=1;
    for(int i=2;i<=2332;i++)
        for(int j=2;j<=2332;j++){
                g[i][j]=(g[i-1][j]+g[i-1][j-1])%mod;
    }
    for(int i=1;i<=2332;i++){
        for(int j=1;j<=2332;j++){
            G[i][j]=g[i-1+j-1][i-1];
        }
    }
    long long t=1;
    if(k==0){
        _li=0;int p=2;
        while(n>1){
            if(!(n%p)){
                li[++_li]=p;
                while(!(n%p)){
                    n/=p;
                    li2[_li]++;
                }
            }
            p++;
        }
        for(int i=1;i<=n;i++){
            t=t*(li2[i]+1)%mod;
        }
    }
    if(k>=1){
        int i=n,j=k-1;
        for(int p=i;p>=1;p--){
            fenjie(i-p+1,G[p][j+1]);
        }
        for(int p=2;p<=2332;p++)t=(t*(long long)(ba[p]+1))%mod;
    }
    cout<<t;
}

T3

对于单个公司的子图求最短路径长度

然后对于任意两点间所有公司的最短路径长度求一个花费建一个新图

对新图做一个最短路

#include<map>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<complex>
#include<iostream>
#include<assert.h>
#include<algorithm>
using namespace std;
#define inf 1001001001
#define infll 1001001001001001001LL
#define FOR0(i,n) for(int (i)=0;(i)<(n);++(i))
#define FOR1(i,n) for(int (i)=1;(i)<=(n);++(i))
#define ll long long
#define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
#define gmax(a,b) (a)=max((a),(b))
#define gmin(a,b) (a)=min((a),(b))
#define ios0 ios_base::sync_with_stdio(0)
#define Ri register int
#include<assert.h>
#define gc getchar()
#define il inline
il int read(){
    bool f=true;
    Ri x=0;char ch;
    while(!isdigit(ch=gc))if(ch==‘-‘)f=false;
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-‘0‘;ch=gc;}
    return f?x:-x;
}
#define gi read()
#define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
int n,m,c,s,t;
int f[21][101][101];
int g[101][101];
int p[21],q[21][101],r[21][101];
int calc(int c,int len){
    int ans=0;
    for(int i=1;i<=p[c];i++){
        if(len>q[c][i]){
            ans+=r[c][i]*(q[c][i]-q[c][i-1]);
        }else{
            ans+=r[c][i]*(len-q[c][i-1]);
            return ans;
        }
    }
    return ans;
}
int main(){
    //FO(railway);
    memset(f,127/3,sizeof(f));
    freopen("railway.in","r",stdin);
    freopen("railway.out","w",stdout);
    n=gi;m=gi;c=gi;s=gi;t=gi;
    FOR1(i,m){
        int x,y,z,b;
        x=gi;y=gi;z=gi;b=gi;
        f[b][x][y]=f[b][y][x]=z;
    }
    FOR1(i,c)p[i]=gi;
    FOR1(i,c){
        FOR1(x,p[i]-1)q[i][x]=gi;q[i][p[i]]=inf;
        FOR1(x,p[i]) r[i][x]=gi;
    }
    FOR1(_,c)FOR1(i,n)f[_][i][i]=0;
    FOR1(_,c){
        FOR1(p,n)FOR1(i,n)FOR1(j,n)gmin(f[_][i][j],f[_][i][p]+f[_][p][j]);
    }
    memset(g,127/3,sizeof(g));
    FOR1(i,n)g[i][i]=0;
    FOR1(k,c){
        FOR1(i,n){
            FOR1(j,n){
                //if(f[k][i][j]&&f[k][i][j]<f[0][0][0]){
                    int T=calc(k,f[k][i][j]);

                    //assert(T>0);
                    gmin(g[i][j],T);
                    gmin(g[j][i],T);
                //}
            }

        }
    }//puts("");
    FOR1(p,n)FOR1(i,n)FOR1(j,n)gmin(g[i][j],g[i][p]+g[p][j]);
    cout<<g[s][t];
    return 0;
}
/*
4 4 2 1 4
1 2 2 1
2 3 2 1
3 4 5 1
2 4 4 2

3 2
3 6
10 5 3
100
10 9*/
时间: 2024-10-24 21:01:52

20160817训练记录的相关文章

斜率优化系列——训练记录

斜率优化训练记录 前言 斜率优化一般用于优化dp的转移,借着训练斜率优化的相关问题来提升一些DP思维.选择老学长留下的专题场来练手,由于该场题数较多,以及个人不太愿意长时间进行单一专题训练,因此开此文来记录断续的训练结果和心得. 记录 题一 由一道简单入门题玩具装箱开头,题意和思路比较简单就不讲了. 代码 #include<bits/stdc++.h> #define dd(x) cout<<#x<<" = "<<x<<&qu

NOI前训练记录

从今年年初开始就没怎么碰oi,学了三个月文化课,然后就是省选到处跑(浪),进了省队后又去北京打(浪)了波(七)铁(天),回家后又生了一星期病,感觉自己noi凉透了... ctsc因为运气的原因有人放弃D3自己才拿到au,apio什么牌都没拿到,自己这么菜的主要原因可能还是没怎么做题吧,五个月不碰oi,已经连dfs都不会了,还有两个月就noi了,再不训练又要为JS丢脸了,自己拿不到au却占了个省队名额,而阿老师邀请赛冠军的水平却没进省队,感觉自己不珍惜这个省队名额真的是说不过去 本文就记录一下本人

Dailight 训练记录

现场赛记录 19 CCPC 湘潭邀请赛  11/Gold 19 ICPC 西安邀请赛 49/Silver 训练规划: hl: 1.深入增强图论,数据结构的能力,包括但不限于树形dp,点分治,多写dp,学习斜率优化,四边形优化 2.保证银牌及以下图论,数据结构,dp的通过率,最好可以在十分钟内出思路 3.养成提交前检查代码的习惯,不出现傻逼错误. 4.学习简单数论(逆元,组合数),尤其是数论结合图论的应用 gbs: 1.加快上机 ->  写完代码过样例 这一过程的速度. 2.减少debug占用机时

二分暑假专题 训练记录 2017-7-29

POJ3258-River Hopscotch 题意: 给你区间[0,L]给你n个石头,然后去除m个石头  最大化 石头间最小的距离 思路: 首先0和L 这两个石头是不可以动的   然后用 s 数组记录 整个区间的石头 然后排序  此时石头的排序就是有序的了  然后二分套模板 接着check函数才是最关键的好的把 从0到 n+1-m   总共就有 n+2-m 个石头了 而由于第0个石头不可以动 , 所以从第一个开始动 同时判断条件是 s[cur] - s[last] < d 而不是 <= #i

dp暑假专题 训练记录

A 回文串的最小划分 题意:给出长度不超过1000的字符串,把它分割成若干个回文字串,求能分成的最少字串数. #include <iostream> #include <cstdio> #include <string.h> #include <string> using namespace std; const int mod = 1e9 + 7; const int maxn = 1000 + 5; const int INF = 0x3f3f3f3f;

训练记录PART1

11/05 bestcoder #93 C 等价于给出很多环,等概率选择N个点,收益为出现过点的环的环长lcm.不同的环只有 \(\sqrt {26}=6\) 个,用\(f_S\)表示点出现在状态为S的那些环里的选取总数,DP一下即可. bestcoder #93 D 考虑meet in the middle.推一下式子,设左侧选的数和为\(A_{left}t\),两两乘积之和为\(B_{left}\),那么满足\(B_{left}+B_{right}+A_{left}*A_{right}>=0

20160813下午训练记录

*下午听说讲课很简单,被拉去隔壁做只可口胡 不可写的题了 T1 江苏省选的时候有道题面差不多的题目,邵战狂当时跟我口胡过这题 我们还是先不考虑1 那么我们选取一个元素,当加入第二个的时候,两个的奇偶性不同,加入第三个数时,肯定不满足. 那么我们特判一下1的数目,然后乱搞一下 int n,a[1234]; bool np[33333333]; int tot,pr[8001234]; const int N=30000000; void sieve(){ for(int i=2;i<=N;i++)

20160819训练记录

T1 给定一个序列 ,在第i时刻位置左边插入一个数i 求最后的序列 [题解]倒着做..插入的位置是左边有空格的位置 用线段树维护一下单点修改 线段树写的优雅一点 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int p,f[4444444],g[4444444],ans[4444444]; int find(int i,int l,int r,int x){ f[

20160818训练记录

T1 "开心题" 每个点如果不是根节点,子树个数等于度数减一.然后随便算一算 T2 数据范围   首先对于两个长度相等的偶数串.把他两两分组 1 2 3 4 5 6 7 8 考虑一个和8相等的(包括交换内部后)的块 先把他调到头部然后调到尾部.然后删除这一块 然后发现这样的可以对每个串求出字典序最小的等价表达..其实随便计算一下就解决了 #include<cstdio> #include<string.h> #include<iostream> #i