A. World Football Cup

#include <bits/stdc++.h>
using namespace std;
 
const int N = ;
char name[N][N];
map<string, int> mp;
char s[N];
 
struct P {
int id, point;
int dif, goal;
bool operator < (const P &rhs) const {
if (point == rhs.point && goal - dif == rhs.goal - rhs.dif) return goal > rhs.goal;
if (point == rhs.point) return goal - dif > rhs.goal - rhs.dif;
return point > rhs.point;
}
} p[N];
 
int main() {
int n;
scanf("%d", &n);
for (int i = ; i < n; i++) {
scanf("%s", name[i]);
mp[name[i]] = i;
p[i].id = i;
}
for (int i = ; i < n * (n - ) / ; i++) {
int pp, qq;
scanf("%s%d:%d", s, &pp, &qq);
int j = ;
int len = strlen(s);
char s1[] = {};
char s2[] = {};
int p1 = , p2 = ;
for (; s[j] != '-'; j++) s1[p1++] = s[j];
j++;
for (; j < len; j++) s2[p2++] = s[j];
int a = mp[s1], b = mp[s2];
p[a].goal += pp, p[b].goal += qq;
p[a].dif += qq; p[b].dif += pp;
if (pp > qq) p[a].point += ;
else if (pp == qq) p[a].point++, p[b].point++;
else p[b].point += ;
}
sort(p, p + n);
vector<string> ans;
for (int i = ; i < n / ; i++)
ans.push_back(name[p[i].id]);
sort(ans.begin(), ans.end());
for (auto x: ans)
cout << x << '\n';
return ;
}

B. Checkout Assistant

有$n$个商品,每个商品价格$c_i$,售货员处理这件商品需要时间$t_i$,偷走一个商品需要$1$个单位时间,问怎么安排这些商品的结账顺序可以使的最后要还的钱最少。

如果让一件商品去结账,相当于花$c_i$块钱,能偷走买走至多$t_i + 1$个商品,要使最后总花费最小,那么就是01背包了。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
 
const int N = ;
ll dp[N];
int w[N];
ll c[N];
 
int main() {
memset(dp, 0x3f, sizeof dp);
dp[] = ;
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d%lld", &w[i], &c[i]), w[i]++;
for (int i = ; i <= n; i++) {
for (int j = n; j >= ; j--) {
dp[j] = min(dp[j], dp[max(j - w[i], )] + c[i]);
}
}
printf("%lld\n", dp[n]);
return ;
}

C. Deletion of Repeats

有一个序列,每种元素至多出现$10$次,如果有一个子串前一半等于后一半,那么把前一半及以前的字符全部删掉,要求从短的以及较左的地方开始删,问最后这个串长什么样。

#include <bits/stdc++.h>
using namespace std; const int N = 1e5 + ;
int a[N], v[N];
vector<int> G[N]; int main() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d", &a[i]);
v[i] = a[i];
}
sort(v + , v + + n);
int cnt = unique(v + , v + + n) - v - ;
for (int i = ; i <= n; i++) {
a[i] = lower_bound(v + , v + + cnt, a[i]) - v;
G[a[i]].push_back(i);
}
int now = ;
for (int i = ; i <= n; i++) {
bool flag = ;
for (auto pos: G[a[i]]) {
flag = ;
if (pos >= i) continue;
if (n - i + < i - pos) continue;
if (pos <= now) continue;
flag = ;
for (int j = ; j < i - pos; j++) {
if (a[i + j] != a[pos + j]) {
flag = ;
break;
}
}
if (!flag) break;
}
if (!flag) now = i - ;
}
printf("%d\n", n - now);
for (int i = now + ; i <= n; i++)
printf("%d%c", v[a[i]], " \n"[i == n]);
return ;
}

D. Points

一个二维坐标系,有三个操作。

1.加点

2.删点

3.查询严格在$(x, y)$右上角的点,输出$x$坐标最小的那个点,如果有相同的,则输出$y$最小的,不存在输出$-1$

因为存在修改操作,那么就不能离线做了,用线段树维护$x$坐标下$y$坐标的最大值,然后就变成了查询$\left[x + 1, inf\right]$中最小的$x$其$y$大于要查询的$y$,那么就又是先查左及剪枝的那个写法了。然后找到对应$x$坐标后,加点删点用一个set维护每个$x$坐标出现过$y$的坐标,在这个set里面lower_bound一下就好了,刚开始都插入0以及所有$y$坐标都加个一会好操作很多。

#include <bits/stdc++.h>
using namespace std;
 
const int N = 5e5 + ;
 
struct Seg {
#define lp p << 1
#define rp p << 1 | 1
int mx[N << ];
void pushup(int p) {
mx[p] = max(mx[lp], mx[rp]);
}
void update(int p, int l, int r, int x, int val) {
if (l == r) {
mx[p] = max(val, mx[p]);
return;
}
int mid = l + r >> ;
if (x <= mid) update(lp, l, mid, x, val);
else update(rp, mid + , r, x, val);
pushup(p);
}
void change(int p, int l, int r, int x, int val) {
if (l == r) {
mx[p] = val;
return;
}
int mid = l + r >> ;
if (x <= mid) change(lp, l, mid, x, val);
else change(rp, mid + , r, x, val);
pushup(p);
}
int query(int p, int l, int r, int x, int y, int val) {
if (x > y) return -;
if (mx[p] <= val) return -;
if (l == r) return l;
int mid = l + r >> ;
if (x <= mid) {
int temp = query(lp, l, mid, x, y, val);
if (temp != -) return temp;
}
return query(rp, mid + , r, x, y, val);
}
} seg;
 
struct OPT {
int opt;
int x, y;
} o[N];
int v[N];
set<int> st[N];
 
int main() {
// freopen("in.txt", "r", stdin);
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
char s[] = {};
scanf("%s%d%d", s, &o[i].x, &o[i].y);
if (s[] == 'a') o[i].opt = ;
else if (s[] == 'r') o[i].opt = ;
else o[i].opt = ;
v[i] = o[i].x;
o[i].y++;
}
sort(v + , v + + n);
int cnt = unique(v + , v + + n) - v - ;
for (int i = ; i <= cnt; i++) st[i].insert();
for (int i = ; i <= n; i++)
o[i].x = lower_bound(v + , v + + cnt, o[i].x) - v;
for (int i = ; i <= n; i++) {
if (o[i].opt == ) {
st[o[i].x].insert(o[i].y);
seg.update(, , cnt, o[i].x, o[i].y);
} else if (o[i].opt == ) {
st[o[i].x].erase(o[i].y);
set<int>::iterator it = st[o[i].x].end();
it--;
int res = ;
res = *it;
seg.change(, , cnt, o[i].x, res);
} else {
int pos = seg.query(, , cnt, o[i].x + , cnt, o[i].y);
if (pos == -) printf("-1\n");
else {
int ans = *st[pos].upper_bound(o[i].y);
printf("%d %d\n", v[pos], ans - );
}
}
}
return ;
}

E. Fairy

一个图为二分图的充要条件就是不存在奇环。
先求出一个dfs树,然后考虑非树边对dfs树的影响。
有几种情况需要考虑。
一、不存在自环及奇环
都可以删。
二、自环
如果存在两个自环及以上,就不可能了,因为它只能删除一条边。
有一个自环,当不存在奇环的时候就只能删除这个自环,否则也没边可删了。
三、存在一个奇环
那么这个奇环上的树边及非树边都可以删。也只有这种情况能删非树边。
四、存在多个奇环
那么能删除的边就是这些奇环的树边的交集。同时,这个交集的边不能出现在偶环上,否则奇环+偶环还是会得到奇环。
那么树上差分一下得到每条边在多少个奇环上,如果在偶环上就把路径减一下,就能处理出不能在偶环上的情况。最后就判断一下每一条边的值是否为奇环的个数。

#include <bits/stdc++.h>

namespace IO {
void read() {}
template<class T, class... T2>
void read(T &x, T2 &... oth) {
x = ; T f = ; char ch = getchar();
while (!isdigit(ch)) { if (ch == '-') f = -; ch = getchar(); }
while (isdigit(ch)) x = x * + ch - '', ch = getchar();
x *= f;
read(oth...);
}
} const int N = 1e6 + ;
struct E {
int v, ne, id;
} e[N << ];
int head[N], tag[N], dep[N], cnt = ;
bool vis[N];
int self, n, m; void add(int u, int v, int id) {
e[++cnt].v = v; e[cnt].ne = head[u]; e[cnt].id = id; head[u] = cnt;
e[++cnt].v = u; e[cnt].ne = head[v]; e[cnt].id = id; head[v] = cnt;
} int tol, fei; void dfs(int u, int f) {
for (int i = head[u]; i; i = e[i].ne) {
if (i == (f ^ )) continue;
int v = e[i].v;
if (dep[v]) {
if (dep[v] > dep[u]) continue;
if ((dep[u] - dep[v] + ) & ) {
tol++;
fei = e[i].id;
tag[u]++; tag[v]--;
} else {
tag[u]--; tag[v]++;
}
} else {
dep[v] = dep[u] + ;
dfs(v, i);
tag[u] += tag[v];
}
}
} std::vector<int> vec; void dfs(int u) {
vis[u] = ;
for (int i = head[u]; i; i = e[i].ne) {
int v = e[i].v;
if (vis[v]) continue;
if (tag[v] == tol)
vec.push_back(e[i].id);
dfs(v);
}
} int main() {
IO::read(n, m);
for (int i = ; i <= m; i++) {
int u, v;
IO::read(u, v);
if (u == v && !self) {
self = i;
continue;
}
if (u == v) {
self = -;
continue;
}
add(u, v, i);
}
if (self == -) {
puts("");
return ;
}
for (int i = ; i <= n; i++) {
if (!dep[i])
dep[i] = , dfs(i, );
}
if (tol == ) {
if (self) {
printf("1\n%d\n", self);
} else {
printf("%d\n", m);
for (int i = ; i <= m; i++)
printf("%d%c", i, " \n"[i == m]);
}
return ;
}
if (self) {
puts("");
return ;
}
for (int i = ; i <= n; i++)
if (!vis[i])
dfs(i);
if (tol == )
vec.push_back(fei);
printf("%d\n", (int)vec.size());
std::sort(vec.begin(), vec.end());
for (int i = ; i < vec.size(); i++)
printf("%d%c", vec[i], " \n"[i + == vec.size()]);
return ;
}

Codeforces Beta Round #19的更多相关文章

  1. Codeforces Beta Round #19 D. Points

    Description Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates a C ...

  2. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

  3. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  4. Codeforces Beta Round #62 题解【ABCD】

    Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...

  5. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  6. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  7. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  8. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  9. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

随机推荐

  1. Hash冲突的解决--暴雪的Hash算法

    Hash冲突的解决--暴雪的Hash算法https://usench.iteye.com/blog/2199399https://www.bbsmax.com/A/kPzOO7a8zx/

  2. ROS消息vs服务

    1.ROS包消息/服务模式与要点 从功能上看,ROS包是信息交互和处理的基本单元.根据信息的交互和处理方式,ROS包有以下两大类: 消息发布者与订阅者 服务器与客户端 对于消息模式的包,信息的提供者主 ...

  3. Android 5.0以下系统支持TLS 1.1/1.2协议版本

    一.背景 项目中,客户端与服务端之间普遍使用Https协议通信,突然接到测试同事反馈Android5.0以下手机上,App测试服使用出现问题,出现SSL handshake aborted错误信息,但 ...

  4. Linux(centOS6.5)安装RabbitMQ

    第一.下载erlang和rabbitmq-server的rpm: wget  http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.c ...

  5. 安装mysql驱动程序

    1.  MYSQL驱动:https://dev.mysql.com/downloads/connector/odbc/ 64 位版本:https://cdn.mysql.com//Downloads/ ...

  6. 【linux】Too many open files 解决问题第一步【记录】

    记录一下解决linux上出现:Too many open files  的第一步骤. 做个记录,免得每次都查来查去的. 1.查看 ulimit -a 2.修改 vi /etc/security/lim ...

  7. 在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

    基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份 ...

  8. C# 文件监听类 FileSystemWatcher 属性

    属性: Path——这个属性告诉FileSystemWatcher它需要监控哪条路径.例如,如果我们将这个属性设为“C:Temp”,对象就监控那个目录发生的所有改变.IncludeSubDirecto ...

  9. Python中的函数(高级使用)

    一.将函数作为变量去使用 在Python中函数也是一种对象,是一种名为function的对象,所以可以将函数赋值给变量,类似整数.浮点数.列表.元组.字典赋值给变量. 我们编写如下程序: #codin ...

  10. Python 绘图与可视化 matplotlib 动态条形图 bar

    bar的参考链接:https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.bar.html 第一种办法 一种方法是每次都重新画,包括清除f ...