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
给定矩形三个点坐标,求另一个点的坐标。
显然四个点横纵坐标分别两两相等,三个横坐标异或,三个纵坐标异或即可。
xxxxxxxxxx47123
45678910
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}给定一个向量的坐标表示,求同向模长为
语法题没营养,为了凑齐一套题去写的。
xxxxxxxxxx49123
45678910
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}对于所有
xxxxxxxxxx53123
45678910
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 即可。
xxxxxxxxxx62123
45678910
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 时,我们判断是否走过和是否为答案的时候,需要在从队头取元素的时候判断,而不是在扩展的时候判断。因为如果在某一次由
xxxxxxxxxx91123
45678910
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
2324
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, 437 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 的二进制表示是否存在对应的字符,然后把需要的字符串都与起来,设数量为
xxxxxxxxxx86123
45678910
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
2324
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 基本相同,对于本题依然考虑二分答案,对于当前的答案
xxxxxxxxxx89123
45678910
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。
太长了这里就直接放个链接吧。。
xxxxxxxxxx117123
45678910
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
232425
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 初稿