731A - A - Sonya and Queries
难度: 计导中等题
因为所有不同的情况只有 2 18 2^{18} 218种,所以可以开一个数组计数,然后这道题就做完了.
#include <cstdio>
#include <cstring>
const int N=1e5+5;
int cnt[1<<20];
int trans(char *x){
int res=0;
for(int i=0;i<18;i++)res=(res<<1)^((x[17-i]-'0')&1);
return res;
}
void Reverse(char *s){
int len=strlen(s);
for(int j=0,k=len-1;j<k;j++,k--){
char a=s[j];s[j]=s[k];s[k]=a;
}
}
int main(){
int n;
scanf("%d",&n);
while(n--){
char o[10],s[20]={
0};
scanf("%s%s",o,s);
Reverse(s);
switch(o[0]){
case '+':{
cnt[trans(s)]++;
break;
}
case '-':{
cnt[trans(s)]--;
break;
}
case '?':{
printf("%d\n",cnt[trans(s)]);
break;
}
}
}
}
714B - B - Filya and Homework
难度: 计导中等题
如果有大于 3 3 3种不同的值,那么显然无解.如果有三种,那么显然需要 a + c = 2 b ( a < b < c ) a+c=2b(a<b<c) a+c=2b(a<b<c),如果小于两种则必然有解.
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int a[100005],dif=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);dif=unique(a+1,a+1+n)-a-1;
puts((dif<=2)?"YES":((dif<=3&&(a[1]+a[3]==a[2]*2))?"YES":"NO"));
}
714D - C - Searching Rectangles
难度: 计导中等题
考虑二分,每次缩短一半的寻找范围,因此迭代次数不超过 17 17 17次.一共有 8 8 8条边需要找,所以可以在 200 200 200次询问内找出两个矩形.
#include <iostream>
#include <algorithm>
using namespace std;
int res[10];
int a1,b1,a2,b2;
void update(int &q){
if(a1<=res[1]&&b1<=res[2]&&res[3]<=a2&&res[4]<=b2)q--;
}
int main(){
int n;
scanf("%d",&n);
int q;
{
a1=1;b1=1;a2=n;b2=n;
int l=1,r=n;
while(l<r){
a2=(l+r)>>1;
cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
fflush(stdout);
cin>>q;
if(q==0)l=a2+1;else r=a2;
}
a2=l;
//puts("here");
l=1;r=a2;
while(l<r){
a1=(l+r+1)>>1;
cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
fflush(stdout);
cin>>q;
if(q==0)r=a1-1;else l=a1;
}
a1=l;
//puts("here");
l=1;r=n;
while(l<r){
b2=(l+r)>>1;
cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
fflush(stdout);
cin>>q;
if(q==0)l=b2+1;else r=b2;
}
b2=l;
//puts("here");
l=1;r=b2;
while(l<r){
b1=(l+r+1)>>1;
cout<<"? "<<a1<<" "<<b1<<" "<<a2<<" "<<b2<<endl;
fflush(stdout);
cin>>q;
if(q==0)r=b1-1;else l=b1;
}
b1=l;
//puts("here");
res[1]