顺序
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)
(a,b,c,d)
满足
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
1≤a<b≤n;1≤c<d≤n;Sa<Sb;Sc>Sd
且
a
,
b
,
c
,
d
a,b,c,d
a,b,c,d互不相等。
输⼊格式
第一行一个正整数
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
咕噜咕噜~