社区讨论
TLE+MLE+RE求助
P3987我永远喜欢珂朵莉~参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m0gpz9u8
- 此快照首次捕获于
- 2024/08/30 20:58 2 年前
- 此快照最后确认于
- 2024/08/30 21:50 2 年前
RT
感觉完全炸掉了
CPP#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=5e5+5,MAXL=1e5+5;
ll n,m;
int a[MAXL];
vector<int> S[MAXN],dsu[MAXN];
inline int find(int num,int now){
return (now==dsu[num].size()||now==dsu[num][now])?now:dsu[num][now]=find(num,dsu[num][now]);
}
ll bit[MAXL];
inline int lowbit(int num){
return num&-num;
}
inline void add(int pos,int num){
while(pos<=n){
bit[pos]+=num;
pos+=lowbit(pos);
}
return;
}
inline ll sum(int pos){
ll ans=0;
while(pos){
ans+=bit[pos];
pos-=lowbit(pos);
}
return ans;
}
int op,l,r,x;
inline int update(int L,int R,int X){
int pos=lower_bound(S[X].begin(),S[X].end(),L)-S[X].begin();
for(int i=find(X,pos);i<S[X].size()&&S[X][i]<=R;i=find(X,i+1)){
if(!(a[S[X][i]]%X)){
add(S[X][i],a[S[X][i]]/X-a[S[X][i]]);
a[S[X][i]]/=X;
}
if(a[S[X][i]]%X)dsu[X][i]=dsu[X][i+1];
}
}
inline ll query(int L,int R){
return sum(R)-sum(L-1);
}
const int size=(1<<20)+1;
char buf[size],*p1=buf,*p2=buf;
char buffer[size];
int op1=-1;
const int op2=size-1;
inline char readchar() {
if(p1!=p2) {
return *p1++;
}
return p1==(p2=(p1=buf)+fread(buf,1,size-1,stdin))?EOF:*p1++;
}
inline void flush() {
fwrite(buffer,1,op1+1,stdout),op1=-1;
}
inline void writechar(const char &x) {
if(op1==op2) flush();
buffer[++op1]=x;
}
#ifndef ONLINE_JUDGE
#define readchar getchar
#endif
#define putchar writechar
inline int read() {
int s=1,c=readchar(),x=0;
while(c<=32) {
c=readchar();
}
if(c=='-') {
s=-1,c=readchar();
}
for(; ('0'<=c && c<='9'); c=readchar()) {
x=x*10+c-'0';
}
return x*s;
}
inline void write(long long x) {
if(x<0) {
writechar('-'),x=-x;
}
char s[25];
int n=0;
while(x || !n) {
s[n++]='0'+x%10,x/=10;
}
while(n--) {
writechar(s[n]);
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
ll lim=sqrt(a[i]);
for(int j=1;j<=lim;j++){
if(!(a[i]%j)){
S[j].push_back(i);
dsu[j].push_back(dsu[j].size());
if(j*j<a[i]){
S[a[i]/j].push_back(i);
dsu[a[i]/j].push_back(dsu[a[i]/j].size());
}
}
}
add(i,a[i]);
}
for(int i=1;i<=m;i++){
op=read();
if(op==1){
l=read(),r=read(),x=read();
update(l,r,x);
}
else{
l=read(),r=read();
write(query(l,r));
putchar('\n');
}
}
flush();
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...