2020ICPC 小米 网络选拔赛第一场
牛逼队友写的,貌似卡常?
#include#include #include #include #include #include
真正有用的各线段的端点,对各点预处理是否连边(是否与已有线段相交).
#includeusing namespace std; const int N=1010,M=4*N,M1=N*N; double dist[M]; int n,m,k; int S,T; int h[N],e[M1],ne[M1]; double w[M1];int idx; struct Point { int x,y; }a[M]; struct line { Point x,y; }b[N]; void add(int a,int b,double c) { ne[idx]=h[a]; e[idx]=b; w[idx]=c; h[a]=idx++; } bool seg(Point a,Point b,Point c,Point d){ if(!(min(a.x,b.x)<=max(c.x,d.x) && min(c.y,d.y)<=max(a.y,b.y)&&min(c.x,d.x)<=max(a.x,b.x) && min(a.y,b.y)<=max(c.y,d.y)))return false; double u,v,w,z; u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y); v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y); w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y); z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y); return (u*v<0 && w*z<0); } bool check(int x,int y) { for(int i=0;i ) if(seg(a[x],a[y],b[i].x,b[i].y)) return false; return true; } double dis(Point a,Point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } struct node { double x; int y; bool operator <(const node &c)const { return x>c.x; } }; int vis[M]; void dijkstra() { for(int i=0;i<=2*k+2;i++) dist[i]=8e18; dist[S]=0; priority_queue q; q.push({0,S}); while(q.size()) { auto t=q.top(); q.pop(); double d=t.x; int u=t.y; if(vis[u])continue; vis[u]=1; for(int i=h[u];i!=-1;i=ne[i]) { int j=e[i]; if(dist[j]>dist[u]+w[i]) { dist[j]=dist[u]+w[i]; q.push(node{dist[j],j}); } } } return; } int main() { //freopen("1.txt","r",stdin); memset(h,-1,sizeof h); cin>>n>>m>>k; for(int i=0;i<=k;i++) { scanf("%d%d%d%d",&a[i*2].x,&a[i*2].y,&a[i*2+1].x,&a[i*2+1].y); b[i]={a[i*2],a[i*2+1]}; //cout< } for(int i=0;i<=2*k+1;i++) for(int j=0;j<=2*k+1;j++) if(check(i,j)) { add(i,j,dis(a[i],a[j])); } S=2*k,T=2*k+1; dijkstra(); printf("%.4lf",dist[2*k+1]); return 0; }
签到
#include#include #include using namespace std; int main() { string s;cin>>s; int x=0; long long ans=0; for(int i=0;i i) { if(s[i]=='w') x++; else { ans+=max(0,x*2-1); x=0; } } ans+=max(0,x*2-1); cout< endl; return 0; }
F.
#include#define ll long long #define Int __int128 using namespace std; const int N=1e5+100; ll a[N]; ll ql[N],qr[N]; int n,L,R; ll res,resl,resr; void write(Int x) { if (x > 9) write(x / 10); putchar(x % 10 + '0'); } bool check(Int mid) { Int ans=0,ans1=0; ans=mid*(res-resl); for(int i=1;i<=n;i++) if(a[i] ql[i]) return false; for(int i=1;i<=n;i++) { ans1+=min(a[i]-mid*ql[i],mid*(qr[i]-ql[i])); } return ans1>=ans; } int main() { cin>>n>>L>>R; for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=n;i++) { scanf("%lld%lld",&ql[i],&qr[i]); resl+=ql[i]; resr+=qr[i]; } if(resr R) { puts("0"); return 0; } res=max(resl,(ll)L); Int l=0,r=1e18,mid; while(l<r) { mid=(l+r+1)>>1; if(check(mid))l=mid; else r=mid-1; } write(l); return 0; }
G
题解构造很巧妙.要多练(
#includeusing namespace std; const int N=2e5+100; int a[N],b[N],pos[N]; int main() { //freopen("1.txt","r",stdin); int n; cin>>n; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); pos[a[i]]=i; } for(int i=1;i<=n;i++) scanf("%d",&b[i]); puts("YES"); for(int i=2,cur=b[1];i<=n;i++) { printf("%d %d\n",cur,b[i]); if(pos[cur]>pos[b[i]]) cur=b[i]; } return 0; }
I
#includeusing namespace std; typedef pair<int,int> pii; const int N=1100; int dp[N][N]; char g[N][N]; //bool st[N][N]; int n,m; map bool>mp; //int cnt=0; bool dfs(int x,int y){ //cnt++; if(x<1||x>n||y<1||y>m) return true; if(mp[{x,y}]) return false; mp[{x,y}]=true; if(dp[x][y]!=-1){ if(dp[x][y]==0) return false; else return true; } if(g[x][y]=='W'){ if(dfs(x-1,y)) return dp[x][y]=1; else return dp[x][y]=0; } if(g[x][y]=='A'){ if(dfs(x,y-1)) return dp[x][y]=1; else return dp[x][y]=0; } if(g[x][y]=='S'){ if(dfs(x+1,y)) return dp[x][y]=1; else return dp[x][y]=0; } if(g[x][y]=='D'){ if(dfs(x,y+1)) return dp[x][y]=1; else return dp[x][y]=0; } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%s",g[i]+1); } int ans=0; memset(dp,-1,sizeof dp); //cout< for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ mp.clear(); if(dfs(i,j)) ans++; } } //cout< printf("%d\n",ans); return 0; }
J.
二维差分签到题
#includeusing namespace std; const int N=1010; int g[N][N]; int res[N][N]; void insert(int x1,int y1,int x2,int y2,int c) { g[x1][y1]+=c; g[x1][y2+1]-=c; g[x2+1][y1]-=c; g[x2+1][y2+1]+=c; } int main() { int T; cin>>T; while(T--) { memset(g,0,sizeof g); int n,m,a,b; cin>>n>>m>>a>>b; int f=1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&res[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { g[i][j]=g[i][j]+g[i-1][j]+g[i][j-1]-g[i-1][j-1]; int t=g[i][j]+res[i][j]; if(t<0) { f=0; break; } else if(t>0) { if(i+a-1>n||j+b-1>m) { f=0; break; } insert(i,j,min(n,i+a-1),min(m,j+b-1),-t); } } if(f) { puts("^_^"); } else puts("QAQ"); } }