赛中unrated.......
cf又炸了系列.......
最近cf还不错,没那么容易炸
做了ABCDE五个题
A
给你n个人的四门科目的分数,问第一个人排名多少
分数相同的时候,id小的靠前
---------------------------------------------
写sort也行,直接比较也行...
反正随便做..
B
给你两个01串,a和b
你现在可以交换a中两个数字的位置
问有多少种交换方式,可以使得a OR b(a|b)的值会发生变化
---------------------------------------------
交换两个0或者两个1是没用的
b中为1的位交换是没用的
也就是说,换0和1,并且它们那一位的b位不都为1的值
直接统计一下就好了....
C
求一个1~n的排列,它的最长上升子序列长度+最长下降子序列长度最小
--------------------------------------------
我们可以这么构造
例如
n=6
3 2 1 6 5 4
n=9
3 2 1 6 5 4 9 8 7
n=7
3 2 1 6 5 4 7
这样 以sqrt(n)为界(上取整),我们可以得到一个排列
证明它是最优的我不会......但是这样能过
D
给你一个可重集合,包含m个01串,每个01串都是n位(n<=12)
两个01串的相似度是这么定义的:
给你一个w数组,如果它们第i位相同则相似度+wi,否则不变
q次询问
每次给你一个01串,一个k
问集合中有多少个01串和它的相似度<=k
--------------------------------------------------
224还算挺快的,直接求一下两两的相似度,然后预处理所有的答案
两两的相似度可以用抑或(XOR 或者叫 ^)操作来处理,然后预处理所有抑或值的相似度
从而可以O(1)的求出
每次询问直接回答即可
E
题目说了一堆.........
原版题意恕我无能不会翻译
(从原版题意转化到下面的过程:)
1,如果两点连线可以造新的点,那么新的每个点都可以和别的店造新的点
这样我们实际得到的是一个区域的面积,换句话说是个凸包
2,我们考虑两组点合并后,得到的凸包一定要求每个点都有2个才能safe
3,所以我们合并前应该是两个可以重合的凸包
实际效果:
给你两组点,一组n个点,一组m个点
两组分别求凸包,然后问它们是否可以通过平移和旋转重合
-----------------------------------------------
直接hash............
hash了每条边的权值和叉积...
注意处理三点一线...
================================
A
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int a[10005];
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int n;
scanf("%d",&n);
int i;
int cnt=1;
for (i=0;i<n;i++)
{
int x,y,z,w;
scanf("%d%d%d%d",&x,&y,&z,&w);
int sum=x+y+z+w;
a[i]=sum;
if (a[i]>a[0]) cnt++;
}
printf("%d\n",cnt);
return 0;
}
B
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char a[100005];
char b[100005];
long long cnt0,cnt1,cnt2,cnt3;
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int n;
scanf("%d",&n);
scanf("%s%s",a,b);
int i;
for (i=0;i<n;i++)
{
if (b[i]=='0')
{
if (a[i]=='1')
{
cnt1++;
}
else
{
cnt0++;
}
}
else
{
if (a[i]=='1')
{
cnt3++;
}
else
{
cnt2++;
}
}
}
cout<<cnt0*cnt1+cnt0*cnt3+cnt1*cnt2<<endl;
return 0;
}
C
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int n;
scanf("%d",&n);
int k=sqrt(n-1);
k++;
int i;
for (i=0;i<k;i++)
{
int j;
for (j=k;j>0;j--)
{
if (i*k+j<=n)
{
printf("%d ",i*k+j);
}
}
}
return 0;
}
D
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int ans[1<<12][105];
int w[15];
int sum[1<<12];
int diff[1<<12];
int n,q,m;
int get_val()
{
static char a[1005];
scanf("%s",a);
int i;
int sum=0;
for (i=0;a[i]!='\0';i++)
{
if (a[i]=='1')
{
sum+=(1<<i);
}
}
return sum;
}
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
scanf("%d%d%d",&n,&m,&q);
int i;
for (i=0;i<n;i++)
{
scanf("%d",&w[i]);
}
for (i=0;i<m;i++)
{
int t=get_val();
sum[t]++;
}
for (i=0;i<(1<<n);i++)
{
int j;
int sum=0;
for (j=0;j<n;j++)
{
if ((1<<j)&i) sum+=w[j];
}
diff[i]=sum;
}
for (i=0;i<(1<<n);i++)
{
int j;
for (j=0;j<(1<<n);j++)
{
if (diff[i^j^((1<<n)-1)]>100) continue;
ans[i][diff[i^j^((1<<n)-1)]]+=sum[j];
}
}
for (i=0;i<q;i++)
{
int x=get_val();
int y;
scanf("%d",&y);
int j;
int sum=0;
for (j=0;j<=y;j++)
{
sum+=ans[x][j];
}
printf("%d\n",sum);
}
return 0;
}
E
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct point
{
int x;
int y;
point (int xx=0,int yy=0)
{
x=xx;
y=yy;
}
friend point operator - (const point &a,const point &b)
{
return point(a.x-b.x,a.y-b.y);
}
friend long long operator * (const point &a,const point &b)
{
return (long long)a.x*b.y-(long long)b.x*a.y;
}
long long length() const
{
return (long long)x*x+(long long)y*y;
}
friend bool operator < (const point &a,const point &b)
{
if (a*b==0)
{
return a.length()<b.length();
}
return a*b<0;
}
void read()
{
scanf("%d%d",&x,&y);
}
};
point a[100005];
point b[100005];
const int p[5]={131,149,191,233,271};
const int modo[5]={200003,300007,400009,500009,700001};
int power(int x,int y,int modo)
{
if (y==0) return 1;
int t=power(x,y/2,modo);
t=(long long)t*t%modo;
if (y%2==1)
{
t=(long long)t*x%modo;
}
return t;
}
bool check(int n,int m)
{
if (n!=m)
{
return false;
}
a[n]=a[0];
a[n+1]=a[1];
b[m]=b[0];
b[m+1]=b[1];
int i,j;
long long val_a[15];
long long val_b[15];
long long val_c[15];
long long val_d[15];
for (i=0;i<5;i++)
{
val_a[i]=0;
}
for (i=0;i<5;i++)
{
int j;
for (j=0;j<n;j++)
{
val_a[i]=(val_a[i]*p[i]+(a[j]-a[j+1]).length())%modo[i];
}
}
for (i=0;i<5;i++)
{
val_b[i]=0;
}
for (i=0;i<5;i++)
{
int j;
for (j=0;j<n;j++)
{
val_b[i]=(val_b[i]*p[i]+(b[j]-b[j+1]).length())%modo[i];
}
}
for (i=0;i<5;i++)
{
val_c[i]=0;
}
for (i=0;i<5;i++)
{
int j;
for (j=0;j<n;j++)
{
val_c[i]=(val_c[i]*p[i]+(a[j]-a[j+1])*(a[j+1]-a[j+2]))%modo[i];
if (val_c[i]<0) val_c[i]+=modo[i];
}
}
for (i=0;i<5;i++)
{
val_d[i]=0;
}
for (i=0;i<5;i++)
{
int j;
for (j=0;j<n;j++)
{
val_d[i]=(val_d[i]*p[i]+(b[j]-b[j+1])*(b[j+1]-b[j+2]))%modo[i];
if (val_d[i]<0) val_d[i]+=modo[i];
}
}
for (j=0;j<n;j++)
{
int i;
for (i=0;i<5;i++)
{
if (val_a[i]!=val_b[i]) break;
if (val_c[i]!=val_d[i]) break;
}
if (i==5) break;
for (i=0;i<5;i++)
{
val_a[i]=(val_a[i]-((a[j]-a[j+1]).length())%modo[i]*power(p[i],n-1,modo[i]))%modo[i];
val_a[i]=(val_a[i]*p[i]+(a[j]-a[j+1]).length())%modo[i];
val_a[i]=(val_a[i]+modo[i])%modo[i];
val_c[i]=(val_c[i]-((a[j]-a[j+1])*(a[j+1]-a[j+2]))%modo[i]*power(p[i],n-1,modo[i]))%modo[i];
val_c[i]=(val_c[i]*p[i]+(a[j]-a[j+1])*(a[j+1]-a[j+2]))%modo[i];
val_c[i]=(val_c[i]+modo[i])%modo[i];
}
}
if (j==n) return false;
return true;
}
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int n,m;
scanf("%d%d",&n,&m);
int i;
for (i=0;i<n;i++)
{
a[i].read();
}
int min_x=1000000005,min_y=1000000005,id=-1;
for (i=0;i<n;i++)
{
if ((a[i].x<min_x)||((a[i].x==min_x)&&(a[i].y<min_y)))
{
min_x=a[i].x;
min_y=a[i].y;
id=i;
}
}
swap(a[id],a[0]);
for (i=1;i<n;i++)
{
a[i]=a[i]-a[0];
}
a[0]=point(0,0);
sort(a+1,a+n);
static point que[1000005];
que[0]=a[0];
int front=0,rail=1;
for (i=1;i<n;i++)
{
for (;rail>=2;rail--)
{
if ((que[rail-1]-que[rail-2])*(a[i]-que[rail-1])<0)
{
break;
}
}
que[rail++]=a[i];
}
n=rail;
for (i=0;i<n;i++)
{
b[i]=que[i];
}
//////////////////////
for (i=0;i<m;i++)
{
a[i].read();
}
min_x=1000000005,min_y=1000000005,id=-1;
for (i=0;i<m;i++)
{
if ((a[i].x<min_x)||((a[i].x==min_x)&&(a[i].y<min_y)))
{
min_x=a[i].x;
min_y=a[i].y;
id=i;
}
}
swap(a[id],a[0]);
for (i=1;i<m;i++)
{
a[i]=a[i]-a[0];
}
a[0]=point(0,0);
sort(a+1,a+m);
que[0]=a[0];
front=0;
rail=1;
for (i=1;i<m;i++)
{
for (;rail>=2;rail--)
{
if ((que[rail-1]-que[rail-2])*(a[i]-que[rail-1])<0)
{
break;
}
}
que[rail++]=a[i];
}
m=rail;
for (i=0;i<m;i++)
{
a[i]=que[i];
}
if (check(m,n))
{
puts("YeS");
}
else
{
puts("nO");
}
return 0;
}
浙公网安备 33010602011771号