#include<bits/stdc++.h>
#define re register
using namespace std;
inline int read()
{
re int x=0,f=1;
re char ch=getchar();
for(;ch>‘9‘||ch<‘0‘;ch=getchar())if(ch==‘-‘)f*=-1;
for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
return x*f;
}
const int N=500005;
int n,m;
long long a[N],lazy[N<<2],ll[N<<2],rr[N<<2];
bool yor[N<<2];
void build(int l,int r,int x)
{
if(l==r){yor[x]=1,ll[x]=rr[x]=a[l];return ;}
re int mid=(l+r)>>1;
build(l,mid,x<<1),build(mid+1,r,x<<1|1);
ll[x]=ll[x<<1],rr[x]=rr[x<<1|1];
yor[x]=(yor[x<<1]&yor[x<<1|1]&(rr[x<<1]<=ll[x<<1|1]));
}
inline void Down(int x)
{
if(lazy[x])
{
ll[x<<1]+=lazy[x],rr[x<<1]+=lazy[x],ll[x<<1|1]+=lazy[x],rr[x<<1|1]+=lazy[x];
lazy[x<<1]+=lazy[x],lazy[x<<1|1]+=lazy[x];
lazy[x]=0;
}
}
void add(int l,int r,int x,int z,int L,int R)
{
if(L<=l&&r<=R){ll[x]+=z,rr[x]+=z,lazy[x]+=z;return ;}
Down(x);
re int mid=(l+r)>>1;
if(mid>=L)add(l,mid,x<<1,z,L,R);
if(mid<R)add(mid+1,r,x<<1|1,z,L,R);
ll[x]=ll[x<<1],rr[x]=rr[x<<1|1];
yor[x]=(yor[x<<1]&yor[x<<1|1]&(rr[x<<1]<=ll[x<<1|1]));
}
bool ask(int l,int r,int x,int L,int R)
{
if(L<=l&&r<=R)return yor[x];
Down(x);
re int mid=(l+r)>>1;
re bool ans=true;
if(mid>=L)ans&=ask(l,mid,x<<1,L,R);
if(mid<R)ans&=ask(mid+1,r,x<<1|1,L,R);
if(mid>=L&&mid<R)ans&=(rr[x<<1]<=ll[x<<1|1]);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(re int i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,n,1);
for(re int i=1,x,y;i<=m;i++)
{
if(read()==1)
{
x=read(),y=read();
add(1,n,1,read(),x,y);
}
else
{
x=read(),y=read();
ask(1,n,1,x,y)?puts("Yes"):puts("No");
}
}
return 0;
}
#include<bits/stdc++.h>
#define re register
#define mod 998244353
using namespace std;
inline int read()
{
re int x=0,f=1;
re char ch=getchar();
for(;ch>‘9‘||ch<‘0‘;ch=getchar())if(ch==‘-‘)f*=-1;
for(;ch>=‘0‘&&ch<=‘9‘;ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
return x*f;
}
const int N=2000005;
struct edge{int v,net,val;}e[N<<1];
int n,a[N],cnt,hd[N];
long long ans,sum1[N],num[N],sum2[N];
inline void add(int val,int v,int u)
{
e[++cnt].v=v,e[cnt].net=hd[u],e[cnt].val=val,hd[u]=cnt;
e[++cnt].v=u,e[cnt].net=hd[v],e[cnt].val=val,hd[v]=cnt;
}
void dfs_first(int u,int fa)
{
num[u]=1;
for(re int i=hd[u],v;i;i=e[i].net)
{
v=e[i].v;
if(v==fa)continue;
dfs_first(v,u);
(num[u]+=num[v])%=mod;
(sum1[u]+=sum1[v])%=mod;
}
(sum1[u]+=num[u]*a[u]%mod)%=mod;
}
void dfs_second(int u,int fa)
{
for(re int i=hd[u],v;i;i=e[i].net)
{
v=e[i].v;
if(v==fa)continue;
(sum2[v]+=((sum2[u]-num[v]*a[u]%mod+mod)%mod+(num[1]-num[v])*a[v]%mod)%mod)%=mod;
dfs_second(v,u);
}
}
void getans(int u,int fa)
{
for(re int i=hd[u],v,mid;i;i=e[i].net)
{
v=e[i].v;
if(v==fa)continue;
(mid=((sum2[u]-num[v]*a[u]%mod+mod)%mod-sum1[v]+mod)%mod)%=mod;
(ans+=e[i].val*((mid*num[v]%mod+(sum2[v]-(num[1]-num[v])*a[v]%mod-mid+mod)%mod*(num[1]-num[v])%mod)%mod)%mod)%=mod;
getans(v,u);
}
}
int main()
{
scanf("%d",&n);
for(re int i=1;i<=n;i++)a[i]=read();
for(re int i=1;i<n;i++)add(read(),read(),read());
dfs_first(1,0);
sum2[1]=sum1[1],dfs_second(1,0);
getans(1,0);
printf("%lld",(ans<<1)%mod);
return 0;
}
#include<bits/stdc++.h>
#define re register
#define mod 10086001
using namespace std;
const int N=1000005;
int T;
long long sum1[N],sum2[N],sum3[N],jc,n,mid;
int main()
{
scanf("%d",&T);
sum1[0]=jc=1,sum2[0]=sum3[0]=0;
for(re long long i=1;i<=1000000;i++)
{
jc=(jc*i)%mod;
sum1[i]=(sum1[i-1]+jc)%mod;
sum2[i]=(sum2[i-1]+jc*(i<<2)%mod)%mod;
sum3[i]=(sum3[i-1]+jc*(i*i%mod<<2)%mod)%mod;
}
for(;T--;)
{
scanf("%lld",&n);
mid=(n-1)>>1;
printf("%lld\n",((sum1[mid]*n%mod*n%mod-sum2[mid]*n%mod+sum3[mid]+mod)%mod+mod)%mod);
}
return 0;
}
原文:https://www.cnblogs.com/jkzcr01-QAQ/p/13579905.html