第一届&第二届“幻想杯”NOIP模拟赛 标程

实在懂不了的话直接来1601找chenyixiao,或者是在lfyzoj上发私信,或者是在luogu上发私信。

灵梦的宴会

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
struct Odge{
    int too, fro, val;
}odge[1000005];
struct Edge{
    int too, nxt, val;
}edge[200005];
int n, m, k, uu, vv, ecnt=0, hea[100005]={0}, r1, r2, fa[100005];
int depth[100005]={0};
int grand[100005][18]={0};
void rn(int &x){
    char ch=getchar();
    x = 0;
    while(ch<'0' || ch>'9')   ch = getchar();
    while(ch>='0' && ch<='9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
}
inline void add_edge(int fro, int too, int val){
    edge[++ecnt].nxt = hea[fro];
    edge[ecnt].too = too;
    edge[ecnt].val = val;
    hea[fro] = ecnt;
}
int myfind(int x){
    return fa[x]==x?x:fa[x]=myfind(fa[x]);
}
void kruskal(){
    int cnt=0;
    for(int i=1; i<=k; i++){
        r1 = myfind(odge[i].fro);
        r2 = myfind(odge[i].too);
        if(r1!=r2){
            cnt++;
            add_edge(odge[i].fro, odge[i].too, odge[i].val);
            add_edge(odge[i].too, odge[i].fro, odge[i].val);
            fa[r2] = r1;
        }
        if(cnt==n-1)    break ;
    }
}
inline bool cmp(Odge x, Odge y){
    return x.val>y.val;
}
void bt(int u){
    for(int i=hea[u]; i; i=edge[i].nxt){
        int t=edge[i].too;
        if(!depth[t]){
            depth[t] = depth[u] + 1;
            grand[t][0] = u;
            bt(t);
        }
    }
}
int query(int x, int y){
    if(depth[x]<depth[y]){
        x ^= y;
        y ^= x;
        x ^= y;
    }
    for(int i=17; i>=0; i--)
        if(depth[grand[x][i]]>=depth[y])
            x = grand[x][i];
    if(x==y)    return y;
    for(int i=17; i>=0; i--)
        if(grand[x][i]!=grand[y][i]){
            x = grand[x][i];
            y = grand[y][i];
        }
    return grand[x][0];
}
int main(){
    rn(n);rn(m);rn(k);
    for(int i=1; i<=n; i++)
        fa[i] = i;
    for(int i=1; i<=k; i++){
        rn(odge[i].fro);rn(odge[i].too);rn(odge[i].val);
    }
    sort(odge+1, odge+1+k, cmp);
    kruskal();
    depth[1] = 1;
    bt(1);
    for(int i=1; i<=17; i++)
        for(int j=1; j<=n; j++)
            grand[j][i] = grand[grand[j][i-1]][i-1];
    for(int i=1; i<=m; i++){
        rn(uu);rn(vv); 
        printf("%d\n", depth[uu]+depth[vv]-2*depth[query(uu, vv)]);
    }
    return 0;
}

烧烤摊

#include <iostream>
#include <cstdio>
using namespace std;
int n, m, t, u, v, w;
typedef long long ll;
struct SGT{
    ll lzt[400005];
    ll sum[400005];
    void build(int o, int l, int r){
        lzt[o] = 0;
        if(l==r)    scanf("%lld", &sum[o]);
        else{
            int mid=(l+r)>>1;
            int lson=o<<1;
            int rson=lson|1;
            build(lson, l, mid);
            build(rson, mid+1, r);
            sum[o] = sum[lson] + sum[rson];
        }
    }
    void push_down(int o, int l, int r, int mid, int lson, int rson){
        lzt[lson] += lzt[o];
        lzt[rson] += lzt[o];
        sum[lson] += (mid-l+1)*lzt[o];
        sum[rson] += (r-mid)*lzt[o];
        lzt[o] = 0;
    }
    void update(int o, int l, int r, int x, int y, int k){
        if(l>=x && r<=y){
            lzt[o] += k;
            sum[o] += (r-l+1)*k;
        }
        else{
            int mid=(l+r)>>1;
            int lson=o<<1;
            int rson=lson|1;
            if(lzt[o])  push_down(o, l, r, mid, lson, rson);
            if(x<=mid)   update(lson, l, mid, x, y, k);
            if(y>mid)    update(rson, mid+1, r, x, y, k);
            sum[o] = sum[lson] + sum[rson];
        }
    }
    long long query(int o, int l, int r, int x, int y){
        if(l>=x && r<=y)  return sum[o];
        else{
            int mid=(l+r)>>1;
            int lson=o<<1;
            int rson=lson|1;
            ll ans=0;
            if(lzt[o])  push_down(o, l, r, mid, lson, rson);
            if(x<=mid)   ans += query(lson, l, mid, x, y);
            if(y>mid)    ans += query(rson, mid+1, r, x, y);
            return ans;
        }
    }
}sgt;
void rn(int &x){
    char ch=getchar();
    x = 0;
    while(ch<'0' || ch>'9')   ch = getchar();
    while(ch>='0' && ch<='9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
}
ll exgcd(ll a, ll b, ll &x, ll &y){
    if(!b){
        x = 1;
        y = 0;
        return a;
    }
    ll re=exgcd(b, a%b, x, y);
    ll t=x;
    x = y;
    y = t - a / b * y;
    return re;
}
int main(){
    rn(n);rn(m);
    sgt.build(1, 1, n);
    for(int i=1; i<=m; i++){
        rn(t);rn(u);rn(v);rn(w);
        if(t==1)    sgt.update(1, 1, n, u, v, w);
        else{
            ll x, y, gcd, b=v-u+1, a=sgt.query(1, 1, n, u, v);
            gcd=exgcd(a, w, x, y);
            if(b%gcd)   printf("-1\n");
            else{
                w /= gcd;
                printf("%lld\n", ((x%w*b/gcd)%w+w)%w);
            }
        }
    }
    return 0;
}

古老的元神

水题。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, u, a[3500005], dp[3500005], ans;
void rn(int &x){
    char ch=getchar();
    x = 0;
    while(ch<'0' || ch>'9')   ch = getchar();
    while(ch>='0' && ch<='9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
}
int main(){
    cin>>n;
    for(int i=1; i<=n; i++){
        rn(u);
        dp[u] = i;
    }
    for(int i=1; i<=n; i++){
        rn(u);
        a[i] = dp[u];
    }
    memset(dp, 0x3f, sizeof(dp));
    dp[0] = 0;
    for(int i=1; i<=n; i++){
        if(dp[ans]<a[i])    dp[++ans] = a[i];
        else{
            int l=1, r=ans, mid;
            while(l<r){
                mid = (l + r) >> 1;
                if(dp[mid]<a[i])    l = mid + 1;
                else                r = mid;
            }
            dp[l] = min(dp[l], a[i]);
        }
    }
    cout<<ans;
    return 0;
}

Sakura Collection

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int dis[200005][3], cnt, hea[200005], n, m, p, e, b, u, v, ans=0x3f3f3f3f;
queue<int> d;
bool ins[200005];
struct Edge{
    int too, nxt;
}edge[2000005];
void add_edge(int fro, int too){
    edge[++cnt].nxt = hea[fro];
    edge[cnt].too = too;
    hea[fro] = cnt;
}
void spfa(int nl, int r){
    d.push(nl);
    ins[nl] = true;
    dis[nl][r] = 0;
    while(!d.empty()){
        int x=d.front();
        d.pop();
        ins[x] = false;
        for(int i=hea[x]; i; i=edge[i].nxt){
            int t=edge[i].too;
            if(dis[t][r]>dis[x][r]+1){
                dis[t][r] = dis[x][r] + 1;
                if(!ins[t]){
                    ins[t] = true;
                    d.push(t);
                }
            }
        }
    }
}
int main(){
    scanf("%d %d %d %d %d", &b, &e, &p, &n, &m);
    for(int i=1; i<=m; i++){
        scanf("%d %d", &u, &v);
        add_edge(u, v);
        add_edge(v, u);
    }
    memset(dis, 0x3f, sizeof(dis));
    spfa(1, 0);
    spfa(2, 1);
    spfa(n, 2);
    for(int i=1; i<=n; i++){
        if(dis[i][0]!=0x3f3f3f3f&&dis[i][1]!=0x3f3f3f3f&&dis[i][2]!=0x3f3f3f3f)
            ans = min(ans, b*dis[i][0]+e*dis[i][1]+p*dis[i][2]);
    }
    cout<<ans;
    return 0;
}

喷气式摩托

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
int n, m, thea[5005], tcnt, hea[10005], cnt, sx[5005], w[5005], s[5005];
int uu, vv, ww, dis[10005];
bool inq[10005];
queue<int> d;
struct Te{
    int too, nxt, val;
}te[30005];
struct Edge{
    int too, nxt, val;
}edge[120005];
void add_tedge(int fro, int too, int val){
    te[++tcnt].nxt = thea[fro];
    te[tcnt].too = too;
    te[tcnt].val = val;
    thea[fro] = tcnt;
}
void add_edge(int fro, int too, int val){
    edge[++cnt].nxt = hea[fro];
    edge[cnt].too = too;
    edge[cnt].val = val;
    hea[fro] = cnt;
}
void bui(int u){
    add_edge(u, u+n, s[u]);
    add_edge(u+n, u, 0);
    for(int i=thea[u]; i; i=te[i].nxt){
        int t=te[i].too;
        int delta=abs(w[t]-w[u]);
        if(sx[u]!=sx[t]){
            add_edge(u, t, te[i].val+delta);
            add_edge(u+n, t+n, max(0, te[i].val-delta));
        }
        else{
            add_edge(u, t+n, te[i].val);
            add_edge(u+n, t, te[i].val);
        }
    }
}
void spfa(){
    memset(dis, 0x3f, sizeof(dis));
    if(sx[1]){
        dis[1] = 0;
        d.push(1);
        inq[1] = true;
    }
    else{
        dis[1+n] = 0;
        d.push(1+n);
        inq[1+n] = true;
    }
    while(!d.empty()){
        int x=d.front();
        d.pop();
        inq[x] = false;
        for(int i=hea[x]; i; i=edge[i].nxt){
            int t=edge[i].too;
            if(dis[t]>dis[x]+edge[i].val){
                dis[t] = dis[x] + edge[i].val;
                if(!inq[t]){
                    inq[t] = true;
                    d.push(t);
                }
            }
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        scanf("%d", &sx[i]);
    for(int i=1; i<=n; i++)
        scanf("%d", &w[i]);
    for(int i=1; i<=n; i++)
        scanf("%d", &s[i]);
    for(int i=1; i<=m; i++){
        scanf("%d %d %d", &uu, &vv, &ww);
        add_tedge(uu, vv, ww);
    }
    for(int i=1; i<=n; i++)
        bui(i);
    spfa();
    printf("%d", min(dis[n], dis[n+n]));
    return 0;
}

稼欲灵招来

水题。

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
struct Node{
    int num, ran;
}a[100005], b[100005];
int n, tot, c[100005], d[100005], sum=0;
const int mod=99999997;
bool cmp(Node x, Node y){
    return x.num<y.num;
}
inline int lb(int x){
    return x & -x;
}
void add(int pos, int num){
    while(pos<=n){
        d[pos] += num;
        pos += lb(pos);
    }
}
int query(int pos){
    int re=0;
    while(pos){
        re += d[pos];
        pos -= lb(pos);
    }
    return re;
}
int main(){
    cin>>n;
    for(int i=1; i<=n; i++)  scanf("%d", &a[i].num), a[i].ran=i;
    for(int i=1; i<=n; i++)  scanf("%d", &b[i].num), b[i].ran=i;
    sort(a+1, a+1+n, cmp);
    sort(b+1, b+1+n, cmp);
    for(int i=1; i<=n; i++)
        c[a[i].ran] = b[i].ran;
    for(int i=1; i<=n; i++){
        add(c[i], 1);
        sum = (sum + i - query(c[i])) % mod;
    }
    cout<<sum;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值