[20181102][模拟赛]

题面

T1

思路

就是先dfs一遍这棵树,先访问根节点,然后访问右孩子,然后左孩子。最后找出这个序列的最长上升子序列

然后一不小心,把第37行的ans写成了a,瞬间爆零

代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 100000 + 100;
ll read() {
    ll x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
ll a[N],ans[N],b[N];
int ls[N],rs[N],num;
void dfs(int u) {
    ans[++num] = a[u];
    if(rs[u]) dfs(rs[u]);
    if(ls[u]) dfs(ls[u]);
}
void solve() {
    int js = 0;
    b[0] = -1e9;
    for(int i = 1;i <= num;++i) {
        if(ans[i] > b[js]) b[++js] = ans[i];
        else {
            int k = upper_bound(b + 1,b + js + 1,ans[i]) - b;
            b[k] = ans[i];
        }
    }
    cout<<js;
}
int main() {
    freopen("point.in","r",stdin);
    freopen("point.out","w",stdout);
    int n = read();
    for(int i = 1;i <= n;++i) a[i] = read();
    for(int i = 1;i <= n;++i) ls[i] = read(),rs[i] = read();
    dfs(1);
    solve();
    return 0;
}

T2

50分思路

直接按照题意交换,然后归并排序或者树状数组找一下逆序对

100分思路

考虑怎样做到\(10^9\)。可以发现,其实数列中有用的数只有交换的那些数,对于中间的这些数只要找出一个元素来代替,并且给他赋个权值,表示在这个区间内有多少个数就可以了。这样就变成了N*3个数,就可以和五十分一样的方法做了

50分代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<map>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 100000 + 100;
map<int,int>ma;
ll read() {
    ll x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0'&& c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
struct node {
    int l,r;
}Q[N];
int n;
namespace BF1 {
    int a[N],tmp[N];
    ll ans = 0;
    void mul_sort(int l,int r) {
        if(l >= r) return;
        int mid = (l + r) >> 1;
        mul_sort(l,mid);mul_sort(mid+1,r);
        int L = l,R = mid+1;
        int js = l;
        while(L <= mid && R <= r) {
            if(a[L] <= a[R]) tmp[js++]=a[L++];
            else {
                ans += mid - L + 1;
                tmp[js++] = a[R++];
            }
        }
        while(L <= mid) {
            tmp[js++] = a[L++];
        }
        while(R <= r) {
            tmp[js++] = a[R++];
        }
        for(int i = l;i <= r;++i) a[i] = tmp[i];
    }
    void Main(int m) {
        for(int i = 1;i <= m;++i) a[i] = i;
        for(int i = 1;i <= n;++i) swap(a[Q[i].l],a[Q[i].r]);
//      for(int i = 1;i <= m;++i) printf("%d ",a[i]);
        mul_sort(1,m);
        cout<<ans;
    }
}
int main() {
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    n = read();
    int Max = -1;
    for(int i = 1;i <= n;++i) {
        Q[i].l = read(),Q[i].r = read();
        Max = max(Max,max(Q[i].l,Q[i].r));
    }
    BF1::Main(Max);
    return 0;
}

100分代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<map>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 100000 + 100;
map<int,int>ma;
ll read() {
    ll x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0'&& c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
struct node {
    int l,r;
}Q[N];
int n;
namespace BF2 {
    int ls[N * 4],W[N * 4],tot = 0,a[N * 4],tmp[N * 4];
    ll ans = 0;
    void lisan() {
        int num = 0;
        for(int i = 1;i <= n;++i) {
            ls[++num] = Q[i].l,ls[++num] = Q[i].r;
        }
        sort(ls + 1,ls + num + 1);
        int now = 0;
        for(int i = 1;i <= num;++i) {
            if(ls[i] == ls[i - 1]) continue;
            if(ls[i] - ls[i-1] > 1) {
                a[++tot] = tot;
                W[tot] = ls[i] - ls[i - 1] - 1; 
            }
            a[++tot] = tot;
            ma[ls[i]] = tot;
            W[tot] = 1;
        }
        for(int i = 1;i <= n;++i) {
            Q[i].l = ma[Q[i].l];
            Q[i].r = ma[Q[i].r];
        }
    }
    void mul_sort(int l,int r) {
        if(l >= r) return;
        int mid = (l + r) >> 1;
        mul_sort(l,mid);
        mul_sort(mid + 1,r);
        ll WW = 0;
        for(int i = l;i <= mid;++i) WW += W[a[i]];
        int L = l,R = mid + 1,js = l;
        while(L <= mid && R <= r) {
            if(a[L] <= a[R]) {
                WW -= W[a[L]];
                tmp[js++] = a[L++];
            }
            else {
                ans += WW * W[a[R]];
                tmp[js++] = a[R++];
            }
        }
        while(L <= mid) {
            tmp[js++] = a[L++];
        }
        while(R <= r) {
            tmp[js++] = a[R++];
        }
        for(int i = l;i <= r;++i) a[i] = tmp[i];
    }
    void Main() {
        lisan();
        for(int i = 1;i <= n;++i) swap(a[Q[i].l],a[Q[i].r]);
        mul_sort(1,tot);
        cout<<ans;
    }

}
int main() {
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    n = read();
    if(n == 1) {
        int x = read(),y = read();
        if(x > y) swap(x,y);
        cout<< y * 2 - x * 2 - 1;
        return 0;
    }
    int Max = -1;
    for(int i = 1;i <= n;++i) {
        Q[i].l = read(),Q[i].r = read();
        Max = max(Max,max(Q[i].l,Q[i].r));
    }
    BF2::Main();
    return 0;
}

T3

30分思路

每次按照要求将点染色,然后统计联通块个数就可以了。

100分思路

考虑将x染为y时,先将x从树里面拿出来,然后染色,然后重新放回去。在合并的时候,考虑让个数比较小的块加入到个数比较大的块中,舍得复杂度变为\(O(能过)\)

30分代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 200000 + 100;
ll read() {
    ll x = 0, f = 1;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0'&& c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
int col[N],pnt[N],block[N],nbok,a[N];
struct node {
    int v,nxt;
} e[N * 2];
int ans;
int head[N],ejs,num[N];
void add(int u,int v) {
    e[++ejs].v = v;
    e[ejs].nxt = head[u];
    head[u] = ejs;
}
queue<int>q1,q2,q;
int vis[N];
int bfs(int U) {
    while(!q.empty()) q.pop();
    q.push(U);
    vis[U] = 1;
    while(!q.empty()) {
        int u = q.front();
        q.pop();
        for(int i = head[u]; i; i = e[i].nxt) {
            int v = e[i].v;
            if(vis[v]) continue;
            if(a[v] == a[u] ) {
                q.push(v);
                vis[v] = 1;
            }
        }
    }
}
int main() {
    freopen("simulator.in","r",stdin);
    freopen("simulator.out","w",stdout);
    int n = read(),q = read();
    for(int i = 1; i <= n; ++i) a[i] = read();
    for(int i = 1; i < n; ++i) {
        int u = read(),v = read();
        add(u,v);
        add(v,u);
    }
    while(q--) {
        int x = read(),y = read();
        for(int i = 1; i <= n; ++i) {
            if(a[i] == x) a[i] = y;
        }
        ans = 0;
        memset(vis,0,sizeof(vis));
        for(int i = 1; i <= n; ++i) {
            if(!vis[i]) {
                ans++;
                bfs(i);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

100分代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
#ifdef WIN32
#define LL "%I64d"
#else 
#define LL "%lld"
#endif
const int N = 300000 + 10; 
vector<int>son[N];
vector<int>to[N];
ll read() {
    ll x = 0, f = 1;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x * f;
}
int id[N],cor[N],siz[N];
int ans = 1;
void dfs(int u,int father) {
    for(int i = 0;i < son[u].size();++i) {
        int v = son[u][i];
        if(v == father) continue;
        if(cor[v] != cor[u]) ans++;//孩子与父亲颜色不同,证明有新块 
        dfs(v,u);
    }
}
void del(int x) {
    for(int i = 0;i < son[x].size();++i) {
        int v = son[x][i];
        if(cor[v] != cor[x]) ans--;//以前颜色不同,现在颜色相同了,将ans-- 
    }
}
void ins(int x) {
    for(int i = 0;i < son[x].size();++i) {
        int v = son[x][i];
        if(cor[v] != cor[x]) ans++;//重新加入后颜色变得不同了,将ans++ 
    }
}
//cor表示当前点的颜色,id[x]表示x这个颜色的真实颜色。
//to[x]表示所有颜色为x的点。siz[x]表示颜色为x的点的个数 
int main() {
    freopen("simulator.in","r",stdin);
    freopen("simulator.out","w",stdout); 
    int n = read(),Q = read();
    for(int i = 1;i <= n;++i) {
        cor[i] = read();id[cor[i]] = cor[i];
        to[cor[i]].push_back(i);siz[cor[i]]++;
    }
    for(int i = 1;i < n;++i) {
        int u = read(),v = read();
        son[u].push_back(v);son[v].push_back(u);
    }
    son[1].push_back(0), cor[0] = 0x3e3e3e3e;
    dfs(1,0);//处理出一开始有多少联通块 
    while(Q--) {
        int x = read(),y = read();
        int y_ = y,x_ = x;
        x = id[x],y = id[y];
        id[x_] = 0;//x被合并之后消失 
        if(siz[x] > siz[y]) swap(x,y);//按照包含元素的大小合并 
        id[y_] = y;//y的颜色将变为块比较大的那个颜色 
        for(int i = 0;i < to[x].size();++i) {
            int v = to[x][i];
            del(v);//删除颜色为x的点 
            to[y].push_back(v);//加入到颜色为y的点中去
            siz[y]++; 
            siz[x]--;
        }
        for(int i = 0;i < to[x].size();++i)
            cor[to[x][i]] = y; //将颜色为x的点重新染色 
        for(int i = 0;i < to[x].size();++i)
            ins(to[x][i]);//将原来颜色为x的点重新加入到树中 
        to[x].clear();//颜色为x的点消失 
        printf("%d\n",ans);
    }
    return 0;
}

总结

期望得分100 + 100 + 30 = 230

实际得分0 + 100 + 30 = 130

再手误就剁手!!!

一言

人的一生会遭遇各种各样的事,其中有令人难以置信的事,也有不讲道理的事,但这就是生活。 ——地狱少女

转载于:https://www.cnblogs.com/wxyww/p/9897289.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
智慧校园信息化系统解决方案旨在通过先进的信息技术,实现教育的全方位创新和优质资源的普及共享。该方案依据国家和地方政策背景,如教育部《教育信息化“十三五”规划》和《教育信息化十年发展规划》,以信息技术的革命性影响为指导,推进教育信息化建设,实现教育思想和方法的创新。 技术发展为智慧校园建设提供了强有力的支撑。方案涵盖了互连互通、优质资源共享、宽带网络、移动APP、电子书包、电子教学白板、3D打印、VR虚拟教学等技术应用,以及大数据和云计算技术,提升了教学数据记录和分析水平。此外,教育资源公共服务平台、教育管理公共服务平台等平台建设,进一步提高了教学、管控的效率。 智慧校园系统由智慧教学、智慧管控和智慧办公三大部分组成,各自具有丰富的应用场景。智慧教学包括微课、公开课、精品课等教学资源的整合和共享,支持在线编辑、录播资源、教学分析等功能。智慧管控则通过平安校园、可视对讲、紧急求助、视频监控等手段,保障校园安全。智慧办公则利用远程视讯、无纸化会议、数字会议等技术,提高行政效率和会议质量。 教育录播系统作为智慧校园的重要组成部分,提供了一套满足学校和教育局需求的解决方案。它包括标准课室、微格课室、精品课室等,通过自动五机位方案、高保真音频采集、一键式录课等功能,实现了优质教学资源的录制和共享。此外,录播系统还包括互动教学、录播班班通、教育中控、校园广播等应用,促进了教育资源的均衡化发展。 智慧办公的另一重点是无纸化会议和数字会议系统的建设,它们通过高效的文件管理、会议文件保密处理、本地会议的音频传输和摄像跟踪等功能,实现了会议的高效化和集中管控。这些系统不仅提高了会议的效率和质量,还通过一键管控、无线管控等设计,简化了操作流程,使得会议更加便捷和环保。 总之,智慧校园信息化系统解决方案通过整合先进的信息技术和教学资源,不仅提升了教育质量和管理效率,还为实现教育均衡化和资源共享提供了有力支持,推动了教育现代化的进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值