The 2021 ICPC Asia Regionals Online Contest (I)--A&D&G

A.线段树二分

#include<iostream>
#include<algorithm>
#include<cstring>
#define lson u<<1
#define rson u<<1|1
using namespace std;
typedef long long ll;
int n,m;
const int N=100010;
struct Node
{
    int l, r;
    ll mi;
}tr[N * 4];
int cnt[N];
void pushup(int u)
{
    tr[u].mi=min(tr[lson].mi,tr[rson].mi);
}
void build(int u, int l, int r)
{
    if (l == r) tr[u] = {l, r,0};
    else
    {
        tr[u] = {l, r,0};
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        // pushup(u);
    }
}
void update(int u,int x, ll d)
{
    if (tr[u].l== x&& tr[u].r==x)
    {
        tr[u].mi=d;
        cnt[x]++;
    }
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if (x <= mid) update(u << 1,x, d);
        else  update(u << 1 | 1,x, d);
        pushup(u);
    }
}

int query(int u, int l, int r,int v)
{
    if(tr[u].mi>v)return 1e9;
    if(r<l)return 1e9;
    if (tr[u].l==tr[u].r) return tr[u].l; 
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid ) {
             int x=query(u<<1,l,r,v);
             if(x!=1e9)return x;
        }
        if (r > mid){
            int x=query(u<<1|1,l,r,v);
            if(x!=1e9)return x;
        }
    }
    return 1e9;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    int res=0;
    build(1,1,n);
    for(int i=0;i<m;i++){
        ll a,b;
        cin>>a>>b;
        if(tr[1].mi>a)continue;
        else{
            int c=i%n;
            int x=query(1,c+1,n,a);
            if(x!=1e9){
                update(1,x,a+b);
               res=max(res,cnt[x]);
                continue;
            }
             x=query(1,1,c,a);
            if(x!=1e9){
                update(1,x,a+b);
                res=max(res,cnt[x]);
            }
        }
    }
    int op=0;
    for(int i=1;i<=n;i++)if(cnt[i]==res)op++;
    for(int i=1;i<=n;i++){
        if(cnt[i]==res){
            cout<<i-1;
            if(--op)cout<<' ';
        }
    }
    return 0;
}

D.差分+sort+set二分+贪心

#pragma G++ optimize(2)
#pragma G++ optimize(3)
#include <iostream>
#include <cstring>
#include<set>
#include <algorithm>
#define int long long
using namespace std;
typedef long long ll;
const int N=1e5+5;
int pos[N];
int n,m;
struct Node
{
    int l,r,c;
    bool operator <(Node x)const
    {
        return c<x.c;
    }
}node[N];
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T,k=0;
    cin>>T;
    while(++k<=T)
    {
        ll s=0;
        cin>>n>>m;
        int l,r,c;
        for(int i=1;i<=m;i++){
            cin>>l>>r>>c;
            node[i]={l,r,c};
            s=s+1ll*(r-l)*(r-l+1)/2*c;
            pos[l]++,pos[r+1]--;        
        }
        int t=0,f=0;
        cout<<"Case #"<<k<<": ";
        for(int i=1;i<=n;i++){
            t+=pos[i];
            if(t<1){
                cout<<"Gotta prepare a lesson";
                f=1;
                break;
            }
        }
        if(!f){
            sort(node+1,node+m+1);
            ll ss=0;
            set<int> op;
            for(int i=1;i<=n;i++)op.insert(i);
            for(int i=1;i<=m;i++){
                if(!op.size())break;
                auto L=lower_bound(op.begin(),op.end(),node[i].l);
                if(L==op.end())continue;
                auto R=upper_bound(op.begin(),op.end(),node[i].r);
                for(auto it=L;it!=R;it++){
                    ss+=node[i].c;
                }
                op.erase(L,R);
            }
            ss-=node[1].c;
            // cout<<ss<<"ss";
            cout<<s-ss;
        }
        if(k!=T)cout<<"\n";
        for(int i=1;i<=n+1;i++)pos[i]=0;
    }
    return 0;
}

G,trie+贪心

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;
const int N=1e5+5;
int tr[4*N][2];
int idx,n,q;
string res[4*N];
vector<string> op(256);
void init()
{
    for(int i=0;i<=255;i++){
        string p="";
        for(int j=7;j>=0;j--){
            if(i>>j&1)p+='1';
            else p+='0';
        }
        op[i]+=p;
    }
    
}
void insert(string s,string v,int c)
{
    int p=0;
    for(int i=0;i<c;i++){
        if(!tr[p][s[i]-'0'])tr[p][s[i]-'0']=++idx;
        p=tr[p][s[i]-'0'];
    }
    res[p]=v;
    return ;
}
string query(string s)
{
    string ans="";
    int p=0;
    for(int i=0;i<s.size();i++){
        if(tr[p][s[i]-'0']){
            p=tr[p][s[i]-'0'];
            if(res[p]!="")ans=res[p];
        }
        else break;
    }
    if(res[p]!="")ans=res[p];
    if(!ans.size())return "1.1.1.1";
    return ans;
}
string w(string s)
{
    string ans;
    int t=0;
    for(int i=0;i<s.size();i++){
        if(s[i]!='.'){
            t=t*10+(s[i]-'0');
        }
        else{
        ans+=op[t];t=0;
        } 
    }
    ans+=op[t];
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    init();
    cin>>n;
    string a,b;
    int c;
    for(int i=1;i<=n;i++){
        cin>>a>>c>>b;
        a=w(a);
        // cout<<a<<"\n";
        insert(a,b,c);
    }
    cin>>q;
    for(int i=1;i<=q;i++){
        cin>>a;
        a=w(a);
        // cout<<a<<"\n";
        cout<<query(a);
        if(i!=q)cout<<"\n";
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值