2024/3/11

P3374 【模板】树状数组 1

原题链接:P3374 【模板】树状数组 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目大意:

1. x k 含义:将第 x 个数加上 k

2. x y 含义:输出区间 [x,y] 内每个数的和

题目做法:

经典树状数组,树状数组(详细分析+应用),看不懂打死我!_鲜果维他命-GitCode 开源社区 (csdn.net)这个写得真的很清晰,希望能有所帮助。

AC代码:

n, q = map(int, input().split())
car = [0 for i in range(n + 1)]
def lowerbit(i):
    return i & (-1 * i)
def getsum(i):
    res = 0
    while i >= 1:
        res += car[i]
        i -= lowerbit(i)
    return res
def modi(i, k):
    while i<=n:
        # print(i)
        car[i] += k
        i += lowerbit(i)
str = input()
ar = [int(n) for n in str.split()]
for i in range(n):
    # print(i + 1)
    modi(i + 1, ar[i])
# for i in range(1,n+1):
#     print(i, car[i], end = '\n')
# print(getsum(n) - getsum(0), end='\n')
# print(car)
for i in range(q):
    a, b, c = map(int, input().split())
    # print(i)
    # print(a, b, c)
    if a == 1:
        modi(b, c)
    else:
        print(getsum(c) - getsum(b - 1))

TLE了三个点,Python真的,C++还是好吧。

#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
using namespace std;
const int maxn = 5e5+10;
int c[maxn], n, q, t;
int lowerbit(int i){
    return i&(-1*i);
}
int sumup(int i){
    int res = 0;
    while(i > 0){
        res += c[i];
        i -= lowerbit(i);
    }
    return res;
}
void modify(int i, int k){
    while(i <= n){
        c[i] += k;
        i += lowerbit(i);
    }
}
void solve()
{
    cin >> n >> q;
    for(int i = 1; i <=n ;i++){
        cin >> t;
        modify(i, t);
    }
    while(q--){
        int x, y, z;
        cin >> x >> y >> z;
        if(x == 1){
            modify(y, z);
        }
        else{
            cout << sumup(z) - sumup(y - 1) << '\n';
        }
    }
}
signed main()
{
    fast int casen = 1;
    //cin>>casen;
    while(casen--) solve();
}

C++就全过了。。。。。

D. X-Magic Pair

原题链接:Problem - 1612D - Codeforces

题目大意:

给你一个(a, b)的pair 每次行动可以把a或者b的值赋成abs(a - b)。问你途中有没有可能a或者b是x。

题目做法:

列几项,找规律,然后循环,然后想一下时间复杂度,大概没问题,过了,没做过这么简单的D题。。。。

AC代码:

#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
using namespace std;
const int maxn = 1e5+100;
void solve(){
    int a, b, x, counts = 0;
    cin >> a >> b >> x;
    if(a < b) swap(a, b);
    while(a >= 1 && b >= 1){
        if(x > a) break; 
        if((x - a) % b == 0){
            int t = (x - a) / -b;
            if(a - t * b >= b){
                cout << "Yes" << '\n';
                return ;
            }
        }
        int div = a / b, ta = a;
        if(a % b == 0) div += 1; 
        a = b;
        b = ta - b * div;
        if(a == x){
            cout << "Yes" << '\n';
            return ;
        }
    }
    cout << "No" << '\n';
}
signed main(){
    fast int casen = 1;
    cin>>casen;
    while(casen--) solve();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值