【codeforces】【比赛题解】#948 CF Round #470 (Div.2)
【A】Protect Sheep
题意:
一个\(R*C\)的牧场中有一些羊和一些狼,如果狼在羊旁边就会把羊吃掉。
可以在空地上放狗,狼不能通过有狗的地方,狼的行走是四联通的。
问是否能够保护所有的羊不被狼吃掉,如果能输出方案。
题解:
判断是否有羊的旁边有狼,有的话就-1。没有的话把所有空地换成狗就好。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=(b);++i)
#define F2(i,a,b) for(int i=a;i<(b);++i)
using namespace std;
int n,m,ok=1;
char str[501][505];
int main(){
scanf("%d%d",&n,&m);
F(i,1,n){
scanf("%s",str[i]);
}
F(i,1,n){
F2(j,0,m){
if(str[i][j]=='S'&&(str[i-1][j]=='W'||str[i][j-1]=='W'||str[i+1][j]=='W'||str[i][j+1]=='W')) ok=0;
}
}
if(ok){
puts("Yes");
F(i,1,n){
F2(j,0,m){
printf("%c",str[i][j]=='.'?'D':str[i][j]);
}
puts("");
}
}
else puts("No");
return 0;
}
【B】Primal Sport
题意:
初始有一个数\(X_0\),每一次可以对\(X_i\)这个数进行一个操作变成\(X_{i+1}\):
选择一个小于\(X_i\)的质数\(p\),则\(X_{i+1}\)等于\(\left\lceil\frac{X_i}{p}\right\rceil\cdot p\)。
给定了\(X_2\),问最小的可能\(X_0\)。
题解:
令\(p_1\)等于\(X_2\)的最大质因数,那么显然\(X_1\)可能为\([X_2-p_1+1,X_2]\)中的合数。
再对这个范围内的\(X_1\)执行相同的过程即可。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=(b);++i)
using namespace std;
const int INF=0x3f3f3f3f; int n,ans=INF; int np[1000001]={1,1},pr[1000001],cnt;
int maxp[1000001]; void init(int num){
F(i,2,num){
if(!np[i]) pr[++cnt]=i, maxp[i]=i;
F(j,1,cnt){
if(i*pr[j]>num) break;
np[i*pr[j]]=1;
maxp[i*pr[j]]=maxp[i];
if(i%pr[j]==0) break;
}
}
} int main(){
init(1000000);
scanf("%d",&n);
F(i,n-maxp[n]+1,n)
if(maxp[i]!=i) ans=min(ans,i-maxp[i]+1);
else ans=min(ans,i);
printf("%d",ans);
return 0;
}
【C】Producing Snow
题意:
每天Bob都能用造雪机造出体积\(V_i\)的一堆雪,但是现在是夏天,每天每堆雪都会融化\(T_i\)体积(如果不足\(T_i\)则全部融化掉)。
问每天会融化多少体积的雪?
题解:
简单set+lower_bound,就很显然。注意点:multiset。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=(b);++i)
#define F2(i,a,b) for(int i=a;i<(b);++i)
#define dF(i,a,b) for(int i=a;i>=(b);--i)
#define dF2(i,a,b) for(int i=a;i>(b);--i)
#define eF(i,u) for(int i=h[u];i;i=nxt[i])
#define ll long long
#define ld double
using namespace std; int n;
ll v[100001],t[100001];
ll ans,sum;
multiset<ll> st; int main(){
scanf("%d",&n);
F(i,1,n) scanf("%lld",v+i);
F(i,1,n) scanf("%lld",t+i);
F(i,1,n){
st.insert(v[i]+sum);
multiset<ll>::iterator it,it2,it3;
sum+=t[i];
ans=t[i]*st.size();
it=st.lower_bound(sum+1);
for(it2=st.begin();it2!=st.end()&&it2!=it;){
ans+=*it2-sum;
it3=it2; ++it2;
st.erase(it3);
}
printf("%lld\n",ans);
}
return 0;
}
【D】Perfect Security
题意:
有一个长度为\(n\)的数组\(A\),和一个等长的数组\(B\),要求你重排数组\(B\),使得序列\(A_1\oplus B_1,A_2\oplus B_2,\cdots,A_n\oplus B_n\)在字典序上最小。
题解:
从1到n遍历每一个\(A_i\),选出当前\(B\)中的让\(A_i\oplus B_i\)最小的\(B_i\)即可,重复\(n\)遍。
那么每次必须要在较快时间内完成,考虑set内按二进制位二分。每次可以\(log^2n\)完成。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=(b);++i)
#define dF(i,a,b) for(int i=a;i>=(b);--i)
using namespace std; int n,a[300001];
multiset<int> b; int main(){
int x;
scanf("%d",&n);
F(i,1,n) scanf("%d",a+i);
F(i,1,n) scanf("%d",&x), b.insert(x);
F(i,1,n){
int now=0;
dF(j,29,0){
if((a[i]>>j)&1){
now+=1<<j;
multiset<int>::iterator it1=b.lower_bound(now), it2=b.lower_bound(now+(1<<j));
if(it1==it2)
now-=1<<j;
}
else{
multiset<int>::iterator it1=b.lower_bound(now), it2=b.lower_bound(now+(1<<j));
if(it1==it2)
now+=1<<j;
}
}
b.erase(b.lower_bound(now));
printf("%d ",a[i]^now);
}
return 0;
}
【E】Picking Strings
题意:
对于一个只含有\(\textbf{A,B,C}\)的字符串,可以做以下变化:
\(\textbf{A}\Rightarrow \textbf{BC}\)
\(\textbf{B}\Rightarrow \textbf{AC}\)
\(\textbf{C}\Rightarrow \textbf{AB}\)
\(\textbf{AAA}\Rightarrow \varnothing\)
给定两个字符串\(S\)和\(T\),有\(Q\)个询问:
每个询问为问\(S[a...b]\)能否通过以上变换变成\(T[c...d]\)。
题解:
考虑\(\textbf{B}\Rightarrow A\textbf{C}\Rightarrow AA\textbf{B}\Rightarrow \textbf{AAA}C\Rightarrow C\)和\(\textbf{C}\Rightarrow A\textbf{B}\Rightarrow AA\textbf{C}\Rightarrow \textbf{AAA}B\Rightarrow B\)。
这表示了\(\textbf{B}\;\textbf{C}\)之间可以互相转化。
考虑\(\textbf{B}\Rightarrow A\textbf{C}\Rightarrow AA\textbf{B}\Rightarrow AAA\textbf{C}\Rightarrow A\textbf{AAA}B\Rightarrow AB\)和\(A\textbf{B}\Rightarrow AA\textbf{C}\Rightarrow \textbf{AAA}B\Rightarrow B\)。
这表示了一个\(\textbf{B}\)之前的\(\textbf{A}\)的个数可以任意地增加或减少,同理\(\textbf{C}\)也一样。
那么又因为\(\textbf{A}\)可以变成\(\textbf{BC}\),也就是说原字符串只要有至少一个\(\textbf{B}\)或者\(\textbf{C}\),就可以把\(\textbf{B}\)或者\(\textbf{C}\)的个数任意地加二。
所以原字符串和目标字符串中的\(\textbf{B}\)或者\(\textbf{C}\)的个数必须奇偶性相同,并且目标字符串的\(\textbf{B}\)或者\(\textbf{C}\)的个数必须大于等于原字符串的个数。
最后考虑字符串末尾的\(\textbf{A}\),它们之后没有任何一个\(\textbf{B}\)或者\(\textbf{C}\)。
那么可以实现个数减三或者把其中一个\(\textbf{A}\)变成\(\textbf{BC}\),这两种操作都无法增加字符串末尾的\(\textbf{A}\)的个数。
那么只要原字符串中末尾\(\textbf{A}\)的个数小于目标字符串中的个数,就无法实现。
如果原字符串中\(\textbf{B}\)或者\(\textbf{C}\)的个数等于目标字符串中的个数,就不能进行第二个操作,只能进行第一个操作。
那么分类讨论就到此结束。
综上所述,我们要知道原字符串和目标字符串的\(\textbf{B}\)或者\(\textbf{C}\)的个数和末尾的\(\textbf{A}\)的个数。
可以用简单的前缀和实现。
代码奉上:
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=(b);++i)
using namespace std; char str1[100005],str2[100005];
int len1,len2;
int sbc1[100005],sbc2[100005];
int sua1[100005],sua2[100005];
int Q; int main(){
scanf("%s%s",str1+1,str2+1);
len1=strlen(str1+1), len2=strlen(str2+1);
F(i,1,len1) sbc1[i]=sbc1[i-1]+(str1[i]=='B'||str1[i]=='C');
F(i,1,len2) sbc2[i]=sbc2[i-1]+(str2[i]=='B'||str2[i]=='C');
F(i,1,len1) sua1[i]=str1[i]=='A'?sua1[i-1]+1:0;
F(i,1,len2) sua2[i]=str2[i]=='A'?sua2[i-1]+1:0;
scanf("%d",&Q);
while(Q--){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int sumbc1=sbc1[b]-sbc1[a-1], sumbc2=sbc2[d]-sbc2[c-1];
int sufa1=min(sua1[b],b-a+1), sufa2=min(sua2[d],d-c+1);
if((sumbc1&1)!=(sumbc2&1)||sumbc1>sumbc2||sufa1<sufa2) {putchar('0'); continue;}
if(sumbc1==sumbc2)
if(sufa1%3==sufa2%3) putchar('1');
else putchar('0');
else
if(sumbc1==0) putchar(sufa1>sufa2?'1':'0');
else putchar('1');
}
return 0;
}
【codeforces】【比赛题解】#948 CF Round #470 (Div.2)的更多相关文章
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- CF Round #551 (Div. 2) D
CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...
- CF Round #510 (Div. 2)
前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...
- CF Round #600 (Div 2) 解题报告(A~E)
CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...
- 【二分】Producing Snow @Codeforces Round #470 Div.2 C
time limit per test: 1 second memory limit per test: 256 megabytes Alice likes snow a lot! Unfortuna ...
- cf Round#273 Div.2
题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...
- 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)
终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...
- 【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)
没有参加,但是之后几天打了哦,第三场AK的CF比赛. CF大扫荡计划正在稳步进行. [A]Olympiad 题意: 给\(n\)个人颁奖,要满足: 至少有一个人拿奖. 如果得分为\(x\)的有奖,那么 ...
- 【codeforces】【比赛题解】#869 CF Round #439 (Div.2)
良心赛,虽然我迟了半小时233333. 比赛链接:#869. 呃,CF的比赛都是有背景的……上次是<哈利波特>,这次是<物语>…… [A]巧妙的替换 题意: Karen发现了石 ...
随机推荐
- P3919 【模板】可持久化数组(可持久化线段树/平衡树)
题目描述 如题,你需要维护这样的一个长度为 N 的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生成一个完全一 ...
- PHP-从零开始使用Solr搜索引擎服务(下)
前言: 原文地址: http://www.cnblogs.com/JimmyBright/p/7156085.html 前面在配置完成Solr服务之后,在浏览器上可以打开Solr的管理界面,这个界面几 ...
- 【BZOJ4140】共点圆加强版(二进制分组)
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...
- Next Permutation - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Next Permutation - LeetCode 注意点 如果是字典序最大的串则要返回字典序最小的串 解法 解法一:参见:http://www.cn ...
- 单点登录(三)-----实战-----cas server 源码下载和部署
我们在上一篇文章中使用的是4.0版本的cas,4.0版本的有发布好的war包可以直接使用,那如果我们要使用更新的版本怎么办呢? 就需要下载源码自己编辑打包了. 步骤如下: 版本选择 我们在cas的gi ...
- Webpack 学习笔记总结
Webpack安装 Linux系统默认已经安装了node&npm,但版本比较低,而且没法升级,可以重新下载Node然后通过软链接替换系统自带的node和npm; ln -s /path_to/ ...
- TCP: time wait bucket table overflow解决方法
/var/log/messages 中出现大量的 TCP: time wait bucket table overflow 引起该现象的原因是服务器tcp的连接数太多,超出了内和定义的最大数 临时改变 ...
- Hystrix的回退和zuul的回退总结
1.Hystrix的回退: Ribbon: Feign: zuul的回退:
- 【题解】Willem, Chtholly and Seniorious Codeforces 896C ODT
Prelude ODT这个东西真是太好用了,以后写暴力骗分可以用,写在这里mark一下. 题目链接:ヽ(✿゚▽゚)ノ Solution 先把原题解贴在这里:(ノ*・ω・)ノ 简单地说,因为数据是全部随 ...
- python常用模块(3)
ConfigParser模块学习 ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每个节可 ...