牛客小白月赛18-记录
生活随笔
收集整理的這篇文章主要介紹了
牛客小白月赛18-记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
比賽鏈接:https://ac.nowcoder.com/acm/contest/1221
成績
總結
好難,就拿了一些水題分
T1:Forsaken喜歡數論\texttt{T1:Forsaken喜歡數論}T1:Forsaken喜歡數論
題目大意
f(i)f(i)f(i)表示iii的最小質因子,求∑i=2nf(i)\sum_{i=2}^nf(i)∑i=2n?f(i)
解題思路
線性篩就是用每個數的最小質因子把這些數篩掉,所以篩的時候統計就好了
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; ll n,cnt,prime[6893911*3],ans; bool v[10000001*3]; int main() {scanf("%lld",&n);v[1]=1;for(ll i=2;i<=n;i++){if(!v[i]) prime[++cnt]=i,ans+=i;for(ll j=1;j<=cnt&&i*prime[j]<=n;j++){v[prime[j]*i]=1;ans+=prime[j];if(!(i%prime[j])) break;}}printf("%lld",ans); }T2:Forsaken喜歡字符串\texttt{T2:Forsaken喜歡字符串}T2:Forsaken喜歡字符串
題目大意
對于一個字符串的子串的價值是在其他字符串里有多少個和它相同的子串。
給nnn個字符串,每次詢問第xxx個字符串長度為lenlenlen的子串的價值之和是多少
解題思路
我們發現每個字符串的長度都很小,所以我們可以暴力字符串hash+maphash+maphash+map庫來統計
要注意的是不能算上自己這個字符串,所以每次詢問時在開一個mapmapmap,再用兩個相減
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; const int N=5e4+10; int n,k,m; map<int,int> v,now; char s[N][6]; int main() {scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%s",s[i]);for(int l=0;l<k;l++){int z=0;for(int r=l;r<k;r++){z+=s[i][r]-'a'+1;z*=27;v[z]+=r-l+1;}}}scanf("%d",&m);while(m--){int x,len;scanf("%d%d",&x,&len);now.clear();int ans=0;for(int l=0;l<k;l++){int z=0;for(int r=l;r<k;r++){z+=s[x][r]-'a'+1;z*=27;now[z]+=r-l+1;}}for(int l=0;l<k;l++){int z=0;if(l+len>k) continue;for(int r=l;r<min(l+len,k);r++)z+=s[x][r]-'a'+1,z*=27;ans+=v[z]-now[z];}printf("%d\n",ans);} }T3:Forsaken給學生分組\texttt{T3:Forsaken給學生分組}T3:Forsaken給學生分組
題目大意
將nnn個數分為kkk組,每組的價值是最大的數減去最小的數。求最大價值和
解題思路
顯然我們可以貪心選取,需要注意的是若k>n2k>\frac{n}{2}k>2n?,那么有些就得單獨一組
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10; ll n,k,a[N],ans; int main() {scanf("%lld%lld",&n,&k);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+1+n);if(k>n/2) k=n-k;for(ll i=1;i<=k;i++)ans+=a[n-i+1]-a[i];printf("%lld",ans); }T4:Forsaken喜歡正方形\texttt{T4:Forsaken喜歡正方形}T4:Forsaken喜歡正方形
題目大意
求四個點能不能組成正方形,或者微調之后能不能組成正方形。
解題思路
考試的時候直接匹配了444條邊相等(沒有判斷菱形)就過了,如果要判斷菱形就加一個判斷對角線是不是邊長的2\sqrt22?倍就好了,這里就不加先了
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int x[5],y[5]; const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; int get_dis(int a,int b) {return (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]);} bool check() {int l1=get_dis(1,2),l2=get_dis(2,3),l3=get_dis(3,4),l4=get_dis(4,1);if(l1==l2&&l2==l3&&l3==l4) return 1;l1=get_dis(1,2),l2=get_dis(2,4),l3=get_dis(4,3),l4=get_dis(3,1);if(l1==l2&&l2==l3&&l3==l4) return 1;l1=get_dis(1,3),l2=get_dis(3,2),l3=get_dis(2,4),l4=get_dis(4,1);if(l1==l2&&l2==l3&&l3==l4) return 1;l1=get_dis(1,3),l2=get_dis(3,4),l3=get_dis(4,2),l4=get_dis(2,1);if(l1==l2&&l2==l3&&l3==l4) return 1;l1=get_dis(1,4),l2=get_dis(4,2),l3=get_dis(2,3),l4=get_dis(3,1);if(l1==l2&&l2==l3&&l3==l4) return 1;l1=get_dis(1,4),l2=get_dis(4,3),l3=get_dis(3,2),l4=get_dis(2,1);if(l1==l2&&l2==l3&&l3==l4) return 1;return 0; } int main() {for(int i=1;i<=4;i++)scanf("%d%d",&x[i],&y[i]);if(check()){printf("wen");return 0;}for(int i=1;i<=4;i++){for(int k=0;k<4;k++){x[i]+=dx[k];y[i]+=dy[k];if(check()){printf("hai xing");return 0;}x[i]-=dx[k];y[i]-=dy[k];}}printf("wo jue de bu xing"); }T7:Forsaken的三維數點\texttt{T7:Forsaken的三維數點}T7:Forsaken的三維數點
題目大意
一個三維空間以(0,0,0)(0,0,0)(0,0,0)為中心,每次兩個操作
解題思路
因為是kkk的最小整數值,所以我們直接對于小數向上取整,然后二分+樹狀數組即可
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define lowbit(x) x&-x using namespace std; const int N=2e5+10; int n,t[N+10],l,r; void change(int x,int z) {while(x<=N){t[x]+=z;x+=lowbit(x);} } int ask(int x) {int ans=0;while(x){ans+=t[x];x-=lowbit(x);}return ans; } double get_dis(double x,double y,double z) {return sqrt(x*x+y*y+z*z);} int main() {scanf("%d",&n);for(int i=1;i<=n;i++){int op;double x,y,z;scanf("%d%lf",&op,&x);if(op==1){scanf("%lf%lf",&y,&z);double dis=get_dis(x,y,z);dis+=(((int)dis)!=dis);change((int)dis,1);}else{l=0;r=N;while(l<=r){int mid=(l+r)/2;if(ask(mid)<(int)x) l=mid+1;else r=mid-1;}if(ask(l)<(int)x) printf("-1\n");else printf("%d\n",l);}} }總結
以上是生活随笔為你收集整理的牛客小白月赛18-记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P1477-[NOI2008]假面舞会【
- 下一篇: DOS配置(dos电脑配置)