社区讨论
珂朵莉树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 条回复,欢迎继续交流。
正在加载回复...