多校训练营6

A:Array

z3475

标签

构造;数学;哈夫曼树

题意

给定一个长度为的数列,其中,构造一个0开始的长度为的数列,其会产生无限数列。满足中每连续的个数字必须包含

思路

从这个不等式中的2下手

显然变换顺序,缩小后求解也是符合题意的答案。我们排序后令变为。其倒数和不超过1,即可放在一颗01-Tire树上,如放在深度为3的节点上,不重复放,以下是的例子。

以下算法可以算出这个例子

1
2
3
4
5
6
7
8
def dfs(node)
    if a.empty():
        return
    if node.deep == a.front().deep:
        mark
        return 
    dfs(node->lson)
    dfs(node->rson)

每个的节点所代表的二进制数记为

如果,令即可求出。

代码
参考代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
int v[1000000+10];
int vi[1000000+10];
constexpr int N=1<<19;
int a[N+1];
int main(){
  int n;
  cin>>n;
  for (int i=1;i<=n;i++){
    cin>>v[i];
    v[i]=1<<(int)log2(v[i]);
    vi[i]=i;
  }
  sort(vi+1,vi+1+n,[](int i,int j){
    return v[i]<v[j];
  });
  int j=1;
  for (int i=1;i<=n;i++){
    int va=v[vi[i]];
    while (a[j]) j++;
    for (int k=j;k<N;k+=va){
      a[k]=vi[i];
    }
  }
  cout << N << endl;
  for (int i=1;i<=N;i++)
    cout << max(a[i],1) << " ";
}

I:Line

z3475

标签

线性代数

题意

个向量,构造出一个点集使每一个点和每一个向量满足其构成的直线上的点集里的点的数量恰好等于

思路

先找出线性无关的一个向量组,而显然每一个向量可以在整数域内任意放大缩小。

,最小点集肯定是一条直线。

,一个平行四边形。

发现即为个基向量的线性组合:

要求这些有限的线性组合组成的有限的线性空间在上述组成的线性空间上具有唯一性。

发现上述每一项内,进行类似进制数的操作就有上述唯一性:把乘上

极限分析

1
2
; log(6*5*37**5)/log(2)
        ~30.95415742375326743848

i32能存的下。

代码
参考代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <bits/stdc++.h>
using namespace std;
struct FAST_IO{
    FAST_IO(){
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
    }
}__fast_io;
#define all(a) (a).begin(),(a).end()
using ll=long long;
template<class T>
using vec=vector<T>;
#define FOR_TUPLE enableif_t<i!=tuple_size<T>::value>(1)
#define END_TUPLE enableif_t<i==tuple_size<T>::value>(1)

bool MULTIDATA=true;
template<class T,size_t n>
struct arr;

template<class T>
struct arr_dtype{using type=T;};
template<class T,size_t n>
struct arr_dtype<arr<T,n>>{using type=typename arr_dtype<T>::type;};
template<class T,size_t n>
struct arr:public array<T,n>{
  using array<T,n>::array;
  using dvalue_type=typename arr_dtype<T>::type;
  template<class ...Args>
  arr(T a,Args... args):array<T,n>{a,args...}{}
  template<class UT>
  arr(const arr<UT,n>& a){
    for (size_t i=0;i<n;i++)
      (*this)[i]=a[i];
  }
  #define TMP_ARR template<class AT=void,class T2,class TU=typename conditional<is_same<AT,void>::value,decltype(declval<T>()+declval<T2>()),AT>::type>
  #define op_arr(x) \
  TMP_ARR arr<T,n>& operator x##=(const arr<T2,n>& b){for (size_t i=0;i<n;i++) (*this)[i] x##=b[i];return *this;}\
  TMP_ARR arr<T,n>& operator x##=(const T2& b){for (size_t i=0;i<n;i++) (*this)[i] x##=b;return *this;}\
  TMP_ARR arr<TU,n> operator x(const arr<T2,n>& b)const{arr<TU,n> c=(*this);for (size_t i=0;i<n;i++) c[i] x##= b[i];return c;}\
  TMP_ARR arr<TU,n> operator x(const T2& b)const{arr<TU,n> c=(*this);for (size_t i=0;i<n;i++) c[i] x##=b;return c;}
  op_arr(+) op_arr(-) op_arr(*) op_arr(/)
};
template<class T>
using arr2=arr<T,2>;
template<class T>
using arr3=arr<T,3>;
template<class AT=void,class T,size_t d,class UT=typename conditional<is_same<AT,void>::value,T,AT>::type>
UT dot(const arr<T,d>& a,const arr<T,d>& b){
    UT c=0;
    for (auto& i:operator*<UT>(a,b)) c+=i;
    return c;
}
template<class AT=void,class T,size_t d,class UT=typename conditional<is_same<AT,void>::value,T,AT>::type>
UT _abs(const arr<T,d>& a){return sqrt(dot<UT>(a,a));}
template<class AT=void,class T,size_t d,class UT=typename conditional<is_same<AT,void>::value,T,AT>::type>
arr<UT,d> normalize(const arr<T,d>& a){return a/_abs<UT>(a);}
template<class T>
T crs(const arr2<T> &a,const arr2<T> &b){return a[0]*b[1]-a[1]*b[0];}
template<class T>
arr3<T> crs(const arr3<T> &a,const arr3<T> &b){return {a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]};}
vec<arr2<int>> s;
int n,d;
int main(){
  cin>>n>>d;
  vec<arr2<int>> v(n);
  for (auto& i:v) cin>>i[0]>>i[1];

  v.erase(unique(all(v)),v.end());
  for (int i=0;i<(int)v.size();i++)
    for (int j=i+1;j<(int)v.size();j++){
      if (crs(v[i],v[j])==0){
        v.erase(v.begin()+j);
        j--;
      }
    }
  for (int i=v.size()-1,d=1;i>=0;i--,d*=37) v[i]*=d;
  vec<arr2<int>> a={{0,0}};
  for (auto w:v){
    vec<arr2<int>> b;
    for (auto ai:a){
      for (int i=1;i<d;i++)
        b.push_back(ai+=w);
    }
    copy(all(b),back_inserter(a));
  }
  cout<<a.size()<<"\n";
  for (auto i:a) cout << i[0] << " " << i[1] << "\n";
}

评论