AtCoder Beginner Contest 246 Solution更好的阅读体验戳此进入题面链接题面 Luogu 链接A - Four Points题面SolutionCodeB - Get Closer题面SolutionCodeC - Coupon题面SolutionCodeD - 2-variable Function题面SolutionCodeE - Bishop 2题面SolutionCodeF - typewriter题面SolutionCodeG - Game on Tree 3题面SolutionCodeEx - 01? Queries题面SolutionCodeUPD
给定矩形三个点坐标,求另一个点的坐标。
显然四个点横纵坐标分别两两相等,三个横坐标异或,三个纵坐标异或即可。
xxxxxxxxxx
471
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23template<typename T = int>
24inline T read(void);
25
26int main(){
27 int x1 = read(), y1 = read(), x2 = read(), y2 = read(), x3 = read(), y3 = read();
28 printf("%d %d\n", x1 ^ x2 ^ x3, y1 ^ y2 ^ y3);
29 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
30 return 0;
31}
32
33template<typename T>
34inline T read(void){
35 T ret(0);
36 short flag(1);
37 char c = getchar();
38 while(c != '-' && !isdigit(c))c = getchar();
39 if(c == '-')flag = -1, c = getchar();
40 while(isdigit(c)){
41 ret *= 10;
42 ret += int(c - '0');
43 c = getchar();
44 }
45 ret *= flag;
46 return ret;
47}
给定一个向量的坐标表示,求同向模长为
语法题没营养,为了凑齐一套题去写的。
xxxxxxxxxx
491
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23template<typename T = int>
24inline T read(void);
25
26int main(){
27 int x = read(), y = read();
28 ld base = sqrtl((ld)x * x + (ld)y * y);
29 printf("%.8Lf %.8Lf\n", (ld)x / base, (ld)y / base);
30
31 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
32 return 0;
33}
34
35template<typename T>
36inline T read(void){
37 T ret(0);
38 short flag(1);
39 char c = getchar();
40 while(c != '-' && !isdigit(c))c = getchar();
41 if(c == '-')flag = -1, c = getchar();
42 while(isdigit(c)){
43 ret *= 10;
44 ret += int(c - '0');
45 c = getchar();
46 }
47 ret *= flag;
48 return ret;
49}
对于所有
xxxxxxxxxx
531
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23template<typename T = int>
24inline T read(void);
25
26int a[210000];
27
28int main(){
29 int N = read(), K = read(), X = read();
30 for(int i = 1; i <= N; ++i){a[i] = read();while(K && a[i] >= X)--K, a[i] -= X;}
31 sort(a + 1, a + N + 1, greater < int >());
32 ll ans(0);
33 for(int i = K + 1; i <= N; ++i)ans += a[i];
34 printf("%lld\n", ans);
35 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
36 return 0;
37}
38
39template<typename T>
40inline T read(void){
41 T ret(0);
42 short flag(1);
43 char c = getchar();
44 while(c != '-' && !isdigit(c))c = getchar();
45 if(c == '-')flag = -1, c = getchar();
46 while(isdigit(c)){
47 ret *= 10;
48 ret += int(c - '0');
49 c = getchar();
50 }
51 ret *= flag;
52 return ret;
53}
存在函数
显然
对于二分
或者不进行二分,根据单调性,显然 break
即可。
xxxxxxxxxx
621
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23template<typename T = int>
24inline T read(void);
25
26ll Func(int a, int b){
27 return (ll)a * a * a + (ll)a * a * b + (ll) a * b * b + (ll)b * b * b;
28}
29
30int main(){
31 ll N = read<ll>();
32 ll mn(LLONG_MAX);
33 for(int x = 0; x <= (int)1e6; ++x){
34 int l = 0, r = (int)1e6;
35 ll cur(-1);
36 while(l <= r){
37 int mid = (l + r) >> 1;
38 ll tmp = Func(x, mid);
39 if(tmp >= N)cur = tmp, r = mid - 1;
40 else l = mid + 1;
41 }
42 mn = min(mn, cur);
43 }printf("%lld\n", mn);
44 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
45 return 0;
46}
47
48template<typename T>
49inline T read(void){
50 T ret(0);
51 short flag(1);
52 char c = getchar();
53 while(c != '-' && !isdigit(c))c = getchar();
54 if(c == '-')flag = -1, c = getchar();
55 while(isdigit(c)){
56 ret *= 10;
57 ret += int(c - '0');
58 c = getchar();
59 }
60 ret *= flag;
61 return ret;
62}
给定有障碍的网格图,.
为空地,#
为障碍。给定起点终点,每次移动仅可以斜向走任意长度,问从起点到终点的最少移动次数,可能无解,无解输出 -1
。
BFS 较为显然,因为时限 6000ms,只要写的不太丑直接搜也能过。对于本题,使用 01BFS 较为显然。我们在宽搜每次搜一步且距离仅为
需要注意对于 01BFS 时,我们判断是否走过和是否为答案的时候,需要在从队头取元素的时候判断,而不是在扩展的时候判断。因为如果在某一次由
xxxxxxxxxx
911
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25template<typename T = int>
26inline T read(void);
27
28int N;
29int dx[10] = {0, -1, -1, 1, 1};
30int dy[10] = {0, -1, 1, -1, 1};
31int vis[1600][1600][5];
32bool mp[1600][1600];
33
34struct Status{
35 int x, y;
36 int dir;//direction 1, 2, 3, 4
37 int dist;
38}S, T;
39void Init(void){
40 char c = getchar();
41 for(int i = 1; i <= N; ++i)for(int j = 1; j <= N; ++j){
42 while(c != '.' && c != '#')c = getchar();
43 mp[i][j] = c == '.' ? false : true;
44 c = getchar();
45 }
46}
47void bfs(void){
48 deque < Status > dq;
49 dq.push_back(S);
50 while(!dq.empty()){
51 auto tp = dq.front(); dq.pop_front();
52 if(vis[tp.x][tp.y][tp.dir])continue;
53 vis[tp.x][tp.y][tp.dir] = true;
54 if(tp.x == T.x && tp.y == T.y)
55 printf("%d\n", tp.dist), exit(0);
56 // printf("Current pos (%d, %d): dis = %d, dir = %d\n", tp.x, tp.y, tp.dist, tp.dir);
57 for(int i = 1; i <= 4; ++i){
58 int tx = tp.x + dx[i], ty = tp.y + dy[i];
59 if(!CHK(tx, ty))continue;
60 if(i == tp.dir)dq.push_front(Status{tx, ty, i, tp.dist});
61 else dq.push_back(Status{tx, ty, i, tp.dist + 1});
62 }
63 }printf("-1\n");
64}
65
66int main(){
67 // freopen("test_11.txt", "r", stdin);
68 N = read();
69 int x = read(), y = read(); S = Status{x, y, 0, 0};
70 x = read(), y = read(); T = Status{x, y, 0, 0};
71 Init();
72 bfs();
73 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
74 return 0;
75}
76
77template<typename T>
78inline T read(void){
79 T ret(0);
80 short flag(1);
81 char c = getchar();
82 while(c != '-' && !isdigit(c))c = getchar();
83 if(c == '-')flag = -1, c = getchar();
84 while(isdigit(c)){
85 ret *= 10;
86 ret += int(c - '0');
87 c = getchar();
88 }
89 ret *= flag;
90 return ret;
91}
给定
容斥较为显然,显然最终答案也就是,用任意一个字符集形成的字符串减去任意两个的加上任意三个...于是我们考虑令全集为 __builtin_popcount()
算一下个数,奇数代表加,反之减。然后对于每一个字符串,因为字符集较小,也用一个 int
的二进制表示是否存在对应的字符,然后把需要的字符串都与起来,设数量为
xxxxxxxxxx
861
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25template<typename T = int>
26inline T read(void);
27
28int N, L;
29int str[20];
30int readStr(void){
31 int ret(0);
32 char c = getchar();
33 while(!islower(c))c = getchar();
34 vector < int > val;
35 while(islower(c)){
36 ret |= 1 << (c - 'a');
37 c = getchar();
38 }return ret;
39}
40ll qpow(ll a, ll b){
41 ll ret(1), mul(a);
42 while(b){
43 if(b & 1)ret = ret * mul % MOD;
44 b >>= 1;
45 mul = mul * mul % MOD;
46 }return ret;
47}
48
49int main(){
50 N = read(), L = read();
51 ll ans(0);
52 for(int i = 1; i <= N; ++i)str[i] = readStr();
53 // for(int i = 1; i <= N; ++i)
54 // cout << bitset < 32 > (str[i]) << endl;
55 int Smx = (1 << N) - 1;
56 // cout << "Smx" << bitset < 32 > (Smx) << endl;
57 for(int S = Smx; S; S = (S - 1) & Smx){
58 // cout << "S:" << bitset < 32 > (S) << endl;
59 int cnt = __builtin_popcount(S);
60 int tot((1 << 26) - 1);
61 // cout << "tot_pre:" << bitset < 32 > (S) << endl;
62 for(int i = 0; i <= N - 1; ++i)
63 if((1 << i) & S)tot &= str[i + 1];
64 // cout << "tot:" << bitset < 32 > (tot) << endl;
65 ans = (ans + qpow(__builtin_popcount(tot), L) * ((cnt & 1) ? 1 : -1) + MOD) % MOD;
66 }
67 printf("%lld\n", ans);
68 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
69 return 0;
70}
71
72template<typename T>
73inline T read(void){
74 T ret(0);
75 short flag(1);
76 char c = getchar();
77 while(c != '-' && !isdigit(c))c = getchar();
78 if(c == '-')flag = -1, c = getchar();
79 while(isdigit(c)){
80 ret *= 10;
81 ret += int(c - '0');
82 c = getchar();
83 }
84 ret *= flag;
85 return ret;
86}
类似于 LG-P3554 [POI2013]LUK-Triumphal arch,给定一棵树,有点权,B 初始在
与 POI2013 基本相同,对于本题依然考虑二分答案,对于当前的答案
xxxxxxxxxx
891
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23template<typename T = int>
24inline T read(void);
25
26int N;
27struct Edge{
28 Edge* nxt;
29 int to;
30 OPNEW;
31}ed[410000];
32ROPNEW(ed);
33Edge* head[210000];
34
35int val[210000];
36int mnval(INT_MAX), mxval(-1);
37int f[210000];
38
39void dfs(int k, int p = 1, int fa = 0){
40 for(auto i = head[p]; i; i = i->nxt){
41 if(SON == fa)continue;
42 dfs(k, SON, p);
43 f[p] += f[SON];
44 }
45 f[p] -= 1;
46 f[p] = max(0, f[p]);
47 f[p] += val[p] > k ? 1 : 0;
48}
49bool Check(int K){
50 memset(f, 0, sizeof(f));
51 dfs(K);
52 return f[1] == 0;
53}
54
55int main(){
56 N = read();
57 for(int i = 2; i <= N; ++i)val[i] = read(), mxval = max(mxval, val[i]);
58 for(int i = 1; i <= N - 1; ++i){
59 int s = read(), t = read();
60 head[s] = new Edge{head[s], t};
61 head[t] = new Edge{head[t], s};
62 if(s == 1)mnval = min(mnval, val[t]);
63 if(t == 1)mnval = min(mnval, val[s]);
64 }if(!head[1]->nxt)mnval = 0;
65 int l = mnval, r = mxval;
66 int ans(-1);
67 while(l <= r){
68 int mid = (l + r) >> 1;
69 Check(mid) ? ans = mid, r = mid - 1 : l = mid + 1;
70 }printf("%d\n", ans);
71 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
72 return 0;
73}
74
75template<typename T>
76inline T read(void){
77 T ret(0);
78 short flag(1);
79 char c = getchar();
80 while(c != '-' && !isdigit(c))c = getchar();
81 if(c == '-')flag = -1, c = getchar();
82 while(isdigit(c)){
83 ret *= 10;
84 ret += int(c - '0');
85 c = getchar();
86 }
87 ret *= flag;
88 return ret;
89}
给定长度为 0
,1
,?
的字符串 ?
需任意替换为 0
或 1
。
太长了这里就直接放个链接吧。。
xxxxxxxxxx
1171
2
3
4
5
6
7
8
9
10
11using namespace std;
12using namespace __gnu_pbds;
13
14mt19937 rnd(random_device{}());
15int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
16bool rnddd(int x){return rndd(1, 100) <= x;}
17
18typedef unsigned int uint;
19typedef unsigned long long unll;
20typedef long long ll;
21typedef long double ld;
22
23
24
25
26template< typename T = int >
27inline T read(void);
28
29int N, Q;
30int S[MAXN];
31
32struct Matrix3{
33 int val[3][3];
34 Matrix3(int v00, int v01, int v02, int v10, int v11, int v12, int v20, int v21, int v22):
35 val{
36 {v00, v01, v02},
37 {v10, v11, v12},
38 {v20, v21, v22}
39 }{;}
40 Matrix3(int S):
41 val{
42 {1, S != 0, 0},
43 {S != 1, 1, 0},
44 {S != 1, S != 0, 1}
45 }{;}
46 Matrix3(int val[][3]){for(int i = 0; i <= 2; ++i)for(int j = 0; j <= 2; ++j)this->val[i][j] = val[i][j];}
47 Matrix3(void) = default;
48 friend const Matrix3 operator * (const Matrix3 &x, const Matrix3 &y){
49 int val[3][3]; memset(val, 0, sizeof val);
50 for(int i = 0; i <= 2; ++i)for(int j = 0; j <= 2; ++j)for(int p = 0; p <= 2; ++p)
51 val[i][j] = ((ll)val[i][j] + (ll)x.val[i][p] * y.val[p][j] % MOD) % MOD;
52 return Matrix3(val);
53 }
54 void Print(void){
55 for(int i = 0; i <= 2; ++i)for(int j = 0; j <= 2; ++j)
56 printf("%d%c", val[i][j], j == 2 ? '\n' : ' ');
57 }
58}mt[MAXN];
59
60class SegTree{
61private:
62 Matrix3 tr[MAXN << 2];
63
64
65
66public:
67 void Pushup(int p){tr[p] = tr[LS] * tr[RS];}
68 void Build(int p = 1, int gl = 1, int gr = N){
69 if(gl == gr)return tr[p] = mt[gl = gr], void();
70 Build(LS, gl, MID);
71 Build(RS, MID + 1, gr);
72 Pushup(p);
73 }
74 void Modify(int idx, Matrix3 v, int p = 1, int gl = 1, int gr = N){
75 if(gl == gr)return tr[p] = v, void();
76 if(idx <= MID)Modify(idx, v, LS, gl, MID);
77 else Modify(idx, v, RS, MID + 1, gr);
78 Pushup(p);
79 }
80 Matrix3 Query(void){return tr[1];}
81}st;
82
83int main(){
84 N = read(), Q = read();
85 string s; cin >> s;
86 for(int i = 1; i <= (int)s.size(); ++i)
87 S[i] = s.at(i - 1) == '?' ? -1 : int(s.at(i - 1) - '0'),
88 mt[i] = Matrix3(S[i]);
89 st.Build();
90 Matrix3 origin(0, 0, 1, 0, 0, 0, 0, 0, 0);
91 while(Q--){
92 int p = read();
93 char c = getchar(); while(c != '0' && c != '1' && c != '?')c = getchar();
94 int flag = c == '?' ? -1 : int(c - '0');
95 st.Modify(p, Matrix3(flag));
96 auto ans = origin * st.Query();
97 printf("%d\n", (int)((ll)(ans.val[0][0] + ans.val[0][1]) % MOD));
98 }
99 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
100 return 0;
101}
102
103template < typename T >
104inline T read(void){
105 T ret(0);
106 short flag(1);
107 char c = getchar();
108 while(c != '-' && !isdigit(c))c = getchar();
109 if(c == '-')flag = -1, c = getchar();
110 while(isdigit(c)){
111 ret *= 10;
112 ret += int(c - '0');
113 c = getchar();
114 }
115 ret *= flag;
116 return ret;
117}
update-2022_10_24 初稿