A - Suffix Three

题意:规定三种语言的结尾符,给出字符串,判断是什么语言。

void test_case() {
string s;
cin >> s;
reverse(s.begin(), s.end());
if(s.substr(0, 2) == "op")
puts("FILIPINO");
else if(s.substr(0, 2) == "us")
puts("JAPANESE");
else
puts("KOREAN");
}

B - Azamon Web Services

题意:交换s串的最多一对字母,问是否可以严格小于c串。

题解:找最小的那个换上来,假如有多个最小的找最后面的那个。居然越界了!

void test_case() {
string s, c;
cin >> s >> c;
int l = s.length();
for(int i = 0; i + 1 < l; ++i) {
int minj = i + 1;
for(int j = i + 2; j < l; ++j) {
if(s[j] <= s[minj])
minj = j;
}
if(s[minj] < s[i]) {
swap(s[minj], s[i]);
break;
}
}
if(s < c)
cout << s << endl;
else
cout << "---" << endl;
}

C - Cut and Paste

题意:光标最开始在最左侧,每次操作:

1、向右移动光标1格

2、把光标右侧的剪切

3、粘贴光标左侧第一个数字的次数

求当光标移动到x<=1e6位置时的字符串的总长度。

题解:直接模拟,超过x的字符串就不需要操作了,直接截断,但是长度继续参与运算。比赛的时候提交的那个截断长度不是x而是固定的MAXLEN=1e6,这样在超多组数据下复杂度好像不太对的,构造几个全都是3的串就复制到GG。

const ll LMOD = 1e16;

int MAXLEN;
char s[1000005]; int l;
ll tl; void append(int x) {
if(s[x] == '1')
return;
if(s[x] == '2') {
if(l < MAXLEN) {
int dl = l - x, ce = min(MAXLEN, l + dl);
for(int i = x + 1; i + dl <= ce; ++i)
s[i + dl] = s[i];
l += dl;
if(l >= MAXLEN)
l = MAXLEN;
}
tl += tl - x;
if(tl >= LMOD || tl <= -LMOD)
tl %= MOD;
return;
}
if(s[x] == '3') {
if(l < MAXLEN) {
int dl1 = l - x, dl2 = dl1 + dl1, ce1 = min(MAXLEN, l + dl1), ce2 = min(MAXLEN, l + dl2);
for(int i = x + 1; i + dl1 <= ce1; ++i)
s[i + dl1] = s[i];
for(int i = x + 1; i + dl2 <= ce2; ++i)
s[i + dl2] = s[i];
l += dl2;
if(l >= MAXLEN)
l = MAXLEN;
}
tl += tl - x + tl - x;
if(tl >= LMOD || tl <= -LMOD)
tl %= MOD;
return;
}
} void test_case() {
int c = 0;
scanf("%d%s", &MAXLEN, s + 1);
tl = l = strlen(s + 1);
while(1) {
++c;
append(c);
if(c == MAXLEN)
break;
}
tl = (tl % MOD + MOD) % MOD;
printf("%lld\n", tl);
}

D - Beingawesomeism

题意:给一个黑白棋盘格,每次可以选择一个1*x或者x*1形状的矩形向一个方向移动,把经过的位置都涂成你选的那个矩形的样子,求最小的步数把整个棋盘都涂成黑色。

题解:

0、全部都是黑色

1、有边上的一行或者一列全部都是黑色,移动这个矩形就可以

2、可以构造出边上的一行或者一列全部都是黑色的,也就是角上的黑色或者中间的一行或者一列全部都是黑色

3、可以构造出角上的黑色或者中间的一行或者一列全部都是黑色的,也就是边上的黑色,注意要造出中间一行或者一列也必须是边上的黑色

4、可以构造出边上的黑色的


int r, c;
char g[205][205];
int cntr[205], cntc[205]; void test_case() {
scanf("%d%d", &r, &c);
for(int i = 1; i <= r; ++i)
scanf("%s", g[i] + 1);
for(int i = 1; i <= r; ++i)
cntr[i] = 0;
for(int j = 1; j <= c; ++j)
cntc[j] = 0;
int sum = 0;
for(int i = 1; i <= r; ++i) {
for(int j = 1; j <= c; ++j) {
cntr[i] += g[i][j] == 'A';
cntc[j] += g[i][j] == 'A';
sum += g[i][j] == 'A';
}
}
/* -1 */
if(sum == 0) {
puts("MORTAL");
return;
}
/* 0 */
if(sum == r * c) {
puts("0");
return;
}
/* 1 */
if(cntr[1] == c || cntr[r] == c || cntc[1] == r || cntc[c] == r) {
puts("1");
return;
}
/* 2 */
if(g[1][1] == 'A' || g[1][c] == 'A' || g[r][1] == 'A' || g[r][c] == 'A') {
puts("2");
return;
}
for(int i = 1; i <= r; ++i) {
if(cntr[i] == c) {
puts("2");
return;
}
}
for(int j = 1; j <= c; ++j) {
if(cntc[j] == r) {
puts("2");
return;
}
}
/* 3 */
if(cntr[1] || cntr[r] || cntc[1] || cntc[c]) {
puts("3");
return;
}
/* 4 */
puts("4");
return;
}

E - Jeremy Bearimy

题意:给一棵2k个节点的树,把k对人分在上面,每个人一个节点,使得每对人之间的距离和最大以及最小,求值。

题解:贪心,比较某条边的两边的子树节点数量,发现最多贪的做法就是尽可能把每对人分在边的异侧,最少贪的做法就是尽可能把每对人分在同一侧。随便dfs一些就可以维护出某个点的子树,然后除去根节点以外每个点代表从根节点走向它的方向的那条边。

vector<pair<int, int> > G[200005];
int siz[200005], sum;
ll GG, BB; void dfs(int u, int p, int W) {
siz[u] = 1;
for(auto &i : G[u]) {
int v = i.first, w = i.second;
if(v == p)
continue;
dfs(v, u, w);
siz[u] += siz[v];
}
if(p != -1) {
if(siz[u] & 1)
BB += W;
GG += 1ll * min(sum - siz[u], siz[u]) * W;
}
} void test_case() {
int k;
scanf("%d", &k);
sum = 2 * k;
for(int i = 1; i <= sum; ++i)
G[i].clear();
for(int i = 1; i <= sum - 1; ++i) {
int a, b, t;
scanf("%d%d%d", &a, &b, &t);
G[a].push_back({b, t});
G[b].push_back({a, t});
}
GG = 0, BB = 0;
dfs(1, -1, 0);
printf("%lld %lld\n", BB, GG);
}

事实上vector(在多组数据的情况下因为反复申请内存)的确太慢了,明明是个O(n)的算法来的。有机会还是上链式前向星吧,顺便把图论模板里的几个vector也改成链式前向星的实现。(强连通缩点那个好像vector就很方便了,不太需要高效率)

ll minval, maxval;

struct Graph {
static const int MAXN = 200000;
static const int MAXM = 400000; int n;
int head[MAXN + 5], top; struct Edge {
int v, w, next;
} edge[MAXM + 5]; void Init(int _n) {
n = _n;
top = 0;
memset(head, 0, sizeof(head[0]) * (n + 1));
} void AddEdge(int u, int v, int w) {
edge[++top].next = head[u];
edge[top].v = v;
edge[top].w = w;
head[u] = top;
} int siz[MAXN + 5];
void dfs(int u, int p, int w) {
siz[u] = 1;
for(int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v;
if(v == p)
continue;
dfs(v, u, edge[i].w);
siz[u] += siz[v];
}
if(p != -1) {
if(siz[u] & 1)
minval += w;
maxval += 1ll * min(n - siz[u], siz[u]) * w;
}
}
} G; void test_case() {
int n, k;
scanf("%d", &k);
n = 2 * k;
G.Init(n);
for(int i = 1; i <= n - 1; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G.AddEdge(u, v, w);
G.AddEdge(v, u, w);
}
minval = 0, maxval = 0;
G.dfs(1, -1, 0);
printf("%lld %lld\n", minval, maxval);
}

Codeforces Round #607 (Div. 2)的更多相关文章

  1. Codeforces Round #607 (Div. 1) Solution

    从这里开始 比赛目录 我又不太会 div 1 A? 我菜爆了... Problem A Cut and Paste 暴力模拟一下. Code #include <bits/stdc++.h> ...

  2. 【cf补题记录】Codeforces Round #607 (Div. 2)

    比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...

  3. Codeforces Round #607 (Div. 1)

    A. Cut and Paste 题解 在计算答案的时候,我们发现只需要知道这个字符串前\(l\) 个具体是啥就行了.所以对于每一组询问,我们暴力把这个字符串前\(l\) 的位都算出来,然后剩下的就推 ...

  4. Codeforces Round #607 (Div. 2) 题解

    Suffix Three Azamon Web Services Cut and Paste Beingawesomeism Jeremy Bearimy Miss Punyverse Suffix ...

  5. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  6. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  7. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  8. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  9. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

随机推荐

  1. Java对list进行分页,subList()方法实现分页

    /** * 自定义List分页工具 * @author hanwl */ public class PageUtil { /** * 开始分页 * @param list * @param pageN ...

  2. Ubuntu linux安装完成后隐藏linux磁盘挂载点

    方案1 打开注册表 , 找到这个位置: 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explore ...

  3. iOS - app 进行安全加固

    研究了大半年逆向工程了,没在博客做记录,最近看到篇,跟自己的想法不谋而合,摘要下: 运行在越狱设备上的 iOS app,非常容易遭到破解分析,这里我列举一些可以加大破解难度的方法,希望有所帮助. 一些 ...

  4. session 在PC端正常设置读取,在移动端无法正常读取

    一.背景 最近在做一个面向三端[H5.IOS.安卓]的短信验证码登录接口.发送短信验证码时,服务端通过 session 保存验证码的值.登录时,从 session 获取验证码和用户输入的验证码 相比较 ...

  5. HTML5 结构标签

    一.定义标题栏:header header 元素是一种具有引导和导航作用的结构元素,通常用来放置整个页面或页面内的一个内容区块的标题,但也可以包含其他内容,因此整个页面的标题应该放在页面的开头. he ...

  6. FPM-OVP增强实例-银行账户

    本文是基于NWBC银行账户信息进行增强,相关过程如下: 1.定位需要增强的界面 首先登陆SAP-GUI(尽量EN登陆,ZH可能乱码),输入TCODE:NWBC跳转到浏览器界面,新建银行账户: 注意上图 ...

  7. 【JUC】3.ReentrantLock

    ReentrantLock实现Lock接口,所以先看下Lock接口: public interface Lock { // 获得锁 void lock(); // 获得锁 void unlock(); ...

  8. Android笔记(七十) AlertDialog

    alertdialog可以在当前界面中弹出一个对话框,这个对话框在界面所有元素之上,可以屏蔽掉其他控件的交互能力,因此alertdialog常用于一些重要的内容警告. 使用AlertDialog.Bu ...

  9. Linux命令——rsync

    参考:Rsync (Remote Sync): 10 Practical Examples of Rsync Command in Linux How to Sync Files/Directorie ...

  10. Jenkins 邮件配置 || Jenkins 发送邮件失败,提示:Error sending to the following VALID addresses

    jenkins---系统管理---系统设置 在Jenkins URL下填写URL链接 在系统管理员邮件地址下填写发件邮箱,这将是以后发送邮件通知的发件人 如果下载了外部邮件通知 配置一下SMTP se ...