답안 #479043

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
479043 2021-10-09T15:18:40 Z vato_chachanidze Addk (eJOI21_addk) C++14
0 / 100
245 ms 4144 KB
#include<bits/stdc++.h>
using namespace std;
int n,k,a[100009],pref[200009],pref2[200009],pref3[2000009],type,l,r,m,siz,z,cnt,new_n=1,fans;
int get(int a[],int l,int r,int L,int R,int ind)
{
	int x=0;
	if(l>r) return x;
	if(r<L || l>R) return x;
	if(l>=L && r<=R) return a[ind];
	return get(a,l,(l+r)/2,L,R,ind*2)+get(a,(l+r)/2+1,r,L,R,ind*2+1);
}
void update(int a[],int ind)
{
	a[ind]=a[ind*2]+a[ind*2+1];
	if(ind!=1)	update(a,ind/2);
}
int main()
{
	cin>>n>>z;
	for(k=1;k<=n;k++)
	{
		cin>>a[k];
	}
	while(new_n<n)
	{
		new_n*=2;
	}
	for(k=new_n;k<=new_n+n-1;k++)
	{
		pref[k]=a[k-new_n+1];
		pref2[k]=a[k-new_n+1]*(k-new_n+1);
		pref3[k]=a[k-new_n+1]*((new_n+n)-k);
	}
	for(k=new_n-1;k>=1;k--)
	{
		pref[k]=pref[k*2]+pref[k*2+1];
		pref2[k]=pref2[k*2]+pref2[k*2+1];
		pref3[k]=pref3[k*2]+pref3[k*2+1];
	}
	//cout<<get(pref,1,new_n,1,1,1);
	int q;
	cin>>q;
	while(q--)
	{
		cin>>type;
		if(type==2)
		{
			cin>>l>>r>>m;
			long long ans1,ans2,ans3;
			if(r-l+1>=m*2)
			{
				ans1=get(pref2,1,new_n,l,l+m-2,1);
				ans1-=get(pref,1,new_n,l,l+m-2,1)*(l-1);
				
				ans2=get(pref3,1,new_n,r-m+2,r,1);
				ans2-=get(pref,1,new_n,r-m+2,r,1)*(n-r);
				
				ans3=get(pref,1,new_n,l+m-1,r-m+1,1)*m;
				
				cout<<ans1+ans2+ans3<<endl;
			}
			else
			{
				if(r-l+1<m)
				{
					cout<<"0"<<endl;
					continue;
				}
				siz=r-l+1;
				cnt=siz-m+1;
				ans1=get(pref2,1,new_n,l,l+cnt-2,1)-get(pref,1,new_n,l,l+cnt-2,1)*(l-1);
				//ans1=pref2[l+cnt-2]-pref2[l-1]-(pref[l+cnt-2]-pref[l-1])*(l-1);
				
				ans2=get(pref3,1,new_n,r-cnt+2,r,1)-get(pref,1,new_n,r-cnt+2,r,1)*(n-r);
				//ans2=pref3[r-cnt+2]-pref3[r+1]-(pref[r]-pref[r-cnt+1])*(n-r);
				
				ans3=get(pref,1,new_n,l+cnt-1,r-cnt+1,1)*cnt;
				//ans3=(pref[r-cnt+1]-pref[l+cnt-2])*cnt;
				
				cout<<ans1+ans2+ans3<<endl;
			}
		}
		else
		{
			int x;
			vector<long long> v1,v2;
			for(int i=1;i<=z;i++)
			{
				cin>>x;
				v1.push_back(x);
				v2.push_back(a[x]);
			}
			for(int i=0;i<z-1;i++)
			{
				a[v1[i]]=v2[i+1];
				pref[v1[i]+new_n-1]=v2[i+1];
				pref2[v1[i]+new_n-1]=v2[i+1]*v1[i];
				pref3[v1[i]+new_n-1]=v2[i+1]*(n-v1[i]+1);
			}
			a[v1[z-1]]=v2[0];
			pref[v1[z-1]+new_n-1]=v2[0];
			pref2[v1[z-1]+new_n-1]=v2[0]*v1[z-1];
			pref3[v1[z-1]+new_n-1]=v2[0]*(n-v1[z-1]+1);
			
			for(int i=0;i<v1.size();i++)
			{
				update(pref,(v1[i]+new_n-1)/2);
				update(pref2,(v1[i]+new_n-1)/2);
				update(pref3,(v1[i]+new_n-1)/2);
			}
		}
	}
}
/*

7 9 5 1 6 3 4 2

9 + 10 + 4 + 6 = 29
21

*/

Compilation message

Main.cpp: In function 'int main()':
Main.cpp:105:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |    for(int i=0;i<v1.size();i++)
      |                ~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 4 ms 332 KB Output is correct
3 Incorrect 8 ms 436 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 94 ms 1624 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 245 ms 4144 KB Output isn't correct
2 Halted 0 ms 0 KB -