T1 树学

题目

【问题描述】

给定一颗 n 个点的树,树边带权,试求一个排列 P,最大化下式

其中,calc(a, b)表示树上由a到b经过的最大边权。

【输入格式】

第一行一个整数 n,表示点数下接 n − 1 行,每行三个数 u, v, w 表示一条连接点 u 和点 v 权值为 w

【输出格式】

总共一行一个整数,表示答案

【输入样例】

2

1 2 2333

【输出样例】

2333

【数据范围】

对于前5%的数据满足 n ≤ 8

对于前40%的数据满足 n ≤ 20

对于前60%的数据满足 n ≤ 200

对于100%的数据满足 n ≤ 100

解析

先从边权最小的边开始累加,尽可能的减少当前边的贡献次数。发现每轮最少贡献一次,即将边两侧的点在P中完全分开。

试过多组数据之后,不难发现,答案即为所有边权之和。

1、最长边只计算过一次。

2、如果次长边被经过两次及以上,从次长边的一端出发,到了最长边的一端,走了一个来回,很显然,这是错误的,所以,次长边只计算过一次。

3、以此类推,最后,所有边都只计算过一次。

Code

#include <iostream>
#include <cstdio>
using namespace std;
int n,u,v,w;
long long ans;
int main()
{
cin>>n;
for(int i=;i<n;i++)
{
cin>>u>>v>>w;
ans+=w;
}
cout<<ans;
return ;
}

T2 保留道路

题目

【问题描述】

很久很久以前有一个国家,这个国家有N个城市,城市由1,2,3,…,N标号,城市间有M条双向道路,每条道路都有两个属性g和s,两个城市间可能有多条道路,并且可能存在将某一城市与其自身连接起来的道路。后来由于战争的原因,国王不得不下令减小花费从而关闭一些道路,但是必须要保证任意两个城市相互可达。

道路花费的计算公式为wG*max{所有剩下道路的属性g}+wS*max{所有剩下道路的属性s},其中wG和wS是给定的值。国王想要在满足连通性的前提下使这个花费最小,现在需要你计算出这个花费。

【输入格式】

输入文件名为road.in。

第一行包含两个正整数N和M。

第二行包含两个正整数wG和wS。

后面的M行每行描述一条道路,包含四个正整数u,v,g,s,分别表示道路连接的两个城市以及道路的两个属性。

【输出格式】

输出文件名为road.out。

输出一个整数,表示最小花费。若无论如何不能满足连通性,输出-1。

【输入输出样例】

road.in

road.out

3 3

2 1

1 2 10 15

1 2 4 20

1 3 5 1

30

【数据规模与约定】

对于10%的数据,N≤10,M≤20;

对于30%的数据,N≤100,M≤1000;

对于50%的数据,N≤200,M≤5000;

对于100%的数据,N≤400,M≤50000,wG,wS,g,s≤1000000000。

解析

这题难在最小生成树有两个变量。

先按g从小到大排序,在加入边的过程中发现,当前的最小生成树只会由上一次的最小生成树和新边构成。

所以每次只需在N条边中生成最小生成树即可。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define INF 100000000000000000LL;
#define M 50010
#define N 410
long long ans=INF;
long long n,m,wS,wG,cnt,f[N];//cnt表示已生成的树的边数
struct rec{
long long x,y;
bool vis;//是否被使用过
long long g,s;
}tree[M],small[M],ra[M];//tree表示初始数据,small表示最小生成树的数据,ra是最小生成树的替身
int find(long long x)
{
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
bool cmp(rec a,rec b)
{
if(a.g!=b.g) return a.g<b.g;
else return a.s<b.s;
}
void kruskal(long long maxg)//生成最小生成树
{
for(int i=;i<=cnt;i++)
{
ra[i]=small[i];//复制数据
ra[i].vis=;//初始化,0为未访问 ,1为访问
}
long long maxs=,tot=;
for(int i=;i<=n;i++) f[i]=i; //并查集初始化
for(int i=;i<=cnt;i++)
{
int a=find(small[i].x);
int b=find(small[i].y);
if(a!=b)
{
maxs=max(maxs,small[i].s);
f[a]=b;
tot++;
ra[i].vis=;//标记
}
if(tot==n-)
{
int num=;
for(int i=;i<=cnt;i++)
if(ra[i].vis) small[++num]=ra[i];
cnt=num;
ans=min(ans,maxg+maxs);
break;
}
}
}
void start()
{
for(int i=;i<=m;i++)//按g的大小,从小到大枚举边
{
if(tree[i].g+tree[i].s>ans) continue;
int pos=cnt+;
for(int j=;j<=cnt;j++)
{
if(small[j].s>tree[i].s)
{
pos=j;
break;
}
}
if(pos==cnt+)
{
cnt++;
small[cnt]=tree[i];
}
else
{
cnt++;
for(int j=cnt;j>=pos+;j--) small[j]=small[j-];
small[pos]=tree[i];
}
kruskal(tree[i].g);
}
}
int main()
{
cin>>n>>m>>wG>>wS;
for(int i=;i<=m;i++)
{
cin>>tree[i].x>>tree[i].y>>tree[i].g>>tree[i].s;
tree[i].g*=1LL*wG;
tree[i].s*=1LL*wS;//初始化
}
sort(tree+,tree+m+,cmp);//将原数据的g从小到大排序
start();
cout<<ans;
return ;
}

T3 appointment

题目

【问题描述】

定义两个排列v_i和g_i的“友好值”为:在1 <= i <= n中,出现v_i > g_i的次数。

给定n,m,以及一个1~n的排列v_i,你需要分别求出和排列v_i“友好值”为0,1,2,...,m的排列g_i有多少个。

【输入格式】

输入一共有两行。

第一行包含两个整数 n,m,意义如上

第二行包含 n 个整数,第 i 个为 vi,意义如上

【输出格式】

输出共 m+1 行,第i行友好值为 i-1 时的g_i有多少个。由于答案可能较大,请输出ans%998244353 的结果。

【样例输入】

3 2

1 3 2

【样例输出】

1

4

1

【样例解释】

友好值为0时,排列g只能是(1, 3, 2)

友好值为1时,排列g可以是(1, 2, 3)  (2, 1, 3)  (2, 3, 1)  (3, 1, 2)

友好值为2时,排列g只能是(3, 2, 1)

【数据范围】

对于20%的数据: n <= 10

对于100%的数据: n <= 6000

解析

先试几组数据,可以发现答案与v_i无关。

设f[i][j]表示当前序列长度为i时,友好值为j。

如果在原有序列中加入一个新数字,原有序列的友好值要么+1要么不变。

若友好值不变,则把新加入的数和一个具有贡献的数交换位置,共有(j+1)种换法。

若友好值+1,则把新加入的数和一个没有贡献的数交换位置,即(i-1)-(j-1),即i-j。

于是得出了状态转移方程f[i][j]=f[i-1][j]*(j+1)+f[i-1][j-1]*(i-j)。

边界:f[i][0]=1。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const long long mod=;
long long f[][];
int main()
{
int n,m,temp;
cin>>n>>m;
for(int i=;i<=n;i++) cin>>temp;
for(int i=;i<=n;i++) f[i][]=;
for(int j=;j<=m;j++)
for(int i=;i<=n;i++) f[i][j]=(f[i-][j]*(j+)%mod+f[i-][j-]*(i-j)%mod)%mod;
for(int i=;i<=m;i++) cout<<f[n][i]<<endl;
return ;
}

泉五培训Day1的更多相关文章

  1. 泉五培训Day5

    T1 陪审团 题目 [题目描述] 陪审团制度历来是司法研究中的一个热议话题,由于陪审团的成员组成会对案件最终的结果产生巨大的影响,诉讼双方往往围绕陪审团由哪些人组成这一议题激烈争夺.小 W提出了一个甲 ...

  2. 泉五培训Day4

    T1 收果子 题目 [题目描述] 有一个果园,有n棵果树依次排成一排,其中已知第 i 棵果树上结了ai个果子.现在要按照果树编号顺序依次收果子,对于一个能装v个果树的果篮,收果子从第1棵果树开始,如果 ...

  3. 泉五培训Day3

    T1 家庭作业 题目 [问题描述] 小P为了能高效完成作业,规定每项作业花一个单位时间. 他的学习日从0时刻开始,有100000个单位时间.在任一时刻,他都可以选择编号1~N的N项作业中的任意一项作业 ...

  4. 泉五培训Day2

    T1 旅游 题目 [题目描述] 幻想乡有n个景点(从1开始标号),有m条双向的道路连在景点之间,每条道路有一个人气值d,表示这条道路的拥挤程度.小G不会经过那些人气值大于x的道路,她想知道有多少对景点 ...

  5. 纪中2018暑假培训day1提高b组改题记录

    收到意见,认为每天的程序和随笔放在一起写的博客太长了,于是分开整理 day1 模拟赛,看了看提高a组t1的样例就不太想写,于是转而写b组 t1: Description 给定一个n个点m条边的有向图, ...

  6. 中山纪念中学培训DAY1

    哇啊啊啊啊啊啊$……$ 并不像说环境怎么样. $Day1$模拟赛 稳重一点选了提高$B$ 然后$5min$后: $t1$装压$DP$最短路 $t2$裸地贪心 $t3……$哇$t3$怎么做啊啊啊啊. $ ...

  7. 常州培训 day1 解题报告

    第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...

  8. 五一培训 DAY1

    DAY1 枚举 例题1 题解: 例题2 题解: 例题3 题解: vis[ ]判断是否为素数,pri[ ]储存素数 例题4 题解: 例题5 题解: PS: i  <  1<<n    ...

  9. 性能测试培训day1

    测试本质: 1构造测试数据和期望结果 2执行 3验证 自动化测试: 写完代码,单元测试测代码逻辑,单元测试搞清楚代码逻辑就行了(白盒测试)先静态,运行前用工具扫描BUG例如(a==11写成a=11), ...

随机推荐

  1. (转)TCP连接的11种状态变迁

    自:http://blog.csdn.net/engrossment/article/details/8104482 http://blog.csdn.net/xiaofei0859/article/ ...

  2. 我使用的brackets插件

    livereload atom dark theme autoprefixer auto save files on window blur beautify brackets file icons ...

  3. matlab 摘要

    matlab中的向量与矩阵 如果定义一个A = [1, 2, 3]; 则A为一个行向量 但是A(:)返回的是一个列向量 关于函数的返回值 在function [a, b, c] = fit_quadr ...

  4. [转].NET Core配置文件加载与DI注入配置数据

    本文转自:http://www.cnblogs.com/skig/p/6079187.html .NET Core配置文件 在以前.NET中配置文件都是以App.config / Web.config ...

  5. 从零开始的全栈工程师——js篇(作用域 this 原型笔试题练习)

    作用域 // 1. fn() function fn () { console.log(12) } var as = function () { console.log(45) } // 2. var ...

  6. If you want the rainbow, you have to deal with the rain.

    If you want the rainbow, you have to deal with the rain.想要彩虹,就先忍受雨水.

  7. SAP常用函数

    1.获取月末最后一天日期 DATA LAST_DATE TYPE SY-DATUM. CALL FUNCTION 'LAST_DAY_OF_MONTHS' EXPORTING day_in = sy- ...

  8. 获取iframe子页面节点,响应浏览器宽高

    获取iframe子页面节点,响应浏览器宽高 html部分代码 <div> <iframe width="100%" height="100%" ...

  9. 如何在K3 WISE BOS集成开发工具中自定义字段过滤条件

    1.结论 对于输入过滤条件后BOS报“列名不正确”的过滤条件,要在列名前增加x2标识 无效的过滤 FNumber ,,,,,) 正确的过滤 x2.FNumber ,,,,,) 2.完全可以不看的探索过 ...

  10. yii2.0安装ElasticSearch及使用

    yii2.0安装ElasticSearch安装及使用教程:https://www.yiichina.com/tutorial/1046 Elasticsearch 权威指南(中文版):https:// ...