4 条题解
-
0
注意到我们在做这道题之前学习了:
- 线段树
- 缩点
- 矩阵快速幂
- 二维数点
- 中国剩余定理
- 莫队
- 树链剖分
- 高斯消元
- 线性基
所以我们在写代码的时候不需要删除这些模板的代码(会让我们累死),只需要注释即可(不会让我们累死)。
代码如下:
/* #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; }
信息
- ID
- 1
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 1
- 标签
- 递交数
- 202
- 已通过
- 51
- 上传者