Codeforces Round #698 (Div. 2)

B题
题意:定义一个牛逼的数是这个数十进制中至少包含一个数d。
现在给定d和若干询问,每个询问一个x,问x能否分解成若干d构成的牛逼的数之和。
看起来挺难搞的,不能快速的判断是否是牛逼的数而且也不能很好的挑选合适的数组成x。那么我们不妨就把这个数拆成 a%d + a/d*d ,这样只需要判断a%d变成牛逼数加的d的最少数量,让后跟a/d比较一下大小就可以了。这个东西是可以预处理出来的,具体可以看代码。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int f[20][20];bool check(int x,int d)
{while(x){if(x%10==d) return true;x/=10;}return false;
}void init()
{for(int i=1;i<=9;i++){for(int j=1;j<=9;j++){int sum=i,cnt=0;while(!check(sum,j)) sum+=j,cnt++;f[i][j]=cnt;}}
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);init();int _; cin>>_;while(_--){int q,d; scanf("%d%d",&q,&d);while(q--){int x; scanf("%d",&x);int a=x%d,b=x/d;if(f[a][d]<=b) puts("YES");else puts("NO");}}return 0;
}
/**/

C题
题意:
在这里插入图片描述
数组a是一个特定的数组,对于每个数 a 都有一个相反数 - a 。让后定义 d 为上面的式子,我们发现对于每个数他的相反数和这个数的 d 是相同的,所以我们只需要先排序检查一下是否符合,让后处理正数即可。化简式子可得
在这里插入图片描述
让后 an 可以直接算出来,依次递推 a ( n - 1 ) ,让后检查是否符合即可。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
LL a[N],d[N];bool check()
{for(int i=1;i<=n*2;i+=2) if(d[i]!=d[i+1]) return false;if(d[n*2]%(n*2)!=0) return false;a[n]=d[n*2]/(n*2);for(int i=n-1;i>=1;i--){LL x=d[i*2+1],y=d[i*2];if((x-y)%(2*i)!=0) return false;a[i]=a[i+1]-(x-y)/(2*i);if(a[i]>=a[i+1]||a[i]<=0) return false;}return true;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);int _; scanf("%d",&_);while(_--){scanf("%d",&n);for(int i=1;i<=n*2;i++) scanf("%lld",&d[i]);sort(d+1,d+1+n*2);if(!check()) puts("NO");else puts("YES");}return 0;
}
/**/

D.

题意:
给定一个数组,可以做无数次操作,每次操作任选两个数 x 和 y,让后在后面添加 2 * x - y。问能否得到k。
我们把 2 * x - y 拆成 x + ( x - y ) ,这样就相当于在一个数后面加上这个数与任意数的差。既然这样我们可以思考能否通过一个选定的数,让后加上这个数与其他数的差来得到 k 呢?所以我们多写几组就可以发现每个数都可以写成 ah+∑i,j(ai−aj)a_h + \sum_{i,j} (a_i-a_j) ah+i,j(aiaj)
其中 i j 是任选的两个数。那么我们的 k 也是可以写成这种形式的,换句话说就是ah+∑i,j(ai−aj)=ka_h + \sum_{i,j} (a_i-a_j) = kah+i,j(aiaj)=k
我们需要移一下项∑i,j(ai−aj)=k−ah\sum_{i,j} (a_i-a_j) = k - a_hi,j(aiaj)=kah
现在我们考虑如何确定 h i j 呢?我们可以发现对于每一个数我们都可以通过两次操作变成另一个。比如我们现在有 ana_nan,让后我们需要得到a1a_1a1。我们只需要先得到an+(an−a1)a_n+(a_n-a_1)an+(ana1),让后an+(an−(an+(an−a1)))a_n+(a_n-(a_n+(a_n-a_1)))an+(an(an+(ana1)))即可得到a1a_1a1。所以我们可以把 aja_jajaha_hah 统一成 a1a_1a1 ,让后就得到如下式子∑i,1(ai−a1)=k−a1\sum_{i,1} (a_i-a_1) = k - a_1i,1(aia1)=ka1,让后显然有解的条件是(k−a1)modgcd⁡(ai,a1)==0(k-a_1) \bmod \gcd(a_i,a_1) == 0(ka1)modgcd(ai,a1)==0,让后一层循环跑一遍就可以啦。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N];int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);int _; scanf("%d",&_);while(_--){LL k; scanf("%d%lld",&n,&k);LL gd=0,first=-1000000000000000001;for(int i=1;i<=n;i++){LL x; scanf("%lld",&x);if(first==-1000000000000000001) first=x;else gd=__gcd(gd,x-first);}if((k-first)%gd==0) puts("YES");else puts("NO");}return 0;
}
/**/

E.
题意:给定两个串 a b,让后有q个操作,每个操作对应一个区间,让后你首先需要检查这个区间是否全为0或1,如果不是就退出。否则你可以选择修改严格小于 长度 / 2 个数。问最终能否使 a 变成 b 。
正着来很难想,因为每次都需要先看是否全为0或者1,让后修改,而且修改还需要顾及下面的操作能否满足全为0或1,所以我们考虑全部反着来。反着来也就是由b到a,每次先修改严格小于 长度 / 2 个数,让后使其全为0或1。这样就很简单了,每次只需要修改数量少的哪个就可以了,需要特判一下两者相等的情况,这样的话不能修改直接输出No即可。最后检查一下是否变成了a就行啦。
对于两个操作直接用线段树维护就好啦,线段树的基本操作了。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=200010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
char st[N],ed[N];
PII q[N];
struct Node
{int l,r;int sum,lazy;
}tr[N<<2];void pushup(int u)
{tr[u].sum=tr[L].sum+tr[R].sum;
}void pushdown(int u)
{if(tr[u].lazy==-1) return;tr[L].lazy=tr[u].lazy;tr[R].lazy=tr[u].lazy;tr[L].sum=Len(L)*tr[u].lazy;tr[R].sum=Len(R)*tr[u].lazy;tr[u].lazy=-1;
}void build(int u,int l,int r)
{tr[u]={l,r,0,-1};if(l==r) { tr[u].sum+=ed[l]-'0'; return; }build(L,l,Mid); build(R,Mid+1,r);pushup(u);
}void modify(int u,int l,int r,int c)
{if(tr[u].l>=l&&tr[u].r<=r){tr[u].sum=Len(u)*c;tr[u].lazy=c;return;}pushdown(u);if(l<=Mid) modify(L,l,r,c);if(r>Mid) modify(R,l,r,c);pushup(u);
}int query(int u,int l,int r)
{if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;pushdown(u);int ans=0;if(l<=Mid) ans+=query(L,l,r);if(r>Mid) ans+=query(R,l,r);return ans;
}bool check()
{for(int i=m;i>=1;i--){int l=q[i].X,r=q[i].Y;int sum=query(1,l,r),len=r-l+1;if(len%2==0&&sum*2==len) return false;if(len-sum>sum) modify(1,l,r,0);else modify(1,l,r,1);}for(int i=1;i<=n;i++) if(query(1,i,i)!=st[i]-'0') return false;return true;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);int _; scanf("%d",&_);while(_--){scanf("%d%d",&n,&m);scanf("%s%s",st+1,ed+1);build(1,1,n);for(int i=1;i<=m;i++) scanf("%d%d",&q[i].X,&q[i].Y);if(check()) puts("YES");else puts("NO");}return 0;
}
/**/

F.
题意:给n个点,让你求这n个点一个排列,使得相邻的三个之间构成的角为锐角。
我们可以发现当是钝角的时候,钝角对的边一定是最大的。那么我们可以考虑一个贪心策略,我们每次都找距离当前点最远的点,让后把他们俩连起来的边当坐角边,而非对角边。
下面证明一下:
假设当前有三个点 A B C ,目前知道距离A最远的点为B,距离B最远的点为C,可以得知AC<AB,所以ABC构成的三角形中最长边为角边,所以∠ABC一定不是钝角。
让后直接瞎搞搞就可以啦。
为了避免精度问题,所以距离最好不开方。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<LL,LL> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int ans[N],st[N];
PII p[N];LL get(int i,int j)
{LL dx=p[i].X-p[j].X;LL dy=p[i].Y-p[j].Y;return dx*dx+dy*dy;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%lld%lld",&p[i].X,&p[i].Y);ans[1]=1,st[1]=1;for(int i=1;i<=n-1;i++){LL mx=0,id=-1;for(int j=1;j<=n;j++) if(!st[j]&&get(ans[i],j)>mx) mx=get(ans[i],j),id=j;ans[i+1]=id; st[id]=1;}for(int i=1;i<=n;i++) printf("%d ",ans[i]);puts("");return 0;
}
/**/

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

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

相关文章

[ARC073C] Ball Coloring(贪心)

[ARC073C] Ball Coloring Solution 我们发现编号的最大值maxmaxmax必然会在Rmax,BmaxR_{max},B_{max}Rmax​,Bmax​中至少一个出现&#xff0c;最小值minminmin必然会在Rmin,BminR_{min},B_{min}Rmin​,Bmin​中至少一个出现。 因此会有四种情况&#xff1a; Rmaxmax,Rminmi…

P2831 [NOIP2016 提高组] 愤怒的小鸟 状压dp

某谷链接 题意&#xff1a;选最少的抛物线来覆盖所有点。 注意到a<0&#xff0c;所以我们可以枚举两个点来构成一条抛物线&#xff0c;让后记这两个点构成的抛物线为 cov[i][j]cov[i][j]cov[i][j]&#xff0c;让后他存的是这个抛物线能覆盖到的点的集合&#xff0c;把它存成…

Visual Studio 2019 16.1 使用 .NET Core 3.0

一.前言早在很久之前微软便公布 .NET Core 3.0 将支持开发Winform应用程序等等新特性&#xff0c;现如今 .NET Core 3.0 预览版已经出来第五个预览版了&#xff0c;从 .NET Core 2.2 到 3.0 将是一个大的跨越&#xff0c;从发布的预览版本个数来看&#xff0c;将会增加很多的功…

P4288 [SHOI2014]信号增幅仪 最小圆覆盖

传送门 题意&#xff1a;给出一些点&#xff0c;让后让你用一个ba1p\frac{b}{a}\frac{1}{p}ab​p1​的且绕x正方向逆时针转动了a的椭圆覆盖&#xff0c;求最小的b。 由于题目中椭圆是绕x正方向逆时针旋转了a&#xff0c;为了方便写出方程&#xff0c;我们可以先把它顺时针转回…

[ARC074C] RGB Sequence(dp)

[ARC074C] RGB Sequence Solution 显然是一道dpdpdp&#xff0c;我们发现直接维护当前状态有多少种颜色不好维护&#xff0c;因为颜色只有333种&#xff0c;所以可以直接记录每一种颜色最晚在哪里出现&#xff0c;令fi,j,k,lf_{i,j,k,l}fi,j,k,l​表示前iii个里RRR最晚在jjj&…

Insider Dev Tour 2019 全球巡演 苏州站

Insider Dev Tour微软&#xff0c;全球&#xff0c;巡演&#xff0c;内幕大会介绍Insider Dev Tour 是 Microsoft Build 技术大会的全球巡演活动&#xff0c;是微软面向广大开发者、技术爱好者&#xff0c;介绍其未来技术发展方向的盛会。在 Microsoft Build之后&#xff0c;会…

CERC17 Problem L - Lunar Landscape(差分,坐标系)

CERC17 Problem L - Lunar Landscape Solution 如果只有AAA&#xff0c;我们可以简单地使用差分解决。 加入了BBB之后&#xff0c;可以把单位正方形用对角线拆成四个等腰Rt&#xff0c;统计等腰Rt的个数。我们先进行坐标转换&#xff0c;把(x,y)−>(x−y,xy)(x,y)->(x-…

.NET Core 性能分析: xUnit.Performance 简介

xunit-performance 是xUnit的一个扩展&#xff0c; 使用它可以对.NET Core项目进行性能测试。官网&#xff1a;https://github.com/Microsoft/xunit-performancexUnit大家可能都用过&#xff0c;它是用来做单元测试的&#xff0c;它可以很快给开发人员功能是否OK的反馈。和xUni…

Codeforces Round #703 (Div. 2) Guessing the Greatest C1 C2 二分

link 题意&#xff1a;交互题&#xff0c;每次可以询问一个区间的次大值&#xff0c;保证所有值都不相同&#xff0c;求最大值位置。easy是询问最多40次&#xff0c;hard最多20次。 交互题大部分都是二分&#xff0c;可以向二分考虑。 easy比较好想&#xff0c;假设当前区间为…

TeamCity+Rancher+Docker实现.Net Core项目DevOps

1.准备项1.1.服务器一台&#xff0c;1H4G&#xff08;更小内存应该也可以&#xff0c;自行测试&#xff09;&#xff0c;系统&#xff1a;Ubuntu 16.04 64位1.2.数据库一个&#xff0c;MYSQL,MSSQL都可以&#xff08;还有其他的&#xff0c;自行配置&#xff09;,教程是MSSQL1.…

ARC078F - Mole and Abandoned Mine(状压DP)

ARC078F - Mole and Abandoned Mine Solution 状压dpdpdp。 首先去掉边最小选取边最大&#xff0c;答案为所有边权和减掉选取边权和&#xff0c;于是我们想要最大化选取的边权和。 假设我们知道最后剩下的唯一一条1...n1...n1...n的路径v1,v2,v3...vk(v11,vkn){v_1,v_2,v_3…

Codeforces Round #703 (Div. 2) D . Max Median 二分 +思维

传送门 题意&#xff1a; 给定一个数组和k&#xff0c;求一段连续区间中位数最大值&#xff0c;连续区间长度>k。 如果k的话可以直接秒了&#xff0c;这里是>k&#xff0c;我们可以通过二分让后利用>k这个条件来检查答案。 二分中位数&#xff0c;假设当前二分的为m…

.NET工程师的书单

短暂的假期里抽空整理了一份书单&#xff0c;以个人的见解这些应该是值得.NET工程师至少去看一遍的书籍。但所罗列的仅包括国内目前已出版的国外书籍的英文版&#xff0c;并不包含中文翻译及相关领域的中文书籍。这里没有任何歧视之意&#xff0c;只是更推荐工程师具备熟练阅读…

ARC079F - Namori Grundy(构造,基环树)

ARC079F - Namori Grundy Solution 首先这是一个NNN个点NNN条边的有向图&#xff0c;所以它的基图是一棵基环树&#xff0c;其次这个图的所有点入度为111&#xff0c;因此这是一棵基环外向树。 然后对于aia_iai​&#xff0c;假设我们求出S{aj∣(i,j)∈E}S\{a_j|(i,j)\in E\…

Codeforces Round #703 (Div. 2) B.Eastern Exhibition 中位数结论

link 题意&#xff1a; 给n个点&#xff0c;求有多少个点到所有点距离之和最小。 中位数结论题了&#xff0c;可以考虑一维的情况&#xff0c;让后二维的话乘起来就好啦。 //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string&g…

微服务架构下静态数据通用缓存机制

在分布式系统中&#xff0c;特别是最近很火的微服务架构下&#xff0c;有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案&#xff0c;这篇文章将结合一些实际的研发经验&#xff0c;尝试理清其中存在的关键问题以及探寻通用的解决之道。什么是静态数据这里静态…

ARC080F - Prime Flip(贪心,差分,二分图匹配)

ARC080F - Prime Flip Solution 差分&#xff0c;转化为每次可以翻转i,j(j−i∈oddprime)i,j(j-i\in odd\;prime)i,j(j−i∈oddprime)。 显然若j−ij-ij−i是奇质数&#xff0c;则需要111次。 否则若j−ij-ij−i是偶数&#xff0c;则需要222次。 否则若j−ij-ij−i是奇数&am…

Codeforces Round #703 (Div. 2) E. Paired Payment 最短路 + 思维

link 题意&#xff1a; 给一张图&#xff0c;每次只能一下走两个点&#xff0c;比如当前在aaa&#xff0c;往下走到bbb再到ccc&#xff0c;权值为(wa,bwb,c)2(w_{a,b}w_{b,c})^2(wa,b​wb,c​)2。求1到其他点的最短路&#xff0c;不存在输出−1-1−1。 思路&#xff1a; 如果…

ARC077E - guruguru(差分)

ARC077E - guruguru Solution 考虑每一次改动对于每一个xxx的影响。 设我们要从aaa变到bbb。 当a−>x−>ba->x->ba−>x−>b时&#xff0c;该次对xxx的贡献为Da,b−Da,x1D_{a,b}-D_{a,x}1Da,b​−Da,x​1&#xff0c;即一个公差为−1-1−1的递减序列&#…

Codeforces Round #700 (Div. 2) C. Searching Local Minimum 交互二分

传送门 题意: 给一个数组&#xff0c;让你找到a[i]<min(a[i1],a[i−1])a[i]<min(a[i1],a[i-1])a[i]<min(a[i1],a[i−1])位置iii&#xff0c;每次询问iii可以得到a[i]a[i]a[i]&#xff0c;最多询问100次&#xff0c;且a[0]a[n1]∞a[0]a[n1]∞a[0]a[n1]∞。 我们考虑假…