bestcoder round 74 div2

随便看了一场以前的bestcoder,然后顺便写了一下,都不码的样子

有中文题面,这里就不写题目大意了

T1.

刚开始想复杂了,T1可能是4道题里面想的最久的

我们大概弄一下就可以发现,如果a[i]>0,并且a[i+1]满足条件,那么s[i]=s[i+1]

所以我们发现其实是一堆相同的弄在一起。

当然如果a[i]=0那么说明s[i]!=s[i-1],这样i就有25种选法,刚开始有26种选法

就是ans=26*25^(a[i]==0的个数)

我们考虑什么时候答案=0,显然a[i]!=0&&a[i]!=a[i+1]+1那么就不合法了

代码:

#include<bits/stdc++.h>
#define N 2000005
#define Mod 1000000007
using namespace std;
int n,T,ans,a[N];
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);n--;ans=26;
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);a[n+1]=0;
        for (int i=1;i<=n;i++)
            if (a[i]!=a[i+1]+1&&a[i]!=0) ans=0;
        for (int i=1;i<=n;i++)
            if (!a[i]) ans=1ll*ans*25%Mod;
        printf("%d\n",ans);
    }
    return 0;
}

T2.

因为只有3条边,显然不会重复走,最短路一定是正常走+走加入的三条路

那么只要枚举一下3条路的排列,然后方向判断一下,dfs就ok了

代码:

#include<bits/stdc++.h>
#define N 500005
#define Mod 1000000007
using namespace std;
int T,n,m,a[N],b[N],s,t,ans,sum;bool use[5];
void dfs(int now,int tot){
    if (tot+abs(now-t)<ans) ans=tot+abs(now-t);
    for (int i=1;i<=3;i++){
        if (use[i]) continue;
        use[i]=1;
        dfs(a[i],tot+1+abs(now-b[i]));
        dfs(b[i],tot+1+abs(now-a[i]));
        use[i]=0;
    }
}
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d%d",&n,&m);
        for (int i=1;i<=3;i++) scanf("%d%d",&a[i],&b[i]);
        for (int i=1;i<=m;i++){
            ans=1e9;scanf("%d%d",&s,&t);
            dfs(s,0);
            sum=(sum+1ll*i*ans%Mod)%Mod;
        }
        printf("%d\n",sum);sum=0;
    }
    return 0;
}

T3.

对于第一个操作,其实等价于xor一个2^x

其实原问题等价于求0-->S^T的最少操作次数

我们发现n<=15,所以我们对于a[i]暴力dfs求出用这些数组成的数的最小次数

dp[i]表示构成i的最小次数

然后考虑操作1

因为都是xor一个2的次方数,所以每一位都是相互独立的

如果x^3是最优的,那么x^1一定是最优的,然后x^1^2也随之一定是最优的

所以我们把x从0到15枚举一下

然后再枚举i的值,更新一下dp值即可

一般的位运算的题,都是先枚举次方再枚举i的

代码:

#include<bits/stdc++.h>
#define N 1000005
#define Mod 1000000007
using namespace std;
int T,n,m,s,t,ans,a[N],mp[N];
void dfs(int u,int dep,int sum){
    if (mp[sum]>dep) mp[sum]=dep;
    if (u==n+1) return;
    dfs(u+1,dep+1,sum^a[u]);
    dfs(u+1,dep,sum);
}
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d%d",&n,&m);
        memset(mp,127,sizeof(mp));
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);
        dfs(1,0,0);
        for (int j=0;j<=17;j++)
            for (int i=0;i<=(1<<18);i++)
                if (mp[i^(1<<j)]>mp[i]+1) mp[i^(1<<j)]=mp[i]+1;
        for (int i=1;i<=m;i++){
            scanf("%d%d",&s,&t);
            //cerr<<mp[s^t]<<endl;
            ans=(ans+1ll*mp[s^t]*i%Mod)%Mod;
        }
        printf("%d\n",ans);ans=0;
    }
    return 0;
}

T4.

感觉T2-T4都没啥难度,还是T1最难(┭┮﹏┭┮)<----弱

显然的贪心,如果当前剩下的点中最小的点能够通过删边来得到,那么就删那个条数

注意我们不用考虑删的是哪些边

因为这个点拓扑了,那么意味着从它出发的边都要删除,所以不用知道具体哪些,只要知道这个点是不是要删即可

然后用一个堆来维护一下点的大小值即可

代码:

#include<bits/stdc++.h>
#define N 2000005
#define Mod 1000000007
using namespace std;
int n,m,k,T,x,y,kk,head[N],ru[N];bool use[N],flag[N];
struct Edge{int nxt,to;}e[N];
priority_queue<int,vector<int>,greater<int> > Q;
inline void link(int x,int y){e[++kk].nxt=head[x];e[kk].to=y;head[x]=kk;}
int main(){
    scanf("%d",&T); 
    while (T--){
        scanf("%d%d%d",&n,&m,&k);
        memset(ru,0,sizeof(ru));
        kk=0;memset(head,0,sizeof(head));
        while (!Q.empty()) Q.pop();
        for (int i=1;i<=m;i++){
            scanf("%d%d",&x,&y);
            link(x,y);ru[y]++;
        }
        for (int i=1;i<=n;i++){
            if (ru[i]<=k) Q.push(i),flag[i]=0;
            else flag[i]=1;
        }
        long long ans=0,tot=0;
        while (!Q.empty()){
            while (ru[Q.top()]>k){flag[Q.top()]=1;Q.pop();}
            int x=Q.top();int y=ru[x];
            //printf("WTF%d\n",x);
            ru[x]=0;k-=y;
            Q.pop();ans=(ans+1ll*(++tot)*x%Mod)%Mod;
            for (int i=head[x];i;i=e[i].nxt){
                int v=e[i].to;
                if (ru[v]<=k+1&&ru[v]>0&&flag[v]){flag[v]=0;Q.push(v);}
                ru[v]--;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/ckr1225/p/9033220.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
### Codeforces Round 1028 (Div. 2) 题目概述 Codeforces Round 1028 (Div. 2) 是一场包含多个算法问题的比赛,涵盖了从简单到复杂的不同难度级别。以下是该比赛的部分题目内容及简要说明: #### A. Gellyfish and Flower 在本题中,有两个角色:Gellyfish 和 Flower。每个角色有两滴血量,分别用 \(a\) 和 \(c\) 表示 Gellyfish 的血量,用 \(b\) 和 \(d\) 表示 Flower 的血量[^3]。 获胜条件是攻击对方的最低血量,并比较双方的最低血量值。如果 Gellyfish 的最低血量小于 Flower 的最低血量,则 Gellyfish 获胜;否则,Flower 获胜。 #### B. Problem - B - Codeforces B 题的具体内容未完全提供,但通常涉及数组、字符串或其他数据结构的操作。可以参考比赛页面获取完整描述。 #### C. Rectangles C 题要求处理矩形的相关问题。具体来说,给定一些矩形的边长信息,需要判断某些条件是否满足。时间限制为每组测试用例 2 秒,内存限制为 256 MB[^2]。输入和输出均为标准格式,详细规则可参考比赛页面。 ### 示例代码(A 题) 以下是一个实现 A 题逻辑的 C++ 程序: ```cpp #include <iostream> #include <algorithm> using namespace std; int main() { int t; cin >> t; while (t--) { int a, b, c, d; cin >> a >> b >> c >> d; int mina = min(a, c); int minb = min(b, d); if (mina < minb) cout << "Flower" << endl; else cout << "Gellyfish" << endl; } } ``` 此代码通过多次循环读取输入并计算两个角色的最低血量,最终输出获胜者名称。 ### 注意事项 - 比赛中的所有题目均可以通过官方链接访问,例如 [Codeforces Round 1028 (Div. 2)](http://codeforces.com/contest/1028)[^2]。 - 每道题目的详细规则和样例输入输出可在对应页面找到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值