Merge pull request #7 from Kiritow/master

Catch up with you.
pull/13/head
KiritoTRw 2016-05-07 19:43:14 +08:00
commit feb6ba9c06
10 changed files with 830 additions and 0 deletions

130
HDOJ/1010.cpp Normal file
View File

@ -0,0 +1,130 @@
/// TLE -> WA
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 10
#define MAXM 10
char map[MAXN][MAXM];
int N,M,T;
inline void init()
{
memset(map,0,MAXN*MAXM);
}
inline bool checkmap()
{
int wall=0;
for(int i=0;i<MAXN;i++)
{
for(int j=0;j<MAXM;j++)
{
if(map[i][j]=='X') ++wall;
}
}
if(N*M-wall<=T)
{
return false;
}
else
{
return true;
}
}
void findSD(int* pSx,int* pSy,int* pDx,int* pDy)
{
for(int i=0;i<MAXN;i++)
{
for(int j=0;j<MAXM;j++)
{
switch(map[i][j])
{
case 'S':
*pSx=i;*pSy=j;
break;
case 'D':
*pDx=i;*pDy=j;
break;
}
}
}
}
int startx,starty,endx,endy;
bool endflag;
void DFS(int x,int y,int step)
{
if(endflag) return;
if(x<1||x>N||y<1||y>M) return;
if(x==endx&&y==endy&&step==T)
{
endflag=true;
return;
}
/// TLE? Try this
int temp=T-step-(abs(endx-x)+abs(endy-y));
if(temp<0||temp%2)
{
return;
}
if(map[x-1][y]=='.'||map[x-1][y]=='D')
{
map[x-1][y]='X';
DFS(x-1,y,step+1);
map[x-1][y]='.';
}
if(map[x+1][y]=='.'||map[x+1][y]=='D')
{
map[x+1][y]='X';
DFS(x+1,y,step+1);
map[x+1][y]='.';
}
if(map[x][y-1]=='.'||map[x][y-1]=='D')
{
map[x][y-1]='X';
DFS(x,y-1,step+1);
map[x][y-1]='.';
}
if(map[x][y+1]=='.'||map[x][y+1]=='D')
{
map[x][y+1]='X';
DFS(x,y+1,step+1);
map[x][y+1]='.';
}
}
int main()
{
while(scanf("%d %d %d",&N,&M,&T)==3&&N+M+T!=0)
{
init();
for(int i=1;i<=N;i++)
{
scanf("%s",&map[i][1]);
}
if(!checkmap())
{
printf("NO\n");
continue;
}
findSD(&startx,&starty,&endx,&endy);
endflag=false;
DFS(startx,starty,0);
if(endflag)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}

73
HDOJ/1010_csdn.cpp Normal file
View File

@ -0,0 +1,73 @@
#include <iostream>
#include <cstring>
using namespace std;
char a[10][10];
int n,m,t;
int sx,sy,ex,ey;
bool flag;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int abs(int x)
{
return x<0?-x:x;
}
void DFS(int x,int y,int time)//当前位置坐标(x,y),到目前位置消耗时间
{
if(x<0||x>=n||y<0||y>=m)
return;
if(x==ex&&y==ey&&time==t)
{
flag =true;
return ;
}
if(flag)
return;
int temp=(t-time)-(abs(x-ex)+abs(y-ey));
if(temp<0||temp&1)
return;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(a[xx][yy]!='X')
{
a[xx][yy]='X';
DFS(xx,yy,time+1);
a[xx][yy]='.';
if(flag)
return ;
}
}
}
int main()
{
while(cin>>n>>m>>t)
{
if(n==0&&m==0)
break;
int wall=0;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
cin>>a[i][j];
if(a[i][j]=='S')
sx=i,sy=j;
else if(a[i][j]=='D')
ex=i,ey=j;
else if(a[i][j]=='X')
wall++;
}
if(n*m-wall<=t)
{
cout<<"NO"<<endl;
continue;
}
flag=false;
a[sx][sy]='X';
DFS(sx,sy,0);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}

105
HDOJ/1879.cpp Normal file
View File

@ -0,0 +1,105 @@
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define MAXN 105
int father[MAXN];
int noderank[MAXN];
void init()
{
for(int i=0;i<MAXN;i++)
{
father[i]=i;
noderank[i]=0;
}
}
int findfather(int node)
{
if(father[node]!=node)
{
father[node]=findfather(father[node]);
}
return father[node];
}
void UNION(int a,int b)
{
int fa=findfather(a);
int fb=findfather(b);
if(fa==fb)
{
return;
}
if(noderank[fa]>noderank[fb])
{
father[fb]=fa;
}
else
{
father[fa]=fb;
if(noderank[fa]==noderank[fb])
{
noderank[fb]++;
}
}
}
struct pack
{
int a,b,v;
};
#define MAXM 5000
pack pk[MAXM];
bool cmp(const pack& a,const pack& b)
{
return a.v<b.v;
}
int main()
{
int N;
while(scanf("%d",&N)==1&&N!=0)
{
init();
int cnt=0;
int a,b,c,d;
int M=(N-1)*N/2;
for(int i=0;i<M;i++)
{
/// Start End Value IsBuilt
scanf("%d %d %d %d",&a,&b,&c,&d);
if(d)
{
UNION(a,b);
}
else
{
pk[cnt].a=a;
pk[cnt].b=b;
pk[cnt].v=c;
++cnt;
}
}
sort(pk,pk+cnt,cmp);
int ans=0;
for(int i=0;i<cnt;i++)
{
int fa=findfather(pk[i].a);
int fb=findfather(pk[i].b);
if(fa!=fb)
{
UNION(fa,fb);
ans+=pk[i].v;
}
}
printf("%d\n",ans);
}
return 0;
}

117
HDOJ/2492_cnblogs.cpp Normal file
View File

@ -0,0 +1,117 @@
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cctype>
#include <cstring>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <cassert>
#include <iostream>
#include <algorithm>
using namespace std;
//Constant Declaration
/*--------------------------*/
//#define LL long long
#define LL __int64
const int M=100001;
const int INF=1<<30;
const double EPS = 1e-11;
const double PI = acos(-1.0);
/*--------------------------*/
// some essential funtion
/*----------------------------------*/
void Swap(int &a,int &b){ int t=a;a=b;b=t; }
int Max(int a,int b){ return a>b?a:b; }
int Min(int a,int b){ return a<b?a:b; }
int Gcd(int a,int b){ while(b){b ^= a ^=b ^= a %= b;} return a; }
/*----------------------------------*/
//for (i = 0; i < n; i++)
/*----------------------------------*/
LL c[M];
int a[M];
int left_lower[M], right_lower[M];//分别是在第i个数左右边比第i个数小的个数
int n = 100000;
int LowBit(int x)
{
return x&(-x);
}
int Sum(int k)
{
int sum = 0;
while (k > 0)
{
sum += c[k];
k -= LowBit(k);
}
return sum;
}
void Update(int k, int sc)
{
while (k <= 100000)
{
c[k] += sc;
k += LowBit(k);
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t, case1 = 0;
scanf("%d", &t);
int m;
int i, j;
int num;
//scanf("%d%d", &n, &m);
while (t--)
{
scanf("%d", &num);
memset(c, 0, sizeof(c));
memset(left_lower, 0, sizeof(left_lower));
memset(right_lower, 0, sizeof(right_lower));
for (i = 1; i <= num; i++)
{
scanf("%d", &a[i]);
left_lower[i] += Sum(a[i] - 1);///Sum(a[i] - 1)插入该数前区间1到a[i]-1的总个数
Update(a[i], 1);
}
memset(c, 0, sizeof(c));
for (i = num; i > 0; i--)//顺序插入
{
right_lower[i] += Sum(a[i] - 1);
Update(a[i], 1);
}
LL ans = 0;
for (i = 1; i <= num; i++)//逆序插入
{
ans += left_lower[i]*(num - i - right_lower[i]);//由于只能求比其小的个数可以用i右边的总个数见减比他小的来求比他大的个数。
ans += (i - 1 - left_lower[i])*right_lower[i];//
}
printf("%I64d\n", ans);
}
return 0;
}

144
HDOJ/3790_cnblogs.cpp Normal file
View File

@ -0,0 +1,144 @@
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cctype>
#include <cstring>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include <cassert>
#include <iostream>
#include <algorithm>
using namespace std;
//Constant Declaration
/*--------------------------*/
//#define LL long long
#define LL __int64
const int M=1100;//最多点数
const int INF=1<<30;
const double EPS = 1e-11;
const double PI = acos(-1.0);
/*--------------------------*/
// some essential funtion
/*----------------------------------*/
void Swap(int &a,int &b){ int t=a;a=b;b=t; }
int Max(int a,int b){ return a>b?a:b; }
int Min(int a,int b){ return a<b?a:b; }
int Gcd(int a,int b){ while(b){b ^= a ^=b ^= a %= b;} return a; }
/*----------------------------------*/
//for (i = 0; i < n; i++)
/*----------------------------------*/
struct djs
{
int l,p;
}d[M],g[M][M];
bool used[M];//标记i是否被用过
void init(int n)
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
g[i][j].l = INF;//初始化图没有边默认为INF,为了一定更新
g[i][j].p = INF;
}
}
for (i = 1; i <= n; i++)
{
d[i].l = INF;
d[i].p = INF;
}
memset(used, 0, sizeof(used));
}
int dijkstra(int star, int end, int n)//起点,终点,总点数(编号为1,2...n)
{
int min_num;//最小值的位置
int i;
d[star].l= 0;
d[star].p= 0;//起点到起点的最短距离为0很重要的一步
for (int cnt = 0; cnt < n; cnt++)//注意别用while(n--),这样会改变n的值。n次贪心
{
int min = INF;
for (i = 1; i <= n; i++)
{
if (!used[i] && d[i].l < min)
{
min = d[i].l;
min_num = i;
}
}
used[min_num] = 1;
//把d[min_num]作为中间点,对相邻的点做松弛
for (i = 1; i <= n; i++)
{
if (!used[i] && d[i].l > d[min_num].l + g[min_num][i].l)
{
d[i].l = d[min_num].l + g[min_num][i].l;
d[i].p = d[min_num].p + g[min_num][i].p;
}
if (!used[i] && d[i].l == d[min_num].l + g[min_num][i].l && d[i].p > d[min_num].p + g[min_num][i].p)//这里的判断是关键
{
d[i].p = d[min_num].p + g[min_num][i].p;
}
}
}
return d[end].l;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
//int t, case1 = 0;
//scanf("%d", &t);
int n, m;
int i, j;
while (scanf("%d%d", &n, &m), n + m)
{
init(n);
for (i = 0; i < m; i++)
{
int a, b, c, c1;
scanf("%d%d%d%d", &a, &b, &c, &c1);
if (g[a][b].l > c)
{
g[b][a].l = g[a][b].l = c;
g[b][a].p= g[a][b].p = c1;
}//此题为无向图
if (g[a][b].l == c && g[b][a].p > c1)//这里的判断是关键
{
g[b][a].p= g[a][b].p = c1;
}
}
int star, end,ans;
scanf("%d%d", &star, &end);
ans = dijkstra(star, end, n);
printf("%d %d\n", ans, d[end].p);
}
return 0;
}

73
HDOJ/4786_cnblogs.cpp Normal file
View File

@ -0,0 +1,73 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 100100
using namespace std;
struct edge{
int u,v;
}a[2][maxn];
int s[2];
int n,m,c,t,uu,vv,cc,MM,mm,cas=0;
int f[maxn],g[maxn];
bool flag;
void init() { for (int i=1; i<=n; i++) f[i]=i; }
void build(int xx,int yy) { f[f[xx]]=f[yy]; }
int getf(int x)
{
if (f[x]!=x) f[x]=getf(f[x]);
return f[x];
}
void addedge(int x)
{
int tot=0;
init();
for (int i=1; i<=s[x]; i++)
if (getf(a[x][i].u)!=getf(a[x][i].v)) tot++,build(a[x][i].u,a[x][i].v);
if (x==0) mm=n-1-tot;
else MM=tot;
}
int main()
{
g[1]=1,g[2]=2;
for (int i=2; g[i]<=maxn; i++) g[i+1]=g[i]+g[i-1];
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
s[0]=s[1]=0;
for (int i=1; i<=m; i++)
{
scanf("%d%d%d",&uu,&vv,&cc);
a[cc][++s[cc]].u=uu;
a[cc][s[cc]].v=vv;
}
init();
for (int i=1; i<=s[0]; i++)
if (getf(a[0][i].u)!=getf(a[0][i].v)) build(a[0][i].u,a[0][i].v);
for (int i=1; i<=s[1]; i++)
if (getf(a[1][i].u)!=getf(a[1][i].v)) build(a[1][i].u,a[1][i].v);
flag=true;
for (int i=2; i<=n; i++)
if (getf(i)!=getf(i-1)) { flag=false; break; }
if (!flag)
{
printf("Case #%d: No\n",++cas);
continue;
}
addedge(0),addedge(1);
//cout<<" MM && mm : " <<mm<<' '<<MM<<endl;
flag=false;
for (int i=1; g[i]<=n; i++)
if (g[i]<=MM && g[i]>=mm) { flag=true; break; }
if (flag) printf("Case #%d: Yes\n",++cas);
else printf("Case #%d: No\n",++cas);
}
return 0;
}

50
UVALive/7483.cpp Normal file
View File

@ -0,0 +1,50 @@
/**
LINK=
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115784#problem/F
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 105
int main()
{
int n;
while(scanf("%d",&n)==1)
{
vector<int> pool[MAXN*2+8];
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d %d",&a,&b);
pool[a].push_back(b);
}
int k=INT_MAX;
int cnt=0;
for(int i=0;i<MAXN*2+8;i++)
{
if(k<i)
{
++cnt;
k=INT_MAX;
}
for(int j=0;j<pool[i].size();j++)
{
k=min(k,pool[i].at(j));
}
}
if(k<INT_MAX)
{
++cnt;
}
printf("%d\n",cnt);
}
/// End of main loop
return 0;
}

29
UVALive/7483_csdn.cpp Normal file
View File

@ -0,0 +1,29 @@
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
int main()
{
int N;
while(cin>>N){
vector <int> arr[201];
for (int i=1;i<=N;i++){
int a, b;
scanf("%d%d",&a,&b);
arr[a].pb(b);
}
int mn=2e9, ans=0;
for (int i=1;i<=N+N;i++){
if (mn < i) ans++, mn = 2e9;
for(int j=0;j<arr[i].size();j++)
{
int e=arr[i][j];
mn=min(mn,e);
}
}
if (mn < 2e9) ans++;
printf("%d\n", ans);
}
return 0;
}

2
UVALive/Readme.md Normal file
View File

@ -0,0 +1,2 @@
#UVALive
[Goto UVa Online Judge](https://uva.onlinejudge.org/ "UVa Online Judge")

107
ZOJ/3946_cnblogs.cpp Normal file
View File

@ -0,0 +1,107 @@
# include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<queue>
# include<list>
# include<set>
# include<map>
# include<string>
# include<cmath>
# include<cstdlib>
# include<algorithm>
using namespace std;
# define LL long long
const int N=1005;
const int INF=1000000000;
const LL oo=1000000000000005;
struct Edge
{
int to,nxt;
LL c,d;
};
int n,m,cnt;
Edge e[N*200];
LL d[N*100];
int head[N*100];
vector<int>pre[N*100];
void add(int u,int v,LL d,LL c)
{
e[cnt].to=v;
e[cnt].d=d;
e[cnt].c=c;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
void solve()
{
for(int i=0;i<n;++i)
pre[i].clear();
fill(d,d+n,oo);
d[0]=0;
queue<int>q;
q.push(0);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(d[v]>d[u]+e[i].d){
d[v]=d[u]+e[i].d;
q.push(v);
}
}
}
q.push(0);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(d[v]==d[u]+e[i].d){
pre[v].push_back(i);
q.push(v);
}
}
}
LL ans1=0,ans2=0;
for(int i=0;i<n;++i){
ans1+=d[i];
LL minn=oo;
for(int j=0;j<pre[i].size();++j)
minn=min(minn,e[pre[i][j]].c);
if(minn==oo) continue;
ans2+=minn;
}
printf("%lld %lld\n",ans1,ans2);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
cnt=0;
memset(head,-1,sizeof(head));
int a,b;
LL c,d;
for(int i=0;i<m;++i){
scanf("%d%d%lld%lld",&a,&b,&d,&c);
add(a,b,d,c);
add(b,a,d,c);
}
solve();
}
return 0;
}