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

 

T3

传送门

解题思路

大模拟,感觉没有时间复杂度难。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>

using namespace std;
const int MAXN = 205;

int n,m,c,k,cnt,mp[MAXN][MAXN];
int hx[MAXN],hy[MAXN],food,wx[MAXN],wy[MAXN];
int sx[4]={0,0,-1,1},sy[4]={-1,1,0,0};
bool exist[MAXN];
char s[MAXN][MAXN],zz[MAXN][MAXN];

struct Snack{
    int num,len;
}S[MAXN];

void dfs(int x,int y){
    S[cnt].len++;
    mp[x][y]=cnt;bool flag=0;
    for(register int i=0;i<=3;i++){
        int xx=x+sx[i],yy=y+sy[i];
        if(xx<=0 || xx>n || yy<=0 || yy>m) continue;
        if(s[xx][yy]!='#' || mp[xx][yy]==cnt) continue;
        flag=1;dfs(xx,yy);
    }
    if(!flag) wx[cnt]=x,wy[cnt]=y;
}

void die(int x,int y,int id){
    mp[x][y]=-1;
    for(register int i=0;i<=3;i++){
        int xx=x+sx[i],yy=y+sy[i];
        if(xx<=0 || xx>n || yy<=0 || yy>m) continue;
        if(mp[xx][yy]!=id) continue;
        die(xx,yy,id);
    }
}

inline bool pd(int x,int y){
    if(x>0 && x<=n && y>0 && y<=m && mp[x][y]<=0) return true;
    return false;
}

inline bool cmp(Snack A,Snack B){
    if(A.len==B.len) return A.num<B.num;
    return A.len>B.len;
}

int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(s[i][j]=='&') mp[i][j]=-1,food++;
            if(s[i][j]=='@'){
                cnt++;
                hx[cnt]=i,hy[cnt]=j;
                dfs(i,j);exist[cnt]=1;
                S[cnt].num=cnt;
            }
        }
    }
//    for(int i=1;i<=n;i++){
//        for(int j=1;j<=m;j++)
//            cout<<mp[i][j]<<" ";
//        cout<<endl;
//    }
    for(int i=1;i<=cnt;i++)
        scanf("%s",zz[i]+1);
    for(int i=1;i<=k;i++)
        for(int j=1;j<=cnt;j++){
            if(!exist[j]) continue;
            if(zz[j][i]=='D') {
                hy[j]++;
                if(!pd(hx[j],hy[j])) {
                    die(hx[j],hy[j]-1,j);
                    food+=S[j].len;
                    exist[j]=0;S[j].len=0;
                    continue;
                }
                if(mp[hx[j]][hy[j]]==-1){
                    food--;S[j].len++;
                    mp[hx[j]][hy[j]]=j;
                    continue;
                }
                mp[hx[j]][hy[j]]=j;
                for(register int t=0;t<=3;t++){
                    int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                    if(mp[xx][yy]==j) {
                        mp[wx[j]][wy[j]]=0;
                        wx[j]=xx,wy[j]=yy;
                        break;
                    }
                }
            }
            if(zz[j][i]=='A') {
                hy[j]--;
                if(!pd(hx[j],hy[j])) {
                    die(hx[j],hy[j]+1,j);
                    food+=S[j].len;
                    exist[j]=0;S[j].len=0;
                    continue;
                }
                if(mp[hx[j]][hy[j]]==-1){
                    food--;S[j].len++;
                    mp[hx[j]][hy[j]]=j;
                    continue;
                }
                mp[hx[j]][hy[j]]=j;
                for(register int t=0;t<=3;t++){
                    int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                    if(mp[xx][yy]==j) {
                        mp[wx[j]][wy[j]]=0;
                        mp[xx][yy]=1;
                        wx[j]=xx,wy[j]=yy;
                        break;
                    }
                }
            }
            if(zz[j][i]=='W') {
                hx[j]--;
                if(!pd(hx[j],hy[j])) {
                    die(hx[j]+1,hy[j],j);
                    food+=S[j].len;
                    exist[j]=0;S[j].len=0;
                    continue;
                }
                if(mp[hx[j]][hy[j]]==-1){
                    food--;S[j].len++;
                    mp[hx[j]][hy[j]]=j;
                    continue;
                }
                mp[hx[j]][hy[j]]=j;
                for(register int t=0;t<=3;t++){
                    int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                    if(mp[xx][yy]==j) {
                        mp[wx[j]][wy[j]]=0;
                        mp[xx][yy]=1;
                        wx[j]=xx,wy[j]=yy;
                        break;
                    }
                }
            }
            if(zz[j][i]=='S') {
                hx[j]++;
                if(!pd(hx[j],hy[j])) {
                    die(hx[j]-1,hy[j],j);
                    food+=S[j].len;
                    exist[j]=0;S[j].len=0;
                    continue;
                }
                if(mp[hx[j]][hy[j]]==-1){
                    food--;S[j].len++;
                    mp[hx[j]][hy[j]]=j;
                    continue;
                }
                mp[hx[j]][hy[j]]=j;
                for(register int t=0;t<=3;t++){
                    int xx=wx[j]+sx[t],yy=wy[j]+sy[t];
                    if(mp[xx][yy]==j) {
                        mp[wx[j]][wy[j]]=0;
                        mp[xx][yy]=1;
                        wx[j]=xx,wy[j]=yy;
                        break;
                    }
                }
            }
        }
    sort(S+1,S+1+cnt,cmp);
//    for(int i=1;i<=n;i++){
//        for(int j=1;j<=m;j++)
//            cout<<mp[i][j]<<" ";
//        cout<<endl;
//    }
    for(int i=1;i<=cnt;i++)
        printf("%d %d\n",S[i].len,S[i].num);
    printf("%d",food);
    return 0;
}
View Code

 

posted @ 2018-09-22 20:17  Monster_Qi  阅读(180)  评论(0编辑  收藏  举报