“玲珑杯”ACM比赛 Round #12题解&源码
2017-03-18 15:40
357 查看
我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,把官方给出的题解贴出来!
A -- Niro plays Galaxy Note 7
Time Limit:1s
Memory Limit:128MByte
DESCRIPTION
Niro, a lovely girl, has bought a Galaxy Note 7 and wants to destroy cities. There are N cities numbered 1... N on a line and each pair of adjacent cities has distance 1. Galaxy Note 7 has its explosion radius R. Niro puts her Galaxy Note 7 in city X and city i will be destroyed if (|X−i|≤R)
.You must tell Niro how many cities wil be destroyed.
INPUT
The first line contains a positive integer T, the number of test cases.
Each of the following T lines contains three integers N, R, X.
OUTPUT
Tlines.Each line contains one integer, the answer.
SAMPLE INPUT
3
100 5 23
100 8 36
100 9 99
SAMPLE OUTPUT
11
17
11
HINT
1≤T,N≤100
0≤R≤100
1≤X≤N
SOLUTION
“玲珑杯”ACM比赛 Round #12
题目链接:http://www.ifrog.cc/acm/problem/1106?contest=1014&no=0
分析:这道题就是所谓的签到题,不是很难,能够摧毁的城市是区间 [max(1,X−i),min(X+i,N)],直接输出min(X+i,N)−max(1,X−i)+1即可,题解的那种方式看不太懂,可能是因为我自己没学C++STL,其实就是以一个点为中心,向左区间和右区间分别延伸R个单位,如果超过N或小于0终止!
下面给出AC代码:
给出官方的STL解法:
题目链接:http://www.ifrog.cc/acm/problem/1107?contest=1014&no=1
题解:
下面给出AC代码:
题目链接:http://www.ifrog.cc/acm/problem/1108?contest=1014&no=2
题解:
下面给出AC代码:
题目链接:http://www.ifrog.cc/acm/problem/1109?contest=1014&no=3
题解:
下面给出AC代码:
题目链接:http://www.ifrog.cc/acm/problem/1110?contest=1014&no=4
题解:
下面给出AC代码:
A -- Niro plays Galaxy Note 7
Time Limit:1s
Memory Limit:128MByte
DESCRIPTION
Niro, a lovely girl, has bought a Galaxy Note 7 and wants to destroy cities. There are N cities numbered 1... N on a line and each pair of adjacent cities has distance 1. Galaxy Note 7 has its explosion radius R. Niro puts her Galaxy Note 7 in city X and city i will be destroyed if (|X−i|≤R)
.You must tell Niro how many cities wil be destroyed.
INPUT
The first line contains a positive integer T, the number of test cases.
Each of the following T lines contains three integers N, R, X.
OUTPUT
Tlines.Each line contains one integer, the answer.
SAMPLE INPUT
3
100 5 23
100 8 36
100 9 99
SAMPLE OUTPUT
11
17
11
HINT
1≤T,N≤100
0≤R≤100
1≤X≤N
SOLUTION
“玲珑杯”ACM比赛 Round #12
题目链接:http://www.ifrog.cc/acm/problem/1106?contest=1014&no=0
分析:这道题就是所谓的签到题,不是很难,能够摧毁的城市是区间 [max(1,X−i),min(X+i,N)],直接输出min(X+i,N)−max(1,X−i)+1即可,题解的那种方式看不太懂,可能是因为我自己没学C++STL,其实就是以一个点为中心,向左区间和右区间分别延伸R个单位,如果超过N或小于0终止!
下面给出AC代码:
#include <bits/stdc++.h> using namespace std; int main() { int T; int n,r,x; int a[1010]; while(scanf("%d",&T)!=EOF) { while(T--) { scanf("%d%d%d",&n,&r,&x); memset(a,0,sizeof(a)); int ans=0; if(x<=n) { for(int i=x;i<=x+r;i++) { if(i<=n) { a[i]=1; } } for(int i=x;i>=x-r;i--) { if(i>=0) { a[i]=1; } } for(int i=1;i<=n;i++) if(a[i]) ans++; printf("%d\n",ans); } } } return 0; }
给出官方的STL解法:
#include <cstdio> #include <algorithm> int T, N, R, X; int main() { for (scanf("%d", &T); T--; ) { scanf("%d%d%d", &N, &R, &X); printf("%d\n", std::min(N, X + R) - std::max(1, X - R) + 1); } return 0; }
题目链接:http://www.ifrog.cc/acm/problem/1107?contest=1014&no=1
题解:
下面给出AC代码:
#include <cstdio> #include <queue> #include <vector> #include <algorithm> const int INF = 1000000000; class Heap { private : std::priority_queue < int, std::vector < int >, std::greater < int > > inc, dec; void BaseClear() { while (!dec.empty() && inc.top() == dec.top()) { inc.pop(); dec.pop(); } } public : int top() { BaseClear(); return inc.top(); } void del(int x) { dec.push(x); } void push(int x) { inc.push(x); } void clear() { while (!inc.empty()) inc.pop(); while (!dec.empty()) dec.pop(); } bool empty() { BaseClear(); return inc.empty(); } } Q0, Q1; int TC, f0[200001], f1[200001], *F0 = f0 + 100000, *F1 = f1 + 100000, N, C0, C1, N0, N1, E0, E1, TAG0, TAG1; void forward(char option) { if (option == '0') { F0--; F0[1] = (Q1.empty() ? INF : Q1.top()) + TAG1 - TAG0; E0++; Q0.push(F0[1]); while (E0 >= N0) Q0.del(F0[E0--]); E1 = 0; Q1.clear(); } else if (option == '1') { F1--; F1[1] = (Q0.empty() ? INF : Q0.top()) + TAG0 - TAG1; E1++; Q1.push(F1[1]); while (E1 >= N1) Q1.del(F1[E1--]); E0 = 0; Q0.clear(); } else { F0--; F0[1] = (Q1.empty() ? INF : Q1.top()) + TAG1 - TAG0; E0++; F1--; F1[1] = (Q0.empty() ? INF : Q0.top()) + TAG0 - TAG1; E1++; Q0.push(F0[1]); Q1.push(F1[1]); while (E0 >= N0) Q0.del(F0[E0--]); while (E1 >= N1) Q1.del(F1[E1--]); TAG0 += C0; TAG1 += C1; } } int main() { for (scanf("%d", &TC); TC--; ) { F0 = f0 + 100000; F1 = f1 + 100000; TAG0 = TAG1 = 0; Q0.clear(); Q1.clear(); E0 = E1 = 0; scanf("%d%d%d%d%d", &N, &C0, &C1, &N0, &N1); char c = getchar(); while (c != '0' && c != '1' && c != '?') c = getchar(); if (c == '0') { F0[E0 = 1] = 0; Q0.push(0); } else if (c == '1') { F1[E1 = 1] = 0; Q1.push(0); } else { F0[E0 = 1] = C0; F1[E1 = 1] = C1; Q0.push(C0); Q1.push(C1); } for (int i = 1; i < N; i++) forward(getchar()); int ans = 1000000001; if (!Q0.empty()) ans = std::min(ans, Q0.top() + TAG0); if (!Q1.empty()) ans = std::min(ans, Q1.top() + TAG1); printf("%d\n", ans); } return 0; }
题目链接:http://www.ifrog.cc/acm/problem/1108?contest=1014&no=2
题解:
下面给出AC代码:
#include <bits/stdc++.h> const int MOD = 1234321237; int F[100001], N, G, a[1000], w[1000]; int gcd(int x, int y) { int r; while (y) { r = x % y; x = y; y = r; } return x; } void DP(int x, int y) { std::vector < int > Div; for (int i = 1; i * i <= x; i++) if (x % i == 0) { Div.push_back(i); if (i * i < x) Div.push_back(x / i); } std::sort(Div.begin(), Div.end()); int L = Div.size(); std::vector < int > Use(L, 0); for (int i = L - 1; ~i; i--) { Use[i] = y / Div[i]; for (int j = i + 1; j < L; j++) if (Div[j] % Div[i] == 0) Use[i] -= Use[j]; } for (int i = G; ~i; i--) { F[i] = 0; for (int j = 0; j < L && Div[j] <= i; j++) F[i] = (F[i] + (long long)F[i - Div[j]] * Use[j]) % MOD; } } int main() { scanf("%d%d", &N, &G); for (int i = 0; i < N; i++) scanf("%d", a + i); for (int i = 0; i < N; i++) scanf("%d", w + i); F[0] = 1; for (int i = 0; i < N; i++) DP(a[i], w[i]); printf("%d\n", F[G]); return 0; }
题目链接:http://www.ifrog.cc/acm/problem/1109?contest=1014&no=3
题解:
下面给出AC代码:
#include <cstdio> const long long MOD = 1234321237; long long POWER(long long a, long long b) { long long r = 1; for (; b; b >>= 1) { if (b & 1) r = r * a % MOD; a = a * a % MOD; } return r; } long long N; int T; int main() { for (scanf("%d", &T); T--; ) { scanf("%lld", &N); long long F = POWER(4, N - 1) * 3 - POWER(3, N - 1) * 2; long long G = POWER(4, N - 1) * (((N % MOD * 9) - 69) % MOD) + POWER(3, N - 1) * (((N % MOD * 8) + 52) % MOD); G %= MOD; F %= MOD; G %= MOD; F += MOD; G += MOD; F %= MOD; G %= MOD; if (G & 1) G += MOD; G >>= 1; printf("%lld %lld\n", F, G); } return 0; }
题目链接:http://www.ifrog.cc/acm/problem/1110?contest=1014&no=4
题解:
下面给出AC代码:
#include <cstdio> #include <vector> #include <algorithm> std::vector < int > E[100001], col[100001]; std::vector < std::pair < int, int > > inc[100002], dec[100002]; int N, q[100001], left[100001], right[100001], size[100001], BeiZeng[17][100001], *fa = BeiZeng[0], LOG; // left : DFN; right maximum DFN in its subtree std::vector < int >::iterator ue[100001]; void DFS() { int D = 1, TIME = 1; q[1] = 1; ue[1] = E[1].begin(); left[1] = right[1] = 1; while (D) { if (ue[D] != E[q[D]].end() && *ue[D] == fa[q[D]]) ue[D]++; if (ue[D] != E[q[D]].end()) { int To = *ue[D]++; fa[To] = q[D]; left[To] = right[To] = ++TIME; q[++D] = To; ue[D] = E[To].begin(); } else { if (D > 1) right[q[D - 1]] = right[q[D]]; D--; } } for (int i = 1; i <= N; i++) size[i] = right[i] - left[i] + 1; while (2 << LOG < N) LOG++; for (int i = 1; i <= LOG; i++) for (int j = 1; j <= N; j++) BeiZeng[i][j] = BeiZeng[i - 1][BeiZeng[i - 1][j]]; } int lowest(int u, int v) { for (int i = LOG; ~i; i--) if (BeiZeng[i][u] && size[BeiZeng[i][u]] < size[v]) u = BeiZeng[i][u]; return u; } inline void bar(int u, int d, int l, int r) { inc[u].push_back(std::make_pair(l, r)); if (d < N) dec[d + 1].push_back(std::make_pair(l, r)); } void conflict(int u, int v) { if (size[u] < size[v]) std::swap(u, v); if (left[u] <= left[v] && right[v] <= right[u]) // u is v's ancestor { int lw = lowest(v, u); if (left[lw] > 1) { bar(left[v], right[v], 1, left[lw] - 1); bar(1, left[lw] - 1, left[v], right[v]); } if (right[lw] < N) { bar(left[v], right[v], right[lw] + 1, N); bar(right[lw] + 1, N, left[v], right[v]); } } else { bar(left[u], right[u], left[v], right[v]); bar(left[v], right[v], left[u], right[u]); } } int MIN[262145], TAG[262145], NUM[262145]; // NUM[] : the number of elements which reach MIN[] void INC(int p, int l, int r, int L, int R, int w) { if (L <= l && r <= R) { MIN[p] += w; TAG[p] += w; return; } if (TAG[p]) { MIN[p + p] += TAG[p]; MIN[p + p + 1] += TAG[p]; TAG[p + p] += TAG[p]; TAG[p + p + 1] += TAG[p]; TAG[p] = 0; } int m = (l + r) >> 1; if (L <= m) INC(p + p, l, m, L, R, w); if (R > m) INC(p + p + 1, m + 1, r, L, R, w); MIN[p] = std::min(MIN[p + p], MIN[p + p + 1]); NUM[p] = (MIN[p + p] == MIN[p] ? NUM[p + p] : 0) + (MIN[p + p + 1] == MIN[p] ? NUM[p + p + 1] : 0); } inline int ZERONUM() { return MIN[1] == 0 ? NUM[1] : 0; } long long ANS; void Treeinit(int p = 1, int l = 1, int r = N) { NUM[p] = r - l + 1; if (l < r) { int m = (l + r) >> 1; Treeinit(p + p, l, m); Treeinit(p + p + 1, m + 1, r); } } int main() { scanf("%d", &N); for (int i = 1, u, v; i < N; i++) { scanf("%d%d", &u, &v); E[u].push_back(v); E[v].push_back(u); } for (int i = 1, c; i <= N; i++) { scanf("%d", &c); col[c].push_back(i); } DFS(); for (int i = 1; i <= N; i++) for (std::vector < int >::iterator x = col[i].begin(); x != col[i].end(); x++) for (std::vector < int >::iterator y = x + 1; y != col[i].end(); y++) conflict(*x, *y); Treeinit(); for (int i = 1; i <= N; i++) { for (std::vector < std::pair < int, int > >::iterator j = inc[i].begin(); j != inc[i].end(); j++) INC(1, 1, N, j -> first, j -> second, 1); for (std::vector < std::pair < int, int > >::iterator j = dec[i].begin(); j != dec[i].end(); j++) INC(1, 1, N, j -> first, j -> second, -1); ANS += ZERONUM(); } printf("%lld\n", (ANS - N) >> 1); return 0; }
相关文章推荐
- “玲珑杯”ACM比赛 Round #13 题解&源码
- “玲珑杯”ACM比赛 Round #19题解&源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】
- 算法&ACM比赛搜集
- Lonlife-ACM 1000 - Spoon Devil's 3-D Matrix(最小生成树)——“玲珑杯”acm比赛-试运行赛
- “玲珑杯”ACM比赛 Round #5 H -- Variance 简单树状数组
- “玲珑杯”ACM比赛 Round #5 I -- I am Two【位运算判断2的幂】
- “玲珑杯”ACM比赛 Round #5 B -- Private Value【STL-map】
- 第36届acm_icpc 北京赛区,网络赛解题报告 & 比赛log
- “玲珑杯”ACM比赛 Round #7
- “玲珑杯”ACM比赛 Round #4 B Best couple
- 玲珑杯1052 - See car——STL集合的应用(“玲珑杯”ACM比赛 Round #4 )
- 玲珑杯”ACM比赛 Round #5
- Lonlife-ACM 1005 - Spoon Devil's RP Test(同余定理)——“玲珑杯”acm比赛-试运行赛
- “玲珑杯”ACM比赛 Round #4 E题
- “玲珑杯”ACM比赛 Round #4 E -- array(dp)
- “玲珑杯”ACM比赛 Round #4 B Best couple
- “玲珑杯”acm比赛-试运行赛 部分题解
- “玲珑杯”ACM比赛 Round #4 G -- See car
- “玲珑杯”ACM比赛 Round #4 A -- chess play 【记忆模拟】
- “玲珑杯”ACM比赛 Round #5 H -- Variance(线段树+方差)