Codeforces Round #665 (Div. 2)

2020/8/21 晚上打完球就22:10了,愣是没报上名(cf打不开,然后就做了一下赛后交的过了3个题

A - Distance and Axis

数学题分类讨论一下即可

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
int n,k;
int main()
{IO;int T;cin>>T;while(T--){cin>>n>>k;int res=0;if(k>n){res+=k-n;}else{if(k%2!=n%2) res++;}cout<<res<<endl;}return 0;
}

B - Ternary Sequence

贪心,先让第一个序列的2找第二个序列的1配对(加分), 然后看看第一个序列的1先找第二个序列的0和1配对(分数不变),最后找第二个序列2配对(减分)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll x,y,z;
ll a,b,c;
int main()
{IO;int T;cin>>T;while(T--){cin>>x>>y>>z;cin>>a>>b>>c;ll res=0;res+=2*min(z,b);y-=a;y-=b-min(z,b);if(y>0) res-=2*y;cout<<res<<endl;}return 0;
}

C - Mere Array

这题是个脑筋急转弯。首先先找到数组中最小的数mina如果想要交换两个数,那么两个数的最大公因数必须是mina,然后可以先把原数组排序不妨记作数组b[],如果a[i]!=b[i]说明原数组中该位置的值需要交换位置,那么这个数必须是mina的倍数,并且只要是这个数的倍数就一定能交换(我们可以考虑让它和mina所在位置交换)。因此只要位置不正确的数全都是mina的倍数就可以满足题意。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=200010;
int a[N],b[N];
int n;
int main()
{IO;int T;cin>>T;while(T--){cin>>n;int mina=1e9+1;for(int i=1;i<=n;i++) {cin>>a[i];b[i]=a[i];mina=min(mina,a[i]);}sort(b+1,b+1+n);bool ok=1;for(int i=1;i<=n;i++)if(a[i]!=b[i]&&a[i]%mina!=0) {ok=0;break;}if(ok) cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;
}

D - Maximum Distributed Tree

贪心:可以考虑统计每条边通过的次数,然后通过次数多的分配边权最大。
如何统计每条边通过次数?
考虑树中的一条边,如果将该边去掉将会分成两部分,可以统计该两部分的点的数量,该边的通过次数即两部分相乘一部分点数为sz那么另一部分即为n-sz那么该边通过次数即sz*(n-sz)。跑一个dfs即可统计出来。
目前有n-1条边待分配边权,有m个边权值,如果m>n-1,把前几个大数乘起来(保证所有边权乘起来等于k)分配给经过边数最多的那条边。如果m==n-1那么就一个边一个数贪心经过次数多的边权重大。如果m<n-1最后几条边权重是1。
(之前没考虑m>n-1这种情况wwwsTO)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=100010,M=2*N;
int n,m;
int h[N],e[M],ne[M],idx;
vector<ll>w;
ll sz[N],p[N];
void add(int a,int b)
{e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
void dfs(int u,int fa)
{sz[u]=1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;dfs(j,u);sz[u]+=sz[j];w.push_back(1ll*sz[j]*(n-sz[j]));}
}
void init(int n)
{for(int i=0;i<=n;i++) h[i]=-1;w.clear();idx=0;
}
int main()
{IO;int T;cin>>T;while(T--){cin>>n;init(n);for(int i=1;i<n;i++){int a,b;cin>>a>>b;add(a,b);add(b,a);}cin>>m;for(int i=0;i<m;i++) cin>>p[i];sort(p,p+m);reverse(p,p+m);dfs(1,-1);sort(w.begin(),w.end());reverse(w.begin(),w.end());ll res=0;if(m<=w.size()){for(int i=0;i<m;i++) res=(res+1ll*(w[i]%mod*p[i]%mod))%mod;for(int i=m;i<w.size();i++) res=(res+w[i])%mod;}else{int k=m-w.size();res=w[0]%mod;for(int i=0;i<=k;i++) res=res*p[i]%mod;for(int i=k+1;i<m;i++) res=(res+w[i-k]%mod*p[i]%mod)%mod;}cout<<res<<endl;}return 0;
}

F-Reverse and Swap

F题Reverse and Swap
留个坑,回来补这题数据结构
2020/8/23补
方法一:
首先这题单点修改,区间查询无疑线段树可以做。
考虑如何进行区间交换?
由于数组线段树固定做儿子和右儿子的下标父节点 u 左孩子u<<1 右孩子u<<1|1,传统方式不宜进行区间交换,因此采用指针方式记录左右孩子(主席树方式)那么区间交换直接交换左右孩子即可,而区间反转则是递归交换左右子树直到叶子节点。
尝试用懒标极维护区间操作:lazy看成一个二进制数(状态压缩),对于一个节点如果lazy^id!=0说明id中的1所在的位置lazy中也是1那么表示需要该节点的左右子树。
于是区间反转则是在根节点直接打上标记tree[root].lazy^=(1<<(k+1))-1;
区间交换则tree[root].lazy^=1<<(k+1);
参考大佬题解

// [1 2 3 4        5 6 7 8]           1000   id:3
// [1 2 3 4]      [5 6 7 8]           0100   id:2
// [1 2] [3 4]  [5 6] [7 8]           0010   id:1 
// [1][2][3][4][5][6][7][8]           0001   id:0
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<vector>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=(1<<18)+10;
int n,q;
ll a[N];
struct node
{int l,r;ll s;int id,lazy;
}tree[40*N];
int cnt,root;
void pushup(int u)
{tree[u].s=tree[tree[u].l].s+tree[tree[u].r].s;
}
void pushdown(int u)
{if(tree[u].id&tree[u].lazy){swap(tree[u].l,tree[u].r);tree[u].lazy^=tree[u].id;}tree[tree[u].l].lazy^=tree[u].lazy;tree[tree[u].r].lazy^=tree[u].lazy;tree[u].lazy=0;}
void build(int &u,int l,int r)
{u=++cnt;tree[u].id=r-l+1;tree[u].lazy=0;if(l==r){tree[u].s=a[l];return;}int mid=l+r>>1;build(tree[u].l,l,mid);build(tree[u].r,mid+1,r);pushup(u);
}
void modify(int u,int l,int r,int pos,int x)
{if(l==r){tree[u].s=x;return;}pushdown(u);int mid=l+r>>1;if(pos<=mid) modify(tree[u].l,l,mid,pos,x);else modify(tree[u].r,mid+1,r,pos,x);pushup(u);
}
ll query(int u,int l,int r,int vl,int vr)
{if(vl<=l&&r<=vr) return tree[u].s;pushdown(u);int mid=l+r>>1;ll v=0;if(vl<=mid) v+=query(tree[u].l,l,mid,vl,vr);if(vr>mid) v+=query(tree[u].r,mid+1,r,vl,vr);pushup(u);return v;
}
void rev(int k)
{tree[root].lazy^=(1<<(k+1))-1;if(tree[root].id&tree[root].lazy){swap(tree[root].l,tree[root].r);tree[root].lazy^=tree[root].id;}
}
void swp(int k)
{tree[root].lazy^=1<<(k+1);if(tree[root].id&tree[root].lazy){swap(tree[root].l,tree[root].r);tree[root].lazy^=tree[root].id;}
}
int main()
{IO;cin>>n>>q;for(int i=1;i<=1<<n;i++) cin>>a[i];build(root,1,1<<n);while(q--){int op,x,y;cin>>op;if(op==1){cin>>x>>y;modify(root,1,1<<n,x,y);}else if(op==2){cin>>x;rev(x);}else if(op==3){cin>>x;swp(x);}else {cin>>x>>y;cout<<query(root,1,1<<n,x,y)<<endl;}}return 0;
}

看standing发现了一个神奇的做法自己写一下
方法二:
把线段树看成一层一层的,可以发现反转和交换操作都是在同层进行,因此可以以层数记录lazy,方法一是用swap操作实现reverse操作,同样其实也可以用reverse操作实现swap:可以先把上一层每个区间进行reverse然后把该层的每个区间再reverse实际上实现的就是swap操作。
之前说过传统线段树不宜进行区间反转等操作,这个方法秒在不进行区间反转操作,只记录每层的区间是否需要进行反转,仅仅在查询和更改时候进行相应的坐标变化即可。

// [1 2 3 4        5 6 7 8]   level:3
// [1 2 3 4]      [5 6 7 8]   level:2
// [1 2] [3 4]  [5 6] [7 8]   level:1
// [1][2][3][4][5][6][7][8]   level:0
// 区间交换 level=2 只需要先反转level=3 然后再反转level=2即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<vector>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=(1<<18)+10;
int n,q;
int b[20];
ll a[N];
struct node
{int l,r,level;ll val;
}tree[4*N];
void pushup(int u)
{tree[u].val=tree[u<<1].val+tree[u<<1|1].val;
}
void build(int u,int l,int r,int level)
{tree[u]={l,r,level};if(l==r){tree[u].val=a[l];return;}int mid=l+r>>1;build(u<<1,l,mid,level-1);build(u<<1|1,mid+1,r,level-1);pushup(u);
}
void modify(int u,int pos,int x)
{if(tree[u].l==tree[u].r){tree[u].val=x;return;}if(b[tree[u].level]) pos=tree[u].r-(pos-tree[u].l);int mid=tree[u].l+tree[u].r>>1;if(pos<=mid) modify(u<<1,pos,x);else modify(u<<1|1,pos,x);pushup(u);
}
ll query(int u,int l,int r)
{if(tree[u].l==l&&r==tree[u].r) return tree[u].val;int lnow=l,rnow=r;if(b[tree[u].level]){lnow=tree[u].r-(r-tree[u].l);rnow=tree[u].r-(l-tree[u].l);}ll v=0;int mid=tree[u].l+tree[u].r>>1;if(rnow<=mid) v+=query(u<<1,lnow,rnow);else if(lnow>mid) v+=query(u<<1|1,lnow,rnow);else{v+=query(u<<1,lnow,mid);v+=query(u<<1|1,mid+1,rnow);}return v;
}
int main()
{cin>>n>>q;for(int i=1;i<=1<<n;i++) cin>>a[i];build(1,1,1<<n,n);while(q--){int op,x,y;cin>>op;if(op==1){cin>>x>>y;modify(1,x,y);}else if(op==2){cin>>x;b[x]^=1;}else if(op==3){cin>>x;b[x]^=1;b[x+1]^=1;}else {cin>>x>>y;cout<<query(1,x,y)<<endl;}}return 0;
}

要加油哦~

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

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

相关文章

【每日一题】7月20日题目精讲—着色方案

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 有n个木块排成一行&#xff0c;从左…

COSCon'18 面向全宇宙招募志愿者啦!

2018 中国开源年会&#xff08;COSCon18-China Open Source Conference 2018) 志愿者招募工作今日正式启动&#xff01;我们诚挚地欢迎开源社区的朋友们及高校的同学们加入志愿工作者团队&#xff0c;与国内外众多开源项目基金会、公司、大神等齐聚一堂&#xff0c;共襄盛举。招…

CF346E-Doodle Jump【类欧】

正题 题目链接:https://www.luogu.com.cn/problem/CF346E 题目大意 给出a,n,p,ha,n,p,ha,n,p,h&#xff0c;在每个ax%p(x∈[0,n])ax\%p(x\in[0,n])ax%p(x∈[0,n])的位置有一个关键点&#xff0c;询问是否所有相邻关键点之间的距离都不超过hhh。 解题思路 没怎么写过类欧&…

【AC自动机】病毒代码(ybtoj AC自动机-5)

正题 ybtoj AC自动机-5 题目大意 给出若干段01串&#xff0c;问你是否存在一个无限的01串&#xff0c;使得串中不存在给出的01串 解题思路 可以把给出01串用AC自动机处理&#xff0c;然后对每个01串的最后一位打上标记 根据AC自动机的连边性质&#xff08;即若无该边&#…

AtCoder Beginner Contest 176总结

由于打球又鸽了一场&#xff0c;快开学了好好打球&#xff01;&#xff01;&#xff01;&#xff08;狗头 还是补一补 A - Takoyaki 签到题 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<a…

讲重点,看趋势——Microsoft Ignite 2018的回顾和展望

一年一度的微软技术大会——Microsoft Ignite 2018上周在奥兰多召开&#xff0c;目前已经落下帷幕。我没有去现场&#xff0c;但据说这次的盛况空前&#xff0c;创下微软之最。确实&#xff0c;这些年来&#xff0c;微软内部非常重视 Iginte&#xff0c;上至最高管理层&#xf…

P4590-[TJOI2018]游园会【dp套dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4590 题目大意 给出一个长度为mmm的字符串sss。 对于每个k∈[0,m]k\in[0,m]k∈[0,m]求有多少个长度为nnn的字符串满足与sss的最长公共子序列长度为kkk且不包含NOINOINOI这一个子串。 可用字符集是{N,O,I}\{N,O,I\}{N,O,I} 解…

【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)

正题 luogu 2605 金牌导航 数据结构优化DP-2 题目大意 有若干个村庄在一条直线上&#xff0c;距离第一个村庄did_idi​&#xff0c;在该村庄建立基站要花费cic_ici​&#xff0c;如果在离该村不大于sis_isi​的范围内有一个基站&#xff0c;那么该村会被信号覆盖&#xff0c;…

Fake Maxpooling(2020多校第二场F)

Fake Maxpooling&#xff08;2020多校第二场F&#xff09; 文章目录题意&#xff1a;题解&#xff1a;代码&#xff1a;题意&#xff1a; 一个n * m的矩阵&#xff0c;第i行第j列的值是lcm&#xff08;i&#xff0c;j&#xff09;&#xff0c;然后给定一个 k * k的子矩阵&…

Educational Codeforces Round 94 (Rated for Div. 2)

这次做了ABCD&#xff0c;今天下午就要上学去了溜了溜了&#xff0c;早上起来补的题解。 A - String Similarity 分析可知可构造w[i]s[2*i]即可满足题意 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<string> #in…

算法工程师的危机

本文为沙漠之鹰第68篇原创文章9月20号讯飞AI同传语音造假的新闻刷爆科技圈&#xff0c;科大讯飞股价应声下跌3.89%&#xff08;不是65.3%&#xff0c;标题党文章害死人&#xff09;。 吃瓜群众纷纷感慨&#xff0c;有多少人工&#xff0c;就有多少智能。小编偷换概念玩的溜AI概…

Cover the Tree(2020多校第二场C)

Cover the Tree 文章目录题意&#xff1a;题解&#xff1a;代码题意&#xff1a; 一个无向树&#xff0c;选择最少数量的链子&#xff0c;能将树上所有边覆盖&#xff0c;答案不唯一 (1≤n≤2105&#xff09; 链子就是两点之间的边 看看样例 输入 5 1 2 1 3 2 4 2 5输出 2 2…

【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)

正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点&#xff0c;让你选择若干点&#xff0c;连接x坐标相邻的点&#xff0c;其中连续上升或下降的为一段&#xff0c;问你有多少中选择方案&#xff0c;使得段数为k 解题思路 设fi,j,0/1f_{i,j,0/1}fi,j,0/1​为到第i个点…

AtCoder Beginner Contest 177总结

回学校第一次打AtCoder&#xff0c;感觉晚上在寝室打不在状态~~ A - Don’t be late 数学题签到 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const in…

[模板]多项式全家桶小记(求逆,开根,ln,exp)

前言 这里的全家桶目前只包括了ln,exp,sqrtln,exp,sqrtln,exp,sqrt。还有一些类似于带余数模&#xff0c;快速幂之类用的比较少的有时间再更&#xff0c;NTTNTTNTT这种前置知识这里不多说。 还有一些基本的导数和微积分内容要了解&#xff0c;建议不懂的可以先去翻翻高二数学…

牛客网【每日一题】7月21日题目精讲—区间权值

来源&#xff1a;牛客网&#xff1a; 区间权值 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 1048576K&#xff0c;其他语言2097152K 64bit IO Format: %lld题目描述 输入描述: 第一行一个正整数 n 第二行 n 个正整数 a1…an 第三行 n 个正…

【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)

正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币&#xff0c;第i个金币tit_iti​时在wiw_iwi​出现&#xff08;只出现一个单位时间&#xff09;&#xff0c;价值为sis_isi​&#xff0c;当你tit_iti​时在wiw_iwi​&#xff0c;就能获得该金币…

Codeforces Round #666 (Div. 2)

哎太菜了就做出2个题掉了19分~~ A - Juggling Letters 统计一下每个字母出现的次数&#xff0c;由于最后要平均分配到每个数组中那么每个字母出现次数应该是n的倍数 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<string> #include<iost…

C# 函数式编程:LINQ

一直以来&#xff0c;我以为 LINQ 是专门用来对不同数据源进行查询的工具&#xff0c;直到我看了这篇十多年前的文章&#xff0c;才发现 LINQ 的功能远不止 Query。这篇文章的内容比较高级&#xff0c;主要写了用 C# 3.0 推出的 LINQ 语法实现了一套“解析器组合子&#xff08;…

【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米&#xff0c;给出高度&#xff0c;你可以选择一个区间&#xff0c;使这个区间的玉米高度1&#xff0c;你可以进行k次这样的操作&#xff0c;查询你操作完后最长不下降子序列最大值 代码 对于选择区间[l,r]&…