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. [转]JQuery ui 实现类似于confirm的功能

    本文转自:http://www.cnblogs.com/JerryWang1991/archive/2011/08/04/2127503.html 今天在改进参加一个全国比赛的项目作品时,发现使用了大 ...

  2. 怎么为android控件边缘添加阴影

    为控件设置一个有阴影感的背景图片即可,可以使用shape 在自定义shape中增加一层或多层,并错开,即可显示阴影效果.为增加立体感,按钮按下的时候,只设置一层.我们可以通过top, bottom, ...

  3. Ruby on Rails 中你使用了Kaminari 后,千万不要再引入will_pagination 这个Gem 了

    今日做开发的时候发现的这个问题 发现无论怎样配置都不能使用Kaminari 的Per 这个功能,分页大小也固定在了30 最开始还以为是Ransack 这个Gem 影响的,上网搜了很久发现没有 最后仔细 ...

  4. Zookeeper配置Kafka

    Zookeeper安装 解压:tar -zxvf zookeeper-3.4.5-cdh5.7.0.tar.gz -C ~/app/ 配置到环境变量: vi ~/.bash_profile expor ...

  5. pat1002. A+B for Polynomials (25)

    1002. A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue T ...

  6. linux命令strings

    linux命令strings,其man信息如下:strings(1)                                        GNU Development Tools      ...

  7. c#操作excel的一些记录

    //开启Excel APP            Excel.Application xlApp = new Excel.Application(); //获取程序下bin—>debug下的文件 ...

  8. Oracle数据库触发器使用(删除触发)

    当我们需要用到触发器的时候,还是很方便,你会指定当我在操作某一事件时触发效果完成我所希望完成的事情:这就是触发器, 下面我给大家上一串代码,这是一个当我在操作删除事件操作时候,我希望把即将删除那条数据 ...

  9. git合并分支上的commit为一条commit到master

    标签: git 缘由? 有一次被人问到怎么把一个分支的所有commit按一个commit合并到主分支上,当时一脸蒙B,平时开发都是直接merge,很少考虑到这种问题,于是特意搜索了相关资料. 场景 其 ...

  10. 洛谷P4925 [1007]Scarlet的字符串不可能这么可爱(计数)

    题意 题目链接 Sol 只要知道"回文连续子串"就能做了吧.. 想要满足这个条件,肯定是不能出现\(aa\)或\(aba\)这种情况 如果没有\(S\)的限制,答案为\(K * ( ...