APIO2013 tasksauthor

喜闻乐见的提答题,这道题还是蛮有趣的

数据结构题写得心塞,来一道提答意思意思

如果喜欢这类题的话还可以去做做uoj83

这题是给出了两个问题,一个最短路,一个无向图染色问题。

Data 1

Floyd VS Dijkstra

嗯107个整数,我们只要给一个n=101,下面一坨0 Floyd就狗带了

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    printf("101\n");
    for(int i=1;i<=101;i++) puts("0");
    puts("1");
    printf("%d %d\n",0,100);
}

Data 2

啥Floyd 艹 Bellman-Ford?

看了一下代码…似乎真的可以随便艹掉。

Floyd:O(n^3),询问O(1)。

Bellman-Ford:询问O(ne)。

似乎随机数据一波就行?然而随机数据烂了。

这个点就是想让我们得到一个让bellman-ford和理论复杂度相差无几的数据。

其实很简单啊…加一坨没用的自环,然后剩下的搞一个5->4->3->2->1这样的链即可。

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    puts("100"); int mm=950;
    for(int i=0;i<100;i++)
    {
        int mx=min(mm,15),mxx=mx; mm-=mx;
        if(i!=0) ++mx;
        printf("%d",mx);
        if(i!=0) printf(" %d 2333",i-1);
        for(int j=1;j<=mxx;j++) printf(" %d 2333",i);
        putchar(10);
    }
    puts("10");
    for(int i=1;i<=10;i++) printf("99 0\n");
}

Data 3

Bellman-Ford vs Floyd

用data 1即可

Data 4

Floyd 艹 Dijkstra!限制157个数!

咦似乎文件名叫“ModifiedDijkstra”看起来非常厉害

看了一下代码似乎没什么问题

咦可以有负权边…

怎么搞呢?如图所示。

这里的更新顺序会变成0,2,4,3,4,1,2,4,3,4,这样再接上去几个就成了指数级啦

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int bs=3*(1<<17),n=33; //可能要调一下
    printf("%d\n",n);
    for(int i=0;i<n;i++)
    {
        if(i==n-1) {puts("0"); continue;}
        else if(i&1) printf("1 %d %d\n",i+1,-(bs/=2));
        else printf("2 %d %d %d %d\n",i+1,-1,i+2,-2);
    }
    puts("6");
    for(int i=1;i<=6;i++) printf("0 %d\n",n-1);
}

UPD:这道题的改进版出现在IPSC2015 D,大家可以试做一下。

Data 5

Dijkstra 艹 Bellman-Ford

需要把Data 2稍加优化(人肉二分)

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int N=300; int cnt=0;
    printf("%d\n",N), cnt++; int mm=40;
    for(int i=0;i<N;i++)
    {
        int mx=min(mm,15),mxx=mx; mm-=mx;
        if(i!=0) ++mx;
        printf("%d",mx), cnt++;
        if(i!=0) printf(" %d 2333",i-1), cnt+=2;
        for(int j=1;j<=mxx;j++) printf(" %d 2333",i), cnt+=2;
        putchar(10);
    }
    puts("10"), ++cnt;
    for(int i=1;i<=10;i++) printf("%d 0\n",N-1), cnt+=2;
    cerr<<"cnt="<<cnt<<"\n";
}

Data 6

Bellman-Ford 艹 Dijkstra

用Data 4即可。

Data 7

这回是一个平面图染色问题。

我们发现Gamble1是不会T的,现在我们就要让RecursiveBacktracking T掉。

我随机生成了个树,随机加了一坨边,就T了。

#include <iostream>
#include <stdio.h>
#include <map>
using namespace std;
map<int,bool> ms[105];
int main()
{
    int n=100,m=1501;
    printf("%d %d\n",n,m);
    for(int i=1;i<n;i++)
    {
        int p=rand()%i;
        printf("%d %d\n",i,p), --m;
        ms[i][p]=ms[p][i];
    }
    while(m)
    {
        int a=rand()%n,b=rand()%n;
        if(ms[a][b]||a==b) continue;
        printf("%d %d\n",a,b);
        ms[a][b]=ms[b][a]=1;
        --m;
    }
}

Data 8

要让RecursiveBacktracking A掉而且数据范围有下限

随便搞啦

这份代码生成粗来类似这样

随手加了一点重边什么的

#include <iostream>
#include <stdio.h>
#include <map>
using namespace std;
map<int,bool> ms[1005];
#define BS 4
int main()
{
    int n=996/BS*BS+1,m=1501;
    printf("%d %d\n",n,m);
    for(;;)
    {
    for(int i=0;i<n;i++)
    {
        if(i==n-1) continue;
        if(i%BS==0)
        {
            for(int j=1;j<BS;j++)
            {
                --m;
                printf("%d %d\n",i,i+j);
                if(!m) exit(0);
            }
        }
        else
        {
            --m;
            printf("%d %d\n",i,(i/BS+1)*BS);
            if(!m) exit(0);
        }
    }
    }
}

感觉这道题答出的还行,大概做了2h的样子

时间: 2024-12-14 09:28:22

APIO2013 tasksauthor的相关文章

【BZOJ】【3205】【APIO2013】机器人robot

斯坦纳树 好神啊……Orz zyf && PoPoQQQ 为啥跟斯坦纳树扯上关系了?我想是因为每个点(robot)都沿着树边汇到根的时候就全部合起来了吧= =这个好像和裸的斯坦纳树不太一样,那个是无向最小生成树,这个是有向图…… 引用题解: 令f[l][r][i][j]表示在点(i,j)将编号在[l,r]区间内的机器人全部合并的最小推动次数 则有动规方程组: f[l][r][i][j]=min{f[l][r][_i][_j]+1} ( (_i,_j)->(i,j) ) f[l][r]

BZOJ 3205 [Apio2013]机器人 ——斯坦纳树

腊鸡题目,实在卡不过去. (改了一下午) 就是裸的斯坦纳树的题目,一方面合并子集,另一方面SPFA迭代求解. 优化了许多地方,甚至基数排序都写了. 还是T到死,不打算改了,就这样吧 #include <map> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm

BZOJ3206 [Apio2013]道路费用

题解啊...明天补吧... 好累啊... 1 /************************************************************** 2 Problem: 3206 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:8040 ms 7 Memory:8232 kb 8 ***************************************************************

BZOJ 3205 Apio2013 机器人 斯坦纳树

题目大意:给定一张地图,一些地方有障碍物,有k<=9个机器人,可以一推到底,遇到转向器会转向,两个编号相邻的机器人可以合并,求最少推多少次可以全部合并 令f[l][r][i][j]表示在点(i,j)将编号在[l,r]区间内的机器人全部合并的最小推动次数 则有动规方程组: f[l][r][i][j]=min{f[l][r][_i][_j]+1} ( (_i,_j)->(i,j) ) f[l][r][i][j]=min(f[l][temp][i][j]+f[temp+1][r][i][j]) (l

APIO2013 taskauthor

喜闻乐见的提答题,这道题还是蛮有趣的 数据结构题写得心塞,来一道提答意思意思 如果喜欢这类题的话还可以去做做uoj83. 这题是给出了两个问题,一个最短路,一个无向图染色问题. Data 1 Floyd VS Dijkstra 嗯107个整数,我们只要给一个n=102,下面一坨0 Floyd就狗带了 #include <iostream> #include <stdio.h> using namespace std; int main() { printf("102\n&

bzoj3205: [Apio2013]机器人

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3205 思路:类似斯坦纳树的想法 但是因为这里的合并必须连号 所以子集枚举就变成了区间合并 说说做法好了 首先记搜搜出每个点向四个方向走一步会到哪里 注意:转向器可能导致机器人一直在里面转出不来,要特判掉 然后设f[l][r][x][y]表示当前合并的机器人是[l,r],合并点是(x,y) 两种转移: 枚举子区间,合并f[l][r][x][y]=min(f[l][mid][x][y],f[m

bzoj千题计划230:bzoj3205: [Apio2013]机器人

http://www.lydsy.com/JudgeOnline/problem.php?id=3205 历时一天,老子终于把它A了 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 因为不懂spfa的优化 以及 数组越界  TAT ┭┮﹏┭┮ 牢骚发完了,题解在下面  (⊙o⊙)… n只有9,很像状压dp dp[l][r][x][y] 表示在(x,y)位置 合成了x-y复合机器人 的最少推动次数 它的转移 存在后效性 所以上 斯坦纳树 自身的转移:dp[l][r][x][y]=min{dp[l

bzoj 3206: [Apio2013]道路费用【最小生成树+并查集】

参考:http://hzwer.com/6888.html 把k条道路权值设为0,和其他边一起跑MST,然后把此时选中的其他边设为必选,在新图中加上必选变缩成k个点,把所有边重标号,枚举k跳边的选取情况,和其他边做MST,建出树,k条边的权值在树上取min #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=300005,inf=1e9; int

[APIO2013]机器人(斯坦纳树)

题目描述 VRI(Voltron 机器人学会)的工程师建造了 n 个机器人.任意两个兼容的机 器人站在同一个格子时可以合并为一个复合机器人. 我们把机器人用 1 至 n 编号(n ≤ 9).如果两个机器人的编号是连续的,那 么它们是兼容的,可以合并成一个复合机器人.最初这 n 个机器人各自都只有唯 一的编号.而一个由两个或以上的机器人合并构成的复合机器人拥有两个编号, 分别是构成它的所有机器人中最小和最大的编号. 例如,2 号机器人只可以与 1 号或 3 号机器人合并.若 2 号机器人与 3 号