传送门太多就不传了……
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;
}
P2763
层次图最短路
#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;
}