传送门太多就不传了……
P3171 费用流,每个格子的入度出度为一,连边跑就完了
/* ID:zky OJ:BZOJ Index:3171 Language:C++ */ #include<vector> #include<queue> #include<cstdio> #include<cstring> #include<climits> #include<iostream> #include<algorithm> using namespace std; struct edge{ int u,v,cap,flow,cost; edge(int _u,int _v,int _cap,int _flow,int _cost): u(_u),v(_v),cap(_cap),flow(_flow),cost(_cost){} edge(){} }; int n,m,s,t; vector<edge>edges; vector<vector<int> >G; void add(int u,int v,int cap,int cost){ edges.push_back(edge(u,v,cap,0,cost)); G[u].push_back(edges.size()-1); edges.push_back(edge(v,u,0,0,-cost)); G[v].push_back(edges.size()-1); } int d[500]; int a[500]; int p[500]; int vis[500]; int flow=0,cost=0; bool spfa(){ memset(d,0x7f,sizeof(d)); queue<int>q; q.push(s); int B=d[0]; d[s]=0; a[s]=INT_MAX; while(!q.empty()){ int u=q.front();q.pop();vis[u]=0; for(int i=0;i<G[u].size();i++){ edge e=edges[G[u][i]]; if(d[e.v]>d[u]+e.cost&&e.cap>e.flow){ d[e.v]=d[u]+e.cost; a[e.v]=min(a[u],e.cap-e.flow); p[e.v]=G[u][i]; if(!vis[e.v]){ vis[e.v]=1; q.push(e.v); } } } } if(d[t]==B)return false; flow+=a[t]; cost+=a[t]*d[t]; int u=t; while(u!=s){ edges[p[u]].flow+=a[t]; edges[p[u]^1].flow-=a[t]; u=edges[p[u]].u; } return true; } int hash[16][16]; int tot=0; int map[16][16]; const int dx[4]={0,1,0,-1}; const int dy[4]={1,0,-1,0}; int main(){ cin>>n>>m; G.resize(n*m*2+10); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) hash[i][j]=++tot; string str; for(int i=1;i<=n;i++){ cin>>str; for(int j=0;j<m;j++){ if(str[j]=='L'){map[i][j+1]=2;} if(str[j]=='R'){map[i][j+1]=0;} if(str[j]=='U'){map[i][j+1]=3;} if(str[j]=='D'){map[i][j+1]=1;} } } s=0;t=n*m*2+1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ add(s,hash[i][j],1,0); add(hash[i][j]+n*m,t,1,0); for(int k=0;k<4;k++){ int x=(i+dx[k])%n+1,y=(j+dy[k])%m+1; add(hash[i][j],hash[x][y]+n*m,1,(k!=map[i][j])); } } while(spfa()); cout<<cost<<endl; return 0; }
P1901
裸暴力可过……
/* ID:zky OJ:BZOJ Index:1901 Language:C++ */ #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int a[10010]; int b[10010]; int n,m; int main(){ cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; int l,r,k; string s; while(m--){ cin>>s; if(s[0]=='Q'){ cin>>l>>r>>k; for(int j=l;j<=r;j++) b[j]=a[j]; sort(&b[l],&b[r+1]); cout<<b[l+k-1]<<endl; }else{ cin>>l>>r; a[l]=r; } } return 0; }
P1054
暴力BFS
/* ID:zky OJ:BZOJ Index:1054 Language:C++ */ #include <map> #include <vector> #include <queue> #include <cstdio> #include <bitset> #include <iostream> #include <algorithm> using namespace std; typedef unsigned int uint; map<uint,int>M; string str; uint s,t; const int dx[4]={0,1,0,-1}; const int dy[4]={1,0,-1,0}; vector<vector<int> >tomap(uint u){ vector<vector<int> >map; map.resize(4); for(int i=3;i>=0;i--){ map[i].resize(4); for(int j=3;j>=0;j--){ map[i][j]=u&1; u>>=1; } } return map; } uint toopt(const vector<vector<int> > &map){ uint opt=0; for(int ii=0;ii<4;ii++) for(int jj=0;jj<4;jj++){ opt<<=1; opt+=map[ii][jj]; } return opt; } void bfs(){ queue<uint>q; q.push(s); M[s]=0; while(!q.empty()){ uint u=q.front(); q.pop(); vector<vector<int> >map=tomap(u); for(int i=0;i<4;i++) for(int j=0;j<4;j++) if(map[i][j]) for(int k=0;k<4;k++){ int x=i+dx[k],y=j+dy[k]; if(x<0||y<0||x>3||y>3||map[x][y])continue; swap(map[i][j],map[x][y]); int opt=toopt(map); if(!M.count(opt)){ M[opt]=M[u]+1; q.push(opt); if(opt==t){ cout<<M[t]<<endl; return; } } swap(map[i][j],map[x][y]); } } } int main(){ for(int i=0;i<4;i++){ cin>>str; for(int j=0;j<4;j++){ s<<=1; s+=str[j]-'0'; } } for(int i=0;i<4;i++){ cin>>str; for(int j=0;j<4;j++){ t<<=1; t+=str[j]-'0'; } } if(s==t){ cout<<0<<endl; return 0; } bfs(); return 0; }
P2761
太水了……
/* ID:zky OJ:BZOJ Index:2761 Language:C++ */ #include <map> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; map<unsigned,bool>hash; int first=1; int main(){ int T,n,x; scanf("%d",&T); while(T--){ first=1; scanf("%d",&n); while(n--){ scanf("%d",&x); if(!hash.count(x)){ if(!first) printf(" %d",x); else{ first=0; printf("%d",x); } hash[x]=true; } } printf("\n"); hash.clear(); } return 0; }
层次图最短路
#include <queue> #include <cstdio> #include <vector> #include <cstring> #include <iostream> #include <algorithm> #define X first #define Y second using namespace std; int n,m,k; struct edge{ int u,v,w; }; vector<edge>edges; vector<int>G[200101]; void add(int u,int v,int w){ edges.push_back((edge){u,v,w}); G[u].push_back(edges.size()-1); } int u,v,w,s,t; int d[200101]; int vis[200101]; typedef pair<int,int> pii; priority_queue<pii,vector<pii>,greater<pii> >q; void Dijk(){ memset(d,0x7f,sizeof(d)); d[s]=0; q.push(pii(d[s],s)); while(!q.empty()){ int u=q.top().Y;q.pop(); if(vis[u])continue; vis[u]=1; for(int i=0;i<G[u].size();i++){ edge e=edges[G[u][i]]; if(d[e.v]>d[u]+e.w){ d[e.v]=d[u]+e.w; q.push(pii(d[e.v],e.v)); } } } cout<<d[t]<<endl; } int main(){ cin>>n>>m>>k; cin>>s>>t; t+=n*k; for(int i=1;i<=m;i++){ cin>>u>>v>>w; for(int j=0;j<=k;j++){ add(u+j*n,v+j*n,w); add(v+j*n,u+j*n,w); add(u+j*n,v+(j+1)*n,0); add(v+j*n,u+(j+1)*n,0); } } int deb=0; if(deb) for(int i=0;i<edges.size();i++){ printf("#%d %d -> %d w:%d\n", i,edges[i].u,edges[i].v,edges[i].w); } Dijk(); return 0; }
P1269
Rope水过
/* ID:zky OJ:BZOJ Index:1269 Language:C++ */ #include <cstdio> #include <ext/rope> #include <iostream> #include <algorithm> using namespace std; using namespace __gnu_cxx; crope a,b,tmp; char s[10]; int now,n,len,size; char str[2000000],rstr[2000000]; int main(){ scanf("%d",&n); while(n--){ scanf("%s",s); switch(s[0]){ case 'M':{scanf("%d",&now);break;} case 'P':{now--;break;} case 'N':{now++;break;} case 'G':{putchar(a[now]);putchar('\n');break;} case 'I':{ scanf("%d",&size); len=a.length(); for(int i=0;i<size;i++){ do{str[i]=getchar();} while(str[i]=='\n'); rstr[size-i-1]=str[i]; } rstr[size]=str[size]='\0'; a.insert(now,str); b.insert(len-now,rstr); break; } case 'D':{ scanf("%d",&size); len=a.length(); a.erase(now,size); b.erase(len-now-size,size); break; } case 'R':{ scanf("%d",&size); len=a.length(); tmp=a.substr(now,size); a=a.substr(0,now)+b.substr(len-now-size,size)+a.substr(now+size,len-now-size); b=b.substr(0,len-now-size)+tmp+b.substr(len-now,now); break; } } } return 0; }