Good Bye 2014

A:签到,从左往右走一遍判断下有没有遇到t即可

B:先利用floyd求出传递闭包,然后利用这个传递闭包贪心小的尽量往前放即可

C:贪心的策略,放的顺序其实根据拿的顺序就可以确定的,所以只要在拿的顺序上从左往右扫一遍即可

D:先DFS预处理出每条边两边点的个数,然后三元组对于每个边经过都是n - 2次,所以一个边都会被计算到n - 2 * 一边点 * 另一边点个数

代码:

#include <cstdio>
#include <cstdlib>

const int N = 30005;

int n, t, a[N];

int main() {
	scanf("%d%d", &n, &t);
	for (int i = 1; i <= n - 1; i++)
		scanf("%d", &a[i]);
	int bo = 0;
	for (int i = 1; i <= t;) {
		if (i == t) {
			bo = 1;
			break;
  		}
		i += a[i];
 	}
 	printf("%s\n", bo ? "YES" : "NO");
	return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 305;

int n, a[N], g[N][N], vis[N];
char str[N];

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) scanf("%d", &a[i]);
 	for (int i = 0; i < n; i++) {
  		scanf("%s", str);
  		for (int j = 0; j < n; j++)
  			g[i][j] = str[j] - '0';
		g[i][i] = 1;
  	}
  	for (int k = 0; k < n; k++) {
  		for (int i = 0; i < n; i++) {
  			for (int j = 0; j < n; j++) {
  				g[i][j] |= (g[i][k]&g[k][j]);
     		}
    	}
   	}
   	for (int i = 0; i < n; i++) {
   		int Min = n;
  		for (int j = 0; j < n; j++) {
  			if (g[j][i] && !vis[a[j]]) {
  				Min = min(Min, a[j]);
     		}
    	}
    	vis[Min] = 1;
    	printf("%d ", Min);
   	}
	return 0;
}
#include <cstdio>
#include <cstring>

const int N = 505;
typedef long long ll;

int n, m, w[N], vis[N][N];

int v;
ll sum = 0;

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		scanf("%d", &w[i]);
	for (int i = 1; i <= m; i++) {
		scanf("%d", &v);
		for (int j = 1; j <= n; j++)
  			sum += w[j] * vis[v][j];
     	memset(vis[v], 0, sizeof(vis[v]));
      	for (int j = 1; j <= n; j++) {
       		if (v == j) continue;
       		vis[j][v] = 1;
       	}
	}
	printf("%lld\n", sum);
	return 0;
}
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

const int N = 100005;

int n;

struct Edge {
	int u, v, id, num;
	double len;
	Edge(){}
	Edge(int u, int v, int id) {
		this->u = u;
		this->v = v;
		this->id = id;
 	}
} e[N];

vector<Edge> g[N];

int dfs(int u, int p) {
	int sz = 1;
	for (int i = 0; i < g[u].size(); i++) {
		int v = g[u][i].v;
		if (v == p) continue;
		int tmp = dfs(v, u);
		sz += tmp;
		e[g[u][i].id].num = tmp;
 	}
 	return sz;
}

int main() {
	scanf("%d", &n);
	int u, v;
 	double  w;
 	for (int i = 1; i <= n - 1; i++) {
	 	scanf("%d%d%lf", &u, &v, &w);
	 	e[i].len = w;
	 	g[u].push_back(Edge(u, v, i));
	 	g[v].push_back(Edge(v, u, i));
 	}
 	dfs(1, 0);
 	int q;
 	scanf("%d", &q);
 	int id, vv;
 	double sum = 0;
  	for (int i = 1; i <= n - 1; i++) {
 	  	sum += (double)(n - 2) * (e[i].num) * (n - e[i].num) * (e[i].len);
  	}
  	double c1 = (double)n * (n - 1) * (n - 2) / 2 / 3;
 	while (q--) {
		scanf("%d%d", &id, &vv);
		sum -= (double)(n - 2) * (e[id].num) * (n - e[id].num) * (e[id].len - vv);
		e[id].len = vv;
		printf("%.10lf\n", sum / c1);
	}
	return 0;
}

时间: 2024-12-28 12:49:46

Good Bye 2014的相关文章

Hello world,Hello 2015,Bye 2014

序 在我写下“在”这个字的时候已经是2014-12-31 19:59,14年最后一天了,总觉得不写点东西祭奠一下那些被自己虐死的脑细胞,心里就不舒服. 那就从生活,工作,学习三个方面,总结一下吧. 生活 仍是一个人,这是2014年唯一的遗憾,没脱单!关键是真没有那个想法,总感觉自己是一个目标很强,事业心很重的人,目标不实现,没有事业,没那个心情去谈对象.也始终相信,该来的总会来,何必特意的去找呢? 话锋一转,说说今年开心的事,话说大学我们专业做开发的唯独我一个,之前大学同学在北京的也是我一个,今

Good Bye 2014 D. New Year Santa Network

D. New Year Santa Network time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output New Year is coming in Tree World! In this world, as the name implies, there are n cities connected by n?-?1 roads,

CodeForces Good Bye 2014 B. New Year Permutation

可能是因为这次没有分Div.1和Div.2,所以感觉题的难度比较大. 题意: 给出一个1~n的排列和一个邻接矩阵A,Aij = 1表示可以交换排列的第i项和第j项,问经过若干次交换后,求能够得到最小字典序的排列. 分析: 如果a和b可交换,b和c可交换,则a和c也可以交换位置.如果把这n个位置看做顶点,两个可交换的位置连一条边,则图中在同一连通分量的顶点都是可以交换元素的.所以用并查集做就很方便了. 要想得到字典序最小的排列,直接贪心就可以了.从第一个数开始,首先试试1能不能交换到第一个位置去,

Good Bye 2014 B. New Year Permutation(floyd )

题目链接 题意:给n个数,要求这n个数字小的尽量放到前面,求一个最小的. 给一个矩阵s[i][j]==1,表示位置 i 的数字可以和 位置 j 的数字交换. 分析: 刚开始用的是3个循环,每次都找一个能直接连接的最小的放到前面,过了小数据,快结束的时候被hack了. 其实不应该这么做,因为还有间接相连提前交换的最小的解. 正解是用floyd,先预先处理出来同一堆,也就是 直接和间接相连的所有 标记,然后根据标记从前向后找最小的. 这个题也可以用并查集做,当时想到了,感觉B题的程度应该考虑暴力神马

Good Bye 2014 E - New Year Domino 单调栈+倍增

E - New Year Domino 思路:我用倍增写哒,离线可以不用倍增. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define y1 skldjfskldjg #define y2 skldfjsklejg using namespace std; const

Codeforces goodbye 2014 b

/**  * @brief good bye 2014 b  * @file b.cpp  * @author mianma  * @created 2014/01/06  10:20  * @edited  2014/01/06  10:20  * @type dfs greedy   * @note  */ #include <fstream> #include <iostream> #include <cstring> #include <vector>

Codeforces goodbye 2014 c

/**  * @brief good bye 2014 c  * @file c.cpp  * @author mianma  * @created 2014/01/06  16:42  * @edited  2014/01/06  16:42  * @type game  * @note   */ #include <fstream> #include <iostream> #include <cstring> #include <vector> #inc

再见2014

2014年就要过去了,该算算总账了! 0. 一句话总结:马上有钱成了梦,马拉个币到年底,一如既往的穷:技术涉猎了不少,更多是走马观花,混个脸熟,从明年开始梳理知识结构:娶了贤妻,这辈子够了:身体很总要,好好锻炼身体. 1. 看了(过)的书: <深入分析java web技术内幕> 很厚,知识点很多,写的不透,可以作为一本参考书,不懂的地方再查资料. <淘宝技术这十年> 看的电子版,就当看武侠小说吧,顺便学习下大侠们的招式,工作中照猫画虎. <Java Concurrency i

HDU 5071 Chat(2014鞍山B,模拟)

http://acm.hdu.edu.cn/showproblem.php?pid=5071 Chat Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 702    Accepted Submission(s): 163 Problem Description As everyone knows, DRD has no girlfr