2018 JUST Programming Contest 1.0 题解
题目链接 gym101778
Problem A
转化成绝对值之后算一下概率。这个题有点像 2018 ZOJ Monthly March Problem D ? 不过那个题要难一些~
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const LL mod = 1e9 + 7;
const int N = 2e5 + 10; int T;
int n, m;
LL fac[N]; inline LL Pow(LL a, LL b, LL mod){
LL ret(1);
for (; b; b >>= 1, (a *= a) %= mod) if (b & 1) (ret *= a) %= mod;
return ret;
} inline LL C(LL n, LL m){ return m > n ? 0 : fac[n] * Pow(fac[m] * fac[n - m] % mod, mod - 2, mod) % mod; } int main(){ fac[0] = 1;
rep(i, 1, 2e5 + 1) fac[i] = fac[i - 1] * 1ll * i % mod; scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
n = abs(n); if (n == 0 && m == 0){
puts("1");
continue;
} if (m < n){
puts("0");
continue;
} if ((m + n) % 2 == 1){
puts("0");
continue;
} int x = (m + n) / 2;
printf("%lld\n", C(m, x) * Pow(Pow(2, m, mod), mod - 2, mod) % mod);
} return 0;
}
Problem B
把首项定成$1$然后二分答案就可以了
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; int T;
LL n, a, l, r, t; int main(){ scanf("%d", &T);
while (T--){
scanf("%lld%lld", &n, &a); l = 0, r = n; while (l + 1 < r){
LL mid = (l + r) >> 1;
if (mid * (mid + 1) / 2ll <= n * a - n + mid) l = mid;
else r = mid - 1;
} if (r * (r + 1) / 2ll <= n * a - n + r) t = r;
else t = l; printf("%lld\n", t);
} return 0;
}
Problem C
找规律。$ans = (n - 1) * phi(n)$
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 1e6 + 10; int T;
int phi[N];
int n; int main(){ rep(i, 2, 1e6 + 1){
if (!phi[i]){
for (int j = i; j <= 1e6; j += i){
if (!phi[j]) phi[j] = j;
phi[j] -= phi[j] / i;
}
}
} scanf("%d", &T);
while (T--){
scanf("%d", &n);
printf("%lld\n", 1ll * (n - 1) * phi[n]);
} return 0;
}
Problem D
状态压缩,对于每一个集合求MST
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 16; int T;
int n, m, k;
int a[N][N], c[1 << N];
int all;
int ans; int main(){ scanf("%d", &T);
while (T--){
scanf("%d%d%d", &n, &m, &k);
memset(c, 0, sizeof c);
memset(a, -1, sizeof a); ans = 2e9; rep(i, 1, m){
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
--x;
--y;
a[x][y] = a[y][x] = z;
} all = 0;
rep(i, 1, k){
int x;
scanf("%d", &x);
--x;
all |= (1 << x);
} int mx = (1 << n) - 1;
rep(i, 1, mx){
c[i] = 2e9;
int p = 0;
dec(j, n - 1, 0) if ((i >> j) & 1){
p = j;
break;
} if ((i ^ (1 << p)) == 0){
c[i] = 0;
continue;
} dec(j, n - 1, 0){
if ((i >> j) & 1){
rep(k, 0, n - 1){
if (((i >> k) & 1) && (j != k) && (~a[j][k])) c[i] = min(c[i], c[i ^ (1 << j)] + a[j][k]);
}
}
}
} rep(i, 1, mx) if ((i & all) == all) ans = min(ans, c[i]);
printf("%d\n", ans);
} return 0;
}
Problem E
直接模拟
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define fi first
#define se second
#define MP make_pair typedef long long LL; int T;
int n, x, y;
int id, d, m;
int mxd, mxm; int main(){ scanf("%d", &T); while (T--){
scanf("%d%d%d", &n, &x, &y); mxd = 1e9, mxm = 0;
id = -1;
rep(i, 1, n){
scanf("%d%d", &d, &m);
if (d <= x && m >= y){
if (mxd > d || (mxd == d && mxm < m)){
mxd = d;
mxm = m;
id = i;
}
}
} printf("%d\n", id);
} return 0; }
Problem F
这个题略卡常数。
对每个权值求二维前缀和,二分答案就好了。
#include <bits/stdc++.h> namespace IO{
const int MT = 20 * 1024 * 1024;
char IO_BUF[MT];
int IO_PTR, IO_SZ; void begin(){
IO_PTR = 0;
IO_SZ = fread (IO_BUF, 1, MT, stdin);
}
template<typename T>
inline bool scan_d (T & t){
while (IO_PTR < IO_SZ && IO_BUF[IO_PTR] != '-' && (IO_BUF[IO_PTR] < '0' || IO_BUF[IO_PTR] > '9'))IO_PTR ++;
if (IO_PTR >= IO_SZ) return false;
bool sgn = false;
if (IO_BUF[IO_PTR] == '-') sgn = true, IO_PTR ++;
for (t = 0; IO_PTR < IO_SZ && '0' <= IO_BUF[IO_PTR] && IO_BUF[IO_PTR] <= '9'; IO_PTR ++)
t = t * 10 + IO_BUF[IO_PTR] - '0';
if (sgn) t = -t;
return true; }
}; using namespace IO;
using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int M = 503;
const int N = 1e2 + 2; int c[M][N][N];
int a[N][N];
int n, m, q;
int mx;
int T; int calc(int x1, int y1, int x2, int y2, int val){
return c[val][x2][y2] - c[val][x2][y1 - 1] - c[val][x1 - 1][y2] + c[val][x1 - 1][y1 - 1];
} void print(int x){
if (x > 9) print(x / 10);
putchar(x % 10 + '0');
} int main(){ begin();
scan_d(T);;
while (T--){
scan_d(n);
scan_d(m);
scan_d(q); mx = 0; rep(i, 1, n){
rep(j, 1, m) scan_d(a[i][j]), mx = max(mx, a[i][j]);
} rep(k, 0, mx){
rep(i, 0, n + 1){
rep(j, 0, m + 1) c[k][i][j] = 0;
}
} rep(k, 1, mx){
rep(i, 1, n){
rep(j, 1, m){
c[k][i][j] = c[k][i - 1][j] + c[k][i][j - 1] - c[k][i - 1][j - 1] + (a[i][j] <= k);
}
}
} while (q--){
int x1, y1, x2, y2;
scan_d(x1);
scan_d(y1);
scan_d(x2);
scan_d(y2); int all = (x2 - x1 + 1) * (y2 - y1 + 1);
all = (all + 1) / 2; int l = 1, r = mx; while (l + 1 < r){
int mid = (l + r) >> 1;
if (calc(x1, y1, x2, y2, mid) >= all) r = mid;
else l = mid + 1;
} int t;
if (calc(x1, y1, x2, y2, l) >= all) t = l;
else t = r; print(t);
putchar(10);
}
}
return 0;
}
Problem G
根据割线定理来做。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define fi first
#define se second
#define MP make_pair typedef long long LL; int T;
int n, x, y;
int id, d, m;
int mxd, mxm; int main(){ scanf("%d", &T); while (T--){
scanf("%d%d%d", &n, &x, &y);
mxd = 1e9, mxm = 0;
id = -1;
rep(i, 1, n){
scanf("%d%d", &d, &m);
if (d <= x && m >= y){
if (mxd > d || (mxd == d && mxm < m)){
mxd = d;
mxm = m;
id = i;
}
}
} printf("%d\n", id);
} return 0; }
Problem H
假的数据结构……其实还是模拟
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int N = 1e5 + 10; int T;
int n, m;
char s[N], ch[2]; int main(){ scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &m);
scanf("%s", s + 1); int c = 0;
rep(i, 1, (n + 1) >> 1) if (s[i] == s[n - i + 1]) ++c;
int all = (n + 1) >> 1; int ans = 0; while (m--){
int x;
scanf("%d%s", &x, ch);
if (s[x] == s[n - x + 1]){
s[x] = ch[0];
if (s[x] != s[n - x + 1]) --c;
} else{
s[x] = ch[0];
if (s[x] == s[n - x + 1]) ++c;
} if (c == all) ++ans;
} printf("%d\n", ans);
} return 0;
}
Problem I
签到
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; int T; int main(){ scanf("%d", &T);
while (T--){
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d); if (a == d && b == c){
puts("-1");
continue;
} if (a + c == b + d){
if (c > a) puts("1"); else puts("2");
} else if (a + c > b + d) puts("1");
else puts("2");
} return 0;
}
Problem J
挺有意思的一个题。
其实暴力做就可以了。因为在1e9的范围内质数间隔最大大概只有$320$。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; int T;
int fg;
LL l, r; bool check(LL x){
if (x <= 10) return false;
string s1 = ""; for (; x; x /= 10) s1 += x % 10 + '0'; reverse(s1.begin(), s1.end()); int n = s1.length();
string s2 = s1.substr(0, (n + 1) / 2);
string s3 = s1.substr((n + 1) / 2); LL a = 0, b = 0; for (auto u : s2) a = a * 10 + u - '0';
for (auto u : s3) b = b * 10 + u - '0'; return __gcd(a, b) == 1;
} int main(){ scanf("%d", &T);
while (T--){
scanf("%lld%lld", &l, &r);
fg = 0;
for (LL i = r; i >= l; --i){
if (check(i)){
fg = 1;
printf("%lld\n", i);
break;
}
} if (!fg) puts("-1");
} return 0; }
Problem K
模拟……
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; struct state{
int x, y, z, t;
state(){
x = y = z = t = -1;
}
state(int x, int y, int z, int t) :
x(x), y(y), z(z), t(t){
}
bool operator < (const state &e) const{
return t < e.t;
}
}; const int N = 1e2 + 2; int T;
int n, m, k;
int fb[N];
int WA[N][N], FAC[N];
vector <state> sub; int main(){ scanf("%d", &T);
while (T--){
scanf("%d%d%d", &n, &m, &k);
int x, y, z, tm, ts;
sub.clear();
rep(i, 0, k - 1){
scanf("%d%d%d%d:%d", &x, &y, &z, &tm, &ts);
sub.push_back(state(x - 1, y - 1, z, tm * 60 + ts));
}
sort(sub.begin(), sub.end());
memset(fb, -1, sizeof fb);
memset(WA, 0, sizeof WA);
memset(FAC, 0, sizeof FAC);
int ep = -1, sg = -1;
pair<int, int> sp(-1, 0), rp(-1, 0);
rep(i, 0, k - 1){
if (sub[i].z == 0)
++WA[sub[i].x][sub[i].y];
else{
if (fb[sub[i].x] == -1)
fb[sub[i].x] = sub[i].y + 1;
if (ep == -1)
ep = sub[i].y + 1;
sg = sub[i].y + 1;
if (WA[sub[i].x][sub[i].y] == 0)
++FAC[sub[i].y];
if (FAC[sub[i].y] > sp.first || (FAC[sub[i].y] == sp.first && sub[i].y + 1 < sp.second))
sp = make_pair(FAC[sub[i].y], sub[i].y + 1);
if (WA[sub[i].x][sub[i].y] > rp.first || (WA[sub[i].x][sub[i].y] == rp.first && sub[i].y + 1 < rp.second))
rp = make_pair(WA[sub[i].x][sub[i].y], sub[i].y + 1);
}
}
rep(i, 0, n - 1) printf("%s%d", i ? " " : "", fb[i]);
putchar(10);
printf("%d %d %d %d\n", ep, sg, sp.se, rp.se);
}
return 0;
}
2018 JUST Programming Contest 1.0 题解的更多相关文章
- 2017 JUST Programming Contest 2.0 题解
[题目链接] A - On The Way to Lucky Plaza 首先,$n>m$或$k>m$或$k>n$就无解. 设$p = \frac{A}{B}$,$ans = C_{ ...
- 2018 AICCSA Programming Contest
2018 AICCSA Programming Contest A Tree Game B Rectangles 思路:如果存在大于0的交面积的话, 那么肯定能找到一条水平的直线 和 一条垂直的直线, ...
- Programming Contest Ranking(题解)
Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...
- gym101343 2017 JUST Programming Contest 2.0
A.On The Way to Lucky Plaza (数论)题意:m个店 每个店可以买一个小球的概率为p 求恰好在第m个店买到k个小球的概率 题解:求在前m-1个店买k-1个球再*p ...
- 2018 Multi-University Training Contest 3(部分题解)
Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Ja ...
- 2018 Multi-University Training Contest 2(部分题解)
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 2018 Multi-University Training Contest 1(部分题解)
Maximum Multiple Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) 题解
题目链接:http://codeforces.com/gym/101147 2017/8/27日训练赛,题目情况9/11,Rank 4/79. A. The game of Osho 题意:定义一个子 ...
- 2018 Multi-University Training Contest - Team 1 题解
Solved A HDU 6298 Maximum Multiple Solved B HDU 6299 Balanced Sequence Solved C HDU 6300 Triangle Pa ...
随机推荐
- grunt简记
grunt和gulp都是前端自动化的工具,grunt更成熟,插件社区全.大:gulp比较年轻,性能更好,更简单容易.具体使用哪种可根据实际项目组来决定. 创建任务 grunt默认执行的是default ...
- 嵌入式(Embedded System)笔记 —— Cortex-M3 Introduction and Basics(上)
随着课内的学习,我想把每节课所学记录下来,以作查阅.以饲读者.由于我所上的是英文班课程,因此我将把关键术语的英文给出,甚至有些内容直接使用英文. 本次所介绍内容是关于Cortex-M3的基础内容. - ...
- 玩转Node.js(三)
玩转Node.js(三) 上一节对于Nodejs的HTTP服务进行了较为详细的解析,而且也学会了将代码进行模块化,模块化以后每个功能都在单独的文件中,有利于代码的维护.接下来,我们要想想如何处理不同的 ...
- ehcache + spring 整合以及配置说明 ,附带整合问题 (已解决)
新做的项目,因为流量不大 就是一个征信平台,高峰流量不多,但缓存是必须的,cache到server上就可以,不需要额外的memcache.redis之类的东西. 但是遇到一个大坑,事情是这样的: 通过 ...
- diskimage-builder-command
yum -y install python-virtualenv.noarch virtualenv ~/dib-virtualenv . ~/dib-virtualenv/bin/activate ...
- 1064 Complete Binary Search Tree (30 分)(二叉查找树)
中序遍历建树 #include<bits/stdc++.h> using namespace std; ; int s[N]; int n; int tree[N]; int cnt; v ...
- 1024Studio官网
一.开发背景 在工作室成立之后,一直就想为工作室建设一个网站,这次乘着暑假有足够的空余时间,开始着手建设我们1024studio的官方网站. 二.系统设计 1.系统目标 根据网上查找的相关资料以及与工 ...
- SpringMVC<一> 基本结构与配置
刚刚踏入SpringMVC的学习,有一定Strust2的使用经验,边看书看博客,边总结,如有不对的地方还希望各位大佬多多指正. Spring 响应过程与结构 (1)用户在客户端发送一个HTTP请求,W ...
- Android通过onDraw实现在View中绘图操作
Android绘图操作,通过继承View实现,在onDraw函数中实现绘图. 下面是一个简单的例子: public class AndroidTest extends Activity { /** C ...
- SqlServer中截取小数位数
方法一:convert(float,字段名) as 别名 select convert(float,round(10.123232,2)) 结果:10.12 select convert(float, ...