Codeforces Round #613 (Div. 2)
题库链接
https://codeforces.com/contest/1285
A. Mezo Playing Zoma
一个机器人,收到系统的指令(只包含L和R),有些命令会被忽略,求可能停留的位置最多有多少个
假设有a个L,b个R,那最左边可以到达a,最右边可以到达b,再加上0,一共a+b+1个
#include <bits/stdc++.h>
using namespace std;
const int maxn = 201110;
char s[maxn];
int main()
{
int n;
cin>>n;
cin>>s;
cout<<n+1<<endl;
return 0;
}
B. Just Eat It!
有一个数组,求是否存在一个子数组的和大于等于整个数组的和
我们把数组看成两部分,前面和后面,前面 + 后面 = 总的数组和
当前面<=0时,后面>=总的数组和,同理,当后面<=0时,前面>=总的数组和
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 201110;
const int M = 1e9+7;
int n,m,k,t;
ll a[maxn];
ll sum[maxn];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("data.in", "r", stdin);
#endif
int T;
cin(T);
while(T--)
{
cin(n);
for(int i = 1; i <= n; i++)
{
scanf("%lld",&a[i]);
sum[i] =sum[i-1]+a[i];
}
bool flag = 0;
for(int i = 1; !flag && i < n; i++)
{
if(sum[i] <= 0) flag = 1;
}
ll temp = 0;
for(int i = n; !flag && i > 1; i--)
{
temp += a[i];
if(temp <= 0) flag = 1;
}
if(flag) puts("NO");
else puts("YES");
}
return 0;
}
C. Fadi and LCM
给定一个X,lcm(a,b) = x,对于所有满足的对中,找max(a,b)最小的
首先a和b肯定是互质的,其次我们可以枚举答案
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 201110;
const int M = 1e9+7;
int main()
{
ll n;
cin>>n;
for(ll i = sqrt(n); i >= 1; i--)
{
ll j = n/i;
if(n%i == 0 && (gcd(i,j) == 1))
{
cout<<i<<' '<<n/i<<endl;
return 0;
}
}
return 0;
}
D. Dr. Evil Underscores
找一个x,使得\(\underset{1 \leq i \leq n}{\max} (a_i \oplus X)\)最小,并且输出这个最大值,我一直以为是输出x,读错题目了,2333
假设这个最大值为ans,首先从高位开始,如果这一位只有0或者只有1,那么ans的这一位就可以是0,因为只要x对应的取0和1就行了
而如果这一位既有0又有1,那么ans的这一位一定会有1,因为不管你对应的x取0还是取1,都会留下一个1
但是我可以选择,如果我选择x的这一位为1,那么0变成1,1变成0,如果我选择x的这一位为0那么1变成1,0变成0,
我可以利用x把一个分支的当前位变为0,所以那个分支的最大值就不超过(1<<bit),所以我可以选择左右分支更小的那一个,希望我解释清楚了,还有不懂就留言吧
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define cin(a) scanf("%d",&a)
#define pii pair<int,int>
#define ll long long
#define gcd __gcd
const int inf = 0x3f3f3f3f;
const int maxn = 201110;
const int M = 1e9+7;
int n,m,k,t;
vector<int> a;
int dfs(vector<int> &c, int bit)
{
if(c.size() == 0 || bit < 0) return 0;
vector<int> l,r;
for(auto &i : c)
{
if( ((i>>bit)&1) == 0) l.push_back(i); //0
else r.push_back(i); //1
}
if(l.size() == 0) return dfs(r,bit-1);
if(r.size() == 0) return dfs(l,bit-1);
return min(dfs(l,bit-1),dfs(r,bit-1))+(1<<bit);
}
int main()
{
cin>>n;
for(int i = 1,x; i <= n; i++)
{
cin>>x;
a.push_back(x);
}
cout<<dfs(a,30)<<endl;
return 0;
}
E. Delete a Segment