A. 题解: 把后缀0去掉后判断是否为回文串即可
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int x; cin >> x; string str; bool isok = false; while(x){ if(isok || x%10){ str += ('0' + x%10); if(x%10) isok = true; } x/= 10; } for(int i = 0,n = str.size(); i < n; ++i){ if(str[i] != str[n - i - 1]){ cout <<"NO"<<endl; return 0; } }cout << "YES"<<endl; return 0; }B. 数据量很小所以暴力就行,枚举 i,j两个拿出来的元素,剩余元素进行排序(然后两两之间绝对值一定是最小的那种)
#include <bits/stdc++.h> using namespace std; int maxn = 50+5; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; vector<int> vec; for(int i = 0; i < 2*n; ++i){ int x; cin >> x; vec.push_back(x); } int ans = 1e9; for(int i = 0; i < 2*n; ++i){ for(int j = i+1; j < 2*n; ++j){ vector<int> q; for(int k = 0; k < 2*n; ++k){ if(k!=i && k!=j){ q.push_back(vec[k]); } }sort(q.begin(),q.end()); int sum = 0; for(int k = 0; k < q.size(); k+=2){ sum = sum + q[k+1] - q[k]; } ans = min(sum,ans); } }cout << ans << endl; return 0; }C. 直觉上认为这题到后面一定会存在一个循环节,根据这个循环节可以缩小k,缩小后的k可以暴力模拟。
#include <bits/stdc++.h> using namespace std; int A[4][4],B[4][4]; int check(int A,int B){ if(A == 3){ if(B==2) return 1; else if(B==1) return 2; }else if(A==2){ if(B==3) return 2; else if(B==1) return 1; }else if(A==1){ if(B==3) return 1; else if(B==2) return 2; }return 0; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); long long k; int a,b; cin >> k >> a >> b; for(int i = 1; i <= 3; ++i){ cin >> A[i][1] >> A[i][2] >> A[i][3]; } for(int i = 1; i <= 3; ++i){ cin >> B[i][1] >> B[i][2] >> B[i][3]; } map<pair<int,int>,int> vis; pair<int,int> now = make_pair(a,b); while(!vis.count(now)){ int win_flag = check(now.first,now.second); if(win_flag == 1) vis[now] = 1; else if(win_flag == 2) vis[now] = 2; else vis[now] = 0; now = make_pair(A[now.first][now.second],B[now.first][now.second]); } // 跳出循环则说明目前找到了循环点。 int cnt = 0; // cnt 记录循环节次数 int circle_A = 0,circle_B = 0 ; pair<int,int> p = now; do{ int win_flag = vis[p]; if(win_flag == 1) circle_A++; else if(win_flag == 2) circle_B++; ++cnt; p = make_pair(A[p.first][p.second],B[p.first][p.second]); }while(p != now); long long ansA = 0,ansB = 0; pair<int,int> tmp = make_pair(a,b); for(int i = 0; i < min(k,1ll*(int(vis.size()) - cnt)); ++i){ if(vis[tmp] == 1){ ansA++; }else if(vis[tmp] ==2) ansB++; tmp = make_pair(A[tmp.first][tmp.second],B[tmp.first][tmp.second]); } ansA += circle_A*((k - min(k,1ll*(int(vis.size())-cnt)))/cnt); ansB += circle_B*((k - min(k,1ll*(int(vis.size())-cnt)))/cnt); tmp = now; k = (k-min(k,1ll*(int(vis.size())-cnt)))%cnt; // 剩余的(模拟即可) for(int i = 0; i < k; ++i){ if(vis[tmp] == 1){ ansA++; }else if(vis[tmp] ==2) ansB++; tmp = make_pair(A[tmp.first][tmp.second],B[tmp.first][tmp.second]); } cout << ansA << ' ' << ansB << endl; return 0; }D. 做法1: 数据结构(题解里说笛卡尔树?听说普通文艺平衡树好像也能做)暂时未补 做法2: 思维,从题目中可以看到m比较小,所以可以进行反推,大概也就e7的复杂度量级,暴力模拟反推就可以过了
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5+5; int a[maxn]; struct Query{ int t,l,r; }qq[maxn]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,q,m; cin >> n >> q >> m; for(int i = 1; i <= n; ++i){ cin >> a[i]; } for(int i = 0; i < q; ++i){ Query &pp = qq[i]; cin >> pp.t >> pp.l >> pp.r; } for(int i = 0; i < m; ++i){ int b; cin >> b; for(int j = q-1; j >= 0; --j){ if( b >= qq[j].l && b <= qq[j].r){ if(qq[j].t==1){ --b; if(b == qq[j].l-1) b = qq[j].r; }else if(qq[j].t==2){ b = (qq[j].l + qq[j].r - b); } } }cout << a[b]<< ' '; }cout << endl; }E. 做法1:线段树离散(暂时未补) 做法2:思维(将区间排序后然后根据区间的性质进行判断就可以了)
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5+5; int a[maxn]; struct Query{ int t,l,r; }qq[maxn]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,q,m; cin >> n >> q >> m; for(int i = 1; i <= n; ++i){ cin >> a[i]; } for(int i = 0; i < q; ++i){ Query &pp = qq[i]; cin >> pp.t >> pp.l >> pp.r; } for(int i = 0; i < m; ++i){ int b; cin >> b; for(int j = q-1; j >= 0; --j){ if( b >= qq[j].l && b <= qq[j].r){ if(qq[j].t==1){ --b; if(b == qq[j].l-1) b = qq[j].r; }else if(qq[j].t==2){ b = (qq[j].l + qq[j].r - b); } } }cout << a[b]<< ' '; }cout << endl; }