【HDU6058】Kanade's sum(暴力 or 链表)

来源:互联网 发布:大数据 图书 编辑:程序博客网 时间:2024/06/01 23:50

记录一个菜逼的成长。。

2017 Multi-University Training Contest - Team 3

题目链接
题目大意:
给你长度为n的一个[1n]的排列。
f(l,r,k)表示[l,r]k
nl=1nr=lf(l,r,k)

吐槽一下。。这题暴力竟然能过,有时会T,加输入挂多交几次就能过了。。
暴力做法:
对与每一个a[i],暴力枚举找出它的左边和右边k个比它大的。
标程做法:
记录每一个值为i的的位置的前驱和后继,从值1开始枚举,可以保证序列中的数都比当前数大。可以保证向左向右枚举最多只有k次,然后删除当前数所在的位置,维护链表。

暴力做法:

#include <stdio.h>#include <math.h>#include <string.h>#include <string>#include <vector>#include <algorithm>using namespace std;#define rep(i,l,r) for( int i = l; i <= r; i++ )#define rep0(i,l,r) for( int i = l; i < r; i++ )#define ALL(v) (v).begin(),(v).end()#define cl(a,b) memset(a,b,sizeof(a))#define clr clear()#define pb push_back#define mp make_pair#define fi first#define se secondtypedef long long LL;typedef pair<int,int> PII;inline void read(int &x){    x=0;char p=getchar();    while(!(p<='9'&&p>='0'))p=getchar();    while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();}const int INF = 0x3f3f3f3f;const int maxn = 500000 + 10;int a[maxn];int L[100],R[100];int main(){  //fin;  int T;scanf("%d",&T);  while(T--){    int n,k;    scanf("%d%d",&n,&k);    for( int i = 1; i <= n; i++ ){      read(a[i]);    }    LL ans = 0;    for( int i = 1; i <= n; i++ ){      int ind1 = 0,ind2 = 0;      for( int j = i; j && ind1 < k+1; j-- )if(a[j] >= a[i])L[ind1++] = j;      for( int j = i; j <= n && ind2 < k+1; j++ )if(a[j] >= a[i])R[ind2++] = j;      L[ind1++] = 0;R[ind2++] = n+1;      for( int j = 0; j < ind1-1; j++ ){        if(k-1-j < ind2-1 && k-1-j >= 0){          ans += (LL)(R[k-j] - R[k-j-1]) * (L[j] - L[j+1]) * a[i];        }      }    }    printf("%lld\n",ans);  }  return 0;}

标程做法:

#include <stdio.h>#include <math.h>#include <string.h>#include <string>#include <vector>#include <algorithm>using namespace std;#define rep(i,l,r) for( int i = l; i <= r; i++ )#define rep0(i,l,r) for( int i = l; i < r; i++ )#define ALL(v) (v).begin(),(v).end()#define cl(a,b) memset(a,b,sizeof(a))#define clr clear()#define pb push_back#define mp make_pair#define fi first#define se secondtypedef long long LL;typedef pair<int,int> PII;inline void read(int &x){    x=0;char p=getchar();    while(!(p<='9'&&p>='0'))p=getchar();    while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();}const int INF = 0x3f3f3f3f;const int maxn = 500000 + 10;int pos[maxn],pre[maxn],nxt[maxn];int L[100],R[100];int n,k;void erase(int p){  int pp = pre[p];  int nn = nxt[p];  if(pp)nxt[pp] = nn;  if(nn != n+1)pre[nn] = pp;}int main(){  //fin;  int T;scanf("%d",&T);  while(T--){    scanf("%d%d",&n,&k);    for( int i = 1,x; i <= n; i++ ){      read(x);      pos[x] = i;    }    rep(i,1,n)pre[i] = i-1,nxt[i] = i + 1;    LL ans = 0;    rep(num,1,n){      int p = pos[num];      int ind1 = 0,ind2 = 0;      for( int d = p; d && ind1 < k + 1; d = pre[d] )L[ind1++] = d;      for( int d = p; d != n+1 && ind2 < k + 1; d = nxt[d] )R[ind2++] = d;      L[ind1++] = 0;R[ind2++] = n+1;      for( int i = 0; i < ind1-1; i++ ){        if(k-1-i < ind2-1 && k-1-i >= 0){          ans += (LL)(R[k-i] - R[k-1-i]) * (L[i] - L[i+1]) * num;        }      }      erase(p);    }    printf("%lld\n",ans);  }  return 0;}
原创粉丝点击