赛中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; }