组队训练记录(5):2019ICPC香港

2022.10.2

在这里插入图片描述
在这里插入图片描述
6题 高罚时 , 呃呃。

B. Binary Tree

签到题,队友上来就秒了

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;

inline void solve(){
    int n = 0; cin >> n;
    for(int i = 1, u, v; i < n; i++) cin >> u >> v;
    if(n & 1) cout << "Alice\n";
    else cout << "Bob\n";
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; cin >> t;
    while(t--) solve();
    return 0;
}

D. Defining Labels

一个类似于进制转换的题目,题意给队友之后队友单切了。

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;

int k, x;

void dfs(int num){
    if(num > k) dfs((num - 1) / k);
    cout << (num % k ? num % k : k) + 9 - k;
}

vector<int>ans;
inline void solve(){
    ans.clear();
   cin >> k >> x;
    dfs(x);
    cout << endl;
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; cin >> t;
    while(t--) solve();
    return 0;
}

E. Erasing Numbers

依旧是队友!猜了个结论嗯冲冲过去了。我就提了一嘴对每个数分成01序列考虑。

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;

const int N = 5e3 + 10;

int a[N], tmp[N];
int n;

int check(int x){
    int cnt0 = 0, cnt1 = 0;
    for(int i = 1; i <= n; i++){
        if(i == x) continue;
        tmp[i] = (a[i] < a[x]) ? 0 : 1;
        tmp[i] == 0 ? cnt0++ : cnt1++;
    }
    int det = abs(cnt0 - cnt1);
    if(!det) return 1;
    int cnt = 0;
    for(int i = 1; i <= x - 1; i++){
        if(cnt0 > cnt1){
            if(tmp[i] == 0) cnt++;
            else cnt--;
        } else {
            if(tmp[i] == 1) cnt++;
            else cnt--;
        }
        cnt = max(cnt, 0ll);
        if(cnt == 3) cnt -= 2, det -= 2;
    }
    cnt = 0;
    for(int i = x + 1; i <= n; i++){
        if(cnt0 > cnt1){
            if(tmp[i] == 0) cnt++;
            else cnt--;
        } else {
            if(tmp[i] == 1) cnt++;
            else cnt--;
        }
        cnt = max(cnt, 0ll);
        if(cnt == 3) cnt -= 2, det -= 2;
    }
    return (det <= 0) ? 1 : 0;
}

inline void solve(){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) cout << check(i);
    cout << endl;
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; cin >> t;
    while(t--) solve();
    return 0;
}

G. Game Design

给队友题意之后过了一会儿队友就说想出来了。
按照二的次幂构造即可。

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
const int mod=1000000007;
const int N = 2e5 + 10,inf=1e9;
int f[200005],cnt;
int w[200005],x;
vector<int>p;
inline void solve(){
    cin>>x;
    if(x==1){
        cout<<2<<endl;
        cout<<1<<endl;
        cout<<1<<" "<<inf<<endl;
        return;
    }
    while(x){
        p.push_back(x%2);
        x/=2;
    }
    reverse(p.begin(),p.end());
    for(auto x:p){
        cnt++;
        f[cnt]=cnt-1;
    }
    for(int i=cnt;i;i--){
        if(p[cnt-i]){
            w[i]=cnt+1-i;
        }
        else{
            w[i]=inf;
        }
    }
    int nowcnt=cnt;
    for(int i=1;i<nowcnt;i++){
        cnt++;w[cnt]=1;f[cnt]=i;
        cnt++;w[cnt]=1;f[cnt]=cnt-1;
    }
    cout<<cnt<<endl;
    for(int i=2;i<=cnt;i++){
        cout<<f[i]<<" \n"[i==cnt];
    }
    for(int i=1;i<=cnt;i++){
        cout<<w[i]<<" \n"[i==cnt];
    }
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; //cin >> t;
    while(t--) solve();
    return 0;
}

I. Incoming Asteroids

一个经典的trick,如果一个元素会受多个因素影响可以均等的拆成多份,在任何一个因素达成条件之后可以暴力的ck是否满足全部条件。
这样的暴力复杂度是 O ( n l o g n ) O(nlogn) O(nlogn) 的,这题加上一个set维护,复杂度是 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)

注意这题有强制在线和输出末尾不能有空格的要求。

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
#define pii pair<int,int>
using namespace std;

const int N = 2e5 + 10;

set<pii>st[1000005];
int now[1000005];


int cnt;
vector<pii>p[200005];
int b[200005],need[200005],a[200005];

int n,m,last;

vector<int>ans;
inline void solve(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int op;cin>>op;
        if(op==1){
            cnt++;
            int k,x;cin>>a[cnt]>>k;
            a[cnt]^=last;
            for(int j=1;j<=k;j++){
                cin>>x;
                x^=last;
                p[cnt].push_back({x,now[x]});
            }
            need[cnt]=a[cnt]/k;
            if(need[cnt]==0)need[cnt]=1;
            for(auto [y,cao]:p[cnt]){
                st[y].insert({cao+need[cnt],cnt});
            }
        }
        else{
            ans.clear();
            int x,y;cin>>x>>y;
            x^=last;
            y^=last;
            now[x]+=y;
            int tot=0;
            while(st[x].size()){
                //if(++tot>5)break;
                //cout<<st[x].size()<<"???\n";
                auto [tmp,u]=*st[x].begin();
                //cout<<tmp<<" "<<u<<endl;
                //assert(tmp>now[x]);
                if(tmp<=now[x]){
                    for(auto [y,fk]:p[u]){
                        b[u]+=now[y]-fk;
                        st[y].erase({fk+need[u],u});
                    }
                    if(b[u]>=a[u]){
                        ans.push_back(u);
                    }
                    else{
                        need[u]=(a[u]-b[u])/p[u].size();
                        if(need[u]==0)need[u]=1;
                        for(auto &[y,cao]:p[u]){
                            cao=now[y];
                            st[y].insert({cao+need[u],u});
                        }
                    }
                }
                else{
                    break;
                }
            }
            cout<<ans.size();
            last=ans.size();
            sort(ans.begin(),ans.end());
            for(auto x:ans)cout<<" "<<x;
            cout<<endl;
        }
    }

}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; //cin >> t;
    while(t--) solve();
    return 0;
}

J. Junior Mathematician

经典数位dp,不过取模过多可能导致常数太大而tle35,注意常数即可。

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
//#define int long long
#define ll long long
#define endl '\n'
using namespace std;
const int mod=1000000007;
const int N = 2e5 + 10;
int fa[N], c[N],m;
string s,t;
vector<int>L,R;
int bs[100005];
ll dp1[5005][62][62],dp2[5005][62][62];
//表示后i个数字,f(x)-x为j,后缀数位和为k的方案数
//1是小于等于,2是大于
void cg(string &s,vector<int>&p){
    p.emplace_back(0);
    for(auto x:s){
        p.emplace_back(x-'0');
    }
}
void init(){
    cin>>s>>t>>m;
    L.clear();R.clear();
    cg(s,L);cg(t,R);
    bs[0]=1;
    for(int i=1;i<=5000;i++){
        bs[i]=bs[i-1]*10%m;
    }
}
ll dfs(vector<int>&p){
    int n=p.size()-1;
    for(int i=0;i<=n;i++){
        for(int j=0;j<m;j++){
            for(int k=0;k<m;k++){
                dp1[i][j][k]=dp2[i][j][k]=0;
            }
        }
    }
    dp1[n][0][0]=1;
    for(int i=n;i;i--){
        for(int t=0;t<=9;t++){
            for(int j=0;j<m;j++){
                for(int k=0;k<m;k++){
                    int nowk=k+t,nowj=(j+t*(k-bs[n-i]+m))%m;
                    if(nowk>=m)nowk%=m;
                    if(t>p[i]){
                        (dp2[i-1][nowj][nowk]+=dp1[i][j][k]+dp2[i][j][k])%=mod;
                    }
                    else if(t<p[i]){
                        (dp1[i-1][nowj][nowk]+=dp1[i][j][k]+dp2[i][j][k])%=mod;
                    }
                    else{
                        (dp2[i-1][nowj][nowk]+=dp2[i][j][k])%=mod;
                        (dp1[i-1][nowj][nowk]+=dp1[i][j][k])%=mod;
                    }
                }
            }
        }
    }
    ll ans=0;
    for(int i=0;i<m;i++){
        (ans+=dp1[0][0][i])%=mod;
    }
    return ans;
}
inline void solve(){
    init();
    int sum=0,res=0,fk=0;
    for(auto x:L){
        res=(res+sum*x)%m;
        (sum=sum+x)%=m;
        fk=(fk*10+x)%m;
    }
    //cout<<dfs(R)<<" !! "<<dfs(L)<<endl;
    cout<<(dfs(R)-dfs(L)+2*mod+(res==fk))%mod<<endl;
}

signed main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    int t = 1; cin >> t;
    while(t--) solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UIUC ICPC Spring Coding Contest 2019是UIUC(伊利诺伊大学厄巴纳-香槟分校)举办的一个编程比赛。UIUC ICPC Spring Coding Contest 2019是ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest)的一部分。ACM国际大学生程序设计竞赛是世界上最具影响力的大学生计算机竞赛之一,每年吸引了来自全球各地的大学生参与。这个比赛旨在培养学生的算法和编程技能,提供一个展示和交流的平台。参赛者需要在规定时间内解决一系列编程问题。 参加UIUC ICPC Spring Coding Contest 2019对于那些对算法和编程有兴趣的学生来说,是一个很好的学习和锻炼机会。比赛中的问题通常涉及各种算法和数据结构,要求参赛者能够用编程语言实现有效和高效的解决方案。参赛者可以通过解决问题来提高他们的算法和编程技能,并与其他参赛者交流和学习。 在准备UIUC ICPC Spring Coding Contest 2019之前,建议参赛者先掌握一些基本的编程知识和技能,如数据结构、算法、编程语言等。参赛者可以参考一些相关的教程和学习资料,如GeeksforGeeks和HackerEarth等网站提供的编程教程。此外,还可以参考一些竞赛经验分享的文章和博客,了解其他人是如何准备和参加编程比赛的。 总之,参加UIUC ICPC Spring Coding Contest 2019是一个很好的机会,可以提高算法和编程技能,与其他参赛者交流和学习。准备比赛前,建议参赛者掌握基本的编程知识和技能,并参考一些相关的教程和学习资料。祝你在比赛中取得好成绩!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Awesome Competitive Programming Awesome](https://blog.csdn.net/qq_27009517/article/details/86593200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值