Codeforces Round #672 (Div. 2)

A - Cubes Sorting

冒泡排序交换次数等于逆序对数,严格降序需要交换n(n−1)2\frac{n(n-1)}{2}2n(n1)次才能升序排列,由此只需要判断原数组是否严格降序即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=500010;
int a[N];
int n;
int main()
{IO;int T=1;cin>>T;while(T--){bool ok=1;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(i>1&&a[i]>=a[i-1]) ok=0;}if(ok) cout<<"NO\n";else cout<<"YES\n";}return 0;
}

B - Rock and Lever

按位考虑,随便搞搞

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int N=500010;
int a[N];
int cnt[40];
int n;
int main()
{IO;int T=1;cin>>T;while(T--){bool ok=1;cin>>n;memset(cnt,0,sizeof cnt);for(int i=1;i<=n;i++){cin>>a[i];bool ok=1;for(int j=31;j>=0;j--)if(ok&&(a[i]>>j&1)){cnt[j]++;ok=0;break;}}ll res=0;for(int i=31;i>=0;i--)if(cnt[i])res+=1ll*cnt[i]*(cnt[i]-1)/2;cout<<res<<'\n';}return 0;
}

C1 - Pokémon Army (easy version)

不带修改,直接dp扫一遍。

状态表示:f(i,0)f_{(i,0)}f(i,0)考虑前iii个数,并且选择第iii个数状态是+f(i,1)f_{(i,1)}f(i,1)考虑前iii个数,并且选择第iii个数状态是-
状态转移:f(i,0)=max(f(i,0),f(k,1)+ai)f_{(i,0)}=max(f_{(i,0)},f_{(k,1)}+a_i)f(i,0)=max(f(i,0),f(k,1)+ai)f(i,1)=max(f(i,1),f(k,0)−ai)f_{(i,1)}=max(f_{(i,1)},f_{(k,0)}-a_i)f(i,1)=max(f(i,1),f(k,0)ai),(1<k<i1<k<i1<k<i)只需要在维护2个前缀最大值即可O(n)O(n)O(n)得到答案。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int N=300010;
const int INF=1e17;
ll a[N],f[N][2];
int n,q;
int main()
{IO;int T=1;cin>>T;while(T--){cin>>n>>q;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) f[i][0]=f[i][1]=-INF;f[0][0]=-INF;ll mmax0=-INF,mmax1=0;ll res=-INF;for(int i=1;i<=n;i++){f[i][0]=mmax1+a[i];f[i][1]=mmax0-a[i];mmax0=max(mmax0,f[i][0]);mmax1=max(mmax1,f[i][1]);res=max(res,max(f[i][0],f[i][1]));}cout<<res<<'\n';}return 0;
}

Pokémon Army (hard version)

用线段树维护fff数组即可,对于线段树每一个区间维护数组f[2][2]f[2][2]f[2][2]
f[0][0]f[0][0]f[0][0]表示序列开头+,结尾+
f[0][1]f[0][1]f[0][1]表示序列开头+,结尾-
f[1][0]f[1][0]f[1][0]表示序列开头-,结尾+
f[1][1]f[1][1]f[1][1]表示序列开头-,结尾-

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int N=300010;
const ll INF=1e17;
ll a[N];
int n,q;
// f[0][0] ++
// f[0][1] +-
// f[1][0] -+
// f[1][1] --
struct node
{int l,r;ll val;ll f[2][2];
}tree[N*4];
void pushup(int u)
{tree[u].val=-INF;for(int i=0;i<2;i++)for(int j=0;j<2;j++){tree[u].f[i][j]=max(tree[u<<1].f[i][j],tree[u<<1|1].f[i][j]);tree[u].f[i][j]=max(tree[u].f[i][j],max(tree[u<<1].f[i][0]+tree[u<<1|1].f[1][j],tree[u<<1].f[i][1]+tree[u<<1|1].f[0][j]));tree[u].val=max(tree[u].val,tree[u].f[i][j]);}
}
void build(int u,int l,int r)
{tree[u]={l,r};if(l==r){tree[u].val=a[l];tree[u].f[0][0]=a[l];tree[u].f[1][1]=-a[l];tree[u].f[0][1]=tree[u].f[1][0]=-INF;return;}int mid=l+r>>1;build(u<<1,l,mid);build(u<<1|1,mid+1,r);pushup(u);
}
void modify(int u,int p,int x)
{if(tree[u].l==tree[u].r){tree[u].val=x;tree[u].f[0][0]=x;tree[u].f[1][1]=-x;tree[u].f[0][1]=tree[u].f[1][0]=-INF;return;}int mid=tree[u].l+tree[u].r>>1;if(p<=mid) modify(u<<1,p,x);else modify(u<<1|1,p,x);pushup(u);
}
int main()
{IO;int T=1;cin>>T;while(T--){cin>>n>>q;for(int i=1;i<=n;i++) cin>>a[i];build(1,1,n);cout<<tree[1].val<<'\n';while(q--){int l,r;cin>>l>>r;modify(1,l,a[r]);modify(1,r,a[l]);cout<<tree[1].val<<'\n';swap(a[l],a[r]);}}return 0;
}

D - Rescue Nibel!

先上课去了,晚上回来写。第一次数组开小了还re了

先把每个区间的左端点和右端点拆开记录下来,然后排个序(注意:先按照位置排序,按照左端点优先原则排序)借用扫描线的思想扫描整个序列。
扫描的过程中,如果到一个左端点说明目前有一盏灯在此时刻点亮那么对答案的贡献就是在需要从前面点亮的灯中选择k−1k-1k1盏灯,维护前面点亮灯的数量只需要维护一个cnt即可,那么对答案的贡献即Ccntk−1C_{cnt}^{k-1}Ccntk1,然后更新cnt即可,如果扫描到一个右端点不难发现对答案没有贡献,只需要维护cnt即可。
计算Ccntk−1C_{cnt}^{k-1}Ccntk1的过程中由于既要取模又有除法需要提前预处理阶乘和逆元。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int N=300010;
const ll mod=998244353;
pii a[2*N];
int n,k;
ll qmi(ll a,ll b,ll p)
{ll res=1;while(b){if(b&1) res=res*a%p;b>>=1;a=a*a%p;}return res;
}ll fact[N],infact[N];
void init(int n)
{fact[0]=infact[0]=1;for(int i=1;i<=n;i++){fact[i]=fact[i-1]*i%mod;infact[i]=qmi(fact[i],mod-2,mod);}
}
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>k;init(n);for(int i=1;i<=n;i++){int l,r;cin>>l>>r;a[i].first=l,a[i].second=-1;//左端点a[i+n].first=r,a[i+n].second=1;//右端点}sort(a+1,a+1+2*n);ll res=0;ll cnt=0;for(int i=1;i<=2*n;i++){int p=a[i].first,id=a[i].second;if(id==-1){if(cnt>=k-1)res=(res+fact[cnt]*infact[k-1]%mod*infact[cnt-k+1]%mod)%mod;cnt++;}else cnt--;}cout<<res<<'\n';}return 0;
}

E - Battle Lemmings

我还是不会难的dp
whd大佬视频题解

为什么能用dp?
首先有一点非常重要:无论如何移动1,所有1的相对位置并不会改变。因此考虑答案的集合肯定是将这些1不改变相对位置的情况下排到某些位置,而代价即移动的步数可以通过原先位置和当前位置算出来,那么如果我们逐一考虑每一个1最终的位置不难发现这个问题是无后效性的。

如何算出答案?
最终要求算一个很奇怪的东西,就是两个0之间只要存在1的对数,发现非常难以计算,我们转化问题考虑反面:哪些0不会对答案有贡献?不难发现只要连续的0两两配对都不会对答案有贡献,我们只需要用总数目减去这些不满足的即可。

状态表示:f(i,j,k)f_{(i,j,k)}f(i,j,k)考虑前iii个位置,目前考虑了前jjj111的位置,代价即交换次数是kkk的集合。
状态转移:考虑第j+1j+1j+1111的位置,枚举i+1→ni+1\to ni+1n,进行答案更新,这里是向后更新未知状态。

时间复杂度:O(n5)O(n^5)O(n5),但是常数非常小,再加上cf强大的评测鸡,跑的并不慢155ms

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int N=83,INF=0x3f3f3f3f;
int f[N][N][N*(N-1)/2];
int n,a[N],pos[N],cnt1;
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]) pos[++cnt1]=i;}int m=n*(n-1)/2;memset(f,0x3f,sizeof f);f[0][0][0]=0;for(int i=0;i<=n;i++)for(int j=0;j<cnt1;j++)for(int k=0;k<=m;k++){if(f[i][j][k]>=INF) continue;for(int p=i+1;p<=n;p++){int now=abs(p-pos[j+1]);if(now+k>m) continue;int cost=max(p-i-1,0)*max(p-i-2,0)/2;if(j+1==cnt1) cost+=(n-p)*(n-p-1)/2;f[p][j+1][k+now]=min(f[p][j+1][k+now],f[i][j][k]+cost);}}int cnt0=n-cnt1;for(int i=0;i<=m;i++){int res=INF;for(int j=1;j<=n;j++){if(i) f[j][cnt1][i]=min(f[j][cnt1][i],f[j][cnt1][i-1]);res=min(res,f[j][cnt1][i]);}if(!cnt1) cout<<0<<' ';else cout<<cnt0*(cnt0-1)/2-res<<' ';}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6134-[JSOI2015]最小表示【bitset,拓扑排序】

正题 题目链接:https://www.luogu.com.cn/problem/P6134 题目大意 给出一张nnn个点mmm条边的DAGDAGDAG。求联通情况不变的情况下最多删除几条边。 1≤n≤3104,0≤M≤1051\leq n\leq 3\times 10^4,0\leq M\leq 10^51≤n≤3104,0≤M≤105 解题思路 拓扑排序后&#xff0c;如果…

【每日一题】8月17日题目精讲-[SCOI2009]生日礼物

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 小西有一条很长的彩带&#xff0c;彩带上挂着各式各样的彩珠。已知彩珠有N个&#xff…

纪中A组模拟赛总结(2021.7.21)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4383838lyflyflyf393939363636000000333总结 T1发现数据很小可以直接暴力&#xff0c;就暴力求出所有方案数&#xff0c;然后堆排了一下 然后看到T2&#xff0c;发现不会 看着T3以为就是两种状态的最短…

Followme Devops step by step

接着上次分享的devops历程[Followme Devops实践之路], 大家希望能够出一个step by step手册, 那今天我就来和手把手来一起搭建这么一套环境, 演示整个过程!实验环境需要准备docker /docker compose建议大家使用国外的vps学习, 不需要考虑网络/gwf的问题/方便(本demo搭建在linod…

Codeforces Round #673 (Div. 2)——待补 E

由于开学了&#xff0c;一般晚上就不打cf了&#xff08;太晚了&#xff0c;寝室不太适合打&#xff09;&#xff0c;而且赛后也懒得vp&#xff0c;有时候会在图书馆口胡题目&#xff0c;然后回寝室补一补&#xff0c;不过我也写得太久了吧&#xff0c;很多细节疯狂wa A - Copy…

【每日一题】8月25日题目精讲 XOR-pyramid

文章目录题目描述&#xff1a;题解&#xff1a;代码&#xff1a;题目描述&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/problem/112798 来源&#xff1a;牛客网 输入描述: 输出描述: Print q lines — the answers for the queries. 示例1 输入 复制 3 8 4 1…

AT3611-Tree MST【点分治,最小生成树】

正题 题目链接:https://www.luogu.com.cn/problem/AT3611 题目大意 给出nnn个点的一棵树。 现在有一张完全图&#xff0c;两个点之间的边权为wxwydis(x,y)w_xw_ydis(x,y)wx​wy​dis(x,y)&#xff08;disdisdis表示树上距离&#xff09; 求这张完全图的最小生成树。 2≤n≤…

【LCT】大融合(luogu 4219)

正题 luogu 4219 题目大意 给你一棵树&#xff08;初始都无连边&#xff09;&#xff0c;让你进行以下操作&#xff1a; 1.连接两个点 2.查询一条边被多少条路径经过 解题思路 因为有边的修改&#xff0c;可以用LCT来维护这棵树 一条边的经过次数&#xff0c;就相当于连接…

申请Office 365一年免费的开发者账号攻略(2018年10月份版本)

要进行Office 365开发&#xff0c;当然需要有完整的Office 365环境才可以。为了便于广大开发人员快速地启动这项工作&#xff0c;微软官方给所有开发人员提供了免费的一年开发者账号那么如何申请Office 365一年免费的开发者账号呢&#xff1f;网上已经有一些攻略了&#xff0c;…

Codeforces Round #674 (Div. 3)

突如其来的div3&#xff0c;赛后打了一下。 A - Floor Number 数学题答案是1⌈n−2x⌉1\lceil \frac{n-2}{x} \rceil1⌈xn−2​⌉ #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm&…

【每日一题】8月28日题目精讲 编号

【每日一题】8月28日题目精讲 编号 链接&#xff1a;https://ac.nowcoder.com/acm/problem/19925 来源&#xff1a;牛客网 题目描述 你需要给一批商品编号&#xff0c;其中每个编号都是一个7位16进制数&#xff08;由0~9, a-f组成&#xff09;。为了防止在人工处理时不小心把编…

P4321-随机漫游【状压dp,数学期望,高斯消元】

正题 题目链接:https://www.luogu.com.cn/problem/P4321 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;qqq次询问。 每次询问给出一个点集和一个起点&#xff0c;求从起点出发随机游走经过所有点集的期望步数。 n∈[1,18],m∈[1,n(n−1)2],q∈[1,105]n\in[1,18],m\i…

开源若要天下闻,掌声须给教育人

引子故事一当我们介绍 Linux Kernel 项目历史的时候&#xff0c;我们会如此说&#xff1a;“1991 年&#xff0c;赫尔辛基大学的大学生 Linus torvald, 在自己的电脑上开发了一个能够运行在 X86 架构上的操作系统&#xff0c;并将它发布在互联网上&#xff0c;任何人都可以参与…

纪中A组模拟赛总结(2021.7.22)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4141414lyflyflyf101010000101010000000总结 T1明显状压&#xff0c;求方案感觉可以用容斥&#xff0c;但又发现假了&#xff0c;就跳过了 T2想找找有没有规律&#xff0c;就把表打了出来&#xff0c;但…

【模板】线性基

ACM模板 文章目录构造线性基线性基模板操作线性基相关题目学习线性基可考虑以下大佬博客 知乎Pecco博客 博客园Kaori博客 menci博客 肖然博客 从线性代数谈线性基&#xff08;有点硬核&#xff09; 构造线性基 普通插入&#xff1a; 不能保证除了主元上其他线性基元素该位置为…

【每日一题】8月27日题目精讲 Is It A Tree?

链接&#xff1a;https://ac.nowcoder.com/acm/problem/105905 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 10000K&#xff0c;其他语言20000K 64bit IO Format: %lld 题目描述 A tree is a well-known data struct…

YbtOJ#631-次短路径【左偏树,最短路】

正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/1 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;对于每个点iii求不经过i∼1i\sim 1i∼1的最短路的第一条边的情况下iii到111的最短路 数据保证这条边唯一 n∈[1,105],m∈[1,2105],c∈[1,103]n\in[1,10^…

好代码是管出来的——使用Jenkins搭建CI服务器

Jenkins是一个开源的跨平台的CI工具&#xff0c;它可以部署在Windows、Linux等平台上&#xff0c;并且Jenkins提供了非常丰富的插件来帮助完成编译、测试、部署等工作。  本文将介绍在Windows平台上使用Jenkins完成.Net Core应用的持续集成环境搭建&#xff0c;其主要内容有&…

牛客练习赛 59

A.小乔和小灰灰 前几天刚刚学了序列自动机&#xff0c;这题直接也没咋想暴力的做法&#xff0c;直接上序列自动机匹配子序列即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm&…

【图论】清理牛棚/Cleaning Shifts S(luogu 4644)

正题 luogu 4644 题目大意 给你一段时间&#xff0c;有n头奶牛&#xff0c;第i头可以花费sis_isi​的代价清理lil_ili​到rir_iri​&#xff0c;问你清理完所有时间段的最小代价 解题思路 所有点需求都为1的线性规划&#xff0c;直接代入最短路就可以了 code #include<q…