首页 > 其他分享 >[题解]SFMOI Round I A~C

[题解]SFMOI Round I A~C

时间:2024-10-04 11:11:38浏览次数:7  
标签:nxt cout int 题解 bmod long SFMOI 区块 Round

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

\(\bf{100+50+50+25+5=\color{indianred}225\color{black}\ ,\ 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]\)边,但这种

比如下图,\((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;
		}
	}
	cout<<a.substr(1,n);
}

标签:nxt,cout,int,题解,bmod,long,SFMOI,区块,Round
From: https://www.cnblogs.com/Sinktank/p/18445821

相关文章

  • C# - 异步编程 - BackgroundWorker 类
    后台线程,BackgroundWorker类用于创建一个线程,在后台持续运行以完成某项工作,并不时地与主线程通信。BackgroundWorker类的属性,方法与事件。属性:WorkerReportsProgress:设置后台任务是否可以把它的进度汇报给主线程。WorkerSupportsCancellation:是否支持从主线程取消。IsB......
  • 【题解】「CF765F」Souvenirs
    https://www.luogu.com.cn/problem/CF765F首先有一个比较navie的\(O(n\sqrtm\logn)\)的做法(add和del的时候,用两个multiset维护一下。有一个bitset的做法来优化用multiset查询前驱后继的做法:https://www.luogu.com.cn/article/zcmco6hd首先考虑离线下来,将询问挂......
  • Codeforces Round 972 (Div. 2)
    一万一参赛,VP赛时136A.SimplePalindrome简单构造题。字母集是5,相同字母间一定构成若干回文子串。将相同字母排列在一起,则只有相同字母可以构成回文子串。显然,优先添加较少的字母即可。#include<bits/stdc++.h>usingnamespacestd;intT,n;chars[5]={'a','e','i......
  • CF154C题解
    传送门:https://codeforces.com/problemset/problem/154/C求出无向图中,满足所有出边都相连或出边直接连接点对的点对数。很显然可以暴力枚举点对一对对去check,时间复杂度\(O(n^2+m)\)。#include<bits/stdc++.h>usingnamespacestd;inlineintread(){charc;boo......
  • 构树 题解
    构树题解好题,除了毒瘤卡空间。“恰好”这个形式很二项式反演。设\(f(n)\)表示树上钦定\(n\)条边和原树相同的方案数,\(g(n)\)表示树上恰好有\(n\)条边和原树相同的方案数,那么原先的形式是:\[f(n)=\sum_{i\gen}{i\choosen}g(i)\]二项式反演得到:\[g(n)=\sum_{i\gen}(......
  • QOJ 8726 [APIO2024] 魔术表演 题解
    DescriptionAlice和Bob是著名的魔术师。Catherine是一位富豪,她非常喜欢观看Alice和Bob的魔术。某一天,Catherine决定向Alice和Bob发出挑战:只要他们能成功表演如下的魔术,Catherine就将向他们提供巨额奖金!这个魔术的表演过程如下:步骤\(1\):Bob进⼊⼀个密室中,在魔术......
  • 题解:洛谷P2339 [USACO04OPEN] Turning in Homework G
    题目链接:洛谷P2339[USACO04OPEN]TurninginHomeworkG首先我们考虑如何处理到达给定时间后才能交作业这一限制。其实在生活中,我们一般只会考虑什么时候交作业截止(除了某些卷王),这样我们只用考虑如何在最大结束时间之前交作业,而不是在所有作业都没开始交之前考虑如何转悠(前者明......
  • 题解:CF2009G1 Yunli's Subarray Queries (easy version)
    题目要求\(a_i=a_{i-1}+1\),设\(b_i=a_i-i\),如果\(b_i=b_j\),那么\(i\)和\(j\)就在正确的相对位置上。这应该很好理解吧,\(a\)是一个公差为\(1\)的等差数列,下标也是一个公差为\(1\)的等差数列,对应位置相减就相等了。我们在输入\(a_i\)的时候减去\(i\),然后用滑动窗口......
  • [题解] [SDOI2011] 消防
    [题解][SDOI2011]消防tag:图论、树、树的直径题目链接(洛谷):https://www.luogu.com.cn/problem/P2491题目描述给定一棵\(n\)个节点的树,第\(i\)条边有边权\(z_i\)。要求找到树上一条长度不大于\(s\)的简单路径,使得不在路径上的点到该路径的最大距离最小。数据范围:\(1......
  • Educational Codeforces Round 95 (Rated for Div. 2) G. Three Occurrences
    首先我们随机两个数组\(valA_x,valB_x\)。对于数组\(a\),记\(cnt\)表示\(a_i\)在前缀中出现的次数。若\(cnt\equiv0\mod3\),则\(b_i=valA_x\)若\(cnt\equiv1\mod3\),则\(b_i=valB_x\)若\(cnt\equiv2\mod3\),则\(b_i=valA_x\oplusvalB_x\)记\(pre_i\)表示\(b\)的前......