2017 计蒜之道 复赛 Windows画图+百度地图导航

因为没有休息好, 打着很异常难受的一场比赛,坚持了一个半小时就撤了。

Windows画图:签到题,没什么说的.

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))
using namespace std;
const int inf=1<<28;
const int maxn=80010;
const int maxm=300;
const int mod=1e9+7;
const double pi=acos(-1.0);
int n,m;
int mapp[maxm][maxm];
void func(int x1,int y1,int x2,int y2,int c)
{
    if(x1>x2) {swap(x1,x2);swap(y1,y2);}
    for(int i=0;x1+i<=x2;i++)
    {
        if((y2-y1)*(i)%(x2-x1)==0)
        mapp[x1+i][y1+(y2-y1)*(i)/(x2-x1)]=c;
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d %d",&n,&m))
    {
        cls(mapp,0);
        for(int i=1;i<=n;i++)
        {
            int x1,y1,x2,y2;
            scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
            func(x1,y1,x2,y2,i);
        }
        int q;
        scanf("%d",&q);
        while(q--)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            printf("%d\n",mapp[a][b]);
        }
    }
    return 0;
}

百度地图导航 官方题解:

把每个城市群抽象成两个点 s‘, s‘‘??。按照如下方式见图:

对于每个城市群里面的城市 s_i??,连边:(s_i, s‘, 0), (s‘‘, s_i, 0);

第一种边正常连边:(u, v, c), (v, u, c);

第二种边连边:(a‘, b‘‘, l), (b‘, a‘‘, l)。

然后跑一遍 s-t 最短路就是答案。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))
using namespace std;
const int inf=1<<28;
const int maxn=20010;
const int maxm=20010;
const int mod=1e9+7;
const double pi=acos(-1.0);
int n,m;
struct node
{
    int to,next;
    ll cost;
}edge[maxn*3*2];
int cnt,head[maxn*3];
ll dist[maxn*3];
int vis[maxn*3];
void addedge(int st,int ed,ll cost)
{
    edge[cnt].to=ed;
    edge[cnt].cost=cost;
    edge[cnt].next=head[st];
    head[st]=cnt++;
}
void spfa(int s,int t)
{
    for(int i=1;i<=n+m+m;i++)
        dist[i]=1e18,vis[i]=0;
    queue<int> Q;
    Q.push(s);
    vis[s]=1;
    dist[s]=0;
    while(!Q.empty())
    {
        int x=Q.front(); Q.pop();
        vis[x]=0;
        for(int i=head[x];i!=-1;i=edge[i].next)
        {
            int to=edge[i].to;
            if(dist[to]>dist[x]+edge[i].cost)
            {
                dist[to]=dist[x]+edge[i].cost;
                if(!vis[to])
                {
                    vis[to]=1;
                    Q.push(to);
                }
            }
        }
    }
    if(dist[t]==1e18)
        printf("-1\n");
    else printf("%lld\n",dist[t]);
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d %d",&n,&m))
    {
        cls(head,-1);
        cnt=0;
        int k;
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&k);
            while(k--)
            {
                int p;
                scanf("%d",&p);
                addedge(p,i+n,0);
                addedge(i+n+m,p,0);
            }
        }
        scanf("%d",&k);
        for(int i=1;i<=k;i++)
        {
            int a,b;
            ll c;
            scanf("%d %d %lld",&a,&b,&c);
            addedge(a,b,c);
            addedge(b,a,c);
        }
        scanf("%d",&k);
        for(int i=1;i<=k;i++)
        {
            int a,b;
            ll c;
            scanf("%d %d %lld",&a,&b,&c);
            addedge(a+n,b+n+m,c);
            addedge(b+n,a+n+m,c);
        }
        int st,ed;
        scanf("%d %d",&st,&ed);
        spfa(st,ed);
    }
    return 0;
}
时间: 2025-01-02 20:43:22

2017 计蒜之道 复赛 Windows画图+百度地图导航的相关文章

2017计蒜之道 初赛 第二场 百度的科学计算器(简单)

/** 题目:2017计蒜之道 初赛 第二场 百度的科学计算器(简单) 链接:https://nanti.jisuanke.com/t/15504 题意:给一个合法的表达式,包含加号+.减号-.括号().数字常量,表达式中没有空格. 输入数据保证数字常量以及计算过程中数值绝对值均不超过 10^12??,对于浮点型数值常量,保证小数点后不超过 666 位. 思路:暴力模拟:python有函数可以直接调用. 坑点:如果表达式中出现过浮点数,那么输出结果保留6位小数, 否则输出整数,不出现小数. */

(状压dp)2017 计蒜之道 复赛 F. 腾讯消消乐

腾讯推出了一款益智类游戏--消消乐.游戏一开始,给定一个长度为 nn 的序列,其中第 ii 个数为 A_iA?i??. 游戏的目标是把这些数全都删去,每次删除的操作为:选取一段连续的区间,不妨记为 [L,R][L,R],如果这一段区间内所有数的最大公约数 \geq k≥k(kk 值在游戏的一开始会给定),那么这一段区间就能被直接删去. 注意:一次删除以后,剩下的数会合并成为一个连续区间. 定义 f(i)f(i) 为进行 ii 次操作将整个序列删完的方案数. 你需要实现一个程序,计算 \sum_{

(最短路)2017 计蒜之道 复赛 D. 百度地图导航

百度地图上有 nn 个城市,城市编号依次为 11 到 nn.地图中有若干个城市群,编号依次为 11 到 mm.每个城市群包含一个或多个城市:每个城市可能属于多个城市群,也可能不属于任何城市群. 地图中有两类道路.第一类道路是 城市之间的快速路,两个城市 u,vu,v 之间增加一条距离为 cc 的边:第二类道路是 城市群之间的高速路,连接两个城市群 a,ba,b,通过这条高速路,城市群 aa 里的每个城市与城市群 bb 里的每个城市之间两两增加一条距离为 cc 的边.图中所有边均为无向边. 你需要

2017计蒜之道复赛 百度地图导航

分析:这道题本质就是很简单的最短路问题,但是如果连边用O(n^2)的暴力会直接TLE掉,连一条边的复杂度是减少不了了,那么能不能减少连边的数量呢? 我们可以设置一个中间点p,假设a中的所有点要到b中去,则从a向p连一条有向边,p向b连一条有向边,可是这样权值不好办啊,那么我们把每个城市圈当作一个中心点,这样从a连向a',a'连向b',b'连向b,除了中间这条边以外的边权值都是0,但是我也有可能从b走向a啊,那么a到a'的两条边的边权都是0,这样会陷入死循环啊? 解决方法很简单,我们把每个中心点拆

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务

2017 计蒜之道 初赛 第一场 B.阿里天池的新任务 1 /* QYP kuai wo dai ma*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<iomanip> 5 #include<cstring> 6 #include<cstdlib> 7 #include<cstdio> 8 #include<queue> 9 #include<ctime

2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)

贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 10^5105 的字符串.现在魔法师想要通过一系列魔法使得这两个字符串相同.每种魔法形如 (u,\ v),\ u,\ v \le 10^5(u, v), u, v≤105,可以将一个字符 uu改成一个字符 vv,并且可以使用无限次.出于种种原因,魔法师会强行指定这两个串能否进行修改. 若失败输出 -

贝壳找房魔法师顾问 2018 计蒜之道 复赛

https://nanti.jisuanke.com/t/A1725 V&V 无向图 强连通图 每个子图,n个点,选择n-1条,使互相连接 因为目标点x->点y,可以改为点y->点x V&C 弱连通图(将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图.如果一个有向图的基图是连通图,则有向图是弱连通图.) 1.一个弱连通子图,它里面的点与该弱连通子图外的点与没有关系,可以单独处理 2.弱连通子图里,一个点,必有另外点与之相邻,包括入和出 3.若弱连通子图里有环,则无论

2017 计蒜之道 初赛 第一场 A、B题

A题 阿里的新游戏 题目概述: 阿里九游开放平台近日上架了一款新的益智类游戏--成三棋.成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示: 成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子.我们可以用坐标系来描述棋盘: 如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三.现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的.请你帮小红计算他成三的线段数. 样例对应的棋盘如下: 输入格式 输入第一行两个整数 n,m(3 \le n, m \le

计蒜之道复赛 B D F

B题是一个简单的模拟 求一下两个点中间在上deta的整数点 然后更新一下每个点的最后一次经过就好了 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl 4 using namespace std; 5 6 const int maxn=300+10; 7 8