竟然又没掉?
A - Parity
先判断基数是奇数还是偶数,如果是偶数,其奇偶性显然只与个位的奇偶性相关,否则与所有数位的数的和的奇偶性相关。
#include<bits/stdc++.h>
using namespace std;
char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
T f=1;ans=0;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
}
typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;
int b,k,a[Maxn];
int main() {
read(b,k);
for(int i=1;i<=k;i++) read(a[i]);
if(b&1) {
int zhy=0;
for(int i=1;i<=k;i++) zhy+=a[i];
if(zhy&1) puts("odd");
else puts("even");
}
else
if(a[k]&1) puts("odd");
else puts("even");
return 0;
}
B - Tape
贪心一下就好了,好像usaco上讲过的。
#include<bits/stdc++.h>
using namespace std;
char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
T f=1;ans=0;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
}
typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;
int n,m,k,a[Maxn];
priority_queue<int,vector<int>,greater<int> > q;
int main() {
read(n,m,k);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<n;i++) q.push(a[i+1]-a[i]-1);
int ans=n;
n-=k;
while(n--) {
ans+=q.top();
q.pop();
}
printf("%d
",ans);
return 0;
}
C - Meaningless Operations
首先观察样例,可以发现0与另一个数字的gcd就是另一个数字,那么如果这个数的位不满,就一定可以选出来一个数与他的&为0,而^为所有位满的数。
如果满的话,可以发现异或就是减去这个数,而位与还是这个数,那么这个数如果就是那个数的约数,其gcd就是这个约数。那么就可以选择那个数的最大的约数即可。
#include<bits/stdc++.h>
using namespace std;
char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
T f=1;ans=0;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
}
typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;
int q,x;
int main() {
read(q);
while(q--) {
read(x);
int sxz=1;
while(sxz<=x) sxz<<=1;
sxz--;
if(x==sxz) {
int flag=0;
for(int i=2;i*i<=sxz;i++)
if(sxz%i==0) {
flag=sxz/i;
break;
}
if(!flag) puts("1");
else printf("%d
",flag);
}
else printf("%d
",sxz);
}
return 0;
}
D - Jongmah
很显然,如果是连着的三个超过了三个,那么一定就没有意义了,因为可以选三个相同的也能达到相同的效果,所以可以直接进行DP了。
#include<bits/stdc++.h>
using namespace std;
char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
T f=1;ans=0;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
}
typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;
int n,m,x,a[Maxn],f[Maxn][3][3];
int main() {
read(n,m);
for(int i=1;i<=n;i++) {
read(x);
a[x]++;
}
for(int i=1;i<=m;i++) {
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
for(int l=0;l<3;l++) {
if(j+k+l>a[i]) continue;
f[i][k][l]=max(f[i][k][l],f[i-1][j][k]+l+(a[i]-j-k-l)/3);
}
}
printf("%d
",f[m][0][0]);
return 0;
}
E - Magic Stones
先差分,然后发现操作的本质就是交换两个数,具体可以参考题解。
#include<bits/stdc++.h>
#define qmin(x,y) (x=min(x,y))
#define qmax(x,y) (x=max(x,y))
using namespace std;
char gc() {
// static char buf[100000],*p1,*p2;
// return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin))?EOF:*p1++;
return getchar();
}
template<class T>
int read(T &ans) {
T f=1;ans=0;
char ch=gc();
while(!isdigit(ch)) {
if(ch==EOF) return EOF;
if(ch=='-') f=-1;
ch=gc();
}
while(isdigit(ch))
ans=ans*10+ch-'0',ch=gc();
ans*=f;return 1;
}
template<class T1,class T2>
int read(T1 &a,T2 &b) {
return read(a)==EOF?EOF:read(b);
}
template<class T1,class T2,class T3>
int read(T1 &a,T2 &b,T3 &c) {
return read(a,b)==EOF?EOF:read(c);
}
typedef long long ll;
const int Maxn=1100000;
const int inf=0x3f3f3f3f;
const ll mod=998244353;
int n,a[Maxn],b[Maxn];
int main() {
read(n);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) read(b[i]);
if(a[1]!=b[1]||a[n]!=b[n]) {
puts("No");
return 0;
}
for(int i=1;i<n;i++) a[i]=a[i+1]-a[i],b[i]=b[i+1]-b[i];
sort(a+1,a+n),sort(b+1,b+n);
for(int i=1;i<n;i++) {
if(a[i]!=b[i]) {
puts("No");
return 0;
}
}
puts("Yes");
return 0;
}