Portal:https://www.luogu.com.cn/contest/179008

\(\bf{100+50+50+25+5=\color{indianred}225}\)\(\bf{\ ,\ rk.\ 184}\)


A - Strange Cake Game

显然对于小W,向下移动蛋糕刀是最有利的;对于小M,向右移动是最有利的。所以双方以最佳状态移动,最终\(x\le y\)的巧克力是小W的。直接统计输出即可。别忘了开long long

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k,sum;
signed main(){
cin>>n>>m>>k;
for(int i=1;i<=k;i++){
int x,y;
cin>>x>>y;
if(y>=x) sum++;
}
cout<<sum;
return 0;
}

B1 - Strange Madoka Game

我们第一次提问\(x\),第二次提问\(x+1\)。考虑\(m\)和对方回答的关系。

拿\(x=6\)举例,我们把上图中每个橙色方块称作一个区块。可以发现,第\(1\)个区块的值与对应的模\(7\)的值相差\(0\),第\(2\)个区块的值与对应模\(7\)的值相差\(1\)(模\(7\)意义下的),第\(3\)个区块则相差\(2\)……

所以我们发现规律:记\(m\bmod x=a,m\bmod (x+1)=b\),那么在区块大小足够的前提下(将\(x\)设为一个很大的值即可保证区块足够大),\((a-b)\bmod (x+1)\)就是所在区块\(-1\),自然\(m\)可以表示为\([(a-b)\bmod (x+1)]\times x+a\)。还是注意开long long

赛时没开long long吃了一发,然后回答没输出感叹号又吃了一发,然后没清空缓冲区又吃了一发(汗

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
const int x=399999999;
signed main(){
cin>>t;
int a,b;
while(t--){
cout<<"? "<<x<<endl;
cin>>a;
cout<<"? "<<x+1<<endl;
cin>>b;
int chunk=(a-b+x+1)%(x+1);
cout<<"! "<<chunk*x+a<<endl;
}
return 0;
}

B2 - Strange Homura Game

这个题也简单。先提问一个很大的\(x\)(比如\(10^{18}\)),假设对方回答为\(a\),那么再询问\(x-a-1\),假设回答为\(b\),那么\(m=b+1\)。

这是因为\(x\bmod m=a\),所以\((x-a-1)\bmod m=(m-1)\)。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
signed main(){
cin>>t;
int a,b;
while(t--){
cout<<"? 1000000000000000000"<<endl;
cin>>a;
cout<<"? "<<1000000000000000000-a-1<<endl;
cin>>b;
cout<<"! "<<b+1<<endl;
}
return 0;
}

C - Strange Train Game

真的好题,思路很巧妙。

我们把所有操作放在一张\(n+1\)个节点的无向图上,将所有\(l_i\)和\(r_i +1\)连边。我们有一个结论:

能够交换区间\([l,r]\)而不对其他下标产生影响,当且仅当\(l\)和\(r+1\)在一个连通块中。

这是因为\(l\)和\(r+1\)在同一连通块中,所以存在\(l\)到\(r+1\)的路径,中途超出的部分一定会抵消回来,最终留下的就是\([l,r]\)的操作。

比如下图,\((1,3),(1,7),(8,10),(6,10)\)这些操作所连成的边处于一个连通块中,那么我们可以交换区间\([4,5]\)而不影响其他下标。

所以我们可以贪心考虑每一个位置\(i\),如果\(a_i=b_i\),就忽略掉,否则就找到\(i\)所在连通块中最大的节点\(nxt\),如果\(nxt=i\),就说明无法修改当前点,否则贪心地将\([i,nxt-1]\)的所有位置都进行操作。

为什么每次操作\([i,nxt-1]\)能保证正确性?因为\(nxt-1\)是连通块中最大节点,所以如果\(i\)所在连通块的其他节点\(j\)也需要修改,就可以\([j,nxt-1]\)再进行翻转而不影响其他区间。

点击查看代码
#include<bits/stdc++.h>
#define N 200010
#define int long long
using namespace std;
int n,m,fa[N];
bool op[N];
string a,b;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int u,int v){
u=find(u),v=find(v);
if(u<v) fa[u]=v;
else if(u>v) fa[v]=u;
}
signed main(){
cin>>n>>m>>a>>b;
a=' '+a,b=' '+b;
for(int i=1;i<=n;i++){
if(a[i]==b[i]) fa[i]=i+1;//相当于可以随意交换
else fa[i]=i;
}
fa[n+1]=n+1;
while(m--){
int l,r;
cin>>l>>r;
merge(l,r+1);
}
bool cur=0;
for(int i=1;i<=n;i++){
if(a[i]==b[i]) continue;
cur^=op[i],a[i]^=cur;
int nxt=find(i);
if(a[i]=='0'&&nxt>i){
a[i]='1',cur^=1,op[nxt]^=1;
}//↑前缀和的思想,先从i+1开始异或1,再在nxt处异或回来
}
cout<<a.substr(1,n);
}

[题解]SFMOI Round I A~C的更多相关文章

  1. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  2. [题解] Codeforces Round #549 (Div. 2) B. Nirvana

    Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...

  3. 题解-CSA Round#18 Randomly Permuted Costs

    Problem CSA Round 18 题意概要:给定一个有重边有自环 \(n\) 点 \(m\) 边的有向无环图(DAG),每条边有其权值,每当你走到一个点 \(x\) 时,所有从 \(x\) 连 ...

  4. [题解]Codeforces Round #709 (Div. 1, based on Technocup 2021 Final Round) - A. Basic Diplomacy

    [题目] A. Basic Diplomacy [描述] Aleksey有n个朋友,有一个m天的假期,每天都需要一个朋友来陪他.给出每天有空的朋友的编号,要求同一个朋友来的天数不能超过m/2上取整.求 ...

  5. 题解——Codeforces Round #508 (Div. 2) T3 (贪心)

    贪心的选取最优解 然后相减好 记得要开long long #include <cstdio> #include <algorithm> #include <cstring ...

  6. 题解——Codeforces Round #508 (Div. 2) T2 (构造)

    按照题意构造集合即可 注意无解情况的判断 #include <cstdio> #include <algorithm> #include <cstring> #in ...

  7. 题解——Codeforces Round #508 (Div. 2) T1 (模拟)

    依照题意暴力模拟即可A掉 #include <cstdio> #include <algorithm> #include <cstring> #include &l ...

  8. 题解——Codeforces Round #507 (based on Olympiad of Metropolises) T2(模拟)

    T2还是模拟 枚举一下第一个放哪里 然后贪心的反转即可 虽然我也不会证,但是这题肯定有解qwq #include <cstdio> #include <algorithm> # ...

  9. 题解——Codeforces Round #507 (based on Olympiad of Metropolises) T1 (模拟)

    暴力模拟即可 就是情况略多 #include <cstdio> #include <algorithm> #include <cstring> using name ...

  10. [题解]Codeforces Round #519 - D. Mysterious Crime

    [题目] D. Mysterious Crime [描述] 有m个n排列,求一共有多少个公共子段. 数据范围:1<=n<=100000,1<=m<=10 [思路] 对于第一个排 ...

随机推荐

  1. JVM划重点:引用类型、垃圾回收算法和内存划分

    一.Java四种引用类型    每种编程语言都有操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过"引用"(Reference).在 Java ...

  2. k8s pod command使用

    简单说明 我们启pod服务时,有时需要在服务启动前做一些初始化的工作,这里可能会涉及多个shell命令以及判断执行,这里可以参考下面的步骤进行: command: ["/bin/bash&q ...

  3. kubernetes之statefulset控制器介绍

    一.简单说明 StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称,启停顺序,在Statefu ...

  4. 指标+AI+BI:构建数据分析新范式丨2024袋鼠云秋季发布会回顾

    10月30日,袋鼠云成功举办了以"AI驱动,数智未来"为主题的2024年秋季发布会.大会深度探讨了如何凭借 AI 实现新的飞跃,重塑企业的经营管理方式,加速数智化进程. 作为大会的 ...

  5. HarmonyOS NEXT仓颉开发语言实现画板案例

    大家上午好,今天分享一下仓颉开发语言实现的画板案例. 最近总是有同学说我写ArkTS冒充仓颉,为了自证清白,截图给大家看一下,确实是仓颉文件: 仓颉提供了画布组件Canvas,我们所有的绘制工作都要在 ...

  6. oracle库exp导出dmp文件导入 expdp导出不适用

    //创建用户 create user test identified by test; grant connect,resource,dba to test; //cmd 命令执行dmp文件 imp ...

  7. SQL Server 重复记录,查询,筛查,指定保留

    Select * From 表 x Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1) Order BY 重复字 ...

  8. java--Hibernate关联映射

    hibernate 程序执行流程 集合映射 User.java public class User { private int userId; private String userName; // ...

  9. pdfjs-dist v2.11.338写个react demo

    app.jsx import './App.css' import * as pdfjs from "pdfjs-dist"; import "pdfjs-dist/we ...

  10. style-vw-loader适配vite

    style-vw-loader这个插件是基于webpack的插件,不适用于vite,因为vite是基于rollup的. rollup的插件和webpack的插件写法略有不通. 查看style-vw-l ...