A
B 输出出现次数大于3的 数 else -1
C 每次操作 奇数位+1 or 偶数位 +1 使得最后 只有 偶数 或 只有奇数
所以 只要 奇数位 有奇数&& 有偶数 or 偶数位 有奇数 &&有偶数 输出no esle yse
D 染色题 每次选择两位进行染色 可知 在一段区间内 绝对是不完全一样的
每一段是两个W之间 or 开头-W or W-结尾 记住这个结论直接on判断即可
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int main(){
//
int t; cin>>t;
while(t--){
int n; cin>>n;
string s; cin>>s;
int flag=0;
int b,r;
b=0,r=0;
for(int i=0;i<n;i++){
if(s[i]=='W') {
//flag=0;
if((b&&!r)||(r&&!b)){
flag=1; cout<<"NO"<<endl; break;
}
b=r=0;continue;
}else if(s[i]=='B'){
b=1;
}else{
r=1;
}
if(i==n-1){
if((b&&!r)||(r&&!b)){
flag=1; cout<<"NO"<<endl; break;
}
}
}
if(!flag) cout<<"YES"<<endl;
}
return 0;
}
E (i,j) i<j s[i][0] == s[j][0]&&s[i][1] != s[j][1] || s[i][0] != s[j][0]&&s[i][1] == s[j][1]
map 存储 因为 有一个一样的 一个不一样的 所以 以这个一样的为基础 模拟那个不一 样的即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int maxn=1e6;
#define inf 0x3f3f3f
map<string,int>mp;
string s[100060];
int main(){
//
int t; cin>>t;
while(t--){
int n; cin>>n;
for(int i=1;i<=n;i++){
//string s; cin>>s;
cin>>s[i];
mp[s[i]]++;
}
ll sum=0;
for(int i=1;i<=n;i++){
mp[s[i]]--;
string tmp="aa";
char tt='a';
tmp[0]=s[i][0];
for(int j=0;j<=10;j++){
tmp[1]=char(tt+j);
if(tmp==s[i]) continue;
sum+=mp[tmp];
}
tmp="aa";
tt='a';
tmp[1]=s[i][1];
for(int j=0;j<=10;j++){
tmp[0]=char(tt+j);
if(tmp==s[i]) continue;
sum+=mp[tmp];
}
//sum+=n-i-mp[s[i]];
}
cout<<sum<<endl;
}
return 0;
}
F 左右开弓 模拟 维护
G 模拟 从下往上找即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int maxn=1e6;
#define inf 0x3f3f3f
map<string,int>mp;
string s[100060];
ll a[200006];
int main(){
//
int T ; cin>>T;
while(T--){
int n,m; cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=n-1;i>=1;i--){
for(int j=0;j<m;j++){
if(s[i][j]=='.'){
for(int k=i-1;k>=0;k--){
if(s[k][j]=='o') break;
if(s[k][j]=='*') {
//break;
s[k][j]='.';
s[i][j]='*';
break;
}
}
}
}
}
for(int i=0;i<n;i++){
cout<<s[i]<<endl;
}
}
return 0;
}
H
二进制思想
我们可以知道 他的最大二进制位数 31位 2^0 - 2^30
把每一个数 转化成 二进制 遍历这个二进制数 如果这一位为0 那么记录下来
我们知道 最后结果是 所有数 and
如果 某一位为0 那么 所有数and 的话 这一位也都是0
所以 我们从30位 开始遍历 如果操作数 大于目前的0的个数 那么就可以置1
这也属于贪心思想 如果操作数<该位0的个数 那么 你or再多的1 也是无用的
还有就是 如果该位没有0 说明 所有数在该位都是1 and 后也是1 所以直接+pow(2,i)即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int maxn=1e6;
#define inf 0x3f3f3f
map<string,int>mp;
string s[100060];
ll a[200006];
ll num[1000];
int main(){
//
int T ; cin>>T;
while(T--){
memset(num,0,sizeof(num));
int n,m; cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
ll k= a[i];
int cnt=0;
// if(a[i]==0) num[0]++;
while(k){
if(k%2==0)
num[cnt]++;
cnt++;
k/=2;
}
for(int j=cnt;j<=30;j++) num[j]++;
}
ll sum=0;
for(int i=30;i>=0;i--){
if(num[i]){
if(m>=num[i]){
m-=num[i];
sum+=pow(2,i);
}
}else{
sum+=pow(2,i);
}
}
cout<<sum<<endl;
}
return 0;
}
我只能沦落到做div4了
裂了裂了