이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |