提出 #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
結果
AC × 2
AC × 11
セット名 テストケース
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