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();
}