前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【算法竞赛】XDU-ACM校赛2023题解 - DEFGIJ

【算法竞赛】XDU-ACM校赛2023题解 - DEFGIJ

作者头像
Livinfly
发布于 2023-05-19 07:46:49
发布于 2023-05-19 07:46:49
34700
代码可运行
举报
文章被收录于专栏:LivinflyLivinfly
运行总次数:0
代码可运行

题面PDF

补题链接

D - 燃起来了!

期望题。

因为我做期望题很少,赛时直接跳了,后面推推感觉还行,大概设计好,有终结状态的状态信息一个就行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma GCC optimize(2)

#include <bits/stdc++.h>

#define fi first
#define se second
#define mkp(x, y) make_pair((x), (y))
#define all(x) (x).begin(), (x).end()

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int MO = 1e9+7;

int qpm(int a, int b, const int &c = MO) { // int/LL
    int ans = 1 % c;
    while(b) {
        if(b & 1) ans = 1LL*ans*a % c;
        a = 1LL*a*a % c;
        b >>= 1;
    }
    return ans;
}

void solve() {
    int a, b, x, y;
    cin >> a >> b >> x >> y;
    if(a == b && y <= x) {
        cout << "forever\n";
        return;
    }
    int p = 1LL*a*qpm(b, MO-2) % MO, d = x/y, r = x%y;
    // cerr << y << ' ' << p << ' ' << d << ' ' << r << '\n';
    int ans = (1LL*y * (qpm(1-p, d) - 1)%MO * qpm(1LL*qpm(1-p, d) * (-p)%MO, MO-2) + r)% MO;
    ans = (ans + MO) % MO;
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed;  // << setprecision(20); // double
    // freopen("i.txt", "r", stdin);
    // freopen("o.txt", "w", stdout);
    // time_t t1 = clock();
    int Tcase = 1;
    cin >> Tcase; // scanf("%d", &Tcase);
    while (Tcase--) 
        solve();
    // cout << "time: " << 1000.0 * ((clock() - t1) / CLOCKS_PER_SEC) << "ms\n";
    return 0;
}

E - 全自动窗口调度算法

好像大家,把序列存下来纯模拟的多,我是维护每个窗口的最早空闲时间,然后更新就行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <bits/stdc++.h>

#define fi first
#define se second
#define all(a) (a).begin(), (a).end()

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, int> PLI;

void solve() {
    int n, m;
    cin >> n >> m;
    vector<LL> a(n), v(m), belong(n), cnt(m), t(m);
    for(auto &x : v) cin >> x;
    for(auto &x : a) cin >> x;
    sort(all(a));
    set<PII> st; // cnt, id
    set<PLI> done; // time, id
    for(int i = 0; i < m; i ++) 
        st.insert({0, i});
    for(int i = 0; i < n; i ++) {
        while(done.size() && done.begin()->fi <= a[i]) {
            int gid = belong[done.begin()->se];
            done.erase(done.begin());
            st.erase(st.find({cnt[gid], gid}));
            cnt[gid] --;
            st.insert({cnt[gid], gid});
        }
        auto [nn, gid] = *st.begin();
//        cout << nn << ' ' << gid << '\n';
        st.erase(st.begin());
        cnt[gid] ++;
        st.insert({cnt[gid], gid});
        done.insert({max(a[i], t[gid])+v[gid], i});
        belong[i] = gid;
//        cout << t[gid] << '\n';
        
        t[gid] = max(t[gid], a[i])+v[gid];
    }
    cout << (done.rbegin()->fi) << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout << fixed;
    
    int Tcase = 1;
//    cin >> Tcase;
    while(Tcase --) 
        solve();
    
    return 0;
}
/*
3 1
100
1 10 301
*/

F - Z-O 平衡

做法1 - $O(n)$

大概骚扰luoyue一段时间后,明白了

考虑数字从左到右一个一个加入序列,每次加入,考虑新加入的数对前面所有序列和自己的总贡献。

由于奇偶的作用不一致,很自然地可以考虑一个序列的奇数个数-偶数个数,会得到以下序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
odd - even    -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
               3  3  2  2  1  1 0 2 1 3 2 4 3

可以找到,序列奇 - 偶为正数/负数,奇数/偶数,增加/减少时的影响,通过一个数组+偏移量,维护整个序列。

base-delta永远是0的位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma GCC optimize(2)

#include <bits/stdc++.h>

#define fi first
#define se second
#define mkp(x, y) make_pair((x), (y))
#define all(x) (x).begin(), (x).end()

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int base = 2e5;

int delta;
LL ans, res;
int rec[base<<1];

void solve() {
    LL n, negE = 0, negO = 0, posE = 0, posO = 0, zero = 0;
    cin >> n;
    while(n --) {
        LL x;
        cin >> x;
        if(x & 1) {
            delta ++;
            res = res - negO + posE*2 - posO + 2*zero + 2;
            rec[base-delta+1] ++;
            swap(posO, posE);
            posO += zero;
            posO ++;
            swap(negO, negE);
            zero = rec[base-delta];
            negE -= zero;
        }
        else {
            delta --;
            res = res + negE + posE - 2*posO + zero + 1;
            rec[base-delta-1] ++;
            swap(posO, posE);
            swap(negO, negE);
            negO += zero;
            negO ++;
            zero = rec[base-delta];
            posE -= zero;
        }
        // cerr << posO << ' ' << posE << ' ' << negO << ' ' << negE << '\n';
        ans += res;
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed;  // << setprecision(20); // double
    // freopen("i.txt", "r", stdin);
    // freopen("o.txt", "w", stdout);
    // time_t t1 = clock();
    int Tcase = 1;
    // cin >> Tcase; // scanf("%d", &Tcase);
    while (Tcase--) 
        solve();
    // cout << "time: " << 1000.0 * ((clock() - t1) / CLOCKS_PER_SEC) << "ms\n";
    return 0;
}
/*
odd - even    -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
               3  3  2  2  1  1 0 2 1 3 2 4 3
*/

做法2 - $O(nlogn)$

口糊一下好了,因为先看的O(n)做法

和第二种一样做偏移,用两个树状数组记录下前面序列的各个奇数 - 偶数的个数,一个记录结果为奇数的各个长度的个数,一个记录结果为偶数的各个长度的个数,树状数组来维护正负的个数的信息,然后强行把第一种O(1)维护的东西变成O(logn)维护的东西((逃

G - 最强平行组合

因为选课没有限制选课相同,可以用背包最大化同个学分下的经验。

再用枚举二进制状态的做法,把每个学分的合法子集的最大值归为自己的值。

这种做法理论复杂度极高,但是出题人放过了(

求教std做法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma GCC optimize(2)

#include <bits/stdc++.h>

#define fi first
#define se second
#define mkp(x, y) make_pair((x), (y))
#define all(x) (x).begin(), (x).end()

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n), b(n), f(2e5+1, -1), g(2e5+1, -1);
       for(auto &x : a) cin >> x;
       for(auto &x : b) cin >> x;
       f[0] = 0;
    for(int i = 0; i < n; i ++) {
        for(int j = 2e5; j >= a[i]; j --) {
            if(f[j-a[i]] != -1) {
                f[j] = max(f[j], f[j-a[i]] + b[i]);
            }
        }
    }
    for(int S = 1; S <= 2e5; S ++) {
        for(int T = S; T; T = (T-1) & S) {
            if(T < k) continue;
            g[S] = max(g[S], f[T]);
        }
    }
    int ans = -1;
    for(int i = 1; i <= 2e5; i ++) {
        if(g[i] != -1 && (i^((1<<18)-1)) <= 2e5 && g[i^((1<<18)-1)] != -1) {
            ans = max(ans, g[i] + g[i^((1<<18)-1)]);
        }
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed;  // << setprecision(20); // double
    // freopen("i.txt", "r", stdin);
    // freopen("o.txt", "w", stdout);
    // time_t t1 = clock();
    int Tcase = 1;
    // cin >> Tcase; // scanf("%d", &Tcase);
    while (Tcase--) 
        solve();
    // cout << "time: " << 1000.0 * ((clock() - t1) / CLOCKS_PER_SEC) << "ms\n";
    return 0;
}

I - 你相信光吗

网络流板子题。

几个注意点,题目是有向图,加容量和恢复容量有些细节。

因为其实是赛时的代码再赛后略修一下,现在已经忘得差不多了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <bits/stdc++.h>

#define fi first
#define se second
#define all(a) (a).begin(), (a).end()

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 310, M = 16000;
const LL INF = 1e18;

int idx, h[N], ne[M], ver[M];
LL e[M], rec[M];
int n, m, S, T, C;
int d[N], cur[N];

void add(int a, int b, LL c) {
    ver[idx] = b, e[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
bool bfs() {
    queue<int> q;
    memset(d, -1, sizeof d);
    q.push(S);
    d[S] = 0, cur[S] = h[S];
    while(q.size()) {
        int t = q.front(); q.pop();
        for(int i = h[t]; ~i; i = ne[i]) {
            int v = ver[i];
            if(d[v] == -1 && e[i]) {
                d[v] = d[t]+1;
                cur[v] = h[v];
                if(v == T) {
                    return true;
                }
                q.push(v);
            }
        }
    }
    return false;
}
LL update(int u, LL limit) {
    if(u == T) return limit;
    LL flow = 0;
    for(int i = cur[u]; ~i && flow < limit; i = ne[i]) {
        cur[u] = i;
        int v = ver[i];
        if(d[v] == d[u]+1 && e[i]) {
            LL t = update(v, min(e[i], limit-flow));
            if(!t) d[v] = -1;
            flow += t;
            e[i] -= t;
            e[i^1] += t;
        }
    }
    return flow;
}
LL dinic() {
    LL res = 0, flow;
    while(bfs())
        while(flow = update(S, INF)) 
            res += flow;
    return res;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout << fixed;
    memset(h, -1, sizeof h);
    cin >> n >> m >> C;
    S = 0, T = n;
    while(m --) {
        int a, b, c;
        cin >> a >> b >> c;
        rec[idx] = c;
        add(a, b, c), add(b, a, 0);
    }
    LL res = dinic(), r1 = 0, r2 = 0;
    vector<PII> vvv;
    for(int i = 0; i < idx; i += 2)
        if(e[i] == 0) 
            vvv.emplace_back(ver[i^1], ver[i]);
    for(auto [x, y] : vvv) {
        int tx = h[x], ty = h[y];
        for(int z = 0; z < idx; z += 2)
            e[z] += e[z^1], e[z^1] = 0;
        add(x, y, C), add(y, x, 0);
        LL tres = dinic();
        idx -= 2;
        h[x] = tx, h[y] = ty;
        if(tres > res) {
            res = tres;
            r1 = x, r2 = y;
        }
    }
    cout << r1 << ' ' << r2 << ' ' << res << '\n';
    return 0;
}

J - bzy 的出行

xorzj说,Cow Relays G是原题,需要的前置知识有,矩阵快速幂、floyd。

因为floyd和矩阵乘法的类似性(是可以这么说的么),用类似矩阵快速幂的形式预处理出g[k, i, j],代表经过2^k条边,i 到 j 的最短路径长度。

不做预处理时间复杂度是O(T \cdot n^3 \cdot log(1e9)),会被卡飞。

然后有一个优化的点是,每次只有一个起点,所以求答案的那个数组可以用一维的,把时间复杂度降下来。

下方码风较凌乱

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#pragma GCC optimize(2)

#include <bits/stdc++.h>

#define fi first
#define se second
#define mkp(x, y) make_pair((x), (y))
#define all(x) (x).begin(), (x).end()

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 210;
const LL INF = 0x3f3f3f3f3f3f3f3f;

LL g[31][N][N], f[N], ff[N], ans[N][N];

void solve() {
    int n, m;
    cin >> n >> m;
    memset(g, 0x3f, sizeof g);
    while(m --) {
        int a, b, c;
        cin >> a >> b >> c;
        g[0][a][b] = c;
    }
    int T;
    cin >> T;
    auto floyd = [&](LL a[N][N], LL b[N][N]) {
        memset(ans, 0x3f, sizeof ans);
        for(int k = 1; k <= n; k ++)
            for(int i = 1; i <= n; i ++)
                for(int j = 1; j <= n; j ++)
                    ans[i][j] = min(ans[i][j], a[i][k] + b[k][j]);
        memcpy(a, ans, sizeof ans);
        return;
    };
    for(int i = 1; i < 31; i ++) {
        memcpy(g[i], g[i-1], sizeof g[i-1]);
        floyd(g[i], g[i-1]);
    }
    auto floyd1 = [&](LL a[N], LL b[N][N]) {
        memset(ff, 0x3f, sizeof ff);
        for(int k = 1; k <= n; k ++)
            for(int i = 1; i <= n; i ++)
                ff[i] = min(ff[i], a[k] + b[k][i]);
        memcpy(a, ff, sizeof ff);
        return;
    };
    int s, k;
    auto qpm = [&](int k) {
        memset(f, 0x3f, sizeof f);
        f[s] = 0;
        int kk = 0;
        while(k) {
            if(k & 1) floyd1(f, g[kk]);
            k >>= 1;
            kk ++;
        }
        return;
    };
    while(T --) {
        cin >> s >> k;
        qpm(k);
        for(int i = 1; i <= n; i ++) {
            cout << (f[i] == INF ? -1 : f[i]) << " \n"[i == n];
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed;  // << setprecision(20); // double
    // freopen("i.txt", "r", stdin);
    // freopen("o.txt", "w", stdout);
    // time_t t1 = clock();
    int Tcase = 1;
    // cin >> Tcase; // scanf("%d", &Tcase);
    while (Tcase--) 
        solve();
    // cout << "time: " << 1000.0 * ((clock() - t1) / CLOCKS_PER_SEC) << "ms\n";
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年05月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
4 条评论
热度
最新
您好,请问一下native监控部分的github开源项目有哪些?现在卡在这不会弄了。期待您的回复!谢谢!
您好,请问一下native监控部分的github开源项目有哪些?现在卡在这不会弄了。期待您的回复!谢谢!
33点赞举报
chokidar,可以看看这个,但是在mac上性能可能不太好。但就拖拽来说的话,mac用monitor支持,windows原生支持,使用时加载不同的逻辑性能最好。
chokidar,可以看看这个,但是在mac上性能可能不太好。但就拖拽来说的话,mac用monitor支持,windows原生支持,使用时加载不同的逻辑性能最好。
回复回复点赞举报
非常感谢您的帮助!之前根据您的文章思路已经成功实现了拖拽下载的功能,使用的是node-watch(与您说的这个差不多),万分感谢!
非常感谢您的帮助!之前根据您的文章思路已经成功实现了拖拽下载的功能,使用的是node-watch(与您说的这个差不多),万分感谢!
回复回复点赞举报
查看全部3条回复
推荐阅读
drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践
对列表进行拖动排序,尺寸改变。之前一般会使用jQuery-UI(interactjs更加纯粹)。其通过mousedown、mousemove、mouseup这三个事件来实现页面元素被鼠标拖拽的效果。vue-drag-resize vuedraggable等包也大抵如此:https://codepen.io/lujun-zhou/pen/LYybXNx。
周陆军博客
2023/05/07
6.7K1
JS魔法堂:IE5~9的Drag&Drop API
一、前言                                  《 HTML5魔法堂:全面理解Drag & Drop API》中提到从IE5开始已经支持DnD API,但IE5~9与HTML5的API有所不同,下面我们来了解一下吧! 二、IE5~9与HTML5的DnD API的不同点                      1. IE5~9DnD API仅对 img元素 、 a[href]元素 和 input[type=text]/textarea元素 中被选中的文字有效,且不用设置 
^_^肥仔John
2018/01/18
1.2K0
html5鼠标拖动排序及resize实现方案分析及实践
对列表进行拖动排序,尺寸改变。之前一般会使用jQuery-UI。其通过mousedown、mousemove、mouseup这三个事件来实现页面元素被鼠标拖拽的效果。vue-drag-resize vuedraggable等包也大抵如此:https://codepen.io/lujun-zhou/pen/LYybXNx。
周陆军
2021/07/13
3.3K0
前端拾零02—H5拖放总结
前端拾零收录日常开发中一些很常见很基础的前端操作,省去每次google甚至答案错误的烦恼
CS逍遥剑仙
2018/08/17
4.3K1
前端拾零02—H5拖放总结
前端拾零02—H5原生拖放总结 【原创】
前端拾零收录日常开发中一些很常见很基础的前端操作,省去每次google甚至答案错误的烦恼
CS逍遥剑仙
2018/09/26
2K0
HTML5拖拽
图片自带拖拽功能 其他元素可设置draggable属性:draggable :true 拖拽元素(被拖拽的元素)事件 :
踏浪
2019/07/31
4K0
js原生拖拽的两种方法
1.onmousedown:鼠标按下事件 2.onmousemove:鼠标移动事件 3.onmouseup:鼠标抬起事件
全栈程序员站长
2022/09/14
4.5K0
js原生拖拽的两种方法
【HTML5】逐步分析如何实现拖放功能
拖放就是通过鼠标放在一个物体上,按住鼠标不放就可以把一个物体托动到另一个位置。其实我们平时一直都有接触,如图
@零一
2021/01/29
1.7K0
HTML5中的拖放功能
每天学习编程,让你离梦想更新一步,感谢不负每一份热爱编程的程序员,不论知识点多么奇葩,和我一起,让那一颗四处流荡的心定下来,一直走下去,加油,2021加油!欢迎关注加我vx:xiaoda0423,欢迎点赞、收藏和评论
达达前端
2021/02/02
2.9K0
HTML5魔法堂:全面理解Drag & Drop API
一、前言                                      在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5的DnD API觉得那些痛苦的日子将一去不复返,但事实又是怎样的呢?下面我们一起来看看DnD API的真面目吧! 二、由于篇幅较长,特设目录一陀                       三、HTML4下实现简单拖拽 四、HTML5下实现简单拖拽 五、如何启用DnD效果 六、draggable属性详解 七、DnD的生命周期 八、DnD中最重要的数
^_^肥仔John
2018/01/18
4.1K0
HTML5魔法堂:全面理解Drag & Drop API
HTML5 进阶系列:拖放 API 实现拖放排序
本文介绍了如何使用 HTML5 的拖放 API 实现一个简单的拖放排序功能。首先介绍了如何为元素设置拖放 API,然后通过一个示例展示了如何实现拖放排序。在示例中,使用了 dataTransfer 对象来存储数据,并通过 setDragImage() 方法来设置拖放图标。最后,指出了在 IE 和 iOS 上需要使用特定的插件来支持拖放排序。
IMWeb前端团队
2017/12/29
2.1K0
html5 新特性
1.querySelector 返回文档中匹配指定css选择器的一个元素.     注意:uerySelector() 方法仅仅返回匹配指定选择器的第一个元素         如果你需要返回所有的元素,请使用 querySelectorAll()     语法:document.querySelector(CSS selectors) 2.getElementsByClassName() 方法返回文档中所有指定类名的元素集合     语法:document.getElementsByClassName
用户1197315
2018/01/22
1.9K0
JavaScript进阶之实现拖拽
如果不设置这段代码,会发生奇怪的现象,这是因为浏览器有自己的对图片和一些其他元素的拖放处理,会在我们拖放时自动运行,这与我们的拖放处理产生了冲突。
落落落洛克
2021/01/08
2.8K0
JavaScript进阶之实现拖拽
理论 | HTML5 进阶系列:拖放 API 实现拖放排序
HTML5 中提供了直接拖放的 API,极大的方便我们实现拖放效果,不需要去写一大堆的 js,只需要通过监听元素的拖放事件就能实现各种拖放功能。 想要拖放某个元素,必须设置该元素的 draggable 属性为 true,当该属性为 false 时,将不允许拖放。而 img 元素和 a 元素都默认设置了 draggable 属性为 true,可直接拖放,如果不想拖放这两个元素,把属性设为 false 即可。 拖放事件 拖放事件由不同的元素产生。一个元素被拖放,他可能会经过很多个元素上,最终到达想要放置的元素内
用户1097444
2022/06/29
1.4K0
理论 | HTML5 进阶系列:拖放 API 实现拖放排序
低代码设计器的自由布局拖动的实现原理
大家好,我们在这篇文章中来分享一下自由布局拖动的实现原理,实现一个设计器组件自由拖动的最简demo。
zz_jesse
2021/12/06
4.8K0
低代码设计器的自由布局拖动的实现原理
html5 drag API 实现列表拖拽
在拖拽过程中蓝色的线条是一个边框,利用拖拽事件添加class 并设置css就能有“响应”式的效果。
上山打老虎了
2022/06/14
1.2K0
html5 drag API 实现列表拖拽
HTML5 拖放(Drag和drop)
在工作当中,我们会常常见到像UC浏览器的新选项卡一样的可以自定义拖拽摆放效果。大的像淘宝的装修,QQ空间装扮等,小到一些游戏等等随处可见拖放的使用场景。
业余草
2019/01/21
1.3K0
HTML5 拖放(Drag和drop)
vue 拖拽hooks ts版
import { ref, } from 'vue' import { useBool } from './useBool' export interface AnyFunction { (...args: any): any } // 数据获取标识 const DATA_SIGN = 'DRAG' export function getDragDataSign() { return DATA_SIGN } /** * DOM 绑定拖拽事件 * @returns { { elems,
copy_left
2021/01/27
9830
彻底搞懂拖拽——基于鼠标事件的拖拽以及基于HTML5 API的拖拽完整实现
  一个典型的拖拽操作是这样的:用户用鼠标选中一个可拖动的(draggable)元素,移动鼠标到一个可放置的(droppable)元素,然后释放鼠标。 在操作期间,会触发一些事件类型,有一些事件类型可能会被多次触发(比如drag 和 dragover 事件类型)。   这里涉及几个知识点:
从入门到进错门
2018/12/05
3.5K0
彻底搞懂拖拽——基于鼠标事件的拖拽以及基于HTML5 API的拖拽完整实现
vue-grid-layout数据可视化图表面板优化过程所遇问题汇总
对于drag事件不熟悉的,请先阅读:《drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践》
周陆军博客
2023/01/25
1.7K0
相关推荐
drag事件详解:html5鼠标拖动排序及resize实现方案分析及实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档