社区讨论

珂朵莉树0pts代码求调

P8969幻梦 | Dream with Dynamic参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lo1jjkmd
此快照首次捕获于
2023/10/22 22:05
2 年前
此快照最后确认于
2023/11/02 23:44
2 年前
查看原帖

我实在看不出来问题在哪了

求调!

CPP
#include <bits/stdc++.h>
using namespace std;
//Start define.
namespace MySpace{
	#define max(a,b) (a>b?a:b)
	#define min(a,b) (a<b?a:b)
	#define lowbit(x) (x&(-x))
	template <typename T>
	inline T read(){
		register T now=0,nev=1;
		register char c=getchar();
		while(c<'0' || c>'9') {
			if(c=='-') nev=-1;
			c=getchar();
		}
		while(c>='0' && c<='9') now=(now<<1)+(now<<3)+(c&15),c=getchar();
		return now*nev;
	}
	template<typename T>
	T qpow(T a,T n,T p){
		T res=1;
		while (n){
			if (n&1) res=1ll*res*a%p;
			a=1ll*a*a%p;
			n>>=1;
		}
		return res;
	}
	template<typename T>
	T gcd(T a,T b){return (b>0?gcd(b,a%b):a);}
}
using namespace MySpace;
const int maxn=3e5+5;
struct node{
	int l,r;
	mutable int v;
	node(int L,int R,int V){
		l=L,r=R,v=V;
	}
	bool operator<(const node tmp) const{
		return l<tmp.l;
	}
};
typedef set<node>::iterator sit;
set<node> tr;
string code;
int n,m;
int l,r,x,p;
sit split(int pos){
	sit x=tr.lower_bound(node(pos,0,0));
	if (x!=tr.end()&&x->l==pos) return x;
	if (x!=tr.begin()) x--;
	if (x->r < pos) return tr.end();
	int l=x->l,r=x->r,v=x->v;
	tr.erase(x);
	tr.insert(node(l,pos-1,v));
	return tr.insert(node(pos,r,v)).first;
}
void add(int l,int r,int v){
	sit R=split(r+1),L=split(l);
	for (sit i=L;i!=R;i++) i->v+=v;
	return;
}
int popcount(int x){
	int cnt=0;
	while (x){
		cnt++;
		x&=(x-1);
	}
	return cnt;
}
void makePopcount(int l,int r){
	sit R=split(r+1),L=split(l);
	for (sit i=L;i!=R;i++) i->v=popcount(i->v);
	return;
}
int query(int k){
	sit R=split(r+1),L=split(l);
	for (sit i=L;i!=R;i++){
		if ((i->r - i->l + 1)<k) k-=(i->r - i->l + 1);
		else return i->v;
	}
	return R->v;
}
int main(){
	n=read<int>(),m=read<int>();
	for (int i=1;i<=n;i++){
		int tmp=read<int>();
		tr.insert(node(i,i,tmp));
	}
	for (int i=1;i<=m;i++){
		cin>>code;
		if (code=="A"){
			l=read<int>(),r=read<int>();
			x=read<int>();
			add(l,r,x);
		}else if (code=="P"){
			l=read<int>(),r=read<int>();
			makePopcount(l,r);
		}else{
			p=read<int>();
			printf("%d\n",query(p));
		}
	}
	return 0;
}




回复

6 条回复,欢迎继续交流。

正在加载回复...