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\n", 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 << '\n';
    }
}

}


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\n", 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\n", 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\n", 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] << '\n';
}


}
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)<<'\n';
    }
    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<<'\n';
    }
    return 0;
}

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

2、Day2

DAY2咕咕咕掉了。

posted @ 2018-07-22 18:05  gwj1139177410  阅读(240)  评论(0编辑  收藏  举报
选择