提高组测试赛


1.2019.11.4
2.2019.11.3


1

自娱

令人颓唐,第一题没开long long,丢80分(好在犯错跳舞唱歌是在15号开始),第二题理应暴力分,第三题理应不会~~
在这里插入图片描述


A.算不出来(math)

我算不出来……

问题描述

给定两个长度为 n n n的非负整数数组 a , b a,b a,b,求

for(i=0;++i<=n;)
for(j=0;++j<=n;)
ans+=int(sqrt(abs(a[i]-b[j])));

的ans

输入格式

第一行一个整数 n n n
接下来两行,每行表示数组 a , b a,b a,b

输出格式

一行一个整数表示答案。

Example
Input

4
1 2 3 4
2 3 3 3

Output

12

数据范围

在这里插入图片描述


又是一道推理题??

解析

暴力!!!
分析一下,发现在这里插入图片描述
所以ab去重后,就是在这里插入图片描述级的了
因为1+2+3+4……一直加到根号级别就限制了。
所以暴力是可以过的(前提是开了long long)

在这里插入图片描述

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
long long a[N],b[N],n,i,j,ans,len1,len2;
long long _a[N],_b[N],_a_[N],_b_[N];
int main()
{
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	for(a[0]=b[0]=-100,scanf("%lld",&n),i=0;++i<=n&&scanf("%lld",&a[i]););
	for(i=0;++i<=n&&scanf("%lld",&b[i]););
	for(sort(a+1,a+n+1),i=0;++i<=n;)
    {
    	if(a[i]!=a[i-1]){_a[++len1]=a[i];_a_[len1]=1;}
    	else ++_a_[len1];
    }
    for(sort(b+1,b+n+1),i=0;++i<=n;)
    if(b[i]!=b[i-1]){_b[++len2]=b[i];_b_[len2]=1;}
    else ++_b_[len2];
	for(i=0;++i<=len1;)
	  for(j=0;++j<=len2;)
	     ans+=int(sqrt(abs(_a[i]-_b[j])))*_a_[i]*_b_[j];
	printf("%lld",ans);
	return 0;
}

Tiny Counting

题目描述

给定长度为 n n n的数组 S S S,下表为 1   n 1~n 1 n,你需要统计有多少个四元组 ( a , b , c , d ) (a,b,c,d) abcd
满足 1 ≤ a < b ≤ n ; 1 ≤ c < d ≤ n ; S a < S b ; S c > S d 1≤a<b≤n;1≤c<d≤n;S_a<S_b;S_c>S_d 1a<bn;1c<dn;Sa<Sb;Sc>Sd
a , b , c , d a,b,c,d abcd互不相等。

输⼊格式

第一行一个正整数 n n n表示 S S S数组的长度
第二行 n n n个正整数,表示 S S S数组的值

输出格式

一行一个正整数表示四元组的数目

样例⼀
input

4
1 4 3 2

output

3

explanation

在这里插入图片描述

样例⼆
input

5
9 1 0 0 5

output

8

限制与约定

在这里插入图片描述

解析

分别统计(a,b)的合法数目p,(c,d)的合法数目q。那么ans=p*q-一些不合法的数。
也就是求逆序对,再求正序对,再排除一下特殊值……
O(n logn)。

代码

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,ans,_ans,answe;
const int N=1e5+5;
int lowbit(int x){return x&(-x);}
struct ss
{
	int id,tmp,v;
}tr[N*2];
long long t[N*2];
long long xa[N*2],xb[N*2],ya[N*2],yb[N*2];
void _add(int x,int v){for(int i=++x;i<=n+5;i+=lowbit(i))t[i]+=v;}
int _sum(int x){int ans=0;for(int i=++x;i;i-=lowbit(i))ans+=t[i];return ans;}
void ch(){for(int i=-1;++i<=n;)t[i]=0;}
bool myc(ss xx,ss yy){return xx.v<yy.v;}
bool huanyuan(ss xx,ss yy){return xx.id<yy.id;}
long long len1,len2,cnt;
int main()
{
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	
	int i,j;
	for(scanf("%lld",&n),i=0;++i<=n&&scanf("%lld",&tr[i].v);tr[i].id=i);
	for(sort(tr+1,tr+n+1,myc),i=0;++i<=n;)if(tr[i].v!=tr[i-1].v||i==1)tr[i].tmp=++cnt;else tr[i].tmp=cnt;
	for(sort(tr+1,tr+n+1,huanyuan),ans=0,_ans=0,i=n;i;--i)
	{
		xa[i]=_sum(tr[i].tmp-1);
		ans+=xa[i];
		xb[i]=_sum(n)-_sum(tr[i].tmp);
		_add(tr[i].tmp,1);
	}
	for(i=0;++i<=n;)_add(tr[i].tmp,-1);
	for(i=0;++i<=n;)
	{
		ya[i]=_sum(tr[i].tmp-1);
		_ans+=ya[i];
		yb[i]=_sum(n)-_sum(tr[i].tmp);
		_add(tr[i].tmp,1);
	}
    answe=ans*_ans;
	for(i=0;++i<=n;)
       answe=answe-xb[i]*xa[i]-xb[i]*yb[i]-ya[i]*xa[i]-yb[i]*ya[i];
    printf("%lld",answe);

	
	return 0;
} 

Medium Counting

咕噜咕噜~


2.


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值