zoukankan      html  css  js  c++  java
  • 10.22模拟赛题解

    51nod 一个让我很怵的比赛

    提高组高分模拟赛让我用bfs水过?? vis[x]每次清空导致写成了spfa 然后爆成10分 自闭

    或许我会在今天 改一下正确的算法 所以今天 我先丢一个考场bfs 数据过水 可以跑过 我等下还要写很多题解 所以...

    //边权是1 那bfs 
    #include<bits/stdc++.h>
    using namespace std;
    template<typename T>inline void read(T &x) {
        x=0;
        T f=1,ch=getchar();
        while (!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}
        while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
        x*=f;
    }
    const int N=1100;
    int n,m,tot,vis[N],lin[N],dis[N];
    struct gg {
        int y,next;
    }a[100100];
    struct pink {
        int x,y;
    }s[100100];
    inline void add(int x,int y) {
        a[++tot].y=y;
        a[tot].next=lin[x];
        lin[x]=tot;
    }
    inline int bfs(int s,int t) {
        queue<int>q; 
        memset(vis,0,sizeof(vis));
        while(q.size()) q.pop();
        q.push(s);vis[s]=1;dis[s]=0;
        for(int i=lin[s];i;i=a[i].next) {
            int y=a[i].y;
            if(y==t) continue;
            q.push(y);dis[y]=1,vis[y]=1;
        }q.pop();//
        while(q.size()) {
            int x=q.front();q.pop();
            for(int i=lin[x];i;i=a[i].next) {
                int y=a[i].y;
                if(vis[y]) continue;
                if(y==t) return dis[x]+1;
                dis[y]=dis[x]+1;
                vis[y]=1;
                q.push(y);
            }
        }
        return -1;
    }
    int main() {
    //    freopen("1.in","r",stdin);
        freopen("railway.in","r",stdin);
        freopen("railway.out","w",stdout);
        read(n); read(m);
        for(int i=1;i<=m;i++) {
            read(s[i].x);read(s[i].y);
            add(s[i].x,s[i].y);
        }
        for(int i=1;i<=m;i++) {
            cout<<bfs(s[i].x,s[i].y)<<' ';
        }
        return 0;
    }
    View Code

    或许让我想起来书上那个线段树 然后考虑 写一个线段树 后来发现 对于二维平面的东西 我们需要映射到区间去做 那么怎么办呢

    我们不妨把一个矩形分成两部分 映射到y轴上 x坐标 作为高度 对应两个矩形 一个大矩形 一个小矩形 然后 我们考虑 离线做这个事情

    那么 此时问题变成了 2n 个修改操作 以及2m 个查询操作 此时线段树 维护 len 表示当前区间被修改的长度 以及 sum 表示 当前区间被修改的面积和

    查询答案就是len*x-sum 

    或许 非常的抽象 至少我这么认为。

    嘿嘿 暴搜全排列qwq??? 但是 我们发现整除11有一个非常美妙的性质 就是对于奇数位和偶数位

  • 相关阅读:
    [读书笔记]黑客与画家[Hackers.and.Painters]
    android电池充电以及电量检测驱动分析
    LV在系统重启后不能自动激活(boot.lvm&after.loca)
    线段树菜鸟一题+归并排序【求逆序数】POJ2299
    【PAT】1035. Password (20)
    Android应用开发学习笔记之ContentProvider
    UVAlive 2322 Wooden Sticks(贪心)
    卸载QTP
    线段树模板
    2013 CSU校队选拔赛(1) 部分题解
  • 原文地址:https://www.cnblogs.com/Tyouchie/p/11765008.html
Copyright © 2011-2022 走看看