Codeforces Round #752 (Div. 2)
Dashboard - Codeforces Round #752 (Div. 2) - Codeforces (Unofficial mirror site, accelerated for Chinese users)Codeforces. Programming competitions and contests, programming communityhttps://codeforce
A比较简单跳过了,B想了一会,发现与XOR和相关的题目,一般都不会真的求XOR,很容易就想到,如果是偶数个数的话,全部切成1,那么xor和自然为0,但是如果是奇数,全部切成1就不行,那么我们只要划分一个降序的2,其他都是1,xor和又变成0了,也就是说,只有全部是升序的奇数个数情况才不行
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int num[maxn];
int dp1[maxn];
int uplength(int *now,int n){
int l = 1;
memset(dp1,0,sizeof dp1);
dp1[1] = now[1];
for(int i=2;i<=n;i++){
if(now[i]>dp1[l])
dp1[++l] = now[i];
else{
int j = upper_bound(dp1+1,dp1+l+1,now[i])-dp1;
dp1[j] = now[i];
}
}
return l;
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i = 1;i<=n;i++){
cin>>num[i];
}
if(n%2==0) {
cout << "YES" << endl; //全部分成只有一个点
continue;
}
if(n%2!=0) {
if(uplength(num,n)!=n)
cout<<"YES"<<endl;
else
cout<<"No"<<endl;
}
}
}
这个地方其实可以不用上升最大子序列去判断,只要单纯判断这一个和前一个比是不是上升了就可以了。
然后是C,C有一个数论知识
如果一个数x 能整除一个集合a中所有数的 Lcm,那么x整除这个集合内的所有数。
两种不可能的情况,一种是谁都动不了,也就是大家都恰好整除i+1
第二种情况是某个数,即使被移动到前面的位置,所有位置都会被整除,也就是ai如果能整除前面位置+1的lcm,那么这个数就没有办法被挪开
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
ll sum=b==0?a:gcd(b,a%b);
return sum;
}
ll lcm(ll a,ll b)
{
ll g=gcd(a,b);
ll sum=a*b/g;
return sum;
}
void solve(){
int n;
scanf("%d",&n);
ll k=1,ok=1;
for(int i=1;i<=n;i++)
{
ll x;
scanf("%lld",&x);
k=lcm(k,i+1);
if(x%k==0)ok=0;
}
if(ok)puts("YES");
else puts("NO");
}
int main()
{
int T;
scanf("%d",&T);
while(T--)solve();
return 0;
}
D 非常巧妙的题目,我到现在也不能理解的很顺畅,总而言之就是三种情况
x=y,输出x
x>y 从n%x = y%n可以看出来,n也可能同时小于x和y,但是规律不太好找(不确定),n不可能在x和y中间,否则左边为n,右边一定小于y,矛盾了;确定的规律是,我们可以让n=x+y,这样左边就是n-x=x+y-x=y,右边是y,恒成立
x<y 看题解明白的,n在x和y中间的时候是可以找到一定规律的,n mod x = n -kx,我们可以让k最大,也就是让k = k/x,而y mod n = y-n,化简得到n = (y+y%x*x)/2;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;cin>>t;
ll x,y;
while(t--){
cin>>x>>y;
if(x==y){
cout<<x<<endl;
continue;
}
if(x>=y){
cout<<x+y<<endl;
continue;
}
cout<<(y+(y/x)*x)/2<<endl;
}
return 0;
}
//知道两个偶数,找一个n n%x = y%n
//对应的n也是偶数
//两个如果相等,那么输出相等结果就可以了,如果两个不相等,那么根据大于或者小于去判断
//x>y,从 n%x = y%n可以看出来,我们如果让n = x+y,那么左边就会等于y,右边也等于y(相当于让左边等于x+y-x)
//x<y则不行,因为减去的x可能不止一个了,无法维持这个结论
//从公式可以推出n = (y+(y/x)*x)/2
后面的题没开,感觉做到这里就是极限了,一步一步来吧,这周尽量再把吉首大学那个新生赛补了
更多推荐
所有评论(0)