A.ABBA

题意:就是问你一个矩阵能由几个行向量表示出来

Solution

其实就是求矩阵的秩,但是会被卡精度(被卡了好几发),直接抄个矩阵求秩的板子就AC了

Code
#define CLR(x) memset(x,0,sizeof(x))//定义宏
using namespace std;
double mat[300][300];//定义矩阵
int r,c;
int cmp(double x,double y){
double v = x - y;
if(v > 1e-1) return 1;//1e-1表示10^-1
if(v < -1e-1) return -1;
return 0;
}
//乘相应值
void subrow(int r1 , int r2,double temp){
for(int i = 1 ; i <= c ; i++){
mat[r1][i] -= mat[r2][i]*temp;
}
}
//交换数值
void swaprow(int r1 , int r2){
for(int i = 1 ; i <= c ; i++){
swap(mat[r1][i],mat[r2][i]);
}
}
//判断秩(主要判定函数)
void solve() {
for (int i = 1; i <= r; i++) {
for (int cal = i; cal <= c; cal++) { //对这 i 行的每一列来找,要是这列本身和之下的列全是0,则找 i 行下一列。
bool flag = true;
if (cmp(mat[i][cal], 0) == 0) {
flag = false; //如果第 i 行 cal 列这个位置是 0 ,那找找这列下面的行有没有
for (int j = i + 1; j <= r; j++) { //一个不为 0 的数 , 要是有 , 就将它与 i 行交换。
int tmp = cmp(mat[j][cal], 0);
if (tmp == 1 || tmp == -1) {
flag = true;
swaprow(j, i);
break;
}
}
}
if (!flag) continue;//如果这列全是 0 , 到下一列。
int v = i; //如果发现这列有值不为 0 并把它跟 i 行交换后,
int maxn = mat[i][cal]; //就再找这列有没有比 i 行 这个位置的值更大的值,如果有,将那一行
for (int j = i + 1; j <= r; j++) { //跟i行交换。(听说是为了减小误差)
if (cmp(mat[j][cal], mat[i][cal]) == 1) {
v = j;
maxn = mat[j][cal];
}
}
if (v != i) {
swaprow(i, v);
}
for (int j = 1; j <= r; j++) {
if (j == i) continue;
if (cmp(mat[i][cal], 0) == 0) continue;
double tmp = mat[j][cal] / mat[i][cal];
subrow(j, i, tmp);
}
break;
}
}
}
int main() {
CLR(mat);
scanf("%d %d", &r, &c);
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
scanf("%lf", &mat[i][j]);
}
}
solve();
bool f = false;
int ans = 0;
for (int i = r; i >= 1; i--) {
for (int j = 1; j <= c; j++) {
int tmp = cmp(mat[i][j], 0);
if (tmp == 1 || tmp == -1) {
f = true;
break;
}
}
if (f) {
ans = i;
break;
}
}
printf("%d\n", ans);//输出秩
return 0;
}

E.Elvis Presley

题意:
在形如二叉树的DAG上选出一个包含a,b的极大点集,使这些点互不可达,且选的个数最少

Solution

阅读理解题

Code

int main() {
int a, b;
cin >> a >> b;
if (a > b) swap(a, b);
if (a == 1) {
cout << -1;
return 0;
}
set stt;
int now = a;
while (now) {
stt.insert(now);
now /= 2;
}
now = b;
int lca;
while (now) {
if (stt.find(now) != stt.end()) {
if (now == a) {
cout << -1;
return 0;
}
lca = now;
break;
}
now /= 2;
}
now = b;
vector ans;
while (now / 2 != lca) {
if (now % 2) ans.push_back(now / 2 * 2);
else ans.push_back(now / 2 * 2 + 1);
now /= 2;
}
now = a;
while (now / 2 != lca) {
if (now % 2) ans.push_back(now / 2 * 2);
else ans.push_back(now / 2 * 2 + 1);
now /= 2;
}
now = lca;
while (now != 1) {
if (now % 2) ans.push_back(now / 2 * 2);
else ans.push_back(now / 2 * 2 + 1);
now /= 2;
}
ans.push_back(a), ans.push_back(b);
sort(ans.begin(), ans.end());
for (int i: ans) cout << i << " ";
}

G.Green Day

题意:略

Solution

题解:仿样例,凑出来的,神奇的AC姿势

Code
void solve() {
int k;
cin >> k;
cout<< 2*k << endl;
for (int i = 1; i <= k; ++i) {
for (int j = 1; j <= k; ++j) {
cout << i << " " << i + j<< endl;
}
for (int j = k+1 ; j <= 2 * k-1 ; ++j) {
cout << i + k << " " << (i + j-1)%(2*k)+1 << endl;
}
}
}

J. Burnished Security Updates

题意:给定一棵边权为小写字母的树和一个目标串$S$ , 问是否存在一条简单路径,使S成为该路径构成的字符串的子序列。若存在,输出任何一条合法路径的两个端点$($先起点,后终点$)$ ,否则输出-1 -1。

Solution

思路:
​ 树形dp维护以某个节点为根的子树中,以根为路径的一个端点,可以在$S$ 中匹配的最长前缀和后缀。当某棵子树的前后缀已经覆盖了$S$,并且前后缀的路径不重复,就是合法路径。保证不重复的方法详见代码。

Code
int n, m, idx;
string s;
int head[maxn];
pii st[maxn], ed[maxn], ans;
struct Edge {
int to, nxt; char c;
} edge[maxn * 2];
void addedge(int u, int v, char c) {
edge[idx] = {v, head[u], c};
head[u] = idx ++;
edge[idx] = {u, head[v], c};
head[v] = idx ++;
}
void dfs(int u, int fa) {
st[u] = ed[u] = {0, u};
for(int i = head[u]; ~i; i = edge[i].nxt) {
int v = edge[i].to; char c = edge[i].c;
if(v == fa) continue;
dfs(v, u);
if(c == s[st[v].x + 1] && st[v].x < m) st[v].x ++;
if(c == s[m - ed[v].x] && ed[v].x < m) ed[v].x ++;
// 路径不重复
if(st[u].x + ed[v].x >= m) ans = {st[u].y, ed[v].y};
if(ed[u].x + st[v].x >= m) ans = {st[v].y, ed[u].y};
st[u] = max(st[u], st[v]);
ed[u] = max(ed[u], ed[v]);
}
}
int main() {
ios;
cin >> n >> m;
for(int i = 1; i <= n; i ++) head[i] = -1;
for(int i = 1; i < n; i ++) {
int u, v; char c;
cin >> u >> v >> c;
addedge(u, v, c);
}
cin >> s;
s = "?" + s;
ans = {-1, -1};
dfs(1, 0);
cout << ans.x << " " << ans.y;
}

Petrozavodsk Winter Training Camp 2016: Moscow SU Trinity Contest的更多相关文章

  1. 2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest (5/9)

    2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest B. Forcefield 题意 给你一维平面上n个镜子 ...

  2. 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】

    2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据 ...

  3. Petrozavodsk Winter Training Camp 2018

    Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...

  4. 2014-2015 Petrozavodsk Winter Training Camp, Contest.58 (Makoto rng_58 Soejima contest)

    2014-2015 Petrozavodsk Winter Training Camp, Contest.58 (Makoto rng_58 Soejima contest) Problem A. M ...

  5. 【推导】【数学期望】【冒泡排序】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem C. Earthquake

    题意:两地之间有n条不相交路径,第i条路径由a[i]座桥组成,每座桥有一个损坏概率,让你确定一个对所有桥的检测顺序,使得检测所需的总期望次数最小. 首先,显然检测的时候,是一条路径一条路径地检测,跳跃 ...

  6. 【线段树】【扫描线】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem A. Donut

    题意:平面上n个点,每个点带有一个或正或负的权值,让你在平面上放一个内边长为2l,外边长为2r的正方形框,问你最大能圈出来的权值和是多少? 容易推出,能框到每个点的 框中心 的范围也是一个以该点为中心 ...

  7. 【取对数】【哈希】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem J. Bobby Tables

    题意:给你一个大整数X的素因子分解形式,每个因子不超过m.问你能否找到两个数n,k,k<=n<=m,使得C(n,k)=X. 不妨取对数,把乘法转换成加法.枚举n,然后去找最大的k(< ...

  8. 【BFS】【最小生成树】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem G. We Need More Managers!

    题意:给你n个点,点带权,任意两点之间的边权是它们的点权的异或值中“1”的个数,问你该图的最小生成树. 看似是个完全图,实际上有很多边是废的.类似……卡诺图的思想?从读入的点出发BFS,每次只到改变它 ...

  9. 【状压dp】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem E. Guessing Game

    题意:给你n个两两不同的零一串,Alice在其中选定一个,Bob去猜,每次询问某一位是0 or 1.问你最坏情况下最少要猜几次. f(22...2)表示当前状态的最小步数,2表示这位没确定,1表示确定 ...

随机推荐

  1. Centos7 安装mysql服务器并开启远程访问功能

    大二的暑假,波波老师送了一个华为云的服务器给我作测试用,这是我程序员生涯里第一次以root身份拥有一台真实的云服务器 而之前学习的linux知识在这时也派上了用场,自己的物理机用的是ubuntu系统, ...

  2. [HNOI2009]【一本通提高组合数学】有趣的数列

    [HNOI2009]有趣的数列 题目描述 我们称一个长度为 2 n 2n 2n 的数列是有趣的,当且仅当该数列满足以下三个条件: 它是从 1 ∼ 2 n 1 \sim 2n 1∼2n 共 2 n 2n ...

  3. Neo4j应用

    CQL函数 1. 字符串函数 功能 描述 UPPER 将所有字母改为大写 LOWER 将所有字母改为小写 SUBSTRING 将获取指定范围的子字符串 REPLACE 替换一个字符串的子字符串 mat ...

  4. Str 真题解(置换)

    目录 题面 置换 这里没有群论 置换 置换的乘法(复合) 置换乘法的单位元 置换乘法的结合律 置换快速幂 置换求乘法逆 真题解 一种可能的代码实现 关于循环节做法 题面 对于字符串 \(s\) 定义一 ...

  5. ETCD快速入门-02 ETCD安装

    2.ETCD安装     etcd 安装可以通过源码构建也可以使用官方构建的二进制文件进行安装.我们以二进制文件为例,系统为CentOS 7.9,操作步骤如下所示: 2.1 Linux ETCD_VE ...

  6. 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...

  7. Apache DolphinScheduler 荣获国外知名媒体采访

    Apache DolphinScheduler 毕业的消息被北美科技媒体 TheNewStack 关注并邀请Apache DolphinScheduler PMC chair 代立冬 进行相关采访. ...

  8. Apache DolphinScheduler 是如何诞生的

    作者 | 代立冬,李岗 排版 | 开源之道小助理 Apache DolphinScheduler,简称"DS", 中文名 "小海豚调度"(海豚聪明.人性化,又左 ...

  9. 个人学习-STL深入学习01-vectory源码研习 // 需要补充

    参考资料: [1]博主:一枚程序员 STL源码剖析--vector https://www.cnblogs.com/sooner/p/3273395.html [2]博主:劲蜡鸡腿堡 vector源码 ...

  10. 从零搭建云原生技术kubernetes(K8S)环境-通过kubesPhere的AllInOne方式

    前言 k8s云原生搭建,步骤有点多,但通过kubesphere,可以快速搭建k8s环境,同时有一个以 Kubernetes 为内核的云原生分布式操作系统-kubesphere,本文将从零开始进行kub ...