2024年1月23日17:29:53斐波那契数列
2024年1月23日17:58:58矩阵三角形和
2024年1月23日17:59:14GCD的超复杂代码
用到的代码如下
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
using namespace std;
inline bool scan_d(int &num)
{
char in;
bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<'0'||in>'9')) in=getchar();
if(in=='-'){ IsN=true;num=0;}
else num=in-'0';
while(in=getchar(),in>='0'&&in<='9'){
num*=10,num+=in-'0';
}
if(IsN) num=-num;
return true;
}
int qi,zi,val;
int GCD(int x,int y)
{
int t;
while(y!=0)
{
t=y;
y=x%y;
x=t;
}
return x;
}
struct tree
{
int l,r;
int sum;
int lazy;
int gcd;
}a[40001];
void build(int l,int r,int num)
{
a[num].l=l;
a[num].r=r;
a[num].lazy=0;
if(l==r)
{
scan_d(a[num].sum);
a[num].gcd=a[num].sum;
return ;
}
int mid=(l+r)/2;
build(l,mid,num*2);
build(mid+1,r,num*2+1);
a[num].sum=a[num*2].sum+a[num*2+1].sum;
a[num].gcd=GCD(a[num*2].gcd,a[num*2+1].gcd);
}
void insert(int l,int r,int num)
{
if(l>=qi && r<=zi)
{
a[num].gcd=val;
a[num].lazy=1;
a[num].sum=val*(r-l+1);
return ;
}
int mid,carry;
mid=(l+r)/2;
if(a[num].lazy == 1)
{
a[num].lazy=0;
a[num*2].sum=a[num].sum/(r-l+1)*(mid+1-l);
a[num*2+1].sum=a[num].sum-a[num*2].sum;
a[num*2].gcd=a[num].gcd;
a[num*2+1].gcd=a[num].gcd;
a[num*2].lazy=1;
a[num*2+1].lazy=1;
}
if(qi<=mid)
{
insert(l,mid,num*2);
}
if(zi>mid)
{
insert(mid+1,r,num*2+1);
}
a[num].sum=a[num*2].sum+a[num*2+1].sum;
a[num].gcd=GCD(a[num*2].gcd,a[num*2+1].gcd);
}
int query1(int l,int r,int num)
{
if(l>=qi && r<=zi)
{
return a[num].sum;
}
int mid,res,carry;
mid=(l+r)/2;
if(a[num].lazy == 1)
{
a[num].lazy=0;
a[num*2].sum=a[num].sum/(r-l+1)*(mid+1-l);
a[num*2+1].sum=a[num].sum-a[num*2].sum;
a[num*2].gcd=a[num].gcd;
a[num*2+1].gcd=a[num].gcd;
a[num*2].lazy=1;
a[num*2+1].lazy=1;
}
res=0;
if(qi<=mid)
{
carry=query1(l,mid,num*2);
res+=carry;
}
if(zi>mid)
{
carry=query1(mid+1,r,num*2+1);
res+=carry;
}
return res;
}
int query2(int l,int r,int num)
{
if(l>=qi && r<=zi)
{
return a[num].gcd;
}
int mid,carry,res=0;
mid=(l+r)/2;
if(a[num].lazy == 1)
{
a[num].lazy=0;
a[num*2].sum=a[num].sum/(r-l+1)*(mid+1-l);
a[num*2+1].sum=a[num].sum-a[num*2].sum;
a[num*2].gcd=a[num].gcd;
a[num*2+1].gcd=a[num].gcd;
a[num*2].lazy=1;
a[num*2+1].lazy=1;
}
if(qi<=mid)
{
res=query2(l,mid,num*2);
}
if(zi>mid)
{
carry=query2(mid+1,r,num*2+1);
if(res!=0)
res=GCD(carry,res);
else res=carry;
}
return res;
}
int main()
{
int T,n,m,i;
char ch[5];
scanf("%d",&T);
while(T--)
{
scan_d(n);
scan_d(m);
build(1,n,1);
for(i=0;i<m;i++)
{
scanf("%s",ch);
scan_d(qi);
scan_d(zi);
if(ch[0]=='G')
{
printf("GCD %d\n",query2(1,n,1));
}
else if(ch[1]=='U')
{
printf("SUM %d\n",query1(1,n,1));
}
else
{
scan_d(val);
insert(1,n,1);
}
}
}
return 0;
}