为什么非要卡常啊 /fn
在本机已经优化的和题解差不多了 , 连快读都是抄题解的 , 为什么还是比题解慢 ?
#include<bits/stdc++.h>
#define ffor(i,a,b) for(register int i=(a);i<=(b);++i)
#define roff(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
const int MAXN=1e5+10,MAXMS=1e6+10; const double PAI=3.1415926535897932;
//const int MAXM=3e3+10;
int n,m,k,a[MAXN],b[MAXN];
namespace fast_io{
char bf[MAXN+5],ob[MAXN+38];
int it,ed,f,c,ot,t,stk[38],x;
#define gc (it==ed&&(ed=(it=0)+fread(bf,1,MAXN,stdin),it==ed)?EOF:bf[it++])
inline int read(){
for(c=getchar();c<48;c=getchar());
for(x=0;c>47;x=x*10+(48^c),c=getchar());
return x;
}inline void fls(){
fwrite(ob,1,ot,stdout),ot=0;
}inline void write(int x){
for(t=0;x>9;stk[++t]=48^(x%10),x/=10);
for(ob[ot++]=48^x;t;ob[ot++]=stk[t--]);
ob[ot++]='\n';if(ot>MAXN)fls();
}
}using fast_io::read;
using fast_io::write;
namespace POLY {
int rev[MAXN];
inline void solve(const int l,const int r,const int mul) {
if(l==r) return ;
int mid=l+r>>1;
solve(l,mid,mul*2),solve(mid+1,r,mul*2);
rev[mid+1]+=mul,rev[r+1]-=mul;
}
inline void binit(void) {
k=1; while(k<=n) k<<=1;
solve(0,k-1,1);
ffor(i,1,k-1) rev[i]+=rev[i-1];
return ;
}
struct Complex {double r,c;};
Complex operator +(Complex a,Complex b) {return {a.r+b.r,a.c+b.c};}
Complex operator -(Complex a,Complex b) {return {a.r-b.r,a.c-b.c};}
Complex operator *(Complex a,Complex b) {return {a.r*b.r-a.c*b.c,a.r*b.c+b.r*a.c};}
Complex blc[MAXN];
inline void fft(const int id) {
// ffor(i,0,k-1) cout<<f.v[i].c<<' ';
if(id==-1) ffor(i,1,k/2) swap(blc[i],blc[k-i]);
// ffor(i,0,k-1) cout<<f.v[i].c<<' ';//cout<<'\n';
ffor(i,0,k-1) if(rev[i]<i) swap(blc[rev[i]],blc[i]);
int len=1,lst;
while(len<k) {
lst=len,len<<=1; Complex omega={cos(PAI/lst),sin(PAI/lst)};
for(int l=0;l<k;l+=len) {
Complex tmp={1,0};
int r=l+lst-1;
ffor(j,l,r) {
Complex a=blc[j],b=tmp*blc[j|lst];
blc[j]=a+b,blc[j|lst]=a-b;
tmp=tmp*omega;
}
}
}
// if(id==1) ffor(i,0,k-1) f.v[i]=res[i];
if(id==-1) ffor(i,0,k-1) blc[i].r/=k,blc[i].c/=k;
// ffor(i,0,k-1) cout<<f.v[i].c<<' ';
// cout<<'\n';
return ;
}
}using namespace POLY;
int ql[MAXMS],qr[MAXMS],qL[MAXMS];
int main() {
// freopen("test.in","r",stdin);
// freopen("my.out","w",stdout);
// ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
n=read(); binit();
ffor(i,1,n) a[i]=read();
m=read();
ffor(i,1,m) ql[i]=read(),qr[i]=read(),qL[i]=read();
int l=1;
ffor(i,1,n) {
if(l>n) break;
int r=min(n,l+2048);
// tmp.v[j]={0,0};
// ffor(j,L[i],R[i]) tmp.v[j-L[i]]={a[j],0};
ffor(j,0,k-1) blc[j]={0,0};
ffor(j,1,m) if(max(ql[j],l)<=min(qr[j],r)) {
int ll=max(ql[j],l),rr=min(qr[j],r);
if(ll!=l||rr!=r) ffor(k,ll,rr) b[k-ll+qL[j]]+=a[k];
else blc[ll-ql[j]+qL[j]].c++;
}
ffor(j,l,r) blc[j-l].r+=a[j];
// tmp=tmp*blc;
fft(1); ffor(j,0,k-1) blc[j]=blc[j]*blc[j]; fft(-1);
ffor(j,1,n) b[j]+=(blc[j].c+1)/2;
l=r+1;
}
ffor(i,1,n) write(b[i]);
fast_io::fls();
return 0;
}