- 1's solution
-
P1's Solution
- @ 2026-6-12 16:17:58
注意到我们在做这道题之前学习了:
- 线段树
- 缩点
- 矩阵快速幂
- 二维数点
- 中国剩余定理
- 莫队
- 树链剖分
- 高斯消元
- 线性基
所以我们在写代码的时候不需要删除这些模板的代码(会让我们累死),只需要注释即可(不会让我们累死)。
代码如下:
/*
#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
constexpr int MOD=571373;
int n,m,q;
int op,l,r,x;
array<int,N> a;
struct tree
{
array<int,N<<2> p;
array<int,N<<2> t1;
array<int,N<<2> t2;
inline void lazy(int rt,int l,int r,int k)
{
(p.at(rt)+=(r-l+1)*k%MOD)%=MOD;
(t1.at(rt)+=k)%=MOD;
}
inline void times(int rt,int l,int r,int k)
{
(p.at(rt)*=k)%=MOD;
(t1.at(rt)*=k)%=MOD;
(t2.at(rt)*=k)%=MOD;
}
void push(int rt,int l,int r)
{
if(t2.at(rt)!=1)
{
int mid=l+r>>1;
times(rt<<1,l,mid,t2.at(rt) );
times(rt<<1|1,mid+1,r,t2.at(rt) );
}
if(t1.at(rt) )
{
int mid=l+r>>1;
lazy(rt<<1,l,mid,t1.at(rt) );
lazy(rt<<1|1,mid+1,r,t1.at(rt) );
}
t1.at(rt)=0;
t2.at(rt)=1;
}
void build(int rt,int l,int r)
{
if(l==r)
{
p.at(rt)=a.at(l);
return;
}
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
}
void add(int rt,int l,int r,int ql,int qr,int k)
{
if(ql<=l && r<=qr)
{
lazy(rt,l,r,k);
return;
}
push(rt,l,r);
int mid=l+r>>1;
if(ql<=mid) add(rt<<1,l,mid,ql,qr,k);
if(mid<qr) add(rt<<1|1,mid+1,r,ql,qr,k);
p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
}
void mul(int rt,int l,int r,int ql,int qr,int k)
{
if(ql<=l && r<=qr)
{
times(rt,l,r,k);
return;
}
push(rt,l,r);
int mid=l+r>>1;
if(ql<=mid) mul(rt<<1,l,mid,ql,qr,k);
if(mid<qr) mul(rt<<1|1,mid+1,r,ql,qr,k);
p.at(rt)=(p.at(rt<<1)+p.at(rt<<1|1) )%MOD;
}
int query(int rt,int l,int r,int ql,int qr)
{
if(ql<=l && r<=qr)
return p.at(rt);
push(rt,l,r);
int ret=0;
int mid=l+r>>1;
if(ql<=mid) (ret+=query(rt<<1,l,mid,ql,qr)%MOD)%=MOD;
if(mid<qr) (ret+=query(rt<<1|1,mid+1,r,ql,qr)%MOD)%=MOD;
return ret;
}
};
tree t;
signed main()
{
cin>>n>>q>>m;
for(int i=1;i<=n;i++)
scanf("%lld",&a.at(i) );
t.build(1,1,n);
t.t2.fill(1);
while(q--)
{
scanf("%lld",&op);
if(op==1)
{
scanf("%lld%lld%lld",&l,&r,&x);
t.mul(1,1,n,l,r,x);
}
else if(op==2)
{
scanf("%lld%lld%lld",&l,&r,&x);
t.add(1,1,n,l,r,x);
}
else
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",t.query(1,1,n,l,r)%MOD);
}
}
return 0;
}
#include<bits/stdc++.h>
#define int long long
#define N 105
using namespace std;
constexpr int INF=0x3f3f3f3f3f3f3f3f;
constexpr int MOD=1e9+7;
int n,m;
array<array<int,N>,N> a;
inline void times(array<array<int,N>,N> &x,array<array<int,N>,N> &y)
{
array<array<int,N>,N> ret={};
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
(ret.at(i).at(j)+=x.at(i).at(k)*y.at(k).at(j)%MOD)%=MOD;
x=ret;
}
inline void pow(array<array<int,N>,N> &a,int y)
{
array<array<int,N>,N> ret;
ret=a;
while(y)
{
if(y&1) times(ret,a);
times(a,a);
y>>=1;
}
a=ret;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lld",&a.at(i).at(j) );
if(m==0)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",i==j ? 1:0);
printf("\n");
}
return 0;
}
pow(a,m-1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%lld ",a.at(i).at(j) );
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
#define int long long
#define N 2000000
#define f first
#define s second
using namespace std;
struct str
{
int x;
int id;
int val;
};
int n,q;
int x,y,z;
array<int,N+5> a;
array<int,N+5> g;
array<int,N+5> ans;
array<vector<str>,N+5> v;
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x)
{
for(int i=x;i<=N;i+=lowbit(i) )
g.at(i)++;
}
inline int query(int x)
{
int ret=0;
for(int i=x;i>=1;i-=lowbit(i) )
ret+=g.at(i);
return ret;
}
signed main()
{
cin>>n>>q;
g.fill(0);
ans.fill(0);
for(int i=1;i<=n;i++)
scanf("%lld",&a.at(i) );
for(auto &e:v) e.clear();
for(int i=1;i<=q;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
v.at(x-1).push_back({z,i,-1});
v.at(y).push_back({z,i,1});
}
for(int i=1;i<=n;i++)
{
add(a.at(i) );
for(const auto &e:v.at(i) )
ans.at(e.id)+=e.val*query(e.x);
}
for(int i=1;i<=q;i++)
printf("%lld\n",ans.at(i) );
return 0;
}
#include<bits/stdc++.h>
#define int long long
#define N 91
using namespace std;
int n;
array<int,N> a,b;
int ext(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int q=ext(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return q;
}
int crt(array<int,N> p,array<int,N> q,int k)
{
int x,y,m;
int a=0,n=1;
for(int i=1;i<=k;i++)
n*=p.at(i);
for(int i=1;i<=k;i++)
{
m=n/p.at(i);
ext(p.at(i),m,x,y);
a=(a+(__int128)y*m*q.at(i) )%n;
}
if(a>0) return a;
else return a+n;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a.at(i)>>b.at(i);
cout<<crt(a,b,n)<<endl;
return 0;
}
#include<bits/stdc++.h>
#define int long long
#define N 50004
#define f first
#define s second
using namespace std;
constexpr int INF=0x3f3f3f3f3f3f3f3f;
struct str
{
int x;
int y;
int id;
};
int n,m,k;
int ans;
array<int,N> a;
array<int,N> p;
array<int,N> ansl;
int q;
int x,y;
int l,r;
array<str,N> s;
inline int to(int x)
{
return (x-1)/m+1;
}
inline int bl(int x)
{
return (x-1)*m+1;
}
inline int br(int x)
{
return min(m*x,n);
}
inline void add(int x)
{
p.at(a.at(x) )++;
ans+=p.at(a.at(x) )<<1;
ans--;
}
inline void del(int x)
{
p.at(a.at(x) )--;
ans-=p.at(a.at(x) )<<1;
ans--;
}
signed main()
{
cin>>n>>q>>k;
m=sqrt(n);
p.fill(0);
for(int i=1;i<=n;i++)
scanf("%lld",&a.at(i) );
for(int i=1;i<=q;i++)
{
scanf("%lld%lld",&s.at(i).x,&s.at(i).y);
s.at(i).id=i;
}
sort(s.begin()+1,s.begin()+1+q,[](str &l,str &r)
{if(to(l.x)==to(r.x) ) return l.y<r.y;
else return to(l.x)<to(r.x);});
l=s.at(1).x,r=s.at(1).y;
for(int i=l;i<=r;i++)
p.at(a.at(i) )++;
for(int i=1;i<=k;i++)
ans+=p.at(i)*p.at(i);
ansl.at(s.at(1).id)=ans;
for(int i=2;i<=q;i++)
{
while(l<s.at(i).x) del(l++);
while(l>s.at(i).x) add(--l);
while(r<s.at(i).y) add(++r);
while(r>s.at(i).y) del(r--);
ansl.at(s.at(i).id)=ans;
}
for(int i=1;i<=q;i++)
printf("%lld\n",ansl.at(i) );
return 0;
}
#include<bits/stdc++.h>
#define int long long
#define N 100005
#define M 710
#define f first
#define s second
using namespace std;
constexpr int INF=0x3f3f3f3f3f3f3f3f;
int n,r;
int q,op;
int x,y,z;
int cnt,mod;
array<int,N> a;
array<int,N> fa;
array<int,N> dep;
array<int,N> hev;
array<int,N> p,to;
array<int,N> t1,t2;
array<int,N> top,dfn;
array<vector<int>,N> g;
inline int lowbit(int x)
{
return x&-x;
}
inline void add(array<int,N> &t,int x,int k)
{
k%=mod;
for(int i=x;i<=n;i+=lowbit(i) )
(t.at(i)+=k)%=mod;
}
inline void update(int l,int r,int k)
{
k%=mod;
add(t1,l,k);
add(t1,r+1,(mod-k)%mod);
add(t2,l,(l%mod)*k%mod);
add(t2,r+1,(mod-(r+1)%mod*k%mod)%mod);
}
inline int query(int l,int r)
{
int ret;
int ret1=0,ret2=0;
for(int i=r;i>0;i-=lowbit(i) )
{
(ret1+=t1.at(i) )%=mod;
(ret2+=t2.at(i) )%=mod;
}
ret=( (r+1)%mod*ret1%mod-ret2+mod)%mod;
ret1=0,ret2=0;
for(int i=l-1;i>0;i-=lowbit(i) )
{
(ret1+=t1.at(i) )%=mod;
(ret2+=t2.at(i) )%=mod;
}
ret=(ret-( (l%mod*ret1%mod-ret2+mod)%mod)+mod)%mod;
return ret;
}
void dfs1(int rt,int f)
{
p.at(rt)=1;
fa.at(rt)=f;
dep.at(rt)=dep.at(f)+1;
for(const auto &e:g.at(rt) )
if(e!=f)
{
dfs1(e,rt);
p.at(rt)+=p.at(e);
if(p.at(hev.at(rt) )<p.at(e) )
hev.at(rt)=e;
}
}
void dfs2(int rt,int ft)
{
dfn.at(rt)=++cnt;
to.at(cnt)=rt;
top.at(rt)=ft;
if(hev.at(rt) )
dfs2(hev.at(rt),ft);
for(const auto &e:g.at(rt) )
if(e!=fa.at(rt) && e!=hev.at(rt) )
dfs2(e,e);
}
inline int front(int l,int r)
{
int ret=0;
while(top.at(l)!=top.at(r) )
{
if(dep.at(top.at(l) )<dep.at(top.at(r) ) )
swap(l,r);
(ret+=query(dfn.at(top.at(l) ),dfn.at(l) ) )%=mod;
l=fa.at(top.at(l) );
}
if(dep.at(l)>dep.at(r) ) swap(l,r);
(ret+=query(dfn.at(l),dfn.at(r) ) )%=mod;
return ret;
}
inline int sons(int x)
{
return query(dfn.at(x),dfn.at(x)+p.at(x)-1);
}
inline void change(int l,int r,int k)
{
while(top.at(l)!=top.at(r) )
{
if(dep.at(top.at(l) )<dep.at(top.at(r) ) )
swap(l,r);
update(dfn.at(top.at(l) ),dfn.at(l),k);
l=fa.at(top.at(l) );
}
if(dep.at(l)>dep.at(r) ) swap(l,r);
update(dfn.at(l),dfn.at(r),k);
}
inline void covson(int x,int k)
{
update(dfn.at(x),dfn.at(x)+p.at(x)-1,k);
}
signed main()
{
cin>>n>>q>>r>>mod;
for(int i=1;i<=n;i++)
scanf("%lld",&a.at(i) );
for(int i=1;i<n;i++)
{
scanf("%lld%lld",&x,&y);
g.at(x).push_back(y);
g.at(y).push_back(x);
}
dfs1(r,0);
dfs2(r,r);
for(int i=1;i<=n;i++)
update(dfn.at(i),dfn.at(i),a.at(i) );
while(q--)
{
scanf("%lld",&op);
if(op==1)
{
scanf("%lld%lld%lld",&x,&y,&z);
change(x,y,z);
}
else if(op==2)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",front(x,y) );
}
else if(op==3)
{
scanf("%lld%lld",&x,&y);
covson(x,y);
}
else if(op==4)
{
scanf("%lld",&x);
printf("%lld\n",sons(x) );
}
}
return 0;
}
#include<bits/stdc++.h>
#define int long long
#define N 105
#define M 105
using namespace std;
constexpr double zed=1e-9;
int n;
int now,num;
array<array<double,M>,N> a;
array<double,N> ans;
inline int gauss()
{
now=1;
// 从当前行开始找绝对值最大的元素
for(int i=1;i<=n;i++)
{
num=now;
for(int j=now;j<=n;j++)
if(fabs(a.at(j).at(i) )>fabs(a.at(num).at(i) ) )
num=j;
// 如果当前列全为 0,跳过
if(fabs(a.at(num).at(i) )<zed) continue;
// 将最大行交换到当前位置
if(num!=now)
for(int j=1;j<=n+1;j++)
swap(a.at(now).at(j),a.at(num).at(j) );
// 主元归一
double x=a.at(now).at(i);
for(int j=1;j<=n+1;j++)
a.at(now).at(j)/=x;
double fac;
for(int j=1;j<=n;j++)
if(j!=now)
{
fac=a.at(j).at(i);
if(fabs(fac)>zed)
for(int l=1;l<=n+1;l++)
a.at(j).at(l)-=fac*a.at(now).at(l);
}
now++;
}
// 检查无解
bool tr;
for(int i=now;i<=n;i++)
{
tr=true;
for(int j=1;j<=n;j++)
if(fabs(a.at(i).at(j) )>zed)
{
tr=false;
break;
}
if(tr && fabs(a.at(i).at(n+1) )>zed)
return -1;
}
// 无穷解
if(now<=n) return 0;
for(int i=1;i<=n;i++)
ans.at(i)=a.at(i).at(n+1);
return 1;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&a.at(i).at(j) );
if(gauss()<=0) cout<<"No Solution"<<endl;
else
for(int i=1;i<=n;i++)
printf("%.2lf\n",ans.at(i) );
return 0;
}
*/
#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
signed main()
{
freopen("test.out","w",stdout);
cout<<"Hello"<<", "<<"W"<<"o"<<"r"<<"l"<<"d"+1-1<<"!"<<endl;
return 0;
}