2015浙江省赛题解
A 映射一下
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e5+10; const int inf=1e9; int a[N]; map<int,int> m1; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int n; cin>>n; int i; m1.clear(); int last=0; int maxn=0; int x=-1; int f=0; for(i=1;i<=n;i++){ cin>>a[i]; m1[a[i]]++; if(m1[a[i]]>maxn){ maxn=m1[a[i]];x=a[i]; f=1; }else if(m1[a[i]]==maxn){ f=0; } } if(!f)puts("Nobody"); else printf("%d\n",x); } return 0; }
B 预处理+思维
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+5; int a[32]; int s[N]; int dis[N]; int main(){ int t; scanf("%d",&t); while(t--){ memset(a,0,sizeof a); int n; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&s[i]); for(int i=1;i<=n;i++){ for(int j=30;j>=0;j--){ if((1<<j)<=s[i]){ a[j]++; dis[i]=j; break; } } } ll sum=0; for(int i=1;i<=n;i++){ for(int j=dis[i]-1;j>=0;j--){ if(((1<<j)^s[i])>s[i]){ sum+=a[j]; } } } printf("%lld\n",sum); } }
C 凸包
D 按位置算贡献,组合数
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e6+10; const int inf=1e9; int a[N]; map<int,int> m1; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ memset(a,0,sizeof a); ll n; cin>>n; ll sum=0; for(ll i=1;i<=n;i++){ ll x; cin>>x; if(a[x]){ sum+=x*(i-a[x])*(n-i+1); a[x]=i; } else{ sum+=x*((n-i+1)*(i)); a[x]=i; } } cout<<sum<<endl; } return 0; }
G 排序模拟
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e6+10; const int inf=1e9; struct node{ string s; int x; bool operator <(const node &t) const{ return x<t.x; } }s[155]; string tmp[5]; int main(){ ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int ans=0; int S,M,D; cin>>S>>M>>D; int i; int cnt=0; for(i=1;i<=S;i++){ string x; cin>>x; int num; cin>>num; s[++cnt]={x,num}; } sort(s+1,s+1+cnt); if(cnt%2){ tmp[1]=s[(cnt+1)/2].s; ans+=s[cnt/2+1].x; } else{ tmp[1]=s[cnt/2+1].s; ans+=s[cnt/2+1].x; } cnt=0; for(i=1;i<=M;i++){ string x; cin>>x; int num; cin>>num; s[++cnt]={x,num}; } sort(s+1,s+1+cnt); if(cnt%2){ tmp[2]=s[(cnt+1)/2].s; ans+=s[cnt/2+1].x; } else{ tmp[2]=s[cnt/2+1].s; ans+=s[cnt/2+1].x; } cnt=0; for(i=1;i<=D;i++){ string x; cin>>x; int num; cin>>num; s[++cnt]={x,num}; } sort(s+1,s+1+cnt); if(cnt%2){ tmp[3]=s[(cnt+1)/2].s; ans+=s[cnt/2+1].x; } else{ tmp[3]=s[cnt/2+1].s; ans+=s[cnt/2+1].x; } cout<<ans<<" "<<tmp[1]<<" "<<tmp[2]<<" "<<tmp[3]<<endl; } return 0; }
H 模拟
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e6+10; const int inf=1e9; int a[7]={6,9,6,5,5,5,5}; bool check(int n) { if(n%400==0||(n%100!=0&&n%4==0)) return true; return false; } int main(){ //ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int y; scanf("%d",&y); int s=y-1928,k=0; for(int i=1929;i<=y;i++) { if(check(i)) k++; } printf("%d\n",a[(2+k+s)%7]); } return 0; }
I 最短路+思维
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e6+10; const int mod=1e9+7; int n,m; char g[550][550]; int sx,sy,ex,ey; int dx[]={-1,0,1,0}; int dy[]={0,1,0,-1}; vector<pll> num; int h[N],ne[N],e[N],idx; int cost[N],w[N]; int st[N]; int dis[N][2]; struct node{ int x,y; int id; bool operator <(const node &t) const{ if(x==t.x) return y>t.y; return x>t.x; } }; void add(int a,int b,int c,int d){ e[idx]=b,ne[idx]=h[a],cost[idx]=c,w[idx]=d,h[a]=idx++; } bool check(int x,int y){ if(x>=0&&x<n&&y>=0&&y<m){ if(g[x][y]!='#') return true; } return false; } int solve(int x,int y){ int res=0; if(g[x][y]>='a'&&g[x][y]<='z') res+=(g[x][y]-'a'+1); int i; for(i=0;i<4;i++){ int a=x+dx[i]; int b=y+dy[i]; if(!check(a,b)) continue; if(g[a][b]>='A'&&g[a][b]<='Z') res+=(g[a][b]-'A'+1); } return res; } int get(int a,int b,int c,int d){ int res=solve(c,d); int i,j; for(i=0;i<4;i++){ int x=dx[i]+a; int y=dy[i]+b; if(check(x,y)){ if(g[x][y]>='A'&&g[x][y]<='Z'){ for(int k=0;k<4;k++){ int tmp1=dx[k]+x; int tmp2=dy[k]+y; if(check(tmp1,tmp2)){ if(tmp1==c&&tmp2==d){ res-=(g[x][y]-'A'+1); } } } } } } return res; } void dij(){ int ans1,ans2; priority_queue<node> q; q.push({0,0,sx*m+sy}); int i; for(i=0;i<=n*m;i++){ st[i]=0; dis[i][1]=0x3f3f3f3f; dis[i][0]=0x3f3f3f3f; } dis[sx*m+sy][0]=dis[sx*m+sy][1]=0; while(q.size()){ auto t=q.top(); q.pop(); if(st[t.id]) continue; st[t.id]=1; if(t.id==ex*m+ey){ ans1=t.x; ans2=t.y; break; } for(i=h[t.id];i!=-1;i=ne[i]){ int j=e[i]; if(dis[j][0]>dis[t.id][0]+cost[i]){ dis[j][0]=dis[t.id][0]+cost[i]; dis[j][1]=dis[t.id][1]+w[i]; q.push({dis[j][0],dis[j][1],j}); } else if(dis[j][0]==dis[t.id][0]+cost[i]&&dis[j][1]>dis[t.id][1]+w[i]){ dis[j][1]=dis[t.id][1]+w[i]; q.push({dis[j][0],dis[j][1],j}); } } } printf("%d %d\n",ans1,ans2); } int main(){ //ios::sync_with_stdio(false); int t; cin>>t; while(t--){ scanf("%d%d",&n,&m); int i,j; idx=0; for(i=0;i<=n*m;i++){ h[i]=-1; } scanf("%d%d%d%d",&sx,&sy,&ex,&ey); sx--,sy--,ex--,ey--; for(i=0;i<n;i++) scanf("%s",g[i]); for(i=0;i<n;i++){ for(j=0;j<m;j++){ int k; if(g[i][j]=='#') continue; if(g[i][j]>='A'&&g[i][j]<='Z'){ num.clear(); for(k=0;k<4;k++){ int x=i+dx[k]; int y=j+dy[k]; if(check(x,y)){ num.push_back({x,y}); } } for(k=0;k<(int)num.size();k++){ for(int l=0;l<(int)num.size();l++){ if(k==l) continue; int tmp1=num[k].first*m+num[k].second; int tmp2=num[l].first*m+num[l].second; add(tmp1,tmp2,get(num[k].first,num[k].second,num[l].first,num[l].second),2);//计算到下个点的代价 } } } else{ for(int k=0;k<4;k++){ int x=i+dx[k]; int y=j+dy[k]; if(!check(x,y)) continue; if(g[x][y]>='A'&&g[x][y]<='Z') continue; add(i*m+j,x*m+y,solve(x,y),1); } } } } dij(); } return 0; }
J 恶心人的题
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; char change(char s){ if(s=='-')return '['; if(s=='_')return '{'; if(s=='+')return '}'; if(s=='=')return ']'; if(s=='Q')return '\"'; if(s=='q')return '\''; if(s=='W')return '<'; if(s=='w')return ','; if(s=='E')return '>'; if(s=='e')return '.'; if(s=='R')return 'P'; if(s=='r')return 'p'; if(s=='T')return 'Y'; if(s=='t')return 'y'; if(s=='Y')return 'F'; if(s=='y')return 'f'; if(s=='U')return 'G'; if(s=='u')return 'g'; if(s=='I')return 'C'; if(s=='i')return 'c'; if(s=='O')return 'R'; if(s=='o')return 'r'; if(s=='P')return 'L'; if(s=='p')return 'l'; if(s=='{')return '?'; if(s=='[')return '/'; if(s=='}')return '+'; if(s==']')return '='; if(s=='A')return 'A'; if(s=='a')return 'a'; if(s=='S')return 'O'; if(s=='s')return 'o'; if(s=='D')return 'E'; if(s=='d')return 'e'; if(s=='F')return 'U'; if(s=='f')return 'u'; if(s=='G')return 'I'; if(s=='g')return 'i'; if(s=='H')return 'D'; if(s=='h')return 'd'; if(s=='J')return 'H'; if(s=='j')return 'h'; if(s=='K')return 'T'; if(s=='k')return 't'; if(s=='L')return 'N'; if(s=='l')return 'n'; if(s==':')return 'S'; if(s==';')return 's'; if(s=='"')return '_'; if(s=='\'')return '-'; if(s=='Z')return ':'; if(s=='z')return ';'; if(s=='X')return 'Q'; if(s=='x')return 'q'; if(s=='C')return 'J'; if(s=='c')return 'j'; if(s=='V')return 'K'; if(s=='v')return 'k'; if(s=='B')return 'X'; if(s=='b')return 'x'; if(s=='N')return 'B'; if(s=='n')return 'b'; if(s=='M')return 'M'; if(s=='m')return 'm'; if(s=='<')return 'W'; if(s==',')return 'w'; if(s=='>')return 'V'; if(s=='.')return 'v'; if(s=='?')return 'Z'; if(s=='/')return 'z'; return s; } string s; int main(){ while(getline(cin,s)) { for(int i=0;i<(int)(s.length());i++) { printf("%c",change(s[i])); } printf("\n"); } return 0; }
K 按规则模拟
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<pll,int> plll; const int N=1e5+10; const double eps=1e-5; int st[N]; map<plll,int> m1; double f[200]; vector<int> def[200][11]; vector<int> pos[200][11]; struct node{ double x; int id; bool operator<(const node &t) const{ return x>t.x; } }s[N]; map<int,pair<double,int> > m2; int main(){ int t; cin>>t; while(t--){ int n,q,d,c; scanf("%d%d%d%d",&n,&q,&d,&c); int a; int i; for(i=1;i<=n;i++){ f[i]=d; } while(c--){ scanf("%d",&a); int i,j; m1.clear(); m2.clear(); for(i=1;i<=n;i++) for(j=1;j<=q;j++) def[i][j].clear(); for(i=1;i<=a;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); if(m1[{{x,y},z}]) continue; m1[{{x,y},z}]=1; def[y][z].push_back(x); } for(i=1;i<=n;i++){ for(j=1;j<=q;j++){ int num=(int)def[i][j].size(); if(num==0) continue; for(auto x:def[i][j]){ f[x]+=1.0*(n-1)/num; } f[i]-=(n-1); } } int cnt1=0,cnt2=0; for(i=1;i<=q;i++){ cnt1=0,cnt2=0; for(j=1;j<=n;j++) st[j]=0; for(j=1;j<=n;j++){ int x; scanf("%d",&x); if(x) cnt1++; else cnt2++; st[j]=x; } for(j=1;j<=n;j++){ if(!st[j]){ f[j]-=(n-1); } else{ f[j]+=1.0*cnt2*(n-1)/cnt1; } } } for(i=1;i<=n;i++){ s[i]={f[i],i}; } sort(s+1,s+1+n); int pri=1; m2[s[1].id]={s[1].x,1}; int cnt=1; for(i=2;i<=n;i++){ if(abs(s[i].x-s[i-1].x)<eps){ m2[s[i].id]={s[i].x,pri}; cnt++; } else{ m2[s[i].id]={s[i].x,pri+cnt}; pri+=cnt; cnt=1; } } int u; scanf("%d",&u); for(i=1;i<=u;i++){ int que; scanf("%d",&que); auto x=m2[que]; printf("%.8f %d\n",x.first,x.second); } } } }
L 签到
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+10; const int mod=1e7+7; int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); int op=0; while(n--){ int x; scanf("%d",&x); if(x>6000)op++; } printf("%d\n",op); } }
没有人不辛苦,只有人不喊疼