说明:
博主没有学习过数据结构,纯纯是陪跑的,来试试强度的。前两题都是签到题,第三题是思维题,第四题我用的multiset写的,这题考点好像叫平衡二叉搜索树,我不是很懂,也是蒙出来了。最后两题大概知道考啥,但是完全不会写,第五题应该考的是树状数组、线段树,第六题是考hash。
背景:
![](https://i-blog.csdnimg.cn/blog_migrate/bd273a239dc6a83e2d28986460a7aa3b.png)
比赛情况:
题目列表:
1. 美丽的2024【算法赛】
参考题解:
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
//using PII = pair<int,int>;
const int N = 1e4+5;
void solve(){
int n;cin >> n;
int cnt = 0;
while(n!=0){
if(a%2==1) cnt++;
a/=2;
}
cout << cnt << endl;
}
int main(){
//1. 美丽的2024【算法赛】
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t = 1;
//cin >> t;
while(t--) solve();
return 0;
}
2. 自助餐【算法赛】
参考题解:
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
//using PII = pair<int,int>;
const int N = 1e2+5;
string s[N];
void solve(){
int n;cin >> n;
for(int i = 1;i<=n;i++) cin >> s[i];
int ans = 0;
for(int i = 1;i<=n;i++){
if(s[i]=="yuanxing") ans++;
else if(s[i]=="zhengfangxing") ans+=2;
else if(s[i]=="changfangxing") ans+=3;
else if(s[i]=="sanjiaoxing") ans+=4;
else if(s[i]=="tuoyuanxing") ans+=5;
else if(s[i]=="liubianxing") ans+=6;
}
cout << ans << endl;
}
int main(){
//2. 自助餐【算法赛】
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t = 1;
//cin >> t;
while(t--) solve();
return 0;
}
3. 玩游戏【算法赛】
参考题解:
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
//using PII = pair<int,int>;
const int N = 1e4+5;
void solve(){
int n;cin >> n;
cout << (n&1?'A':'B') << endl;
}
int main(){
//
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t = 1;
//cin >> t;
while(t--) solve();
return 0;
}
4. 乘飞机【算法赛】
参考题解:
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using ll = long long;
//using PII = pair<int,int>;
const int N = 1e5+5;
int age[MAX];
string check(int l, int r) {
multiset<int> ages;
for(int i=l; i<=r; i++) {
auto it = ages.lower_bound(age[i]-365);
if(it != ages.end() && *it <= age[i]+365) return "YES";
ages.insert(age[i]);
}
return "NO";
}
void solve(){
int n,q;cin >> n >> q;
for(int i=1; i<=n; i++) cin >> age[i];
while(q--){
int l, r;
cin >> l >> r;
cout << check(l, r) << "\n";
}
}
int main(){
//4. 乘飞机【算法赛】
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t = 1;
//cin >> t;
while(t--) solve();
return 0;
}
5. 压制二元组的总价值【算法赛】
参考题解1:(大佬写的,感谢带专魂大佬提供的题解)
#include <bits/stdc++.h>
using i64 = long long;
using namespace std;
template<class T> struct Fenwick {
int n;
vector<T> tr;
Fenwick(int n) : n(n), tr(n + 1, 0) {}
void insert(int x, const T v) {
for (; x <= n; x += x & -x) {
tr[x] += v;
}
}
T query(int x) {
T res = 0;
for (; x; x -= x & -x) {
res += tr[x];
}
return res;
}
T query(int l, int r) {
return query(r) - query(l - 1);
}
};
void solve(){
int n;
cin >> n;
vector<int> a(n + 1), b(n + 1), pos(n + 1);
for (int i = 1; i <= n; i ++ ){
cin >> a[i];
}
for (int i = 1; i <= n; i ++ ){
cin >> b[i];
pos[b[i]] = i;
}
Fenwick<i64> bit1(n), bit2(n);
i64 ans = 0;
for (int i = 1; i <= n; i ++ ){
ans += 1ll * i * bit2.query(pos[a[i]]) - bit1.query(pos[a[i]]);
bit2.insert(pos[a[i]], 1);
bit1.insert(pos[a[i]], i);
}
cout << ans << "\n";
}
int main(){
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int _ = 1;
//cin >> _;
while (_ -- ){
solve();
}
return 0;
}
参考题解2:(另一个大佬写的,感谢Sadbo1大佬提供的题解)
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
#define int long long
#define ull unsigned long long
#define lowbit(i) ((i)&(-i))
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define rep(i, a, b) for(int i=a;i<=b;i++)
#define per(i, a, b) for(int i=a;i>=b;i--)
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int inf = 4e18;
const int N = 2e5 + 200;
template<typename T>
class BIT {
public:
std::vector<T> c;
int sz;
BIT(int n) : c(n + 1) { sz = n; }
void resize(int n) {
c.resize(n + 1);
sz = n;
}
void add(int pos, T k) {
while (pos <= sz) {
c[pos] += k;
pos += lowbit(pos);
}
}
void add(int l, int r, int k) {
BIT::add(l, k);
BIT::add(r + 1, -k);
}
T query(int i) {
T res = 0;
while (i > 0) {
res += c[i];
i -= lowbit(i);
}
return res;
}
};
int a[N], b[N], pos[N];
signed main() {
IOS
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
pos[a[i]] = i;
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
BIT<int> bit1(n), bit2(n);
int ans = 0;
for (int i = 1; i <= n; i++) {
ans += bit1.query(pos[b[i]]) * pos[b[i]] - bit2.query(pos[b[i]]);
bit1.add(pos[b[i]], 1);
bit2.add(pos[b[i]], pos[b[i]]);
}
cout << ans << endl;
return 0;
}
6. 机器人【算法赛】
参考题解1:(感谢QPY大佬提供的题解)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define i64 long long
#define LL long long
#define i128 __int128
#define ull unsigned long long
#define db long double
#define PII pair<int,int>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define lowbit(x) ((x)&-(x))
#define debug(x) cout<<(#x)<<" = "<<(x)<<'\n'
const double eps=1e-8;
const int mod=998244353;
const int inf=1e9+7;
const i64 INF=1e18+7;
const int N=2e6+5;
const int M=1e6+5;
int qmi(int a,int b){
a=(a%mod+mod)%mod;
int ret=1;
for(;b;b>>=1,a=a*a%mod)if(b&1)ret=ret*a%mod;
return ret;
}
int Sqrt(int x){
assert(x>=0);
int t=sqrt(x);
while((t+1)*(t+1)<=x)t++;
while(t*t>x)t--;
return t;
}
int n;
int a[N],pre[N],sum[N];
int inv2[5000005];
//p s id
bool cmp(array<int,3>&t1,array<int,3>&t2){
array<int,2>v1,v2;
v1={t1[0]+t2[1],t1[1]};
if(v1[0]<v1[1])swap(v1[0],v1[1]);
if(v1[0]==v1[1])v1[0]++,v1[1]=0;
v2={t2[0]+t1[1],t2[1]};
if(v2[0]<v2[1])swap(v2[0],v2[1]);
if(v2[0]==v2[1])v2[0]++,v2[1]=0;
if(v1!=v2)return v1>v2;
return t1[2]<t2[2];
}
inline void solve(){
cin>>n;
int mx=0;
for(int i=1;i<=n;i++){
cin>>a[i];
mx=max(mx,a[i]);
}
int t=qmi(2,mod-2);
inv2[0]=1;
for(int i=1;i<=mx;i++){
inv2[i]=inv2[i-1]*t%mod;
}
pre[0]=1;sum[0]=0;
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]*inv2[a[i]]%mod;
sum[i]=sum[i-1]+a[i];
}
int inv=qmi(1ll+mod-pre[n],mod-2);
int ans=0;
for(int i=1;i<=n;i++){
int t=pre[i-1]*((1ll+mod-inv2[a[i]])%mod)%mod*inv%mod;
// debug(t);
ans+=t*i%mod;
ans%=mod;
}
cout<<ans<<'\n';
vector<array<int,3>>p(n);
for(int i=1;i<=n;i++){
p[i-1][0]=a[i];
p[i-1][1]=sum[i];
p[i-1][2]=i;
}
sort(all(p),cmp);
ans=0;
for(int i=1;i<=n;i++){
ans+=i*p[i-1][2]%mod;
// debug(p[i-1][0]);
// debug(p[i-1][1]);
// debug(p[i-1][2]);
ans%=mod;
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int _=1;
// cin>>_;
while(_--)solve();
return 0;
}
参考题解2:(感谢xx001大佬提供的题解)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const int N=5e6+10;
int n,m,x,y,b[N],c[N];
long long mo=998244353;
ll q_pow(ll a,ll b){
ll res=1;
while(b){
if(b&1)res=res*a%mo;
a=a*a%mo;
b>>=1;
}
return res;
}
ll inv(ll a){
return q_pow(a,mo-2);
}
void sovel()
{
cin>>n;
int ans=1,z=1;
for(int i=1;i<=n;i++)
{
cin>>c[i];
z=(z*b[c[i]]%mo+mo)%mo;
}
int di=inv(((1-z)%mo+mo)%mo);
int sum=0;
for(int i=1;i<=n;i++)
{
sum=(sum+ans*((1-b[c[i]])%mo+mo)%mo*di%mo*i%mo)%mo;
ans=ans*b[c[i]]%mo;
}
int key=0;
int len=n;
for(int i=n;i>=1;i--)
{
if(!c[i])
{
key=(key+len*i)%mo;
len--;
}
}
len=1;
for(int i=1;i<=n;i++)
{
if(c[i])
{
key=(key+len*i)%mo;
len++;
}
}
cout<<sum<<endl<<key;
}
signed main()
{
cin.tie(nullptr)->sync_with_stdio(false);
int t=1;
b[0]=1;
int me=inv(2);
for(int i=1;i<=5e6;i++)
{
b[i]=b[i-1]*me%mo;
}
//cin>>t;
while(t--)
{
sovel();
}
}