远古OI笔记

摘要: 原文地址一些远古笔记 - lamaper - 博客园 Dijkstar 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 namespace dij{ struct edge{ int to,len,nxt; …

原文地址一些远古笔记 - lamaper - 博客园

Dijkstar

 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
namespace dij{
    struct edge{
        int to,len,nxt;
        }edge[MAXN];
    bool vis[MAXN];
    long long dist[MAXN];
    int head[MAXN],cnt;
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;

    void add(int x,int y,int z){
        cnt++;
        edge[cnt].to = y;
        edge[cnt].len = z;
        edge[cnt].nxt = head[x];
        head[x] = cnt;
        }

    void work(int e,int f,int g){
            for(int i = 1 ; i <= f ; i++){
            dist[i] = 0x7fffffff;
            }

            dist[g] = 0;
            q.push(make_pair(0,g));
            while(!q.empty()){
                int pos = q.top().second;
               q.pop();
                if (vis[pos]) continue;
               vis[pos] = 1;
                for(int i = head[pos] ; i != 0 ; i = edge[i].nxt){
                    int a = edge[i].to;
                    int b = edge[i].len;
                    if(dist[pos] + b < dist[a]){
                        dist[a] = dist[pos] + b;
                        q.push(make_pair(dist[a],a));
                    }
                }
            }
        }

}

模板-高精度

耗时两天学习研究;\ 十分感谢B站提供的课程;

  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
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include<bits/stdc++.h>
using namespace std;
//高精度
// GJQ
const int MAXN=508;
char ch1[MAXN],ch2[MAXN],temp[MAXN];//temp用于减法交换减数 
int a[MAXN],b[MAXN],c[MAXN];
void add(char c1[],char c2[]){
    //读入两个字符串 
    int len1 = strlen(c1);
    for(int i = 0;i < len1;i++){
        a[i] = c1[len1-i-1] - '0';
        //cout<<a[i]<<" ";
    }
    int len2 = strlen(c2);
    for(int i = 0;i < len2;i++){
        b[i] = c2[len2-i-1] - '0';
        //cout<<b[i]<<" ";
    }

    //加法模拟 
    int len = max(len1 , len2) + 1;
    int jw = 0;
    for(int i = 0;i < len;i++){
        c[i] = a[i] + b[i] + jw;
        jw = c[i]/10;
        c[i] = c[i]%10;
        //cout<<c[i]<<" ";
    }

    for(int i = len - 1 ;i >= 0 ;i--){
        if(0 == c[i] && len > 1){
            len--;
            //cout<<a[i]<<" ";
        }else{
            break;
        }
    }
//  cout<<c[1];
    for(int i = len - 1; i >= 0 ; i--){
        cout<<c[i];
    }
}
void mius(char c1[],char c2[]){ 
    int len1 = strlen(c1);
    int len2 = strlen(c2);

    if(len2 > len1 || (len2 == len1 && strcmp(c1,c2)<0)){
        /*
        * 函数strcmp来自cstring包
        * 这个函数用于比较两个字符串值的大小 
        */
        cout<<"-";
        strcpy(temp,c1);
        strcpy(c1,c2);
        strcpy(c2,temp);
        /*
        * 函数strcpy用于复制字符串内容 
        */
        int len1 = strlen(c1);
        int len2 = strlen(c2);
        //重新读入长度 
    }

    for(int i = 0;i < len1;i++){
        a[i] = c1[len1-i-1] - '0';
        //cout<<a[i]<<" ";
    }
    for(int i = 0;i < len2;i++){
        b[i] = c2[len2-i-1] - '0';
        //cout<<b[i]<<" ";
    }

    //int len = max(len1 , len2) + 1;
    //int jw = 0;

    //len1已经检查过,是最大数长度 
    for(int i = 0;i < len1;i++){
        if(a[i] < b[i]){
            a[i+1] = a[i+1] - 1;
            a[i] = a[i] + 10;
        }
        c[i] = a[i] - b[i];
    }

    //去除前导0 
    for(int i = len1 - 1 ;i >= 0 ;i--){
        if(0 == c[i] && len1 > 1){
            len1--;
            //cout<<a[i]<<" ";
        }else{
            break;
        }
    }
//  cout<<c[1];
    for(int i = len1 - 1; i >= 0 ; i--){
        cout<<c[i];
    }
}
void x(char c1[],char c2[]){
    //读入两个字符串 
    bool flaga = 0;
    if(c1[0] == '-'){
        flaga = 1;
        strcpy(c1,&c1[1]);//删除负号 
    }
    bool flagb = 0;
    if(c2[0] == '-'){
        flagb = 1;
        strcpy(c2,&c2[1]);//删除负号 
    }

    if(flaga != flagb)cout << "-";

    int len1 = strlen(c1);
    for(int i = 0;i < len1;i++){
        a[i] = c1[len1-i-1] - '0';
        //cout<<a[i]<<" ";
    }
    int len2 = strlen(c2);
    for(int i = 0;i < len2;i++){
        b[i] = c2[len2-i-1] - '0';
        //cout<<b[i]<<" ";
    }

    //乘法模拟 
    int jw;
    for(int i = 0;i < len1;i++){
        jw = 0;
        for(int j = 0 ; j < len2 ; j++){
            c[i+j] = a[i] * b[j] + jw + c[i+j];
            jw = c[i+j]/10;
            c[i+j] = c[i+j]%10; 

        }
        c[i+len2] = jw;
    }
    int lenc = len1 + len2;
    for(int i = lenc - 1 ;i >= 0 ;i--){
        if(0 == c[i] && lenc > 1){
            lenc--;
            //cout<<a[i]<<" ";
        }else{
            break;
        }
    }
//  cout<<c[1];
    for(int i = lenc - 1; i >= 0 ; i--){
        cout<<c[i];
    }
}

void chu(char c1[],char c2[]){

    //读入两个字符串 
    bool flaga = 0;
    if(c1[0] == '-'){
        flaga = 1;
        strcpy(c1,&c1[1]);//删除负号 
    }
    bool flagb = 0;
    if(c2[0] == '-'){
        flagb = 1;
        strcpy(c2,&c2[1]);//删除负号 
    }

    if(flaga != flagb)cout << "-";

    int len1 = strlen(c1);
    for(int i = 0;i < len1;i++){
        a[i] = c1[len1-i-1] - '0';
        //cout<<a[i]<<" ";
    }
    int len2 = strlen(c2);
    for(int i = 0;i < len2;i++){
        b[i] = c2[len2-i-1] - '0';
        //cout<<b[i]<<" ";
    }

    //乘法模拟 
    int jw;
    for(int i = 0;i < len1;i++){
        jw = 0;
        for(int j = 0 ; j < len2 ; j++){
            c[i+j] = a[i] * b[j] + jw + c[i+j];
            jw = c[i+j]/10;
            c[i+j] = c[i+j]%10; 

        }
        c[i+len2] = jw;
    }
    int lenc = len1 + len2;
    for(int i = lenc - 1 ;i >= 0 ;i--){
        if(0 == c[i] && lenc > 1){
            lenc--;
            //cout<<a[i]<<" ";
        }else{
            break;
        }
    }
//  cout<<c[1];
    for(int i = lenc - 1; i >= 0 ; i--){
        cout<<c[i];
    }
}
int main(){
    cin >> ch1 >> ch2 ;
    x(ch1,ch2); 
    return 0;
}

欧拉筛

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <cstring>
 using namespace std;
 int prime[1100000],primesize,phi[11000000];
 bool isprime[11000000];
 void getlist(int listsize)
 {
     memset(isprime,1,sizeof(isprime));
     isprime[1]=false;
     for(int i=2;i<=listsize;i++)
     {
         if(isprime[i])prime[++primesize]=i;
         for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
          {
             isprime[i*prime[j]]=false;
            if(i%prime[j]==0)break;
         }
    }
 }

广度优先搜索

关于队列

queue<> X;//创建队列\ X.pop();//弹出队首\ X.push();//放入元素\ X.empty();//return bool\ X.front();//返回队首元素\ X.size();//队列大小\

P1443马的遍历

 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
#include <bits/stdc++.h>
using namespace std;

struct node{
    int x, y, t;    
};

queue<node> q;

int m,n,sx,sy;
int ans[401][401];
int dir[][2] = {{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
bool vis[401][401];

void bfs(int sx,int sy){
    q.push((node){sx,sy,0});

    vis[sx][sy] = 1;
    ans[sx][sy] = 0;

    while(!q.empty()){
        node now = q.front();
        q.pop();

        for(int i = 0 ;i < 8;i++){
            int nx = now.x + dir[i][0];
            int ny = now.y + dir[i][1];

            if(vis[nx][ny] || nx < 1||ny < 1||nx > n||ny > m)continue;

            vis[nx][ny] = 1;
            ans[nx][ny] = ans[now.x][now.y] + 1;
            q.push( (node){nx , ny , now.t+1} );

        }

    }

}

int main(){
    cin >> n >> m >> sx >> sy;

    bfs(sx,sy);

    for(int i = 1 ; i <= n ; i++){
        for(int j = 1 ; j <= m ; j++){
            if(vis[i][j])printf("%-5d",ans[i][j]);
            else cout << "-1   ";
        }cout<<endl;

    }

    return 0;
}

P1135奇怪的电梯

 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
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct node{
    int st,t;
};
const int c[2] = {1,-1};
int k[MAXN];
int n,a,b,ans;
bool vis[MAXN];

queue<node> q;

void bfs(int a){
    q.push((node){a , 0});
    vis[a] = 1;
    ans = -1;

    while(!q.empty()){
        node now = q.front();
        q.pop();

        //for(int j = 0 ; j < n ; j++){
            for(int i = 0 ; i < 2 ; i++){
                int n = now.st + k[now.st]*c[i];

                if(n < 1 || n > b || vis[n])continue;

                vis[n] = 1;
                if(n == b)
                {
                        ans = now.t + 1;
                        break;
                    }
                q.push((node){ n , now.t + 1});
            }

        //}

    }

}

int main(){

    cin >> n >> a >> b;
    if(a == b){
    cout << "0";
    return 0;}
    for(int i = 1 ; i <= n ; i++)cin >> k[i];

    bfs(a);

    cout << ans;

    return 0;
}

博客由 Hugo 强力驱动,主题采用由 Jimmy 设计的 Stack ,并由 lamaper 个性化修改。