突发奇想
查看原帖
突发奇想
674967
xz001楼主2023/9/23 14:16

我用哈希表写了数组,但不知道为什么这样。

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int M = 4000000000000000000;
const int N = 2000000000000000000;
struct node{
	int x,y;
};
struct Hash{
	vector<node>v[3000005];
	inline int xz001(int x){
		x=(x*998244353+1000000007);
		x=-x;
		x=(x*333331+33331);
		x=-x;
		x=((x*998244353+1000000007)*1000000007+998244353)*333331+33331;
		x=(x*33331+333331);
		return abs(x);
	}
	inline void add(int x,int k){
		int at=xz001(x)%3000000;
		for(int i=0;i<(int)v[at].size();++i){
			if(v[at][i].x==x){
				v[at][i].y+=k;
				return;
			}
		}
		v[at].push_back({x,k});
		return;
	}
	inline int query(int x){
		int at=xz001(x)%3000000;
		for(int i=0;i<(int)v[at].size();++i){
			if(v[at][i].x==x){
				return v[at][i].y;
			}
		}
		return 0;
	}
};
Hash t;
inline void add(int x,int k){
	while(x<=M){
		t.add(x,k);
		x+=lowbit(x); 
	}
	return;
}
inline int query(int x){
	int ans=0;
	while(x){
		ans+=t.query(x);
		x-=lowbit(x); 
	}
	return ans;
}
int n,m;
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1,a;i<=n;i++){
		scanf("%lld",&a);
		add(i+N,a);
	}
	while(m--){
		int op;
		scanf("%lld",&op);
		if(op==1){
			int x,k;
			scanf("%lld%lld",&x,&k);
			x+=N;
			add(x,k);
		}else{
			int l,r;
			scanf("%lld%lld",&l,&r);
			l+=N,r+=N;
			printf("%lld\n",query(r)-query(l-1));
		}
	}
	return 0;
}

不开 O2 TLE,开 O2 WA。

2023/9/23 14:16
加载中...