LUOGU NOIP 2018 模拟赛 DAY1

T1

传送门

解题思路

这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
typedef long long LL;

inline LL rd(){
    LL x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
    while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return f?x:-x;
}

LL l,r;
int q;

int main(){
    scanf("%d",&q);
    while(q--){
        l=rd(),r=rd();
        printf("%lld\n",(r-l+1)%9*(l%9+r%9)%9*5%9);
    }
    return 0;
}
View Code

T2

传送门

解题思路

最短路,求出哈利在1点与T1点到其他点的最短路,再求出罗恩在一点与T1点到其他点的最短路,然后分类讨论就行了。

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;
const int MAXN = 50005;
const int MAXM = 100005;

inline int rd(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
    while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return f?x:-x;
}

int n,m,head[MAXN],cnt,k,T1,T2,ans;
int to[MAXM<<1],nxt[MAXM<<1],val[MAXM<<1];
int dis[MAXN][5];  //dis[x][1] 哈利1 dis[x][2] 罗恩1 dis[x][3] 哈利x dis[x][4] 罗恩x 
bool lim[MAXN],vis[MAXN];
queue<int> Q;

inline void add(int bg,int ed,int w){
    to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
}

void spfa_Harry(int st,int now){
    memset(vis,false,sizeof(vis));
    dis[st][now]=0;Q.push(st);vis[st]=1;
    register int x,u;
    while(!Q.empty()){
        x=Q.front();Q.pop();vis[x]=0;
        for(register int i=head[x];i;i=nxt[i]){
            u=to[i];
            if(dis[x][now]+val[i]<dis[u][now]){
                dis[u][now]=dis[x][now]+val[i];
                if(!vis[u]){vis[u]=1;Q.push(u);}
            }
        }
    }
}

void spfa_Ron(int st,int now){
    memset(vis,false,sizeof(vis));
    dis[st][now]=0;vis[st]=1;Q.push(st);
    int x,u;
    while(!Q.empty()){
        x=Q.front();Q.pop();vis[x]=0;
        for(register int i=head[x];i;i=nxt[i]){
            u=to[i];if(lim[u]) continue;
            if(dis[x][now]+val[i]<dis[u][now]){
                dis[u][now]=dis[x][now]+val[i];
                if(!vis[u]) {vis[u]=1;Q.push(u);}
            }
        }
    }
}

int main(){
    memset(dis,0x3f,sizeof(dis));
    n=rd(),m=rd(),k=rd();int x,y,z;
    for(int i=1;i<=k;i++) lim[rd()]=1;
    for(int i=1;i<=m;i++){
        x=rd(),y=rd(),z=rd();
        add(x,y,z),add(y,x,z);
    }
    T1=rd(),T2=rd();
    spfa_Harry(1,1);spfa_Harry(T1,2);
    spfa_Ron(1,3);spfa_Ron(T1,4);
    ans=min(min(max(dis[T1][1],dis[T2][3]),max(dis[T2][1],dis[T1][3]))
    ,min(min(dis[T1][1],dis[T2][1])+dis[T2][2],min(dis[T1][3],dis[T2][3])+dis[T2][4]));
    cout<<ans<<endl;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/sdfzsyq/p/9691053.html
今日推荐