2019SWERC题解
A题 带限制的最短路
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; int h[N],ne[N],e[N],d[N],w[N],idx; void add(int a,int b,int c,int dd){ e[idx]=b,ne[idx]=h[a],d[idx]=c,w[idx]=dd,h[a]=idx++; } int sx,sy,ex,ey; int B,n; int f[N]; int x[N],y[N]; vector<pll> num[N]; int st[N][110]; struct node{ int id,dis,cost; bool operator <(const node &t) const{ return cost>t.cost; } }; map<int,pll> m1; int cnt; int dist[N][110]; int cal(pll a,pll b){ int d1=a.first-b.first; int d2=a.second-b.second; return ceil(sqrt(d1*d1+d2*d2)); } int dij(){ int ans=0x3f3f3f3f; memset(dist,0x3f,sizeof dist); priority_queue<node> q; q.push({1,0,0}); dist[1][0]=0; while(q.size()){ auto t=q.top(); q.pop(); if(t.dis>B) continue; if(st[t.id][t.dis]) continue; st[t.id][t.dis]=1; if(t.id==n+2){ ans=min(ans,t.cost); continue; } for(int i=h[t.id];i!=-1;i=ne[i]){ int j=e[i]; if(t.dis+d[i]>B) continue; if(dist[j][t.dis+d[i]]>dist[t.id][t.dis]+w[i]){ dist[j][t.dis+d[i]]=dist[t.id][t.dis]+w[i]; q.push({j,t.dis+d[i],dist[j][t.dis+d[i]]}); } } } if(ans==0x3f3f3f3f){ return -1; } return ans; } int main(){ ios::sync_with_stdio(false); memset(h,-1,sizeof h); cin>>sx>>sy>>ex>>ey; cin>>B; cin>>f[0]; int t; cin>>t; int i; for(int i=1;i<=t;i++){ cin>>f[i]; } cin>>n; for(i=1;i<=n;i++){ int l; cin>>x[i]>>y[i]; cin>>l; for(int j=1;j<=l;j++){ int a,b; cin>>a>>b; a++; num[i].push_back({a,b}); } } add(1,n+2,cal({sx,sy},{ex,ey}),f[0]*cal({sx,sy},{ex,ey})); add(n+2,1,cal({sx,sy},{ex,ey}),f[0]*cal({sx,sy},{ex,ey})); for(i=1;i<=n;i++){ add(1,i+1,cal({x[i],y[i]},{sx,sy}),f[0]*cal({x[i],y[i]},{sx,sy})); add(i+1,1,cal({x[i],y[i]},{sx,sy}),f[0]*cal({x[i],y[i]},{sx,sy})); add(n+2,i+1,cal({x[i],y[i]},{ex,ey}),f[0]*cal({x[i],y[i]},{ex,ey})); add(i+1,n+2,cal({x[i],y[i]},{ex,ey}),f[0]*cal({x[i],y[i]},{ex,ey})); for(auto tmp:num[i]){ int pos=tmp.first+1,id=tmp.second; add(i+1,tmp.first+1,cal({x[i],y[i]},{x[pos-1],y[pos-1]}),f[id]*cal({x[i],y[i]},{x[pos-1],y[pos-1]})); add(tmp.first+1,i+1,cal({x[i],y[i]},{x[pos-1],y[pos-1]}),f[id]*cal({x[i],y[i]},{x[pos-1],y[pos-1]})); } } cout<<dij()<<endl; }
B题 签到
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e6+10; const int inf=0x3f3f3f3f; map<string,int>mp; int main(){ ios::sync_with_stdio(false); int n; cin>>n; string s; mp.clear(); for(int i=1;i<=n;i++) { cin>>s; mp[s]++; } for(auto it=mp.begin();it!=mp.end();it++) { if(it->second>(n-(it->second))) { cout<<it->first<<endl; return 0; } } cout<<"NONE"<<endl; return 0; }
C题 签到
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e6+10; const int inf=0x3f3f3f3f; string s; set<int> m1; int main(){ ios::sync_with_stdio(false); int n; cin>>n; int i; for(i=0;i<=n+1;i++){ m1.insert(i); } for(i=1;i<=n;i++){ cin>>s; if(s[0]=='-') continue; if((int)s.size()>=7) continue; int ans=0; for(int j=0;j<(int)s.size();j++){ ans=ans*10+(s[j]-'0'); } if(m1.count(ans)) m1.erase(ans); } cout<<*m1.begin()<<endl; return 0; }
F题 计算几何
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e6+10; const int inf=0x3f3f3f3f; struct point { double x,y; }p[55]; point operator - (point x,point y) { point tmp; tmp.x=x.x-y.x; tmp.y=x.y-y.y; return tmp; } double cross(point a,point b) { return a.x*b.y-a.y*b.x; } double area(point *p,int n) { double res=0; p[n+1]=p[1]; for(int i=1;i<=n;i++) res+=(cross(p[i],p[i+1])); return fabs(res/2.0); } int main(){ int T; scanf("%d",&T); double ans=0; while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); ans+=area(p,n); } printf("%lld\n",(ll)floor(ans)); return 0; }
G题 拓扑排序
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=1e5+10; const int inf=0x3f3f3f3f; const int M=2e7; int in[N],h[M],ne[M],e[M],idx; struct node{ int id; int k; bool operator <(const node &t) const{ return k>t.k; } }g[N]; string s[N]; int st[300][300],n; map<string,int> m1; int last[N]; int ans[N]; void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void topo(){ int i; priority_queue<node> q; for(i=1;i<=n;i++){ if(!in[i]) q.push(g[i]); } int cnt=0; while(q.size()){ auto t=q.top(); q.pop(); ans[++cnt]=t.k; for(int i=h[t.id];i!=-1;i=ne[i]){ int j=e[i]; in[j]--; if(!in[j]){ q.push(g[j]); } } } } int main(){ ios::sync_with_stdio(false); memset(h,-1,sizeof h); int i; int S,L; cin>>S>>L>>n; for(i=1;i<=S;i++) cin>>s[i]; sort(s+1,s+1+S); for(i=1;i<=S;i++){ m1[s[i]]=i; } memset(last,-1,sizeof last); for(i=1;i<=L;i++){ string a,b; cin>>a>>b; st[m1[a]][m1[b]]=st[m1[b]][m1[a]]=1; } for(i=1;i<=n;i++){ string a; cin>>a; g[i].id=i,g[i].k=m1[a]; for(int j=1;j<=S;j++){ if(last[j]==-1||st[g[i].k][j]) continue; add(last[j],i); in[i]++; } last[g[i].k]=i; } topo(); for(i=1;i<=n;i++){ cout<<s[ans[i]]<<" "; } cout<<endl; }
I 签到
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+10; int main(){ ios::sync_with_stdio(false); ll a,b,c; cin>>a>>b>>c; cout<<(a+1)*(b+1)/(c+1)-1<<endl; }
没有人不辛苦,只有人不喊疼