#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 无特殊约定