传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1271
http://www.lydsy.com/JudgeOnline/problem.php?id=1800
http://www.lydsy.com/JudgeOnline/problem.php?id=2150
http://www.lydsy.com/JudgeOnline/problem.php?id=1015
P1271:
二分水题
#include <cstdio> #include <climits> #include <iostream> #include <algorithm> using namespace std; typedef long long lld; lld s[200001],e[200001],d[200001]; lld tot=0; lld n,m,T; lld l,r,mid; bool ok(){ lld cnt=0; for(lld i=1;i<=n;i++){ lld t=min(mid,(lld)e[i]); if(t>=s[i]) cnt+=(t-s[i])/d[i]+1; } return cnt&1; } int main(){ cin>>T; while(T--){ cin>>n; for(lld i=1;i<=n;i++) cin>>s[i]>>e[i]>>d[i]; l=0;r=INT_MAX+1LL; while(l<r){ mid=(l+r)/2; if(ok()) r=mid; else l=mid+1; } if(l==INT_MAX+1LL){ puts("Poor QIN Teng:("); continue; } lld ans=0; for(lld i=1;i<=n;i++){ if(s[i]<=l&&l<=e[i]&&(l-s[i])%d[i]==0) ans++; } cout<<l<<" "<<ans<<endl; } return 0; }
P1800
还能更水么?
#include<cmath> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int n; int chs=0; int ans=0; int way[21]; double len[21]; double sum[21]; double T; const double eps=1e-6; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>len[i]; sum[i]=sum[i-1]+len[i]; } for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if((sum[j]-sum[i])*2==sum[n])ans++; cout<<ans*(ans-1)/2<<endl; return 0; }
P2150
最小路径覆盖
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int n,m,r,c; int dx[4],dy[4]; int w[2555][2555]; int mp[51][51]; int hash[51][51]; int tot=0; int vis[2555]; int Link[2555]; bool find(int x){ for(int i=1;i<=tot;i++){ if(w[x][i]&&!vis[i]){ vis[i]=1; if(!Link[i]||find(Link[i])){ Link[i]=x; return true; } } } return false; } int main(){ cin>>n>>m>>r>>c; dx[0]=r;dy[0]=c; dx[1]=r;dy[1]=-c; dx[2]=c;dy[2]=r; dx[3]=c;dy[3]=-r; string s; for(int i=1;i<=n;i++){ cin>>s; for(int j=0;j<m;j++){ if(s[j]=='.') mp[i][j+1]=0; else mp[i][j+1]=1; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!mp[i][j]) hash[i][j]=++tot; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ for(int k=0;k<4;k++){ int x=i+dx[k],y=j+dy[k]; if(x<1||y<1||x>n||y>m)continue; w[hash[i][j]][hash[x][y]]=1; } } int ans=0; for(int i=1;i<=tot;i++){ memset(vis,0,sizeof(vis)); if(find(i))ans+=1; } cout<<tot-ans<<endl; return 0; }
P1015
倒着并查集
#include<vector> #include<queue> #include<cstring> #include<cstdio> #include<iostream> #include<algorithm> #define X first #define Y second #define read(x) x=getint() #define read3(x,y,z) x=getint();y=getint();z=getint() using namespace std; typedef pair<int,int> pii; vector<vector<int> >G; void add(int u,int v){ G[u].push_back(v); G[v].push_back(u); } int getint(){ int ok=0; int res=0; char ch; while(1){ ch=getchar(); if(ch>='0'&&ch<='9'){ ok=1; res*=10; res+=ch-'0'; }else if(ok)break; } return res; } int F; int fa[400010]; int vis[400010]; int find(int x){ if(fa[x]!=x)return fa[x]=find(fa[x]); return x; } int hash[400010]={0}; void dfs(int x){ fa[x]=F; vis[x]=1; for(int i=0;i<G[x].size();i++){ int e=G[x][i]; if(!vis[e]&&!hash[e]){ vis[e]=1; dfs(e); } //dfs(e); } } int n,m,qs; vector<pii>M; vector<int>E; int ans[400010]; int hash2[400010]; int main(){ read(n);read(m); for(int i=0;i<n;i++)fa[i]=i; G.resize(n+1); for(int i=0;i<m;i++){ int u,v; read(u);read(v); add(u,v); } read(qs);int e; for(int i=0;i<qs;i++){ read(e); E.push_back(e); hash[e]=1; } int sum=n-qs; for(int i=0;i<n;i++){ if(!hash[i]){ for(int j=0;j<G[i].size();j++){ e=G[i][j]; if(!hash[e]){ if(find(i)!=find(e)){ fa[find(e)]=find(i); sum--; } } } } } ans[qs]=sum; for(int i=qs-1;i>=0;i--){ sum++; int fi=E[i]; for(int j=0;j<G[fi].size();j++){ e=G[fi][j]; if(!hash[e]){ if(fi!=find(e)){ fa[find(e)]=fi; sum--; } } } ans[i]=sum; hash[E[i]]=0; } for(int i=0;i<=qs;i++) printf("%d\n",ans[i]); return 0; }