到中期总有不安的焦虑导致想法过多的懈怠,打打cf找找状态,赛中又回到之前浮躁的状态,总是不能很好的静下心。赛后静下来发现自己在模拟比赛中还是专注不够,造成一些过于啥b 的想法。
比赛前静心,集中思考,思路放宽点。
题目:A. XORwice
求最小的(a ^ x)+(b ^ x)。 明显贪心找a和b的公共1部分全变为0。a,b与完取异或即可,看看数据容易发现也就是直接a,b异或。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
int main() {
int T;
scanf("%d",&T);
while(T--) {
ll a,b;
scanf("%lld %lld",&a,&b);
printf("%lld\n",(a^(a&b))+(b^(a&b)));
}
return 0;
}
题目:B. Putting Bricks in the Wall
给定一个n*n的图,从(1,1)走到(n,n),其余由0,1组成,你走到的格子是0那么就必须走0,同理1,问你最少改变几次使得从起点走不到终点。
题意读矛盾了,题中说明了给定的是存在的解,并且不需要你找到最小的。。。。(所以我们只需要考虑左上角以及右下角的值即可)。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<bits/stdc++.h>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
char s[205][210];
int main() {
int T;
scanf("%d",&T);
while(T--) {
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i) {
scanf("%s",s[i]+1);
}
if(s[1][2]==s[2][1] && s[n][n-1]==s[n-1][n]) {
if(s[1][2]==s[n][n-1]) {
printf("2\n2 1\n1 2\n");
}
else {
printf("0\n");
}
}
else if(s[1][2]==s[2][1]) {
if(s[n][n-1]==s[1][2]) {
printf("1\n%d %d\n",n,n-1);
}
else {
printf("1\n%d %d\n",n-1,n);
}
}
else if(s[n][n-1]==s[n-1][n]) {
if(s[n][n-1]==s[1][2]) {
printf("1\n1 2\n");
}
else {
printf("1\n2 1\n");
}
}
else {
vector<PP>hh;
if(s[n][n-1]=='1') {
hh.push_back(mmp(n,n-1));
}
if(s[n-1][n]=='1') {
hh.push_back(mmp(n-1,n));
}
if(s[1][2]=='1') {
hh.push_back(mmp(2,1));
}
if(s[2][1]=='1') {
hh.push_back(mmp(1,2));
}
printf("2\n");
for(int i=0;i<hh.size();++i) {
printf("%d %d\n",hh[i].first,hh[i].second);
}
}
}
return 0;
}
给定一个串S,用图中的两个操作让他变为回文串,输出操作总数,以及擦操作。
首先判断他是否为回文,回文则为0。
否则我们思考一下abc。
但他们都不一样的时候如何让构造回文,两个操作都是中间数动,可知关键点还是在首尾两个字符。
s
1
s
2
.
.
.
s
n
−
2
s
n
s_1s_2...s_{n-2}s_n
s1s2...sn−2sn可以L操作变为
s
n
−
2
.
.
.
s
2
s
1
s
2
.
.
.
s
n
−
2
s
n
s_{n-2}...s_2s_1s_2...s_{n-2}s_n
sn−2...s2s1s2...sn−2sn
需要找到s1,sn的对称,继续。
s
n
−
2
.
.
.
s
2
s
1
s
2
.
.
.
s
n
−
2
s
n
s
n
−
2
.
.
.
s
2
s
1
s_{n-2}...s_2s_1s_2...s_{n-2}s_ns_{n-2}...s_2s_1
sn−2...s2s1s2...sn−2snsn−2...s2s1构造了s1的对称,看sn即可。
最后R s2-sn-2。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<bits/stdc++.h>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
char s[100100];
int main() {
scanf("%s",s+1);
int len=strlen(s+1);
bool flag=true;
for(int i=1;i<=len;++i) {
if(s[i]==s[len-i+1]) continue;
else {
flag=false; break;
}
}
if(flag)
printf("0\n");
else {
printf("3\n");
printf("L %d\n",len-1);
printf("R %d\n",len-1);
printf("R %d\n",len*2-1);
}
return 0;
}
题目:D. Hexagons
如图蜂巢模型,六个方向各有价值,问从(0,0)到(x,y)的最小距离。
范围大。考虑构造。
首先分析(0,0)到(1,1)的距离,类似于最短路的松弛边思想达最小,我们放缩六边形的相邻位置,到相邻点最小有10种方法,其中基于最小和相同的排除后,可以发现只有两种比较到达的大小,使得路径最短。可以自己写一写。
完了直接曼哈顿距离计算。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<bits/stdc++.h>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
char s[205][210];
int main() {
int T;
scanf("%d",&T);
while(T--) {
ll x,y;
scanf("%lld %lld",&x,&y);
ll c1,c2,c3,c4,c5,c6;
scanf("%lld %lld %lld %lld %lld %lld",&c1,&c2,&c3,&c4,&c5,&c6);
c1=min(c1,c2+c6);
c2=min(c2,c1+c3);
c3=min(c3,c2+c4);
c4=min(c4,c3+c5);
c5=min(c5,c4+c6);
c6=min(c6,c1+c5);
ll ans=0;
if(x>=0 && y>=0) {
ans+=min(x,y)*c1;
ans+=(x-min(x,y))*c6+(y-min(x,y))*c2;
}
else if(x<=0 && y<=0) {
x=-x,y=-y;
ans+=min(x,y)*c4;
ans+=(x-min(x,y))*c3+(y-min(x,y))*c5;
}
else {
if(x>=0) {
ans=x*c6+(-y)*c5;
}
else {
ans=(-x)*c3+c2*y;
}
}
printf("%lld\n",ans);
}
return 0;
}