제출 #775047

#제출 시각아이디문제언어결과실행 시간메모리
775047vjudge1Swap Swap Sort (CCO21_day1problem1)C++17
0 / 25
95 ms27480 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long lo; 

#define fi first
#define se second
#define endl "\n"
#define int long long
#define pb push_back
#define fio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define FOR for(int i=1;i<=n;i++)
#define mid ((start+end)/2)
#define ort ((bas+son)/2)

const lo inf = 1000000000;
const lo li = 500005;
const lo mod = 1000000007;

int n,m,a[li],k,flag,t,x[li],b[li],siz[li],tree[li*4];
int cev;
string s;
vector<int> vec[li];
vector<pair<int,int>> v;
map<pair<int,int>,int> calc;

inline void update(int node,int start,int end,int l,int r){
	if(start>end || start>r || end<l)return ;
	if(start>=l && end<=r){tree[node]+=1;return ;}
	update(node*2,start,mid,l,r),update(node*2+1,mid+1,end,l,r);
	tree[node]=tree[node*2]+tree[node*2+1];
}

inline int query(int node,int start,int end,int l,int r){
	if(start>end || start>r || end<l)return 0;
	if(start>=l && end<=r)return tree[node];
	return query(node*2,start,mid,l,r)+query(node*2+1,mid+1,end,l,r);
}

int32_t main(void){
	scanf("%lld %lld %lld",&n,&k,&t);
	FOR scanf("%lld",&a[i]);
	for(int i=1;i<=k;i++)b[i]=i;
	for(int i=1;i<=t;i++){
		scanf("%lld",&x[i]);
		v.pb({b[x[i]],b[x[i]+1]});
		swap(b[x[i]],b[x[i]+1]);
	}
	FOR{
		vec[a[i]].pb(i);
		siz[a[i]]++;
	}
	for(auto go:v){
		if(calc.find({go.fi,go.se})!=calc.end())continue;
		//~ if(calc.find({go.se,go.fi})!=calc.end())continue;
		int tut1=0,tut2=0;
		int combo=0,ty=0,precombo=0;
		int res=0;
		while(tut1<siz[go.fi] && tut2<siz[go.se]){
			if(vec[go.fi][tut1]<vec[go.se][tut2]){
				if(ty==1){
					precombo=combo;
					
					combo=0;
					ty=0;
				}
				res+=precombo;
				combo++;
				tut1++;
			}
			else{
				if(ty==0){
					precombo=combo;
					combo=0;
					ty=0;
				}
				res-=precombo;
				combo++;
				tut2++;
			}
		}
		if(tut1<siz[go.fi])res+=combo*(siz[go.fi]-tut1);
		else res-=combo*(siz[go.se]-tut2);
		calc[{go.fi,go.se}]=res;
	}
	cev=0;
	for(int i=n;i>=1;i--){
		cev+=query(1,1,k,1,a[i]-1);
		update(1,1,k,a[i],a[i]);
	}
	for(int i=1;i<=k;i++)b[i]=i;
	for(int i=1;i<=t;i++){
		int xx=b[x[i]];
		int yy=b[x[i]+1];
		//~ cout<<xx<<" :: "<<yy<<endl;
		int at=0;
		/*
		 * if(calc.find({xx,yy})!=calc.end())
		 */
		 at=-calc[{xx,yy}];
		//~ else at=calc[{yy,xx}];
		//~ cout<<at<<" ()() "<<endl;
		cev+=at;
		printf("%lld\n",cev);
		swap(b[x[i]],b[x[i]+1]);
	}
	return 0;
}

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

Main.cpp: In function 'int32_t main()':
Main.cpp:42:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 |  scanf("%lld %lld %lld",&n,&k,&t);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:43:11: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |  FOR scanf("%lld",&a[i]);
      |      ~~~~~^~~~~~~~~~~~~~
Main.cpp:46:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   46 |   scanf("%lld",&x[i]);
      |   ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...