您的位置:首页 > 其它

BestCoder #76

2016-03-22 23:23 330 查看

第一题:

sortsort一遍,然后扫一遍数列,维护一个ll(第一个比a[i]a[i]小的数的位置),求出所有满足条件的情况。

复杂度:o(nlogn)o(nlogn)

第二题:

kk个连续的数相乘的乘积最大,1...k1...k的序列作为初始序列,然后nn减去(1+k)∗k2{(1+k)*k}\over{2},剩下的均匀分给每一个数,多出来的从后往前分。

复杂度:o(n)o(n)

第三题:

考虑每一个节点对最终答案的影响,即每一个节点在多少联通块中。这样用树形dpdp就搞定了。

dpi[i]dp_i[i]代表在ii的子树中包含ii的联通块块个数。dp2[i]dp_2[i]代表包含ii的上面所有联通块的个数。

最终答案就是∑dp1[i]∗dp2[i]\sum{dp_1[i]*dp_2[i]}

dp1[i]=∏(dp1[j]+1)dp2[i]=dp1[fa]dp1[i]+1∗dp2[fa]+1
dp_1[i]=\prod{(dp_1[j]+1)}\\
dp_2[i]={{dp_1[fa]}\over{dp_1[i]+1}}*dp_2[fa]+1

复杂度:o(n)o(n)

第四题

个人感觉蛮不错的题。和hihocoderhihocoder那题的思路有点像。

i|ji|j和ii&jj有包含关系,暴力枚举所有满足i|j=xi|j=x的情况下所有的ii&jj的值。设ii&j=yj=y。

然后去掉公共部分yy,在剩下来的二进制位(ii^yy)中求出所有满足情况的数的个数。即在区间[0,n−y][0,n-y]和[0,m−y][0,m-y]中找出所有满足的数的总数。

用stlstl少写一个二分。

复杂度:o(3log2nlog2n)o(3^{log_2n}log_2n)

第五题

二分最终的答案。在原序列中,如果>=mid>=mid的,就标记为11,否则就标记为00那么,用线段树维护操作,求出最终a[k]a[k]位置是11还是00。

做到这里就是一个线段树的区间求和修改操作。

感觉这个想法很不错!!!

复杂度:o(m(logn)2)o(m(logn)^2)

给一个第四题的代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef vector <int>    VI;
typedef pair <int,int>  PII;
#define FOR(i,x,y)  for(int i = x;i < y;++ i)
#define IFOR(i,x,y) for(int i = x;i > y;-- i)
#define pb  push_back
#define mp  make_pair
#define fi  first
#define se  second
#define all(x)  (x).begin(),(x).end()
#define sz(x)   (int)(x).size()

const int maxn = 1<<14;
VI G[maxn];
int n,m;

void init(){
FOR(i,1,maxn){
for(int j = i;j;j = (j-1)&i)    G[i].pb(j);
G[i].pb(0);
reverse(G[i].begin(),G[i].end());
}
}

int calc(int x,int n,int m){
if(n < 0 || m < 0)  return 0;
return lower_bound(all(G[x]),n+1) - lower_bound(all(G[x]),x-m);
}

void work(){
LL ans = 0;
FOR(i,1,maxn){
FOR(j,0,sz(G[i])){
int x = i,y = G[i][j];
if((x^y) > (n+m-2*y))    continue;
if(x == y && x <= n && x <= m)    {ans += x;continue;}
int cnt = calc(x^y,n-y,m-y);
if(!y){
if(x <= n)  cnt --;
if(x <= m)  cnt --;
}
ans += __gcd(x,y)*(LL)cnt;
}
}
printf("%I64d\n",ans);
}

int main(){
int T;  scanf("%d",&T);
init();
while(T--){
scanf("%d%d",&n,&m);
work();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: