DISCO Presents Discovery Channel Code Contest 2020 Qual题解
\(A\)
咕咕
int x,y;
int c[4]={0,300000,200000,100000};
int res;
int main(){
cin>>x>>y;
if(x<=3)res+=c[x];
if(y<=3)res+=c[y];
if(x==1&&y==1)res+=4e5;
cout<<res<<endl;
return 0;
}
\(B\)
咕咕
const int N=2e5+5;
typedef long long ll;
int a[N],n;ll sum[N],suf[N],res;
int main(){
scanf("%d",&n);
fp(i,1,n)scanf("%d",&a[i]),sum[i]=suf[i]=a[i];
fp(i,1,n)sum[i]+=sum[i-1];fd(i,n,1)suf[i]+=suf[i+1];
res=1e18;
fp(i,1,n-1)cmin(res,abs(sum[i]-suf[i+1]));
printf("%lld\n",res);
return 0;
}
\(C\)
一道思博题想了这么久看来脑子已经没用了
如果每行都有草莓那么每行分别考虑,对于没有草莓的行缩起来就行了
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=305;
char mp[N][N];int col[N][N],n,m,cnt,K;
int main(){
scanf("%d%d%d",&n,&m,&K);
fp(i,1,n)scanf("%s",mp[i]+1);
fp(i,1,n)fp(j,1,m)if(mp[i][j]=='#'){
col[i][j]=++cnt;
for(R int k=j-1;k&&!col[i][k]&&mp[i][k]!='#';--k)col[i][k]=cnt;
for(R int k=j+1;k<=m&&!col[i][k]&&mp[i][k]!='#';++k)col[i][k]=cnt;
}
fp(i,1,n)fp(j,1,m)if(col[i][j]){
for(R int k=i-1;k&&!col[k][j];--k)col[k][j]=col[i][j];
for(R int k=i+1;k<=n&&!col[k][j];++k)col[k][j]=col[i][j];
}
fp(i,1,n)fp(j,1,m)printf("%d%c",col[i][j]," \n"[j==m]);
return 0;
}
\(D\)
傻了,什么神仙题
我们发现一次操作要么使总位数减1总和不变,要么使总和减9总位数不变,而最终的情况一定是位数为1总和小于等于9,记总位数为d,总和为s,答案就是\(d-1+(s-1)/9\)
const int N=2e5+5;
typedef long long ll;
int d[N],n;ll c[N],res,sum;
int main(){
scanf("%d",&n);
fp(i,1,n)scanf("%d%lld",&d[i],&c[i]),sum+=c[i],res+=d[i]*c[i];
printf("%lld\n",(res-1)/9+sum-1);
return 0;
}
\(E\)
我们记\(d(i)=query(i,i+n-1)\),如果存在某个\(d(i)\neq d(i+1)\),那么显然\(i\)和\(i+n\)的颜色就可以知道了,同时\((i+1,i+n-1)\)这个区间中一定是红蓝次数各一半,我们可以用它去check出其他所有颜色
所以问题是怎么找到这个分界点,它实际上是可以二分的,我们初始时记\(l=1,r=n+1\),那么\(d(l)\neq d(r)\)显然成立,我们每一次判断\(mid\),如果\(d(mid)=d(l)\)则令\(l=mid\),否则令\(r=mid\),这样一直二分到\(r-l=1\)即可
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
const int N=505;
char s[5];int a[N],col[N],bs[N],cnt[2],n,las,now,ql,qr,l,r,mid,ans;
inline int ask(R int l,R int r){
putchar('?'),putchar(' ');
fp(i,l,r)printf("%d ",i);
putchar('\n'),fflush(stdout);
scanf("%s",s+1);return s[1]=='R';
}
inline int ask(R int l,R int r,R int x,R int d){
putchar('?'),putchar(' ');
fp(i,l,r)if(i!=x)printf("%d ",i);
if(d)printf("%d ",x);
putchar('\n'),fflush(stdout);
scanf("%s",s+1);
if(s[1]=='-')while(true);
return s[1]=='R';
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);
fp(i,1,n<<1)col[i]=-1;
l=1,r=n+1,ans=0,bs[1]=ask(1,n),bs[n+1]=bs[1]^1;
while(r-l>1){
mid=(l+r)>>1,bs[mid]=ask(mid,mid+n-1);
bs[mid]==bs[l]?l=mid:r=mid;
}
col[l]=bs[l],col[r+n-1]=bs[r];
ql=r,qr=r+n-2;
fp(i,ql,qr)col[i]=ask(ql-1,qr+1,i,0)^1;
fp(i,1,ql-2)col[i]=ask(ql,qr,i,1);
fp(i,qr+2,n<<1)col[i]=ask(ql,qr,i,1);
putchar('!'),putchar(' ');
fp(i,1,n<<1)putchar(col[i]?'R':'B');
putchar('\n'),fflush(stdout);
return 0;
}
\(F\)
首先,可以发现如果一个状态转移一次之后每个格子都有一个机器人,那么这个状态肯定是合法的
如果一直往下走,那么循环节就是\(g={n\over \gcd(n,T)}\),往右走循环节是\(h={m\over \gcd(m,T)}\),那么这个\(g\times h\)的子矩形只会受自己内部影响,和外面无关,所以我们可以对于每个这样的子矩形单独考虑
这样我们可以把问题转化为一个\(g\times h\)的子矩形且\(T=1\),我们考虑合法的方案,一种是存在某个格子不走,那么整个矩形全都不走,一种是分别考虑每行,要么不走要么全往右,一种是每列都是全往下,这个直接组合数算一下,全都不走的情况也会在后两种里被算到,要去掉
还有一种情况是既往右又往下,假设我们先固定\((1,1)\)为右,那么\((1,2)\)就不能被\((n,2)\)走到了,所以\((n,2)\)也必然是右,以此类推我们可以确定\({h\times g\over \gcd(h,g)}\)个格子,那么对于所有\(\gcd(h,g)\)个格子每个都有两种方案,直接算一下就好了,记得把全往右和全往下的情况也去掉
//quming
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
typedef long long ll;
const int P=1e9+7;
inline void upd(R int &x,R int y){(x+=y)>=P?x-=P:0;}
inline int inc(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R ll y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
return res;
}
int n,m,T,res,h,g;
int main(){
scanf("%d%d%d",&n,&m,&T);
h=n/__gcd(n,T),g=m/__gcd(m,T);
// printf("%d %d\n",h,g);
res=((0ll+1+ksm(2,h)-1+ksm(2,g)-1+ksm(2,__gcd(h,g))-2)%P+P)%P;
res=ksm(res,1ll*(n/h)*(m/g));
printf("%d\n",res);
return 0;
}
DISCO Presents Discovery Channel Code Contest 2020 Qual题解的更多相关文章
- DISCO Presents Discovery Channel Code Contest 2020 Qual Task E. Majority of Balls
Not able to solve this problem during the contest (virtual participation). The first observation is ...
- IOCCC(The International Obfuscated C Code Contest)
国际 C 语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从 1984 年开始,每年举办一次(1997年.1 ...
- 【AtCoder】CODE FESTIVAL 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...
- 【AtCoder】CODE FESTIVAL 2016 qual B
CODE FESTIVAL 2016 qual B A - Signboard -- #include <bits/stdc++.h> #define fi first #define s ...
- 【AtCoder】CODE FESTIVAL 2016 qual C
CODE FESTIVAL 2016 qual C A - CF -- #include <bits/stdc++.h> #define fi first #define se secon ...
- CODE FESTIVAL 2017 qual B B - Problem Set【水题,stl map】
CODE FESTIVAL 2017 qual B B - Problem Set 确实水题,但当时没想到map,用sort后逐个比较解决的,感觉麻烦些,虽然效率高很多.map确实好写点. 用map: ...
- CODE FESTIVAL 2017 qual B C - 3 Steps【二分图】
CODE FESTIVAL 2017 qual B C - 3 Steps 题意:给定一个n个结点m条边的无向图,若两点间走三步可以到,那么两点间可以直接连一条边,已经有边的不能连,问一共最多能连多少 ...
- M-SOLUTIONS Programming Contest 2020 题解
M-SOLUTIONS Programming Contest 2020 题解 目录 M-SOLUTIONS Programming Contest 2020 题解 A - Kyu in AtCode ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
随机推荐
- ASP.NET Core中如何显示[PII is hidden]的隐藏信息
有时候我们在ASP.NET Core项目运行时,发生在后台程序中的错误会将关键信息隐藏为[PII is hidden]这种占位符,如下所示: 而知道这些关键信息,有时候对我们调试程序是非常重要的.所以 ...
- 1、VUE介绍
1.VUE简介 最近一段时间,Web前端领域出现了很多MVVM框架技术,如AngularJS.React,VUE.js等等. Vue.js借鉴了AngularJS的设计理念,也吸取了React和Ang ...
- IdentityServer4学习及简单使用
本文,主要用来记录IdentityServer4的简单使用. 一. IdentityServer的预备知识 要学习IdentityServer,需要了解下基于Token的验证体系,其中涉及到Token ...
- jquery 获取后台实时数据
第一步.提醒后台处理数据1.$.ajax({}) 提交数据,2.后台返回状态3.后台开始处理数据,并每秒记录状态到 data.json 文件4.前台每秒请求 data.json 文件,直到处理完成 第 ...
- Unity PhysicsScene测试
应该是unity 2018.3中加入的功能,对象可以放置于不同的物理场景中. 一个Scene对应一个物理场景(PhysicsScene),若想放入独立的物理场景测试创建一个Scene即可.见下图gif ...
- 二.HTML
1.HTML 1. <head></head>标签 <!DOCTYPE html> <!--统一规范--> <!----> <html ...
- Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合
Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合 一丶FORM的介绍 1.生成页面可用的HTML标签 2.对用户提交的 ...
- 剑指前端(前端入门笔记系列)——DOM(元素节点)
DOM(元素节点) 本文介绍了元素节点的基本操作:增删改查 增 新增一个元素节点分为两步(二者缺一不可),第一步:创建元素节点,第二步:将创建的元素节点插入到指定元素节点中(也就是插入指定元素节点 ...
- CSS 初识
一.CSS 发展历程 从HTML被发明开始,样式就以各种形式存在.不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制.最初的HTML只包含很少的显示属性. 随着HTML的成长,为了满足页面设计 ...
- Map去重,去重value相同的元素,保留key最小的那个值
Map<Integer,String>,Integer代表时间撮,String代表文本信息去重函数:就是删除Map中value相同的元素,只保留key最小的那个元素 public stat ...