NOIP2016 T4 魔法阵

题面

NOIP2016 T4 魔法阵_第1张图片

思路

本题暴力思路很简单,枚举判断就好(有45分啊)

代码
#include
using namespace std;
struct node{int x;int y;}w[40005];
int t[40005][4],n,m;
bool cmp(node p,node q){return p.xint main()
{
 scanf("%d%d",&n,&m);
 for (int i=1;i<=m;i++) scanf("%d",&w[i].x),w[i].y=i;
 sort(w+1,w+m+1,cmp);
 for (int a=1;a<=m;a++)
  for (int b=1;b<=m;b++)
   for (int c=1;c<=m;c++)
    for (int d=1;d<=m;d++)
    if(w[a].x2&&w[b].x-w[a].x<(w[c].x-w[b].x)*1.0/3)
     {
      t[w[a].y][1]++;
      t[w[b].y][2]++;
      t[w[c].y][3]++;
      t[w[d].y][4]++;
     }
    for (int i=1;i<=m;i++) cout<1]<<" "<2]<<" "<3]<<" "<4]<return 0;
} 

但想得满分就没那么容易了,需要用到数轴分析
B-A=2(D-C)
B-A<(C-B)/3
所以设D-C为t
B-A=t
B-A<(C-B)/3=>C-B>6(B-A)=>6t+K=C-B
NOIP2016 T4 魔法阵_第2张图片
接下来就可以枚举t和d和a了,通过t与d和a推出其他点的位置(不用枚举所有,有范围的),不过有个优化,桶排一遍后用乘法原理优化,会快得多。

代码

#include 
#define MAXN 50010
using namespace std;
int n,m;
int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
int x[MAXN],tt[MAXN];
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++) cin>>x[i],tt[x[i]]++;
    for(int t=1;t*9int sum=0;
        for(int dx=9*t+2;dx<=n;dx++){
            int ax=dx-9*t-1;
            int bx=ax+2*t;
            int cx=dx-t;
            sum+=tt[ax]*tt[bx];
            c[cx]+=tt[dx]*sum;
            d[dx]+=tt[cx]*sum;
        }
        sum=0;
        for(int ax=n-9*t-1;ax;ax--){
            int bx=ax+2*t;
            int cx=bx+6*t+1;
            int dx=ax+9*t+1;
            sum+=tt[cx]*tt[dx];
            a[ax]+=tt[bx]*sum;
            b[bx]+=tt[ax]*sum;
        }
    }
    for(int i=1;i<=m;i++) cout<x[i]]<<" "<x[i]]<<" "<x[i]]<<" "<x[i]]<return 0;
}

你可能感兴趣的:(题解)