제출 #1042349

#제출 시각아이디문제언어결과실행 시간메모리
1042349vjudge1Addk (eJOI21_addk)C++17
0 / 100
61 ms5076 KiB
#include <bits/stdc++.h> using namespace std; long long tree[100000*4]; vector<long long> vec; void build(long long node,long long l,long long r) { if(l==r) { tree[node]=vec[l-1]; } else { long long m=(l+r)/2; build(node*2,l,m); build(node*2+1,m+1,r); } } void upd(long long node,long long i,long long x,long long l ,long long r) { if(l==r) { tree[node]=x; } else { long long m=(l+r)/2; if(i<=m) { upd(node*2,i,x,l,m); } else upd(node*2+1,i,x,m+1,r); } } long long sum(long long node,long long l,long long r,long long L,long long R) { if(l>R || r<L) { return 0; } else if(l>=L && r<=R) { return tree[node]; } else { long long m=(l+r)/2; return sum(node*2,l,m,L,R)+sum(node*2+1,m+1,r,L,R); } } int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); long long n,k; cin>>n>>k; for(long long n1=n;n1>0;n1--) { long long x; cin>>x; vec.push_back(x); } build(1,1,vec.size()); pair<long long,long long> sqd[n]={},sqd2[n]={}; long long val=0,val2=0; for(long long i=0;i<n;i++) { val=val+vec[i]*(i%317+1); val2+=vec[i]; if(i%317==316) { sqd[i]={val,val2}; val=0; val2=0; } } val=0,val2=0; for(long long i=n-1;i>=0;i--) { val=val+vec[i]*((vec.size()-i-1)%317+1); val2+=vec[i]; if((vec.size()-i-1)%317==316) { sqd2[i]={val,val2}; val=0; val2=0; } } long long q; cin>>q; for(;q>0;q--) { long long x; cin>>x; if(x==1) { vector<long long> temp; for(long long k1=k;k1>0;k1--) { long long br; cin>>br; temp.push_back(br-1); } long long tempp=vec[temp[0]]; for(long long i=0;i<temp.size();i++) { if(i==temp.size()-1) { long long br2=0; if((temp[i]+1)%317!=0) br2=317-((temp[i]+1)%317); if(temp[i]+br2<n) { sqd[temp[i]+br2].first-=(vec[temp[i]]*(temp[i]%317+1)); sqd[temp[i]+br2].second-=(vec[temp[i]]); vec[temp[i]]=tempp; sqd[temp[i]+br2].first+=(vec[temp[i]]*(temp[i]%317+1)); sqd[temp[i]+br2].second+=(vec[temp[i]]); } else vec[temp[i]]=tempp; br2=0; if((vec.size()-temp[i])%317!=0) br2=317-((vec.size()-temp[i])%317); if(temp[i]-br2>=0) { sqd2[temp[i]-br2].first-=(vec[temp[i]]*((vec.size()-temp[i]-1)%317+1)); sqd2[temp[i]-br2].second-=(vec[temp[i]]); vec[temp[i]]=tempp; sqd2[temp[i]-br2].first+=(vec[temp[i]]*((vec.size()-temp[i]-1)%317+1)); sqd2[temp[i]-br2].second+=(vec[temp[i]]); } else vec[temp[i]]=tempp; upd(1,temp[i]+1,tempp,1,vec.size()); } else { long long br=temp[i+1]; long long br2=0; if((temp[i]+1)%317!=0) br2=317-((temp[i]+1)%317); if(temp[i]+br2<n) { sqd[temp[i]+br2].first-=(vec[temp[i]]*((temp[i])%317+1)); sqd[temp[i]+br2].second-=(vec[temp[i]]); vec[temp[i]]=vec[br]; sqd[temp[i]+br2].first+=(vec[temp[i]]*((temp[i])%317+1)); sqd[temp[i]+br2].second+=(vec[temp[i]]); } else vec[temp[i]]=vec[br]; br2=0; if((vec.size()-temp[i])%317!=0) br2=317-((vec.size()-temp[i])%317); if(temp[i]-br2>=0) { sqd2[temp[i]-br2].first-=(vec[temp[i]]*((vec.size()-temp[i]-1)%317+1)); sqd2[temp[i]-br2].second-=(vec[temp[i]]); vec[temp[i]]=vec[br]; sqd2[temp[i]-br2].first+=(vec[temp[i]]*((vec.size()-temp[i]-1)%317+1)); sqd2[temp[i]-br2].second+=(vec[temp[i]]); } else vec[temp[i]]=vec[br]; upd(1,temp[i]+1,vec[br],1,vec.size()); } } } else { long long l,r,m; cin>>l>>r>>m; long long sz=r-l+1; if(m>sz/2) { m=sz-m+1; } long long l1=l+m-1,r1=r-m+1; long long res=0; if(l1>r1) swap(l1,r1); if(l1<=r1) { res=res+sum(1,1,vec.size(),l1,r1)*m; } for(long long m1=m-1,l2=l1-2;l2>=l-1;l2--,m1--) { if(l2%317==316 && l2-316>=l-1) { res=res+sqd[l2].first+(sqd[l2].second*(m1-317)); m1-=316; l2-=316; } else { res+=vec[l2]*m1; } } l1=r1; for(long long m1=m-1;l1<=r-1;l1++,m1--) { if((vec.size()-l1-1)%317==316 && l1+316<=r-1) { res=res+sqd2[l1].first+(sqd2[l1].second*(m1-317)); m1-=316; l1+=316; } else { res+=vec[l1]*m1; } } cout<<res<<"\n"; } } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:113:32: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |             for(long long i=0;i<temp.size();i++)
      |                               ~^~~~~~~~~~~~
Main.cpp:115:21: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |                 if(i==temp.size()-1)
      |                    ~^~~~~~~~~~~~~~~
Main.cpp:130:17: warning: this 'else' clause does not guard... [-Wmisleading-indentation]
  130 |                 else
      |                 ^~~~
Main.cpp:132:21: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else'
  132 |                     br2=0;
      |                     ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...