20191021

#include<bits/stdc++.h>
#define maxn 1001000
#define ll long long
using namespace std;
int que[30];
int jishu=0;
bool is_queue[30];
char s[maxn];
int num[30][maxn];//字符第i次出现时在第多少层 
int tot[maxn];//字符共出现了多少次 
int cnt[30][maxn];// 第i个a对应的是第多少个b 
int p[30][maxn];//第i个a对应的是谁 
int now[30][maxn];//第i个a变成啥了 
char zifu[27]={'0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
inline int dfs(int x,int level,int step)
{
	if (step==0)
		return x;
	now[x][level]=dfs(p[x][level],cnt[x][level]+1,num[p[x][level]][cnt[x][level]+1]);
	return now[x][level];
}
int main()
{
	freopen("modify.in","r",stdin);
	freopen("modify.out","w",stdout);
	ios::sync_with_stdio(0);
	int n,m;
	cin>>n>>m;
	for (int i=1;i<=n;i++)
		cin>>s[i];
	for (int i=1;i<=m;i++)	
	{
		char a,b;
		cin>>a>>b;
		int aa=(int)a-'a'+1;
		int bb=(int)b-'a'+1;
		if(aa!=bb)
		{
			if (!is_queue[aa])
				que[++jishu]=aa,is_queue[aa]=true;
			if (!is_queue[bb])
				que[++jishu]=bb,is_queue[bb]=true;
			num[aa][++tot[aa]]=i;
			num[bb][++tot[bb]]=i;
			cnt[aa][tot[aa]]=tot[bb];
			cnt[bb][tot[bb]]=tot[aa];
			p[aa][tot[aa]]=bb;
			p[bb][tot[bb]]=aa;
		}
	}
	for (int i=1;i<=jishu;i++)
		now[que[i]][1]=dfs(que[i],1,num[que[i]][1]);
	for (int i=1;i<=n;i++)
		cout<<zifu[now[(int)s[i]-'a'+1][1]];
	return 0;
}
#include<bits/stdc++.h>
#define maxn 10010
#define ll long long
using namespace std;
int a[maxn];
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int n,m;
	cin>>n>>m;
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int i=1;i<=m;i++)
		for (int j=1;j<n;j++)
			if (a[j]>a[j+1])
				swap(a[j],a[j+1]);
	for (int i=1;i<=n;i++)
		cout<<a[i]<<' ';
	return 0;
}
#include<bits/stdc++.h>
#define maxn 3010
#define ll long long
using namespace std;
struct edge
{
	int end,next,val;
}e[maxn];
int head[maxn];
int tot;
int n,m;
void add(int x,int y,int z)
{
	e[++tot].next=head[x];
	e[tot].end=y;
	e[tot].val=z;
	head[x]=tot; 
}
int d[maxn],f0[maxn][maxn],f1[maxn][maxn];
int minb[maxn][maxn];
int son[maxn];
void dfs(int baba,int now)
{
	if (d[now]==1)
	{
		son[now]=0;
		return;
	}
	for (int i=head[now];i;i=e[i].next)
	{
		int to=e[i].end;
		if (to!=baba)
		{
			dfs(now,to);
			son[now]+=son[to];
			son[now]++;
		}
	}
}
void dp(int baba,int now)
{
	if (d[now]==1)
		return;
	for (int i=head[now];i;i=e[i].next)
	{
		int to=e[i].end;
		if (to!=baba)
		{
			dp(now,to);
			for (int j=min(son[now],m);j>=1;j--)
				for (int k=min(son[to],m);k>=1;k--)
				{
					minb[now][j+k]=min(minb[now][j+k],minb[now][j]+minb[to][k]);
					f0[now][j+k]=min(f0[now][j+k],f0[now][j]+f1[to][k]-e[i].val);
					f0[now][j+k]=min(f0[now][j+k],f0[to][j+k]);
					f0[now][j+k]=min(f0[now][j+k],f1[to][j+k]);
					f1[now][j+k]=min(f1[now][j+k],f1[now][j]+f1[now][j]-e[i].val);
					
				}
		}
	}

}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m;
	for (int i=1;i<=n-1;i++)	
	{
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
		d[a]++;
		d[b]++;
	}
	dfs(0,1);
	dp(0,1);
	for (int i=1;i<=n;i++)
		ans=min(ans,min(f1[i][m],f0[i][m]));
	return 0;
}

1 / 5 青岛二中信息学奥林匹克联赛模拟赛 提高组 by thc 注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、 C/C++中函数 main()的返回值类型必须是 int,程序正常结束时的返回值必须 是 0。 3、评测在 windows10 lemon 下进行,各语言的编译器版本以其为准。 试题名称 改名 冒泡排序 打卡 程序文件名 modify.cpp sort.cpp card.cpp 输入文件名 modify.in sort.in card.in 输出文件名 modify.out sort.out card.out 编译选项 -lm -O2 -lm -O2 -lm -O2 时间限制 1s 2s 2s 内存限制 128M 128M 256M 测试点数目 10 10 10 每个测试点分 值 10 10 10 结果比较方式 忽略多余的空格和 文件尾的空行 忽略多余的空格 和文件尾的空行 忽略多余的空格 和文件尾的空行 题目类型 传统 传统 传统 2 / 5

1. 改名 (modify.cpp/c/pas)

【问题描述】 Magolor 在众多的 oj 上有众多账号,以便于他同时 AC 多道题目。现在他想要修改 他的 vjudge 用户名,这样大家就不会发现 magolor 一天 AC 了 2000 道题目。 Magolor 的用户名是一个长度为 n 的由小写字母组成的字符串。每次 magolor 会选 择两个字母 xi 和 yi,之后他会将名称里所有的 xi 换成 yi,同时将所有的 yi 换成 xi。有可 能 xi 与 yi 在用户名中没有出现过,xi 与 yi 也可能相同。他想知道经过 m 次操作之后, 他的新用户名是什么。

【输入格式】 第一行包含两个整数 n,m,即原名称的长度和操作的次数。 第二行为长度为 n 的字符串,即原用户名 接下来 m 行,第 i 行包含用空格隔开的两个小写字母 xi 和 yi。

【输出格式】 一行,一个字符串,表示修改后的用户名。

【输入样例】 11 6 abacabadaba a b b c a d e g f a b b

【输出样例】 cdcbcdcfcdc

【样例说明】 abacabadaba->babcbabdbab->cacbcacdcac->cdcbcdcacdc->cdcbcdcacdc->cdcbcdcfcdc-> cdcbcdcfcdc

【数据范围和约定】 对于 40%的数据,n≤1000,m≤1000 对于 100%的数据,n≤1000000,m≤1000000 3 / 5

2. 冒泡排序 (sort.cpp/c/pas)

【问题描述】 Magolor 马上要去给获奖者颁发图灵奖了。但是他还有一个棘手的任务没有完成。 他有一个长度为 n 的序列,他要将这个序列进行冒泡排序。冒泡排序即对一个长度为 n 的序列 a[ ]运行如下代码 n 次 但是时间来不及了,Magolor 只能将这个代码运行 k 次。他想知道运行 k 次后得到 的序列。

【输入格式】 第一行两个整数 n,k,表示序列长度和执行次数 第二行 n 个整数,表示原始的序列 a[]

【输出格式】 一行 n 个整数,表示冒泡排序执行 k 轮后的序列。

【输入样例】 6 2 5 4 1 6 3

【输出样例】 2 1 4 3 5 6

【数据范围及约定】 保证 a[]中元素小于≤10^9 测试点 n K 1 ≤3000 =n-1 3-5 ≤3000 ≤3000 6-10 ≤1000000 ≤n 4 / 5

3.打卡 (card.cpp/c/pas)

【问题描述】 Magolor 不喜欢运动。但是体育老师为了让他强身健体,给了他一项跑步任务。 体育老师把 Magolor 带到了一个有 n 个点,n-1 条边的联通的运动场(即一棵树)。 两个点之间设有双向的跑道,每个跑道有自己的长度。每个点都有一个打卡装置。 Magolor 可以选择从任意一个点出发,在任意一个点退出运动场。他的任务是在 k 个不 同的点打卡。经过同一条跑道多次,距离也会计算多次。请你帮 Magolor 算出他至少要 跑多远的距离。如果对题意存在疑问,请参考样例。

【输入格式】 第一行包含两个正整数 n,k,其中 n 表示点的个数,k 的含义见题面描述。 接下来 n−1 行每行 3 个正整数 x,y,z,表示一条跑道连接 x 和 y,长度为 z 树中点的编号为 1-n。

【输出格式】 一行一个整数,表示 Magolor 为了在 k 个不同的点打卡至少需要跑多远。

【输入样例】 5 4 1 2 1 2 3 3 2 4 2 4 5 5

【输出样例】 7

【样例说明】 Magolor 可以从 3 号点出发,依次经过 3,2,1,2,4 ,从 4 号点退出,总的跑步距离为 7.可以证明不存在更优的方案。

5 / 5 【数据范围及约定】 1≤k≤n 1≤x,y≤n 1≤z≤1e5 测试点 n K 1-2 ≤10 无特殊约定 3-4 ≤3000 =n 5-6 ≤500 无特殊约定 7-10 ≤3000 无特殊约定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值