codeforce Gym 100342H Hard Test (思考题)

题意:构造让Dijkstra单源最短路算法有效松弛次数最多的数据。。。

题解:构造,题意换种说法就是更新晚的路径要比更新早的路径短。因为所有点都会更新一次,那么按照更新时间形成一条链,即到最后一个点的最短路径,

注意:越在这条链的后面的边越晚更新,然后添加边,在前面的点所连的边一定是先更新的,所以反过来添加边的时候只要保证比之前的路径更长就行了。

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
#define fi first
#define se second
#define bug(x) cout<<#x<<‘=‘<<x<<endl;
#define FOR(i,s,e) for(int i = s; i < e; i++)

const int maxn = 1005;

int G[maxn][maxn];

#define local
int main()
{
#ifdef local
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
#endif // local
    //memset(G,-1,sizeof(G));
    int n,m; scanf("%d%d",&n,&m);for(int i = 1; i < n; i ++) {
        printf("%d %d 0\n",i,i+1);
    }
    m -= n-1;
    for(int i = n-2; i > 0 && m; i--){
        for(int j = i+2; j <= n && m; j++){
            m--;
            G[i][j] = G[i][i+1] + G[i+1][j];
            printf("%d %d %d\n",i,j,++G[i][j]);
        }
    }
    return 0;
}
时间: 2024-11-09 09:05:11

codeforce Gym 100342H Hard Test (思考题)的相关文章

Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/attachments Description Andrew is having a hard time preparing his 239-th contest for Petrozavodsk. This time the solution to the problem is based on Di

codeforce gym 100307H Hack Protection

原题地址:http://codeforces.com/gym/100307/problem/H 题意: 给定一个序列,求序列的子区间中,满足子区间XOR值等于AND值得子区间个数. 题解: 一直以为NEERC这种有名的比赛应该题解到处都是,太天真了…… 首先考虑区间的AND值. 对于固定起点的区间,因为 & 的性质,AND值必然单调递减,并且,根据AND值中1的个数划分后面的区间,必然最多只能划分成32段,对于某一段中的任意位置,它和固定的起点所形成的子区间的AND值是一样的. 再来考虑区间的X

codeforce Gym 100418K Cards (概率,数学)

题意:麦田的故事,n张牌,取x张牌,记住前x张牌最大的值m,继续往后取,遇到第一张比m大的牌就停下来.求一个x使得最后的牌在整副牌里是最大的期望最大. 假设最大的牌是A,A在各种位置出现的概率就是相等的,在A固定的情况下,在它前面的牌中最大的牌B,出现在各个位置的概率也是相等的.所以就是要求一个X,使得 下面这个矩形框中的概率和最大. 样例,n=5 #include<bits/stdc++.h> int main() { int n;scanf("%d",&n);

codeforce Gym 100685E Epic Fail of a Genie(贪心)

题意:给出一堆元素,求一个子集,使子集的乘积最大,如有多个,应该使子集元素个数尽量小. 题解:贪心,如果有乘积大于1的正数,那么是一定要选的,注意负数也可能凑出大于1的正数,那么将绝对值大于1的负数两两配对,如果还剩下一个,那么在判断一下,那个负数和比它小的最小负数的乘积是否大于1,如果是那么就选这两个.把所有可能凑成大于1的数选完以后,剩下的数一定比1小,那么就不选. 如果无法凑出大于1的数,那么再分类讨论一下. 挺容易写错... #include<bits/stdc++.h> using

codeforce gym 100548H The Problem to Make You Happy

题意: Alice和Bob在一个有向图上玩游戏,每个人各自操作一个棋子,如果两个棋子走到一个点上,判定Bob输:如果轮到任何一方走时,无法移动棋子,判定该方输 现在Bob先走,要求判断胜负 题解 模型上看是SG问题,但是通常的SG做法需要DP,但是考虑这不是DAG模型,普通的记忆化搜索写法会RE 正解的DP做法:dp[i][j][k]:i,j是Bob,Alice的位置,k是目前轮到谁走了. 开始将所有显然的Bob输的情况加入队列中,不断拓展,找到所有的Bob输的情况. 转移类似SG #inclu

codeforce Gym 101102A Coins (01背包变形)

01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXW 15005 #define N 155 #define LL long long #define MOD 1000000007 int w1[N],w2[N]; LL dp1[MAXW],dp2[MAXW]; int main(

codeforce Gym 100342J Triatrip (bitset)

傻逼题,但是为什么别人的O(n^3)不会T?只是因为用了bitset优化... 附上一张bitset基本操作的表 #include<bits/stdc++.h> using namespace std; const int maxn = 1500+2; char g[maxn][maxn]; bitset<maxn> b1[maxn],b2[maxn],res; #define local int main() { #ifdef local freopen("triatr

codeforce Gym 100203I I WIN (网络流)

把'I'拆成容量为1一条边,一个入点一个出点,入点和相邻的'W'连一条容量为1的边,出点和相邻的'N'连一条容量为1,所有的'W'和源点连一条容量为1边,所有的'N'和汇点连一条容量为1的边,表示只能用一次.一发网络流就过了. 写了4000B+的贪心,然并卵 #include<bits/stdc++.h> using namespace std; const int INF = 0x3fffffff; const int maxn = 2142; #define PB push_back st

codeforce Gym 100685F Flood

一开始T了,因为某些个结点被重复扩展了多次,科学做法是topo排序,每次只把入度为0的点放入队列,这样就严格保证了每个结点只被扩展一次. #include<bits/stdc++.h> using namespace std; #define eps 1e-9 #define bug(x) cout<<#x<<'='<<x<<endl; #define Min 1e-7 const int maxn = 1e4+4; const int maxe