提出 #52970268
ソースコード 拡げる
#include<bits/stdc++.h>
#define UP(i,a,b) for(i=a;i<=(b);++i)
#define DN(i,a,b) for(i=a;i>=(b);--i)
#define up(i,a,b) for(i=a;i<(b);++i)
#define dn(i,a,b) for(i=a;i>(b);--i)
#define pa make_pair
typedef long long ll;
using namespace std;
void rdc(char &c){for(c=getchar();c==' '||c=='\r'||c=='\n';c=getchar());}
const int N=4e5+5;
int a[N],n;
ll ans;
struct node{
int sz,pri;
ll vl,su;
node *ls,*rs;
/*子树大小 优先级 结点权值 子树和 左右儿子*/
}t[N],*root,*tot;
void init_node(node *u,int k){
u->sz=1;
u->su=u->vl=k;
u->pri=rand();
u->ls=u->rs=t;
}
void push_up(node *u){
u->sz=u->ls->sz+u->rs->sz+1;
u->su=u->ls->su+u->rs->su+u->vl;
/*更新子树大小与子树和*/
}
void split(node *u,int k,node *&l,node *&r){
/*权值分裂:l存<=k的结点,r存其它结点*/
if(u==t){
l=r=t;return;
}
if(k<u->vl){
r=u;
split(u->ls,k,l,u->ls);
}else{
l=u;
split(u->rs,k,u->rs,r);
}
push_up(u);
}
void merge(node *l,node *r,node *&u){
/*合并l,r到u*/
if(l==t){
u=r;return;
}else if(r==t){
u=l;return;
}
if(l->pri>r->pri){
u=l;
merge(l->rs,r,l->rs);
}else{
u=r;
merge(l,r->ls,r->ls);
}
push_up(u);
}
void init(){
root=tot=t;
}
int main(){
int i;
node *x,*y,*p;
scanf("%d",&n);
init();
UP(i,1,n){
scanf("%d",a+i);
}
DN(i,n,1){
split(root,a[i],x,y);
/*分裂后 y为>a[i]的所有结点*/
ans+=y->su-1ll*a[i]*y->sz;
p=++tot;
init_node(p,a[i]);
/*上面已经按a[i]分裂好了 直接插入结点即可*/
merge(x,p,x);merge(x,y,root);
}
printf("%lld\n",ans);
return 0;
}
提出情報
| 提出日時 |
|
| 問題 |
F - Double Sum |
| ユーザ |
tomxi_ |
| 言語 |
C++ 20 (gcc 12.2) |
| 得点 |
500 |
| コード長 |
1644 Byte |
| 結果 |
AC |
| 実行時間 |
339 ms |
| メモリ |
20988 KiB |
コンパイルエラー
Main.cpp: In function ‘int main()’:
Main.cpp:69:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
69 | scanf("%d",&n);
| ~~~~~^~~~~~~~~
Main.cpp:72:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
72 | scanf("%d",a+i);
| ~~~~~^~~~~~~~~~
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
500 / 500 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
00_sample_00.txt, 00_sample_01.txt |
| All |
00_sample_00.txt, 00_sample_01.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 02_corner_00.txt, 02_corner_01.txt, 02_corner_02.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 00_sample_00.txt |
AC |
1 ms |
3588 KiB |
| 00_sample_01.txt |
AC |
1 ms |
3856 KiB |
| 01_random_00.txt |
AC |
14 ms |
5008 KiB |
| 01_random_01.txt |
AC |
337 ms |
20896 KiB |
| 01_random_02.txt |
AC |
211 ms |
15436 KiB |
| 01_random_03.txt |
AC |
339 ms |
20868 KiB |
| 01_random_04.txt |
AC |
111 ms |
10992 KiB |
| 01_random_05.txt |
AC |
324 ms |
20852 KiB |
| 02_corner_00.txt |
AC |
88 ms |
20988 KiB |
| 02_corner_01.txt |
AC |
1 ms |
3852 KiB |
| 02_corner_02.txt |
AC |
71 ms |
20848 KiB |