2019, XII Samara Regional Intercollegiate Programming Contest 全部题解

英语巨烂的我,把两个签到题读成了不可写题…感觉给我一个中文题面,有机会ak…
A. Rooms and Passages
题意:有 n + 1个点在一排,有 n 条边连接,依次求点 i 往 点 n 的方向走最多能走多远,如果当前的边权值为 x (x > 0),且已经走过一条权值为 -x 的边,那么这条边不能走。
思路:倒着处理,标记每条正边在当前出现的最小坐标即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 5e5 + 10;
int vis[maxn], a[maxn];
stack<int> s;
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    int pre = 0;
    for (int i = n; i; i--) {
        if (a[i] > 0) {
            s.push(++pre);
            vis[a[i]] = i;
        }
        else {
            if (!vis[-a[i]])
                pre = min(pre + 1, n - i + 1), s.push(pre);
            else {
                pre = min(pre + 1, vis[-a[i]] - i);
                s.push(pre);
            }
        }
    }
    while (!s.empty())
        printf("%d ", s.top()), s.pop();
}

B. Rearrange Columns
题意:要求交换一些列,使得 # 互相连通,签到题

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1010;
char s[2][maxn], str[2][maxn];
int main() {
    cin>>s[0]>>s[1];
    int n = strlen(s[0]);
    int t1 = 0, t2 = 0, t = 0;
    for (int i = 0; i < n; i++) {
        int f1 = 0, f2 = 0;
        if (s[0][i] == '#')
            f1 = 1;
        if (s[1][i] == '#')
            f2 = 1;
        if (f1 && f2)
            t++;
        else if (f1)
            t1++;
        else if (f2)
            t2++;
    }
    if (t1 && t2 && !t)
        return puts("NO"), 0;
    for (int i = 0; i < t1; i++)
        str[0][i] = '#', str[1][i] = '.';
    for (int i = 0; i < t; i++)
        str[0][i + t1] = str[1][i + t1] = '#';
    for (int i = 0; i < t2; i++)
        str[0][i + t1 + t] = '.', str[1][i + t1 + t] = '#';
    for (int i = t1 + t2 + t; i < n; i++)
        str[0][i] = str[1][i] = '.';
    if (strcmp(str[0], s[0]) == 0) {
        for (int i = 0; i < t2; i++)
            str[0][i] = '.', str[1][i] = '#';
        for (int i = 0; i < t; i++)
            str[0][i + t2] = str[1][i + t2] = '#';
        for (int i = 0; i < t1; i++)
            str[0][i + t2 + t] = '#', str[1][i + t2 + t] = '.';
    }
    puts("YES");
    cout<<str[0]<<endl;
    cout<<str[1]<<endl;
}

C. Jumps on a Circle
题意:有一个长度为 p 的环,你要走n次,第 i 次走 i 步,求能走多少个不同的点
思路:n很大,其实有用的n就是2 * p,因为走2 * p步肯定回到原点(等差数列求和是 p 的倍数),第 2 * p + 1其实就是第 1 步,所以我们对 n 取一个min(n , 2 * p)然后模拟走一遍就可以了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e7 + 5;
bitset<maxn> a;
int main() {
    int p;
    ll n;
    cin>>p>>n;
    n = min(n, 2ll * p);
    int k = 0;
    for (int i = 0; i <= n; i++) {
        k += i;
        k %= p;
        a[k] = 1;
    }
    printf("%d\n", a.count());
}

D. Country Division
题意:给一棵树,q次询问,每次询问把树中一些点染红色,一些点染蓝色,求是否能够断开一些边,使得所有红点联通,所有蓝点联通,且任意红点和任意蓝点不联通。
思路:我们求出所有红点lca1,所有蓝点lca2,如果所有蓝点不在lca1的子树中或者所有红点不在lca2的子树中,那么就是yes。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int maxn = 2e5 + 10;
int f[maxn][20], dep[maxn], L[maxn], R[maxn], cnt;
vector<int> G[maxn], a, b;
void dfs(int u, int fa) {
    dep[u] = dep[fa] + 1;
    L[u] = ++cnt;
    f[u][0] = fa;
    for (int i = 1; i < 20; i++)
        f[u][i] = f[f[u][i - 1]][i - 1];
    for (auto v : G[u])
        if (v != fa)
            dfs(v, u);
    R[u] = cnt;
}
int LCA(int x, int y) {
    if (dep[x] < dep[y])
        swap(x, y);
    for (int i = 19; i >= 0; i--)
        if (dep[f[x][i]] >= dep[y])
            x = f[x][i];
    if (x == y)
        return x;
    for (int i = 19; i >= 0; i--)
        if (f[x][i] != f[y][i])
            x = f[x][i], y = f[y][i];
    return f[x][0];
}
int ok(int u, vector<int> tmp) {
    for (auto v : tmp)
        if (L[v] >= L[u] && R[v] <= R[u])
            return 0;
    return 1;
}
int main() {
    int n, u, v, q, k1, k2, x;
    scanf("%d", &n);
    for (int i = 1; i < n; i++) {
        scanf("%d%d", &u, &v);
        G[u].pb(v);
        G[v].pb(u);
    }
    dfs(1, 0);
    scanf("%d", &q);
    while (q--) {
        scanf("%d%d", &k1, &k2);
        a.clear();
        b.clear();
        int lca1 = 0, lca2 = 0, mx = 0, mn = 0;
        for (int i = 1; i <= k1; i++) {
            scanf("%d", &x), a.pb(x);
            if (!mx || L[mx] < L[x])
                mx = x;
            if (!mn || L[mn] > L[x])
                mn = x;
        }
        lca1 = LCA(mx, mn);
        mx = 0, mn = 0;
        for (int i = 1; i <= k2; i++) {
            scanf("%d", &x), b.pb(x);
            if (!mx || L[mx] < L[x])
                mx = x;
            if (!mn || L[mn] > L[x])
                mn = x;
        }
        lca2 = LCA(mx, mn);
        if (ok(lca1, b))
            puts("YES");
        else if (ok(lca2, a))
            puts("YES");
        else
            puts("NO");
    }
}

E. Third-Party Software - 2
题意:选择最少的区间,使得这些区间能够覆盖[1, m]
思路:原题,写过几次了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
struct node{
    int x, y, id;
    bool operator<(const node& t) const {
        if (x == t.x)
            return y > t.y;
        return x < t.x;
    }
} a[maxn];
priority_queue<int, vector<int>, greater<int> > q;
int main()
{
    int n, m, mx = 0, p = 0, t;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d%d", &a[i].x, &a[i].y), a[i].id = i;
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n && mx < m; i++) {
        if (a[i].x > p + 1) {
            if (a[i].x > mx + 1)
                break;
            p = mx;
            q.push(t);
            i--;
        }
        else {
            if (a[i].y > mx)
                mx = a[i].y, t = a[i].id;
        }
        if (mx >= m)
            q.push(t);
    }
    if (mx < m)
        puts("NO");
    else {
        puts("YES");
        printf("%d\n", q.size());
        while (!q.empty()) {
            printf("%d ", q.top());
            q.pop();
        }
    }
}

F. Friendly Fire
题意:有 n 个怪兽,每个怪兽有攻击力 ai 和血量 bi,你可以选择两个怪兽,如果 ai >= bj,那么怪兽 i 能打死怪兽 j,让他们同时攻击对方(有可能两只怪兽同时死亡),使得死亡的怪兽的攻击力之和最大。
思路:我们对于每只怪兽,把它的 ai 权值更新到max型线段树中的 bi 点去,枚举每只怪兽 i,我们从线段树中查找 区间[1, b[i] ]的最大值mx,如果mx存在,那么更新答案 ans = max(ans, mx),如果mx >= b[i],那么 ans = max(ans, mx + a[i]),但是细节挺多,有可能查到的怪兽是 i ,这样是不合法的,怎么消除这个问题,留给你深思啦(这题我代码写的巨丑)。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10, N = 1e9;
int mx[maxn * 35], cur[maxn * 35], ls[maxn * 35], rs[maxn * 35];
int a[maxn], b[maxn], cnt;
void up(int &o, int l, int r, int k, int v, int id, int opt) {
    if (!o)
        o = ++cnt;
    if (l == r) {
        if (opt)
            mx[o] = v, cur[o] = id;
        else if (mx[o] < v)
            mx[o] = v, cur[o] = id;
        return;
    }
    int m = (l + r) / 2;
    if (k <= m)
        up(ls[o], l, m, k, v, id, opt);
    else
        up(rs[o], m + 1, r, k, v, id, opt);

    mx[o] = max(mx[ls[o]], mx[rs[o]]);
    if (mx[ls[o]] == mx[o])
        cur[o] = cur[ls[o]];
    else
        cur[o] = cur[rs[o]];
}
int qu(int o, int l, int r, int ql, int qr) { // 查询最大值下标
    if (ql > qr)
        return 0;
    if (l >= ql && r <= qr)
        return cur[o];
    int m = (l + r) / 2, p = 0, tmp = 0;
    if (ql <= m)
        tmp = qu(ls[o], l, m, ql, qr);
    if (a[tmp] > a[p])
        p = tmp;
    if (qr > m)
        tmp = qu(rs[o], m + 1, r, ql, qr);
    if (a[tmp] > a[p])
        p = tmp;
    return p;
}
map<int, int> mp, mp2;
struct node{
    int a, b;
    node (int t1, int t2) {a = t1, b = t2; }
    bool operator<(const node& t)const {
        return a > t.a;
    }
};
vector<node> G[maxn];
int main()
{
    int n, rt = 0, sz = 0;
    scanf("%d", &n);
    int ans = 0, t1 = 1, t2 = 2;
    for (int i = 1; i <= n; i++) {
        scanf("%d%d", &a[i], &b[i]);
        if (!mp2[b[i]])
            mp2[b[i]] = ++sz;
        G[mp2[b[i]]].push_back(node(a[i], i));
        up(rt, 1, N, b[i], a[i], i, 0);
    }
    for (int i = 1; i <= sz; i++)
         sort(G[i].begin(), G[i].end());
    for (int i = 1; i <= n; i++) {
        int tmp = qu(rt, 1, N, 1, a[i]);
        if (tmp == i) {
            int v = 0;
            int t = mp2[b[i]], ttt = 0;
            if (G[t].size() > 1)
                v = G[t][1].a, ttt = G[t][1].b;
            up(rt, 1, N, b[i], v, ttt, 1);
        }
        int k = qu(rt, 1, N, 1, a[i]);
        if (k) {
            if (a[k] > ans)
                ans = a[k], t1 = i, t2 = k;
            if (a[k] >= b[i] && a[k] + a[i] > ans)
                ans = a[k] + a[i], t1 = i, t2 = k;
        }
        if (tmp == i)
            up(rt, 1, N, b[i], G[mp2[b[i]]][0].a, G[mp2[b[i]]][0].b, 1);
    }
    printf("%d\n%d %d\n", ans, t1, t2);
}

G. Akinator
题意:很绕,有 n 个人,有一个是小偷,要求你必须经过询问刚好 k 次,每次询问一堆人是否有小偷,找到这个小偷,同时求一个东西:如果你是第 m 次确定了第 i 个人的身份,那么这个人贡献的权值是:ai * m,我们要求最小的总的贡献sum / 总的ai,可以对ai进行排序。
思路:先对a数组排序,设d[l][r][k]为已经问了 k 次,再去确认区间 [l , r] 的人的身份的最小贡献,转移方程:dp[l][r][k] = min(d[ l ] [ i ][k + 1] + d[i + 1][ r ][k + 1]) (i <= i < r)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n, k;
ll d[101][101][101], a[101], sum, inf = 1e18;
ll dfs(int l, int r, int step) {
    if (step > k)
        return inf;
    if (l == r)
        return a[l] * step;
    if (d[l][r][step])
        return d[l][r][step];
    d[l][r][step] = inf;
    for (int i = l; i < r; i++)
        d[l][r][step] = min(d[l][r][step], dfs(l, i, step + 1) + dfs(i + 1, r, step + 1));
    return d[l][r][step];
}
int main() {
    cin>>n>>k;
    for (int i = 1; i <= n; i++)
        cin>>a[i], sum += a[i];
    if (ceil(log2(n)) > k)
        return puts("No solution"), 0;
    sort(a + 1, a + 1 + n);
    ll ans = dfs(1, n, 0);
    ll tmp = __gcd(ans, sum);
    printf("%lld/%lld\n", ans / tmp, sum / tmp);
}

H. Missing Number
轩少
I. Painting a Square
题意:有一个大方形,你有一个小方形刷子,问最小需要刷移动多少次,能把大方形刷满。
思路:我们发现我们每次刷,肯定是贴着大方形转圈圈的刷是最优的,每次刷一圈,大方形的边长就会缩小 2 * 小方形边长,然后就水题啦。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dfs(ll a, ll b) {
    if (a <= b)
        return a;
    if (a <= b * 2)
        return (a - b) * 3 + b;
    return (a - b) * 4 + dfs(a - 2 * b, b);
}
int main()
{
    ll a, b;
    cin>>a>>b;
    cout<<dfs(a, b) - b;
}

J. The Power of the Dark Side - 2
轩少
K. Deck Sorting
题意:给你一个字符串s,有两个空柱子,你按顺序依次把这些字符放到两个柱子上,最后把两个柱子拼接,问是否能形成一个相同的字符必连续的目标串。
思路:因为最多只有3种字符,我们枚举目标串的排列,然后判断其是否可行,怎么判断:假设目标串排列是:RGB,我们把R放在第一个柱子,B放在第二个柱子,那么G有可能在R下面,也有可能在B上面,我们依次枚举s,如果出现了B,那么我们标记一下第二个柱子不能放G了,接下来如果出现了G,因为有了标记,那么G只能放第一个柱子,我们判断R放完了没有,如果放完了那么放第一个柱子下面,如果没放完,那么不合法。

#include<bits/stdc++.h>
using namespace std;
string s;
int ok(string targ) {
    map<char, int> mp, mp2;
    for (auto c : s)
        mp[c]++;
    for (int i = 0; i < targ.length(); i++)
        mp2[targ[i]] = i + 1;
    int flag = 0;
    for (auto c : s) {
        mp[c]--;
        if (mp2[c] == 2) {
            if (mp[targ[0]] && flag)
                return 0;
        }
        else if (mp2[c] == 3) {
            flag = 1;
        }
    }
    return 1;
}
int main() {
    cin>>s;
    reverse(s.begin(), s.end());
    if (ok("RGB") || ok("RBG") || ok("GRB") || ok("GBR") || ok("BRG") || ok("BGR"))
        puts("YES");
    else
        puts("NO");
}

L. Inscribed Circle
轩少
M. Shlakoblock is live!
题意:有n个游戏,每个游戏有两个属性pi, vi,你可以选择一些游戏,使得vi + 1,使得所有的游戏 pi * vi 的总和除以总 vi 和最大。
思路:水题,先把游戏按照pi从大到小排序,我们从0开始选择枚举选择的游戏个数,然后把求出来的值更新到答案就行。

#include<bits/stdc++.h>
#define pi pair<int, int>
#define mk make_pair
using namespace std;
const int maxn = 1010;
struct node {
    int p, v, id;
    bool operator<(const node& t) const {
        return p > t.p;
    }
} a[maxn];
bool cmp(pi x, pi y) {
    return 1ll * x.first * y.second > 1ll * y.first * x.second;
}
int main()
{
    int T;
    scanf("%d", &T);
    while (T--) {
        int n, sum = 0, res = 0, p = 0;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d%d", &a[i].p, &a[i].v);
            a[i].id = i;
            sum += a[i].v;
            res += a[i].p * a[i].v;
        }
        sort(a + 1, a + 1 + n);
        pi ans = mk(res, sum);
        for (int i = 1; i <= n; i++) {
            res += a[i].p;
            sum++;
            if (cmp(mk(res, sum), ans))
                ans = mk(res, sum), p = i;
        }
        int d = __gcd(ans.first, ans.second);
        printf("%d/%d\n", ans.first / d, ans.second / d);
        printf("%d\n", p);
        if (!p)
            puts("");
        for (int i = 1; i <= p; i++)
            printf("%d%c", a[i].id, i == p ? '\n' : ' ');
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
xv Contents Graphical Debugging Tools 299 DDD 299 Eclipse 302 Kernel Debugging 305 Don’t Panic! 306 Making Sense of an oops 307 Using UML for Debugging 309 An Anecdotal Word 312 A Note about In-Kernel Debuggers 313 Summary 313 Chapter 11: The GNOME Developer Platform 315 GNOME Libraries 316 Glib 316 GObject 316 Cairo 316 GDK 317 Pango 317 GTK+ 317 libglade 318 GConf 318 GStreamer 318 Building a Music Player 319 Requirements 319 Getting Started: The Main Window 319 Building the GUI 321 Summary 340 Chapter 12: The FreeDesktop Project 341 D-BUS: The Desktop Bus 341 What Is D-Bus? 342 Under D-Hood of D-Bus 342 D-Bus Methods 346 Hardware Abstraction Layer 350 Making Hardware Just Work 350 Hal Device Objects 353 The Network Manager 358 Other Freedesktop Projects 360 Summary 360 02_776130 ftoc.qxp 2/2/07 10:13 PM Page xv xvi Contents Chapter 13: Graphics and Audio 361 Linux and Graphics 361 X Windows 362 Open Graphics Library 364 OpenGL Utilities Toolkit 365 Simple Directmedia Layer 365 Writing OpenGL Applications 365 Downloading and Installing 366 Programming Environment 367 Using the GLUT Library 368 Writing SDL Applications 382 Downloading and Installing 382 Programming Environment 383 Using the SDL Library 383 Summary 394 Chapter 14: LAMP 395 What Is LAMP? 395 Apache 396 MySQL 396 PHP 397 The Rebel Platform 397 Evaluating the LAMP Platform 397 Apache 399 Virtual Hosting 400 Installation and Configuration of PHP 5 401 Apache Basic Authentication 402 Apache and SSL 402 Integrating SSL with HTTP Authentication 403 MySQL 404 Installing MySQL 404 Configuring and Starting the Database 404 Changing the Default Password 405 The MySQL Client Interface 405 Relational Databases 405 SQL 406 The Relational Model 409 PHP 411 The PHP Language 411 Error Handling 420 Error-Handling Exceptions 421 02_776130 ftoc.qxp 2/2/07 10:13 PM Page xvi xvii Contents Optimization Techniques 422 Installing Additional PHP Software 427 Logging 427 Parameter Handling 428 Session Handling 429 Unit Testing 430 Databases and PHP 432 PHP Frameworks 432 The DVD Library 433 Version 1: The Developer’s Nightmare 433 Version 2: Basic Application with DB-Specific Data Layer 434 Version 3: Rewriting the Data Layer,Adding Logging and Exceptions 437 Version 4: Applying a Templating Framework 441 Summary 442 Index 443 GNU 47 Acknowledgments ix Introduction xix Chapter 1: Working with Linux 1 A Brief History of Linux 2 The GNU Project 2 The Linux Kernel 3 Linux Distributions 4 Free Software vs. Open Source 4 Beginning Development 5 Choosing a Linux Distribution 6 Installing a Linux Distribution 8 Linux Community 15 Linux User Groups 15 Mailing lists 16 IRC 16 Private Communities 16 Key Differences 16 Linux Is Modular 17 Linux Is Portable 17 Linux Is Generic 17 Summary 18 Chapter 2: Toolchains 19 The Linux Development Process 19 Working with Sources 20 Configuring to the Local Environment 21 Building the Sources 22 Components of the GNU Toolchain 23 The GNU Compiler Collection 23 The GNU binutils 34 GNU Make 39 The GNU Debugger 40 02_776130 ftoc.qxp 2/2/07 10:13 PM Page xi xii Contents The Linux Kernel and the GNU Toolchain 44 Inline Assembly 44 Attribute Tags 45 Custom Linker Scripts 45 Cross-Compilation 46 Building the GNU Toolchain 47 Summary 48 Chapter 3: Portability 49 The Need for Portability 50 The Portability of Linux 51 Layers of Abstraction 51 Linux Distributions 52 Building Packages 57 Portable Source Code 70 Internationalization 81 Hardware Portability 88 64-Bit Cleanliness 89 Endian Neutrality 89 Summary 92 Chapter 4: Software Configuration Management 93 The Need for SCM 94 Centralized vs. Decentralized Development 95 Centralized Tools 95 The Concurrent Version System 96 Subversion 104 Decentralized tools 108 Bazaar-NG 109 Linux kernel SCM (git) 112 Integrated SCM Tools 115 Eclipse 115 Summary 117 Chapter 5: Network Programming 119 Linux Socket Programming 119 Sockets 120 Network Addresses 122 Using Connection-Oriented Sockets 123 Using Connectionless Sockets 130 02_776130 ftoc.qxp 2/2/07 10:13 PM Page xii xiii Contents Moving Data 133 Datagrams vs. Streams 133 Marking Message Boundaries 137 Using Network Programming Libraries 140 The libCurl Library 140 Using the libCurl Library 141 Summary 147 Chapter 6: Databases 149 Persistent Data Storage 149 Using a Standard File 150 Using a Database 150 The Berkeley DB Package 152 Downloading and Installing 153 Building Programs 154 Basic Data Handling 154 The PostgreSQL Database Server 165 Downloading and Installing 165 Building Programs 167 Creating an Application Database 167 Connecting to the Server 169 Executing SQL Commands 173 Using Parameters 181 Summary 184 Chapter 7: Kernel Development 185 Starting Out 185 Kernel Concepts 199 A Word of Warning 200 The Task Abstraction 200 Virtual Memory 205 Don’t Panic! 208 Kernel Hacking 208 Loadable Modules 209 Kernel Development Process 211 Git: the “Stupid Content Tracker” 212 The Linux Kernel Mailing List 213 The “mm” Development Tree 215 The Stable Kernel Team 215 LWN: Linux Weekly News 216 Summary 216 02_776130 ftoc.qxp 2/2/07 10:13 PM Page xiii xiv Contents Chapter 8: Kernel Interfaces 217 What Is an Interface? 217 Undefined Interfaces 218 External Kernel Interfaces 219 System Calls 219 The Device File Abstraction 224 Kernel Events 238 Ignoring Kernel Protections 239 Internal Kernel Interfaces 243 The Kernel API 243 The kernel ABI 244 Summary 245 Chapter 9: Linux Kernel Modules 247 How Modules Work 247 Extending the Kernel Namespace 250 No Guaranteed Module Compatibility 251 Finding Good Documentation 251 Linux Kernel Man Pages 251 Writing Linux Kernel Modules 252 Before You Begin 253 Essential Module Requirements 253 Logging 256 Exported Symbols 257 Allocating Memory 259 Locking considerations 267 Deferring work 275 Further Reading 283 Distributing Linux Kernel Modules 284 Going Upstream 284 Shipping Sources 284 Shipping Prebuilt Modules 284 Summary 285 Chapter 10: Debugging 287 Debugging Overview 287 A Word about Memory Management 288 Essential Debugging Tools 289 The GNU Debugger 289 Valgrind 298 02_776130 ftoc.qxp 2/2/07 10:13 PM Page xiv
This text develops a comprehensive theory of programming languages based on type systems and structural operational semantics. Language concepts are precisely defined by their static and dynamic semantics, presenting the essential tools both intuitively and rigorously while relying on only elementary mathematics. These tools are used to analyze and prove properties of languages and provide the framework for combining and comparing language features. The broad range of concepts includes fundamental data types such as sums and products, polymorphic and abstract types, dynamic typing, dynamic dispatch, subtyping and refinement types, symbols and dynamic classification, parallelism and cost semantics, and concurrency and distribution. The methods are directly applicable to language implementation, to the development of logics for reasoning about programs, and to the formal verification language properties such as type safety. This thoroughly revised second edition includes exercises at the end of nearly every chapter and a new chapter on type refinements. Table of Contents Part I Judgments and Rules Chapter 1 Abstract Syntax Chapter 2 Inductive Definitions Chapter 3 Hypothetical and General Judgments Part II Statics and Dynamics Chapter 4 Statics Chapter 5 Dynamics Chapter 6 Type Safety Chapter 7 Evaluation Dynamics Part III Total Functions Chapter 8 Function Definitions and Values Chapter 9 System T of Higher-Order Recursion Part IV Finite Data Types Chapter 10 Product Types Chapter 11 Sum Types Part V Types and Propositions Chapter 12 Constructive Logic Chapter 13 Classical Logic Part VI Infinite Data Types Chapter 14 Generic Programming Chapter 15 Inductive and Coinductive Types Part VII Variable Types Chapter 16 System F of Polymorphic Types Chapter 17 Abstract Types Chapter 18 Higher Kinds Part VIII Partiality and Recursive Types Chapter 19 System PCF of Recursive Functions Chapter 20 System FPC of Recursive Types Part IX Dynamic Types Chapter 21 The Untyp

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙橘子猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值