zoukankan      html  css  js  c++  java
  • NOI2018网络同步赛爆零记

    1、Day1

    早上睡醒7:30,,吃完饭8:00.。。。
    赶紧跑到图书馆(打算耗中午的时间,在家太吵),,然后震惊的是还没开门,据说今天是九点开,,,然后我就方了。。。
    趁着有早有跑到打印店(大概10mins),然后等着可以下题面。。。
    大概8:30的时候可以登录了,,,但是,网站实在太卡,,以至于根本打不开。。
    过了5mins大概群里终于有人打开了发了PDF,,然后印了出来,拿着边走边回到图书馆门口大约是8:40,,在门口看题面(幸好带了笔),,应该没有浪费时间吧qwq?
    然后是乱搞写题:
    最后还有大约1小时,也就是12:30的时候,,,就弃坑写不出来不写了。。。
    然后就是各种水群。。。
    T1:
    #1, Q=0是什么操作,,只要交了就有五分???(emmm,虽然还要文件读写不写错,文件名不写错,不能RE,CE,UKE,,)
    然后就不太会了,据说是bzoj3551Kruskal重构树,然而没写过,也没时间重新去搞了,,就丢掉了,,,(然后Candy?小哥哥帮我敲了一个暴力,成为了我分数最高的一道题。。。)
    T2:我只会枚举排列求逆序对判断。(最裸的暴力,,期望40分
    T3:我只会枚举所有子串判断(最裸的暴力,期望10分,,,然而交了以后发现没有去重,,,还有1h,,一边吃午饭一边水群,算了懒得改了,反正暴力也就10分。。
    T1return.cpp

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int N = 2e5+5, M = 4e5+5, inf = 1e9+5;
    #define pii pair<int, int>
    #define fir first
    #define sec second
    
    inline int read() {
        char c=getchar(); int x=0,f=1;
        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 n, m, Q, K, S;
    struct edge {int v, ne, w, a;} e[M<<1];
    int cnt = 1, h[N];
    inline void ins(int u, int v, int w, int a) {
        e[++cnt] = (edge) {v, h[u], w, a}; h[u] = cnt;
        e[++cnt] = (edge) {u, h[v], w, a}; h[v] = cnt;
    }
    
    int d[N], done[N];
    priority_queue<pii, vector<pii>, greater<pii> > q;
    void dijkstra(int s) {
        for(int i=1; i<=n; i++) d[i] = inf, done[i] = 0;
        d[s] = 0;
        q.push(make_pair(d[s], s));
        while(!q.empty()) {
            int u = q.top().sec; q.pop();
            if(done[u]) continue;
            done[u] = 1;
            for(int i=h[u]; i; i=e[i].ne) {
                int v = e[i].v;
                if(d[v] > d[u] + e[i].w) {
                    d[v] = d[u] + e[i].w;
                    q.push(make_pair(d[v], v));
                }
            }
        }
    }   
    
    
    namespace brute_force {
    
    const int N = 1505;
    
    
    int vis[N], head, tail;
    int bfs(int s, int p) { //printf("bfs %d %d
    ", s, p);
        memset(vis, 0, sizeof(vis));
        static int q[N];
        head = tail = 1;
        q[tail++] = s; vis[s] = 1; 
        int ans = d[s];
        while(head != tail) {
            int u = q[head++];
            for(int i=h[u]; i; i=e[i].ne) if(e[i].a > p) {
                int v = e[i].v;
                if(vis[v]) continue;
                vis[v] = 1;
                ans = min(ans, d[v]);
                q[tail++] = v;
            }
        }
        return ans;
    }
    
    void solve() {
        dijkstra(1);
        int ans = 0;
        while(Q--) {
            int v0, p0, v, p;
            cin >> v0 >> p0;
            v = (v0 + K * ans - 1) % n + 1;
            p = (p0 + K * ans) % (S+1);
            ans = bfs(v, p);
            cout << ans << '
    ';
        }
    }
    
    }
    
    
    struct meow {
        int u, v, a;
        bool operator < (const meow &r) const {
            return a > r.a;
        }
    } me[M];
    namespace off_line {
    
    struct quer {
        int p, v, id;
        bool operator < (const quer &r) const {
            return p > r.p;
        }
    } p[N];
    
    int fa[N], val[N];
    int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
    int ans[N];
    void Union(int x, int y) { //printf("Union %d %d
    ", x, y);
        x = find(x); y = find(y);
        if(x == y) return;
        fa[y] = x;
        val[x] = min(val[x], val[y]);
        //printf("hey %d %d
    ", x, val[x]);
    }
    
    void solve() {
        dijkstra(1);
        for(int i=1; i<=n; i++) fa[i] = i, val[i] = d[i];
        for(int i=1; i<=Q; i++) p[i].v = read(), p[i].p = read(), p[i].id = i;
    
        sort(me+1, me+1+m);
        sort(p+1, p+1+Q);
        int now = 1;
        for(int i=1; i<=Q; i++) {
            int now_p = p[i].p, now_v = p[i].v;
            //printf("p %d %d %d
    ", p[i].v, p[i].p, me[now].a);
            while(now <= m) {
                if(me[now].a > now_p) Union(me[now].u, me[now].v), now++;
                else break;
            }
            int x = find(now_v);
            ans[p[i].id] = val[x];
        }
        for(int i=1; i<=Q; i++) cout << ans[i] << '
    ';
    }
    
    
    }
    int main() {
        freopen("return.in", "r", stdin);
        freopen("return.out", "w", stdout);
    
        int T; cin >> T;
        while(T--) {
            cnt = 1;
            memset(h, 0, sizeof(h));
            cin >> n >> m;
            for(int i=1; i<=m; i++) {
                int u = read(), v = read(), l =read(), a = read();
                ins(u, v, l, a);
                me[i] = (meow) {u, v, a};
            }
            cin >> Q >> K >> S;
            if(n <= 1500) brute_force::solve();
            else if(K == 0) off_line::solve();
            //off_line::solve();
        }
    }

    T2、inverse.cpp

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #define maxn 50050
    #define mod 998244353
    using namespace std;
    
    //逆序对
    int a[maxn];
    void MergeSort(int l, int r, int &ans){
        if(l >= r)return ;
        int m = (l+r)>>1;
        MergeSort(l,m,ans);
        MergeSort(m+1,r,ans);
        int i = l, j = m+1;
        int t[r-l+1], k = 0;
        while(i<=m && j<=r){
            if(a[i]<=a[j])t[k++]=a[i++];
            else{
                t[k++] = a[j++];
                ans += m-i+1;//加上剩余元素个数
            }
        }
        while(i<=m)t[k++]=a[i++];
        while(j<=r)t[k++]=a[j++];
        for(i=l, k=0; i <= r; i++,k++)a[i]=t[k];
    }
    int getcount(int b[], int n){
        int ans = 0;
        for(int i = 1; i <= n; i++)a[i] = b[i];
        MergeSort(1,n,ans);
        return ans;
    }
    
    //题目
    int q[maxn];
    int main(){
        freopen("inverse.in","r",stdin);
        freopen("inverse.out","w",stdout);
        //逆序对
        int T;  cin>>T;
        while(T--){
            int ans = 0;
            int n;  cin>>n;
            for(int i = 1; i <= n; i++)cin>>q[i];
            next_permutation(q+1, q+n+1);
            do{
                int cc = 0;
                for(int i = 1; i <= n; i++){
                    cc += abs(i-q[i]);
                }
                cc /= 2;
                if(cc == getcount(q,n)){
                    ans++;
                }
            }while(next_permutation(q+1, q+n+1));
            cout<<(ans%mod)<<'
    ';
        }
        return 0;
    }

    T3name.cpp

    #include<cstdio>
    #include<iostream>
    #include<string>
    using namespace std;
    
    int main(){
        freopen("name.in","r",stdin);
        freopen("name.out","w",stdout);
        string S;
        cin>>S;
        int Q;  cin>>Q;
        for(int i = 1; i <= Q; i++){
            string T;  int l, r;  cin>>T>>l>>r;
            string a = T, b = S.substr(l-1,r-l+1);
            int ans = 0;
            for(int i = 0; i < a.size(); i++){
                for(int j = i; j < a.size(); j++){
                    string c = a.substr(i,j-i+1);
                    if(b.find(c) == string::npos){
                        ans++;
                    }
                }
            }
            cout<<ans<<'
    ';
        }
        return 0;
    }

    期望得分:80+40+5 = 125
    实际得分:75+8+0 = 83
    据说现场选手基本都是200+。

    2、Day2

    DAY2咕咕咕掉了。

  • 相关阅读:
    poj- 2528 Mayor's posters
    POJ 2631 Roads in the North (树的直径裸题)
    Quoit Design (白话--分治--平面点对问题)
    洛古 P1020 导弹拦截 (贪心+二分)
    D
    代理模式---动态代理之Cglib
    代理模式---动态代理之JDK
    开闭原则
    迪米特法则
    接口隔离原则
  • 原文地址:https://www.cnblogs.com/gwj1314/p/9444638.html
Copyright © 2011-2022 走看看