【LGR-197-Div.2】洛谷 10 月月赛 I &「SFMOI」Round I题解记录(A,B1,B2,C)
比赛链接:https://www.luogu.com.cn/contest/179008
A.Strange Cake Game
对于小W,往下走最赚,对于小M往右走最赚,于是路线形成了个折线,直接对应竖坐标位置去看看横坐标符不符合要求即可
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<deque>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<random>
using namespace std;
typedef long long ll;
void fio()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
ll ksm(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1)
ans*=x;
x*=x;
y>>=1;
}
return ans;
}
ll gcd(ll x,ll y)
{
if(y==0)
return x;
else
return gcd(y,x%y);
}
int main()
{
ll n,m;
cin>>n>>m;
ll k;
cin>>k;
ll ans=0;
while(k--)
{
ll x,y;
cin>>x>>y;
if(x<=y)
ans++;
}
cout<<ans<<endl;
}
B1.Strange Madoka Game
将题目进行转化形成两个式子\(k1*x1+b1=m,k2*x2+b2=m\)
然后有\(k1*x1+b1=k2*x2+b2\)
随后左右模x2
有\((k1*x1+b1-b2)\)%\(x2=0\)
这里我取\(x2=4e8-1,x1=4e8\)
最后式子可转化成
\(k1\)%\(x2=(b2-b1)\)%\(x2\)
对于k1,他必须小于x2,否则\(k1*x2>1e17\),所以当\(b2-b1<=0,k1=b1-b2\),否则\(k1=x2-(b1-b2)\)
所以\(m=k1*x1+b1\)
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<deque>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<random>
using namespace std;
typedef long long ll;
//mt19937 rand(time(0));
void fio()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
ll ksm(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1)
ans*=x;
x*=x;
y>>=1;
}
return ans;
}
ll gcd(ll x,ll y)
{
if(y==0)
return x;
else
return gcd(y,x%y);
}
int main()
{
ll t;
cin>>t;
ll x=4e8,y=(4e8-1);
while(t--)
{
cout<<"? "<<x<<endl;
cout.flush();
ll j;
cin>>j;
cout<<"? "<<y<<endl;
cout.flush();
ll k;
cin>>k;
cout<<"! ";
if(j==0&&k==0)
{
cout<<0<<endl;
}
else if(j==k)
{
cout<<j<<endl;
}
else
{
ll uo=(j-k)%y;
ll c=y-uo;
if(uo<=0)
c=abs(uo);
cout<<x*(c)+j<<endl;
}
}
}
B2.Strange Homura Game
先将式子得出\(x1=m*k1+b1,x2=m*k2+b2\)
转化得\(x1-b1=m*k1,x2-b2=m*k2\)
现在只要使\(k1!=k2即可使答案m得出\)
这里取x最好取大于等于2e17的数,这样求出第一个\(k1*m\),
然后用\((k1*m-1)\),得出\(k2*m\)
这样保证\(k1=k2+1\),随后gcd即可
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<deque>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<random>
#include<time.h>
using namespace std;
typedef long long ll;
mt19937 rnd(time(0));
void fio()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
ll ksm(ll x,ll y)
{
ll ans=1;
while(y)
{
if(y&1)
ans*=x;
x*=x;
y>>=1;
}
return ans;
}
ll gcd(ll x,ll y)
{
if(y==0)
return x;
else
return gcd(y,x%y);
}
int main()
{
ll x=((ll)1e17)+rnd()%(ll)(1e17);
ll t;
cin>>t;
while(t--)
{
ll j,k;
cout<<"? "<<x<<endl;
cout.flush();
cin>>j;
ll uo=x-j;//倍数
ll ko=uo-1;
cout<<"? "<<ko<<endl;
cout.flush();
cin>>k;
ll co=gcd(uo,ko-k);
cout<<"! "<<co<<endl;
}
}
C.Strange Train Game
这个看了题解区大佬的解法orz,set的启发式合并
这里照写了一遍代码,确实很妙。出处不来自这里
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll>q[350000];
ll p[350000];
int main()
{
ll n,m;
cin>>n>>m;
string f1,f2;
cin>>f1>>f2;
for(ll i=1;i<=m;i++)
{
ll l,r;
cin>>l>>r;
q[l-1].insert(r-1);
}
ll now=0;
for(ll i=0;i<n;i++)
{
now^=p[i];
if(now)swap(f1[i],f2[i]);
if(f1[i]==f2[i])
{
cout<<f1[i];
if(q[i].count(i))
{
q[i].erase(i);
}
if(q[i].size()>q[i+1].size())swap(q[i],q[i+1]);
q[i+1].insert(q[i].begin(),q[i].end());
}
else
{
if(q[i].empty())
{
cout<<f1[i];
}
else
{
cout<<"1";
auto j=q[i].begin();
q[i].erase(*j);
if(q[i].size()>q[(*j)+1].size())swap(q[i],q[(*j)+1]);
q[(*j)+1].insert(q[i].begin(),q[i].end());
if(f2[i]=='1')now^=1,p[(*j)+1]^=1;
}
}
}
}