弱省互测#0 t3
Case 1 题意
要求给出下面代码的答案然后构造输入。
给一个图, n 个点 m 条边 q 次询问,输出所有点对之间最大权值最小的路径。
题解
把每一个询问的输出看成一条边,建一棵最小生成树。
Case 3 题意
给输出,要求构造输入使得用所给代码运行后得到的输出和给出的输出相同。
所给代码:n 次 Dijkstra 求两点间最短路
分析
考虑一下贪心。
题解
首先还是把每一条最短路的询问结果看成一条边,然后我们把这些边排序。
对于每一条边,如果这两个点现在的距离大于这条边的权值,我们就把这条边加进去,更新所有点对
的距离。
正确性显然。
现在证明这样做边数最短:
假设这样得到的构造方案为 A ,假设还有一种构造方案是 B ,并且边数更少。
那么在 A 中肯定存在一条边,在 B 中不存在。
于是在 B 中,这一条边的两个端点之间的距离,肯定大于 A 中这条边的边权。
否则如果相等的话,在 A 中就不会选择这一条边。
因此, B 这个方案肯定是非法的,也就是说, A 是边数最少的构造方案。
#include <bits/stdc++.h>
using namespace std;
namespace one {
const int N=1015, M=1000015;
struct E {
int x, y, w;
}e[M];
int p[N], n, tot, m;
bool cmp(const E &a, const E &b) {
return a.w<b.w;
}
int find(int x) {
return x==p[x]?x:p[x]=find(p[x]);
}
void work() {
scanf("%d%d", &n, &m);
printf("%d %d\n", n, m);
int cnt=0;
for(int i=1; i<=n; ++i) {
for(int j=i+1; j<=n; ++j) {
e[cnt].x=i;
e[cnt].y=j;
scanf("%d", &e[cnt].w);
++cnt;
}
}
for(int i=1; i<=n; ++i) {
p[i]=i;
}
sort(e, e+cnt, cmp);
for(int i=0; i<cnt; ++i) {
int x=e[i].x, y=e[i].y, fx=find(x), fy=find(y), w=e[i].w;
if(fx!=fy) {
p[fx]=fy;
++tot;
printf("%d %d %d\n", x, y, w);
}
}
for(; tot<=m; ++tot) {
printf("%d %d %d\n", 1, 1, 0);
}
}
}
namespace two {
const int mo1=9999991, mo2=3333331;
typedef long long ll;
int ipow(int a, int b, int mo) {
int x=1;
for(; b; b>>=1, a=(ll)a*a%mo) if(b&1) x=(ll)x*a%mo;
return x;
}
void work() {
int n;
scanf("%d", &n);
printf("%d\n", n);
for(int i=1; i<=n; ++i) {
static char s[100005];
scanf("%s", s+1);
int now1=0, now2=0, len=strlen(s+1);
for(int i=1; i<=len; ++i) {
now1=(now1*10+s[i]-'0')%mo1;
now2=(now2*10+s[i]-'0')%mo2;
}
for(int x=1; x<=10000; ++x) {
int h1=ipow(x, x, mo1), h2=ipow(x, x, mo2);
if(h1==now1 && h2==now2) {
printf("%d ", x);
break;
}
}
}
}
}
namespace three {
int d[1005][1005];
struct E {
int x, y, w;
}e[1000005];
bool cmp(const E &a, const E &b) {
return a.w<b.w;
}
void work() {
int n, m, cnt=0, tot=0;
scanf("%d%d", &n, &m);
printf("%d %d\n", n, m);
for(int i=1; i<=n; ++i) {
for(int j=i+1; j<=n; ++j) {
e[cnt].x=i;
e[cnt].y=j;
scanf("%d", &e[cnt].w);
cnt++;
}
}
memset(d, 0x3f, sizeof d);
for(int i=1; i<=n; ++i) {
d[i][i]=0;
}
sort(e, e+cnt, cmp);
for(int it=0; it<cnt; ++it) {
int x=e[it].x, y=e[it].y, w=e[it].w;
if(w<d[x][y]) {
++tot;
printf("%d %d %d\n", x, y, w);
d[x][y]=d[y][x]=w;
for(int i=1; i<=n; ++i) {
for(int j=1; j<=n; ++j) {
d[i][j]=min(d[i][j], min(d[i][x]+d[x][j], d[i][y]+d[y][j]));
}
}
}
}
for(; tot<=m; ++tot) {
printf("%d %d %d\n", 1, 1, 1);
}
}
}
namespace four {
const int N=55005;
vector<int> a[N];
void work() {
int n, root;
scanf("%d%d", &n, &root);
printf("%d %d\n", n, root);
int csz=0, sz=pow(n, (double)2/3);
for(int i=1; i<=n; ++i) {
int blc;
scanf("%d", &blc);
csz+=a[blc].empty();
a[blc].push_back(i);
}
int j, rt, na;
for(j=0, na=a[csz].size(); j<na; ++j) {
if(a[csz][j]==root) {
swap(a[csz][j], a[csz][0]);
break;
}
}
for(int i=csz; i>=1; --i) {
rt=a[i][0], j=1, na=a[i].size();
for(; j<sz-1 && j<na; ++j) {
printf("%d %d\n", a[i][j-1], a[i][j]);
}
if(j<na) {
printf("%d %d\n", a[i][j++], root);
}
for(; j<sz*2-1 && j<na; ++j) {
printf("%d %d\n", a[i][j-1], a[i][j]);
}
if(j<na) {
printf("%d %d\n", a[i][j++], root);
}
for(; j<na; ++j) {
printf("%d %d\n", a[i][j-1], a[i][j]);
}
if(root!=rt) {
printf("%d %d\n", root, rt);
}
}
}
}
namespace five {
const int N=100015;
struct E {
int l, r, k, w;
}e[N];
bool cmp(const E &a, const E &b) {
if(a.w==-1) {
return 0;
}
if(b.w==-1) {
return 1;
}
return a.w<b.w;
}
int a[N], K[N], vis[N], left, right;
void work() {
int n, t;
scanf("%d%d", &n, &t);
printf("%d %d\n", n, t);
left=1;
right=n;
int len=n/t, tot=0;
for(int i=0; i<t; ++i) {
int w;
scanf("%d%d", &K[i], &w);
if(w==-1) {
continue;
}
e[tot].l=i*len+1, e[tot].r=i*len+len;
e[tot].k=len-K[i]+1;
e[tot].w=w;
++tot;
}
sort(e, e+tot, cmp);
for(int i=0; i<tot; ++i) {
int l=e[i].l, k=e[i].k, w=e[i].w;
for(int j=1; j<k; ++j, ++l) {
while(vis[left]) {
++left;
}
a[l]=left;
vis[left]=1;
++left;
}
a[l]=w;
vis[w]=1;
}
for(int i=tot-1; i>=0; --i) {
int r=e[i].r, k=e[i].k;
for(int j=0; j<(len-k); ++j, --r) {
while(vis[right]) {
--right;
}
a[r]=right;
vis[right]=1;
--right;
}
}
for(int i=1; i<=n; ++i) {
if(a[i]) {
continue;
}
while(vis[right]) {
--right;
}
a[i]=right;
--right;
}
for(int i=1; i<=n; ++i) {
printf("%d ", a[i]);
}
for(int i=0; i<t; ++i) {
printf("%d ", K[i]);
}
}
}
int main() {
int C;
scanf("%d", &C);
printf("%d\n", C);
if(C<20) one::work();
else if(C<40) two::work();
else if(C<60) three::work();
else if(C<80) four::work();
else five::work();
return 0;
}
弱省互测#0 t3的更多相关文章
- 弱省互测#2 t3
题意 给出\(n\)个01字节和\(m\)个01字节,要求用后者去匹配前者,两个串能匹配当且仅当除了每个字节末位不同,其他位都要相同.问匹配后者至少有多少个末位不同.(\(1 \le m \le n ...
- 弱省互测#1 t3
题意 给出一棵n个点的树,求包含1号点的第k小的连通块权值和.(\(n<=10^5\)) 分析 k小一般考虑堆... 题解 堆中关键字为\(s(x)+min(a)\),其中\(s(x)\)表示\ ...
- 弱省互测#0 t2
题意 给定两个字符串 A 和 B,求下面四个问题的答案: 1.在 A 的子串中,不是 B 的子串的字符串的数量. 2.在 A 的子串中,不是 B 的子序列的字符串的数量. 3.在 A 的子序列中,不是 ...
- 弱省互测#0 t1
题意 给一个\(N \times M\)的01网格,1不能走,从起点\((1, 1)\)走到\((N, M)\),每次只能向下或向右走一格,问两条不相交的路径的方案数.(n, m<=1000) ...
- 【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)
Description 给定一颗 \(n\) 个点的树,带边权. 你可以选出一个包含 \(1\) 顶点的连通块,连通块的权值为连接块内这些点的边权和. 求一种选法,使得这个选法的权值是所有选法中第 \ ...
- 弱省互测#2 t2
题意 给两个树,大小分别为n和m,现在两棵树各选一些点(包括1),使得这棵树以1号点为根同构(同构就是每个点的孩子数目相同),求最大的同构树.(n, m<=500) 分析 我们从两棵树中各取出一 ...
- 【loj2461】【2018集训队互测Day 1】完美的队列
#2461. 「2018 集训队互测 Day 1」完美的队列 传送门: https://loj.ac/problem/2461 题解: 直接做可能一次操作加入队列同时会弹出很多数字,无法维护:一个操作 ...
- 【2018集训队互测】【XSY3372】取石子
题目来源:2018集训队互测 Round17 T2 题意: 题解: 显然我是不可能想出来的……但是觉得这题题解太神了就来搬(chao)一下……Orzpyz! 显然不会无解…… 为了方便计算石子个数,在 ...
- 洛谷 P4463 - [集训队互测 2012] calc(多项式)
题面传送门 & 加强版题面传送门 竟然能独立做出 jxd 互测的题(及其加强版),震撼震撼(((故写题解以祭之 首先由于 \(a_1,a_2,\cdots,a_n\) 互不相同,故可以考虑求出 ...
随机推荐
- (转)winform(C#)里几种弹出对话框
//消息框中需要显示哪些按钮,此处显示“确定”和“取消” MessageBoxButtons messButton = MessageBoxButtons.OKCancel; //"确定要退 ...
- bzoj4398:福慧双修
学习了一下最短路的姿势,这个建图方法好妙啊,虽然不会证明正确性…… #include <bits/stdc++.h> #define N 220000 #define INF 100000 ...
- mysql的enum和set数据类型
定义一个ENUM或者SET类型,可以约束存入的数值. ENUM中的值必须是定义过数值列中的一个,比如ENUM('a','b','c'),存入的只能是'a'或者'b'或者'c',如果存入'','d'或者 ...
- POJ 2226二分图最大匹配
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...
- Reverse Core 第一部分 代码逆向技术基础
@date: 2016/10/14 <逆向工程核心原理>笔记 记录书中较重要的知识,方便回顾 ps. 因有一些逆向基础,所以我本来就比较熟悉的知识并未详细记录 第一章 关于逆向工程 目标, ...
- StringUtils中 isNotEmpty 和isNotBlank的区别
isNotEmpty : 判断某字符串是否非空 StringUtils.isNotEmpty(null) = false StringUtils.isNotEmpty("") = ...
- Servlet调用过程
(1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址. (2)浏览器根据ip地址和端口号访问服务器,组织http请求信息 ...
- svn上传工程之后下载,打开下载之后的工程缺少文件
当我们把iOS的工程上传到SVN中,当我们再从SVN中下载下来,就会出现错误,这是什么原因呢?我这里出现的错误是找不到文件,后来知道原来是被屏蔽掉了,就是上传的时候不上传某个类型的文件.例如我出错就是 ...
- iOS JSON、NSDictionary互转
#import "myCode.h" @implementation myCode /*! * @brief 把格式化的JSON格式的字符串转换成字典 * @param jsonS ...
- 手把手教你玩转nginx负载均衡(三)----配置虚拟服务器网络
引言 虽然上一篇我们成功的启动了虚拟机,也安装好了操作系统,但是这台虚拟机和主机以及其他虚拟机是没有办法连通的,我们的目标是配置多台服务器并且配置nginx反向代理,来实现负载均衡,所以不能访问内网是 ...