QBXT模拟赛2

总结

期望得分:\(100 + 40 + 0 = 140\)

实际得分:\(0 + 0 + 0 = 0\)

鬼知道为什么我代码没有交上。。自测\(10 + 50 + 0\)……这是心态爆炸的一场考试

\(T1\)敲了\(3\)个小时,写了\(9kb\),连样例都过不了,改了改过了样例迅速离开

\(T2\)只会\(40\),但因为一个点的\(a[i]\)很大,于是水过去了,变成了\(50\)

\(T3\)连看都没看,\(0\)分滚粗

我果是个彩笔

思路&&代码

T1

模拟题, 一看这长长的题面,就知道是个简单题(fp嘛我做了三个小时不过样例能是简单题?)

其实我觉得最难的不是别的,就是输入。。。这么一大堆字符串,还有\(5\)个位置,还是两个队,如何做到最简?

其实这些可以化作一个整体,我们很容易想到要用结构体存储,但复杂的hapigou就是:结构体数组怎么开?

我们可以开一个三维的\(a\)数组,存储两个队所有位置所有人的信息,\(a[0]\)就表示\(A\)队,\(a[1]\)就表示\(B\)队,\(a[x][1-5]\)就表示\(x\)队五个位置的信息,\(a[x][y][cnt]\)就表示\(x\)队第\(y\)个位置的第\(cnt\)名选手,这样不仅好理解,还方便了之后我们要用到的的排序

再者,肯定要从实力由高到低的选,每次某个位置换的肯定是这个位置剩余的实力最强的人,所以我们就可以直接按照实力把每个位置的人排序,如果实力相同则编号较小的在前

之后我们就要想怎么来选人了,要想让场上所有人的综合实力最大,我们要保证换下来的人与在场的人实力的差值最小,所以就可以在五个位置中找差值最小的位置来换,这样这道题就完美解决了

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int A = 5e5 + 11;
const int B = 1e6 + 11;
const int INF = 1000; inline int read() {
char c = getchar(); int x = 0, f = 1;
for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
return x * f;
} struct node { char name[16]; int id, val; } a[2][6][A];
int N, M, T, P, Q;
int cnt[2][6], change[2][6]; bool cmp(node a, node b) {
return a.val == b.val ? a.id < b.id : a.val > b.val;
} inline int check(char s[4]) {
if(s[0] == 'p' && s[1] == 'g') return 1;
if(s[0] == 's' && s[1] == 'g') return 2;
if(s[0] == 's' && s[1] == 'f') return 3;
if(s[0] == 'p' && s[1] == 'f') return 4;
if(s[0] == 'c') return 5;
} inline void add(int dui, char name[16], int pos, int id, int val) {
a[dui][pos][++cnt[dui][pos]].id = id;
strcpy(a[dui][pos][cnt[dui][pos]].name, name);
a[dui][pos][cnt[dui][pos]].val = val;
} int main() {
N = read(), M = read(), T = read(), P = read(), Q = read();
char s[4], name[16]; int idd, val, dui;
for(int i = 1; i <= N + M; i++) {
dui = (i <= N ? 0 : 1);
scanf("%s %d %s %d", name, &idd, s, &val);
add(dui, name, check(s), idd, val);
}
for(int i = 1; i <= 5; i++) sort(a[0][i] + 1, a[0][i] + cnt[0][i] + 1, cmp), sort(a[1][i] + 1, a[1][i] + cnt[1][i] + 1, cmp);
for(int i = 1; i <= 5; i++) change[1][i] = 1, change[0][i] = 1;
int suma = 1, sumb = 1, team;
while(P * suma < T || Q * sumb < T) {
if(P * suma <= Q * sumb) team = 0, suma++; else team = 1, sumb++;
int minn = 10000000, po; node be, aft;
for(int i = 1; i <= 5; i++) {
int k = change[team][i], c = a[team][i][k].val - a[team][i][k + 1].val;
if(k == cnt[team][i]) continue;
if(c < minn || (c == minn && a[team][i][k + 1].id < aft.id)) minn = c, po = i, be = a[team][i][k], aft = a[team][i][k + 1];
}
change[team][po]++;
char dui = (team == 0 ? 'A' : 'B');
printf("Substitution by %c,No.%d %s is coming up to change No.%d %s.\n", dui, aft.id, aft.name, be.id, be.name);
}
return 0;
}

T2

这道题到现在我还是只会五十分,很容易想到是一个贪心的思路,我们直接用两个指针表示从左边右边拿,就能拿五十了

满分的也在下面,还是不会。。菜死了

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int A = 1e5 + 11;
const int B = 1e6 + 11;
const int INF = 0x3f3f3f3f; inline int read() {
char c = getchar(); int x = 0, f = 1;
for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
return x * f;
} int n, T, x[A], a[A]; namespace sub {
int maxn = -INF;
inline void Main() {
for(int i = 1; i <= n; i++) {
int now = 0, ans = 0, l = i - 1, r = i + 1, one;
while(now <= T) {
if(l < 1 && r > n) break;
else if(l >= 1 && r <= n && x[i] - x[l] <= x[r] - x[i]) {
one = min((T - now) / ((x[i] - x[l]) * 2), a[l]);
now += (x[i] - x[l]) * 2 * one, ans += one;
if(one == a[l]) l--; else break;
}
else if(l >= 1 && r <= n && x[i] - x[l] > x[r] - x[i]) {
one = min((T - now) / ((x[r] - x[i]) * 2), a[r]);
now += (x[r] - x[i]) * 2 * one, ans += one;
if(one == a[r]) r++; else break;
}
else if(l < 1 && r <= n) {
one = min((T - now) / ((x[r] - x[i]) * 2), a[r]);
now += (x[r] - x[i]) * 2 * one, ans += one;
if(one == a[r]) r++; else break;
}
else if(l >= 1 && r > n) {
one = min((T - now) / ((x[i] - x[l]) * 2), a[l]);
now += (x[i] - x[l]) * 2 * one, ans += one;
if(one == a[l]) l--; else break;
}
}
maxn = max(maxn, ans + a[i]);
}
cout << maxn << '\n';
return;
}
} int main() {
n = read(), T = read();
for(int i = 1; i <= n; i++) x[i] = read();
for(int i = 1; i <= n; i++) a[i] = read();
if(n <= 1000) return sub::Main(), 0; return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std; const int N = 5e5 + 11; inline int read() {
char c = getchar(); int x = 0, f = 1;
for( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for( ; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c ^ 48);
return x * f;
} int s[N], T;
int x[N], a[N], n; bool check(int H) {
int nowh = 0, tim = 0;
int lc = 0, rc = 0, l = 1, r = n + 1;
for (int i = 1; i <= n; i++)
if (nowh + a[i] <= H) nowh += a[i], tim += (int)(x[i] - x[1]) * a[i];
else {r = i, rc = H - nowh, tim += (int)(x[i] - x[1]) * rc; break;}
if (tim <= T) return 1;
for (int i = 2; i <= n; i++) {
int suml = s[i - 1] - s[l - 1] - lc;
int sumr = s[r - 1] - s[i - 1] + rc;
tim += (x[i] - x[i - 1]) * (suml - sumr);
while (r <= n && x[i] - x[l] > x[r] - x[i]) {
int can = min(a[l] - lc, a[r] - rc);
tim += (x[r] - x[i] - x[i] + x[l]) * can;
lc += can, rc += can;
if (lc >= a[l]) ++l, lc = 0;
if (rc >= a[r]) ++r, rc = 0;
}
if (tim <= T) return 1;
}
return 0;
} signed main() {
n = read(), T = read(); T /= 2;
for (int i = 1; i <= n; i++) x[i] = read();
for (int i = 1; i <= n; i++) a[i] = read();
for (int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];
int l = 0, r = s[n], ans;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) l = mid + 1, ans = mid;
else r = mid - 1;
}
cout << ans << '\n';
return 0;
}

T3

神仙字符串题,不会

#include<bits/stdc++.h>
#define N 500010
#define ls (x << 1)
#define rs (x << 1 | 1)
using namespace std;
typedef long long ll;
struct intv{
int s, i;
} a[N], b[N];
int p[N], rc[N << 2], f[N], n, m, type, anss, sum[N << 2];
ll ansf;
char s[N];
bool cmp(intv a, intv b) {
return a.s < b.s;
}
inline void updata(int x, int l, int r, int p) {
if (l == r) {
rc[x] = r, sum[x] = 1; return;
}
int mid = (l + r) >> 1;
if (p <= mid) updata(ls, l, mid, p);
else updata(rs, mid + 1, r, p);
sum[x] = sum[ls] + sum[rs];
rc[x] = (rc[rs] == -1 ? rc[ls] : rc[rs]);
}
inline intv query(int x, int l, int r, int xl, int xr) {
if (l == xl && r == xr) return (intv) {sum[x], rc[x]};
int mid = (l + r) >> 1;
if (xr <= mid) return query(ls, l, mid, xl, xr);
else if (xl > mid) return query(rs, mid + 1, r, xl, xr);
else {
intv ql = query(ls, l, mid, xl, mid), qr = query(rs, mid + 1, r, mid + 1, xr);
return (intv) {ql.s + qr.s, qr.i == -1 ? ql.i : qr.i};
}
}
int main() {
freopen("htstr.in", "r", stdin);
freopen("htstr.out", "w", stdout);
scanf("%s%d", s + 1, &type);
n = strlen(s + 1); s[0] = '#';
int mx = 0, id, now = 1;
for (int i = 1; i <= n; i++) {
if (mx >= i) p[i] = min(mx - i, p[2 * id - i]);
for (; s[i + p[i] + 1] == s[i - p[i]]; p[i]++);
if (p[i] + i < mx) id = i, mx = p[i] + i;
}
for (int i = 1; i <= n; i++) a[i] = (intv) {i - p[i], i};
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n << 2; i++) rc[i] = -1;
for (int i = 1; i <= n; i++) {
while (now <= n && a[now].s <= i) updata(1, 1, n, a[now].i), now++;
if (p[i] <= 1) continue;
intv qs = query(1, 1, n, i + 1, i + p[i] / 2);
ansf += (ll)qs.s;
if (qs.i != -1) b[++m] = (intv) {3 * i - 2 * qs.i + 1, 2 * qs.i - i};
}
if (type == 1) {printf("%I64d\n", ansf + n); return 0;}
sort(b + 1, b + m + 1, cmp);
id = 1, mx = 0;
for (int r = 1; r <= n; r++) {
while (b[id].s <= r && id <= m) mx = max(mx, b[id].i), id++;
if (mx < r) ++anss, mx = r;
else r = mx, ++anss;
}
if (type == 2) printf("%d\n", anss);
else printf("%I64d %d\n", ansf + n, anss);
return 0;
}

QBXT模拟赛2的更多相关文章

  1. QBXT模拟赛1

    总结 期望得分:\(100 + 80 + 10 = 190\) 实际得分:\(90 + 80 + 10 = 180\) 这是在清北的第一场考试,也是在清北考的最高的一次了吧..本来以为能拿\(190\ ...

  2. 4.28 QBXT模拟赛

    NOIP2016提高组模拟赛 ——By wangyurzee7 中文题目名称 迷妹 膜拜 换数游戏 英文题目与子目录名 fans mod game 可执行文件名 fans mod game 输入文件名 ...

  3. 2017.10.3 QBXT 模拟赛

    题目链接 T1 模拟 #include <cstring> #include <cstdio> #define N 105000 int L,R; char s[N]; int ...

  4. 2017.10.7 QBXT 模拟赛

    题目链接 T1 容斥原理,根据奇偶性进行加减 #include<iostream> #include<cstdio> using namespace std; typedef ...

  5. 2017.10.6 QBXT 模拟赛

    题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...

  6. 2017.10.5 QBXT 模拟赛

    题目链接 T1 从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和.最后如 ...

  7. 2017.10.4 QBXT 模拟赛

    题目链接 T1 维护一个单调栈 #include <iostream> #include <cstdio> #define N 500000 #define rep(a,b,c ...

  8. 2017.10.2 QBXT 模拟赛

    题目链接 T1 我们所要求得是(a*b)|x 也就是 使(a*b)的倍数小于x的个数之和 1<=x<=n 我们可以 找一个c使得 (a*b*c)<=x 由于我们所求的是一个三元有序对 ...

  9. 2017.10.1 QBXT 模拟赛

    题目链接 T1 枚举右端点,前缀和优化.对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r] ...

随机推荐

  1. vue 指令和修饰符

    1. v-textv-text主要用来更新textContent,可以等同于JS的text属性. <spanv-text="msg"></span> 这两者 ...

  2. servlet重点知识总结

    Servlet Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. ...

  3. 基于socketserver实现并发的socket编程

    目录 一.基于TCP协议 1.1 server类 1.2 request类 1.3 继承关系 1.4 服务端 1.5 客户端 1.6 客户端1 二.基于UDP协议 2.1 服务端 2.2 客户端 2. ...

  4. 用OC实现一个栈:结合单链表创建动态栈

    一.介绍 栈是一种数据存储结构,存储的数据具有先进后出的特点.栈一般分为动态栈和静态栈. 静态栈比较好理解,例如用数组实现的栈.动态栈可以用链表来实现. 方式:固定base指针,每次更改top指向入栈 ...

  5. C#中char[]与string之间的转换;byte[]与string之间的转化

    目录 1.char[]与string之间的转换 2.byte[]与string之间的转化 1.char[]与string之间的转换 //string 转换成 Char[] string str=&qu ...

  6. MongoDB自学------(5)MongoDB分片

    分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量. ...

  7. git查看/修改个人信息-用户名邮箱

    我们在使用git作为仓库管理工具时,要设置自己Git的用户名和邮箱,要不然大家一块开发时不知道谁是谁,不知道谁提交的. 另外,当我们用自己的电脑开发时你可能设置的是一个你喜欢的昵称,所以那就得改一下. ...

  8. javascript解决在safari浏览器中使用history.back()返回上一页后页面不会刷新的问题

    我们知道,在JavaScript中提供了一个window.history.back()方法用于返回上一页,另外也可以使用window.history.go(-1)返回上一页(跳转). 在其他的主流浏览 ...

  9. git遇到的错误和解决方法(长期更新)

    1:场景:将两个git合并成一个git url,由于项目超过100M,所以出现错误,以下是解决方案:

  10. sed文本处理

    1.基本概述 sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称* 为"模式空间"(pattern space) 接着用 ...