ACM-ICPC 2018 徐州赛区网络预赛(F、G、H、I)

版权声明:欢迎转载 https://blog.csdn.net/l18339702017/article/details/82557612


 F. Features Track(哈希算法)

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-------------"<<endl

typedef long long ll;
const int maxn = 1e5+10;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 1010;
const int hasa = 2333;
const int hasb = 1007;

ll n, k, cnt;
struct node{
    ll x, y;
};
map<ll, node>mp;
map<ll, ll>mps;
ll max(ll a, ll b){
    if(a > b) return a;
    else return b;
}
int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        cnt = 0;
        mp.clear();
        scanf("%lld", &n);
        ll k, u, v, ans;
        for(int i=1; i<=n; i++){
            mps.clear();
            scanf("%lld", &k);
            for(int j=1; j<=k; j++){
                scanf("%lld %lld", &u, &v);
                ans = ( u % MOD * 1LL * hasa  % MOD + v % MOD * 1LL * hasb ) % MOD;
                if(mps[ans] == 1) continue;
                else mps[ans] = 1;
                if(mp.count(ans)) {
                    if(i - mp[ans].x == mp[ans].y) {
                        mp[ans].y ++;
                        cnt = max(mp[ans].y, cnt);
                    }
                    else {
                        mp[ans].y = 1;
                        mp[ans].x = i;
                    }
                }
                else {
                    mp[ans].y = 1;mp[ans].x = i;
                    cnt = max(cnt, 1LL);
                }
            }
        }
        printf("%lld\n", cnt);
    }
    return 0;
}

G. Trace(STL-set / 线段树)

#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-----------------"<<endl;

typedef long long ll;
const int maxn = 1e5+10;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 1010;

int n;

ll solve(vector<int> ve){
    int len = ve.size();
    set<int> se;
    ll ans = 0;
    set<int>::iterator it;
    for(int i=len-1; i>=0; i--){
        it = se.lower_bound(ve[i]);
        if(it == se.begin()) ans += ve[i];
        else{
            it -- ;
            ans += ve[i] - *it;
        }
        se.insert(ve[i]);
    }
    return ans;
}

int main(){
    while(scanf("%d", &n) != EOF){
        vector<int> vx, vy;
        int x, y;
        while(n--){
            scanf("%d%d", &x, &y);
            vx.push_back(x);
            vy.push_back(y);
        }
        ll cnt = solve(vx) + solve(vy);
        printf("%lld\n", cnt);
    }
    return 0;
}
#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-----------------"<<endl;

typedef long long ll;
const int maxn = 1e5+10;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 1010;

int n;
int L[maxn], R[maxn], sum[maxn];
struct node{
    int l, r, sumx, sumy;
    int mid(){
        return (l+r) >> 1;
    }
}tree[maxn<<2];
void build(int x, int l, int r){
    tree[x].l = l; tree[x].r = r;
    tree[x].sumx = tree[x].sumy = 0;
    if(l == r) return ;
    int mid = tree[x].mid();
    build(x<<1, l, mid);
    build(x<<1|1, mid+1, r);
}
void update(int x, int op, int pos, int key){
    if(tree[x].l == tree[x].r){
        if(op == 1) tree[x].sumx = max(tree[x].sumx, key);
        else tree[x].sumy = max(tree[x].sumy, key);
        return ;
    }
    int mid = tree[x].mid();
    if(pos <= mid) update(x<<1, op, pos, key);
    else update(x<<1|1, op, pos, key);
    if(op == 1) tree[x].sumx = max(tree[x<<1].sumx, tree[x<<1|1].sumx);
    else tree[x].sumy = max(tree[x<<1].sumy, tree[x<<1|1].sumy);
}
int query(int x, int op, int l, int r){
    if(l <= tree[x].l && r >= tree[x].r){
        if(op == 1) return tree[x].sumx;
        else return tree[x].sumy;
    }
    int mid = tree[x].mid();
    if(l > mid) return query(x<<1|1, op, l, r);
    else if(r <= mid) return query(x<<1, op, l, r);
    else return max(query(x<<1, op, l, mid), query(x<<1|1,op, mid+1, r));
}

int main(){
    scanf("%d", &n);
    int tot = 1;
    for(int i=1; i<=n; i++){
        scanf("%d%d", &L[i], &R[i]);
        sum[tot++] = L[i];
        sum[tot++] = R[i];
    }
    sort(sum, sum + tot);
    build(1, 1, tot);
    ll ans = 0;
    for(int i=n; i>=1; i--){
        int u = L[i], v = R[i];
        L[i] = lower_bound(sum, sum+tot, L[i]) - sum + 1;
        R[i] = lower_bound(sum, sum+tot, R[i]) - sum + 1;
        int ny = query(1, 1, L[i], tot);
        int nx = query(1, 2, R[i], tot);
        ans += v - ny;
        ans += u - nx;
        update(1, 1, L[i], sum[R[i]-1]);
        update(1, 2, R[i], sum[L[i]-1]);
    }
    printf("%lld\n", ans);
    return 0;
}

H. Ryuji doesn't want to study(线段树)

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-------------"<<endl

typedef long long ll;
const ll maxn = 1e5+10;
const ll MAXN = 1e6+10;
const ll INF = 0x3f3f3f3f;
const ll MOD = 1e9+7;
const ll N = 1010;

ll n, q;
ll a[maxn];
struct node{
    ll l, r, val, ans;
    ll mid(){
        return (l + r) >> 1;
    }
}tree[maxn << 2];
void pushup(ll x){
    tree[x].val = tree[x<<1].val + tree[x<<1|1].val;
    tree[x].ans = tree[x<<1].ans + tree[x<<1|1].ans;
}
void build(ll x, ll l, ll r){
    tree[x].l = l; tree[x].r = r;
    if(l == r){
        tree[x].val = a[l];
        tree[x].ans = a[l] * (n-l+1);
        return ;
    }
    ll mid = tree[x].mid();
    build(x<<1, l, mid);
    build(x<<1|1, mid+1, r);
    pushup(x);
}
void update(ll x, ll pos, ll val){
    if(tree[x].l == tree[x].r){
        tree[x].val = val;
        tree[x].ans = val * (n-tree[x].l+1);
        return ;
    }
    ll mid = tree[x].mid();
    if(mid >= pos) update(x<<1, pos, val);
    else if(mid < pos) update(x<<1|1, pos, val);
    pushup(x);
}
ll ans1 = 0, ans2 = 0;
void query(ll x, ll l, ll r){
    if(tree[x].l >= l && tree[x].r <= r){
        ans1 += tree[x].ans;
        ans2 += tree[x].val;
        return ;
    }
    ll mid = tree[x].mid();
    if(mid >= l) query(x<<1, l, r);
    if(mid < r) query(x<<1|1, l, r);
}

int main(){
    while(scanf("%lld%lld", &n, &q) != EOF){
        for(ll i=1; i<=n; i++) scanf("%lld", &a[i]);
        build(1, 1, n);
        while(q--){
            ans1 = ans2 = 0;
            ll x, y, z;
            scanf("%lld%lld%lld", &x, &y, &z);
            if(x == 1){
                query(1, y, z);
                printf("%lld\n", ans1 - ans2*(n-z));
            }
            else{
                update(1, y, z);
            }
        }
    }
    return 0;
}

I. Characters with Hash

#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"-------------"<<endl

typedef long long ll;
const int maxn = 1e5+10;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int N = 1010;

int solve(int n){
    if(n==0) return 1;
    int ans = 0;
    while(n){
        n/=10;
        ans++;
    }
    return ans;
}
char s[MAXN];
int main(){
    int t;
    scanf("%d", &t);
    int n;
    char rt;
    while(t--){
        clr(s);
        scanf("%d %c", &n, &rt);
        scanf("%s", s);
        int cnt = 0, len = 0, pos = -1;
        for(int i=0; i<n; i++){
            if(s[i] != rt){
                pos = i;
                break;
            }
        }
        if(pos == -1) pos = n;
        for(int i=pos; i<n; i++){
            len = abs(s[i] - rt);
            if(i == pos) cnt += solve(len);
            else cnt +=2;
        }
        if(cnt == 0) cnt ++;
        cout << cnt << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/l18339702017/article/details/82557612