洛谷⑨月月赛Round2 官方比赛 OI
自评:
(完成时间3.5时)
第一题 模拟 虽然A了,代码敲得有点慢
第二题 最短路 第一次敲对了,又考虑数据范围和答案范围,改错了,100分改成42分。QAQ。
第三题 乱搞 80分 还可以(因为没思路啊),不过也有A了的
如果第二题不手贱的话,day1 280分,day2再随便写点,妥妥的一等。
可惜没如果。(也还好不是联赛)。
P3392 涂国旗
题目描述
某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗。(毛熊:阿嚏——)
从最上方若干行(>=1)的格子全部是白色的。
接下来若干行(>=1)的格子全部是蓝色的
- 剩下的行(>=1)全部是红色的
现有一个棋盘状的破布,分成了N行M列的格子,每个格子是白色蓝色红色之一,小a希望把这个布改成该国国旗,方法是在一些格子上涂颜料,盖住之前的颜色。
小a很懒,希望涂最少的格子,使这块破布成为一个合法的国旗。
输入输出格式
输入格式:
第一行是两个整数,N,M
接下来N行是一个矩阵,矩阵的每一个小方块是'W'(白),'B'(蓝),'R'(红)中的一个
输出格式:
一个整数,表示至少需要涂多少块。
输入输出样例
4 5
WRWRW
BWRWB
WRWRW
RWBWR
11
说明
样例解释:
目标状态是
WWWWW
BBBBB
RRRRR
RRRRR
一共需要改11个格子
对于100%的数据,N,M<=50
100分代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
char mp[N][N],bf[N][N],w[N],b[N],r[N];
int n,m,ans=0x7fffffff;
inline int check(char *a,char *b){
int res=;
for(int i=;i<=m;i++) if(a[i]!=b[i]) res++;
return res;
}
void dfs(){
memcpy(bf,mp,sizeof mp);
for(int i=;i<=n-;i++){
int tans=;
for(int q=;q<=i;q++){
tans+=check(mp[q],w);
memcpy(mp[q],w,sizeof w);
}
for(int j=i+;j<=n-;j++){
int t2=,t3=;
for(int q=i+;q<=j;q++){
t2+=check(mp[q],b);
memcpy(mp[q],b,sizeof b);
}
for(int q=j+;q<=n;q++){
t3+=check(mp[q],r);
memcpy(mp[q],r,sizeof r);
}
tans+=t2+t3;
ans=min(ans,tans);
for(int q=i+;q<=n;q++) memcpy(mp[q],bf[q],sizeof bf[q]);
tans-=t2+t3;
}
for(int q=;q<=n;q++) memcpy(mp[q],bf[q],sizeof bf[q]);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%s",mp[i]+);
for(int i=;i<=m;i++) w[i]='W';
for(int i=;i<=m;i++) b[i]='B';
for(int i=;i<=m;i++) r[i]='R';
dfs();
printf("%d\n",ans);
return ;
}
P3393 逃离僵尸岛
题目描述
小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家。
该国有N个城市,城市之间有道路相连。一共有M条双向道路。保证没有自环和重边。
K个城市已经被僵尸控制了,如果贸然闯入就会被感染TAT...所以不能进入。由其中任意城市经过不超过S条道路就可以到达的别的城市,就是危险城市。换句话说只要某个没有被占城市到某个被占城市不超过s距离,就是危险。
小a住在1号城市,国际空港在N号城市,这两座城市没有被侵略。小a走每一段道路(从一个城市直接到达另外一个城市)得花一整个白天,所以晚上要住旅店。安全的的城市旅馆比较便宜要P元,而被危险的城市,旅馆要进行安保措施,所以会变贵,为Q元。所有危险的城市的住宿价格一样,安全的城市也是。在1号城市和N城市,不需要住店。
小a比较抠门,所以他希望知道从1号城市到N号城市所需要的最小花费。
输入数据保证存在路径,可以成功逃离。输入数据保证他可以逃离成功。
输入输出格式
输入格式:
第一行4个整数(N,M,K,S)
第二行2个整数(P,Q)
接下来K行,ci,表示僵尸侵占的城市
接下来M行,ai,bi,表示一条无向边
输出格式:
一个整数表示最低花费
输入输出样例
13 21 1 1
1000 6000
7
1 2
3 7
2 4
5 8
8 9
2 5
3 4
4 7
9 10
10 11
5 9
7 12
3 6
4 5
1 3
11 12
6 7
8 11
6 13
7 8
12 13
11000
说明
对于20%数据,N<=50
对于100%数据,2 ≦ N ≦ 100000, 1 ≦ M ≦ 200000, 0 ≦ K ≦ N - 2, 0 ≦ S ≦ 100000
1 ≦ P < Q ≦ 100000
100分代码:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
inline const int read(){
register int x=,f=;
register char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
#define ll long long
#define xx first
#define yy second
#define pir pair<int,int>
const int N=2e5+;
struct node{
int v,next;
}e[N<<];
int tot,head[N],js[N],pw[N];
bool vis[N],JS[N];
int n,m,s,k,P,Q;
void add(int x,int y){
e[++tot].v=y;
e[tot].next=head[x];
head[x]=tot;
}
void bfs(int S,int lim){
int dis[N]={};
memset(vis,,sizeof vis);
queue<pir>q;
q.push(make_pair(S,));
vis[S]=;
while(!q.empty()){
pir h=q.front();q.pop();
if(h.yy==lim) continue;
for(int i=head[h.xx];i;i=e[i].next){
if(!dis[e[i].v]){
dis[e[i].v]=dis[h.xx]+;
if(!vis[e[i].v]){
vis[e[i].v]=;
pw[e[i].v]=Q;
q.push(make_pair(e[i].v,dis[e[i].v]));
}
}
}
}
}
void spfa(){
ll dis[N];
memset(dis,,sizeof dis);
memset(vis,,sizeof vis);
queue<int>q;
q.push();
dis[]=;
vis[]=;
while(!q.empty()){
int h=q.front();q.pop();
vis[h]=;
for(int i=head[h];i;i=e[i].next){
int v=e[i].v;
if(JS[v]) continue;
if(dis[v]>dis[h]+(ll)pw[v]){
dis[v]=dis[h]+(ll)pw[v];
if(!vis[v]){
vis[v]=;
q.push(v);
}
}
}
}
printf("%lld\n",dis[n]);
}
int main(){
n=read(),m=read(),k=read(),s=read();
P=read(),Q=read();
for(int i=;i<=k;i++) js[i]=read();
for(int i=,x,y;i<=m;i++) x=read(),y=read(),add(x,y),add(y,x);
for(int i=;i<=k;i++) bfs(js[i],s);
for(int i=;i<=n;i++) if(!pw[i]) pw[i]=P;pw[n]=;
for(int i=;i<=k;i++) JS[js[i]]=;
spfa();
return ;
}
P3394 机器人的领域
题目描述
一个机器人从xoy平面出发,按照给定的程序运行,程序中的一个字母E\S\W\N分别表示机器人往东\南\西\北走1米。我们会给出则一段有N个指令的程序。机器人将连续的执行这段程序K次。从原点开始,机器人每执行完一步,就会在地上做一个标记(原点也留了一个)。现在问,所有程序结束后,有多少个1*1的小方形,其四个顶点都被坐上了标记?
输入输出格式
输入格式:
第一行两个整数,N,K
第一行是长度为N的字符串,每个字符只会是一个字母E\S\W\N分别表示机器人往东\南\西\北走1米。
输出格式:
一个整数,表示符合要求的小方格数量
输入输出样例
6 3
SEENWS
6
说明
20% N<=50,K=1;
另外20% k=1
另外20% N<=50
100% N<=100000,0<k<=10^9
80分代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+;
struct node{
int x,y;
bool operator < (const node a) const {
if(x==a.x) return y<a.y;
return x<a.x;
}
bool operator == (const node a) const{
return x==a.x&&y==a.y;
}
bool operator != (const node a) const{
return x!=a.x||y!=a.y;
}
}ans[N<<];
char s[N];
int cnt,res,n,k;
bool vis[][];
node deal(int sx,int sy){
ans[++cnt]=(node){sx,sy};
int len=strlen(s);
for(int i=;i<len;i++){
if(s[i]=='N') ans[++cnt]=(node){++sx,sy};
else if(s[i]=='S') ans[++cnt]=(node){--sx,sy};
else if(s[i]=='W') ans[++cnt]=(node){sx,--sy};
else if(s[i]=='E') ans[++cnt]=(node){sx,++sy};
}
node t;
t.x=sx;
t.y=sy;
return t;
}
int ef(node x){
int l=,r=cnt;
while(l<r){
int mid=l+r>>;
if(x<ans[mid]||ans[mid]==x) r=mid;
else l=mid+;
}
return l;
}
int solve(){
sort(ans+,ans+cnt+);
cnt=unique(ans+,ans+cnt+)-(ans+);
for(int i=;i<=cnt;i++){
if(!vis[ans[i].x+][ans[i].y+]){
node la=(node){ans[i].x,ans[i].y+};
node ra=(node){ans[i].x-,ans[i].y};
node aa=(node){ans[i].x-,ans[i].y+};
int lp=ef(la);
if(ans[lp]!=la) continue;
int rp=ef(ra);
if(ans[rp]!=ra) continue;
int pp=ef(aa);
if(ans[pp]!=aa) continue;
res++;
vis[ans[i].x+][ans[i].y+]=;
}
}
}
int main(){
scanf("%d%d%s",&n,&k,s);
node t=deal(,);
solve();
int r1=res;
if(k==){printf("%d",res);return ;}
else{
deal(t.x,t.y);
solve();
int r2=res-r1;
printf("%lld\n",(ll)r1+(ll)r2*(ll)(k-));
//cout<<(ll)r1+(ll)r2*(ll)(k-1);
}
return ;
}
改后的AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
struct node{
int x,y;
bool operator < (const node& a)const{
return x<a.x||(x==a.x&&y<a.y);
}
};
set<node>S;
long long n,k,ans,lr,r;
char s[];
int main(){
scanf("%d%d%s",&n,&k,s);
node now;
now.x=;now.y=;
S.insert(now);
for(int i=;i<=k;i++){
r=;
for(int j=;j<n;j++){
if(s[j]=='E')now.y++;
if(s[j]=='W')now.y--;
if(s[j]=='S')now.x--;
if(s[j]=='N')now.x++;
if(S.count(now)==){
node a,b,c,d,e,f,g,h;
a.x=now.x-;a.y=now.y-;b.x=now.x-;b.y=now.y;
c.x=now.x-;c.y=now.y+;d.x=now.x;d.y=now.y-;
e.x=now.x;e.y=now.y+;f.x=now.x+;f.y=now.y-;
g.x=now.x+;g.y=now.y;h.x=now.x+;h.y=now.y+;
if(S.count(a)==&&S.count(b)==&&S.count(d)==)r++;
if(S.count(b)==&&S.count(c)==&&S.count(e)==)r++;
if(S.count(d)==&&S.count(f)==&&S.count(g)==)r++;
if(S.count(e)==&&S.count(g)==&&S.count(h)==)r++;
S.insert(now);
}
}
if(r==lr){
ans+=(k-i+)*r;
break;
}
ans+=r;lr=r;
}
cout<<ans<<endl;
return ;
}
洛谷⑨月月赛Round2 官方比赛 OI的更多相关文章
- 洛谷⑨月月赛Round2 P3393逃离僵尸岛[最短路]
题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵尸控制了,如果贸然闯入 ...
- 洛谷⑨月月赛Round2 P3392涂国旗[DP]
题目描述 某国法律规定,只要一个由N*M个小方块组成的旗帜符合如下规则,就是合法的国旗.(毛熊:阿嚏——) 从最上方若干行(>=1)的格子全部是白色的. 接下来若干行(>=1)的格子全部是 ...
- 洛谷9月月赛round2
洛谷9月月赛2 t1 题意:懒得说了 分析:模拟 代码: program flag; var a:..,..]of char; n,i,m,j,x,y,ans,k:longint; begin ass ...
- 洛谷五月月赛【LGR-047】划水记
虽然月赛有些爆炸,但我永远资瓷洛谷! 因为去接水,所以迟到了十几分钟,然后洛谷首页就打不开了-- 通过洛谷题库间接打开了比赛,看了看\(TA\),WTF?博弈论?再仔细读了读题,嗯,判断奇偶性,不过要 ...
- 洛谷八月月赛Round1凄惨记
个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...
- 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)
科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...
- 洛谷P2777 [AHOI2016初中组]自行车比赛
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 洛谷U14667 肝活动【比赛】 【状压dp】
题目描述 Yume 最近在玩一个名为<LoveLive! School idol festival>的音乐游戏.他之所以喜欢上这个游戏,是因为这个游戏对非洲人十分友好,即便你脸黑到抽不出好 ...
- 洛谷 P2777 [AHOI2016初中组]自行车比赛
题目描述 小雪非常关注自行车比赛,尤其是环滨湖自行车赛.一年一度的环滨湖自行车赛,需要选手们连续比赛数日,最终按照累计得分决出冠军.今年一共有 N 位参赛选手.每一天的比赛总会决出当日的排名,第一名的 ...
随机推荐
- iOS动画——UIKit动画
iOS动画 iOS有很多动画技术,API主要分布在两个库中,一个是UIKit,另一个是CoreAnimation,先对UIKit动画做一下总结. UIKit动画 在UIKit中,很多API都可以看到a ...
- 【Spring】AOP
AOP 编程允许你把遍布应用各处的功能分离出来形成可重用的组件,将安全.事务和日志关注点与你的核心业务逻辑相分离. 面向切面编程往往被定义为促使应用程序分离关注点的一项技术.系统由许多不同组件组成,每 ...
- C#语言最基础的数组和集合
数组的书写格式:数据类型[]变量名=new 数据类型[长度]: 集合的书写格式:List<变量类型>变量名=new List<变量类型>(): 集合添加元素:变量名.Add(数 ...
- Kotlin实例----android5.0新特性之palette
一.Palette的使用 使用Palette可以让我们从一张图片中拾取颜色,将拾取到的颜色赋予ActionBar,StatusBar以及UI背景色可以让界面色调实现统一或者加载不同图片时同步变化色调 ...
- android中TextView内容竖向显示
项目中遇到需要textview内容竖着排的需求,如图所示: 网上那些“教程”并不能达到需要的效果,发现有一个属性可以支持这种效果,android:ems=“*”,这是属性表示一行只显示*个字符. 具体 ...
- 设计模式——“signleton”
那天别人问了我一个问题,关于单例模式的,由于之前了解的都是蜻蜓点水,所以重新复习了一次重新总结. 单例模式的写法总的来说有5种:懒汉,恶汉,枚举,双重校验锁,静态内部类 懒汉 public class ...
- 关于类似vue-cli 脚手架
#!/usr/bin/env node const download = require('download-git-repo') const program = require('commander ...
- MariaDB常用命令手记
创建用户命令 mysql>create user username@localhost identified by 'password'; 直接创建用户并授权的命令 mysql>grant ...
- 将数据库中的内容展示出来并将某些value值转换成汉字
1.将数据库中的内容展示出来 前台代码未做改变,刚开始未显示的原因是因为 data-field 跟数据库不一样data-field 需要跟数据库中的一样才可以 2.将某些value值转换成汉字 在li ...
- Day 12 字符串和正则表达式
使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配 ...