賽中unrated.......ios
cf又炸了系列.......數組
最近cf還不錯,沒那麼容易炸spa
作了ABCDE五個題翻譯
Ablog
給你n我的的四門科目的分數,問第一我的排名多少get
分數相同的時候,id小的靠前input
---------------------------------------------string
寫sort也行,直接比較也行...hash
反正隨便作..it
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; }