Powered By HC TECH : AutoACer Engine

3600-3699
pull/41/head
KiritoTRw 2016-09-04 14:13:02 +08:00 committed by GitHub
parent 661cb9622c
commit 3845accd4b
84 changed files with 7640 additions and 0 deletions

41
HDOJ/3600_autoAC.cpp Normal file
View File

@ -0,0 +1,41 @@
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N = 300+10;
int s[N*N],g[N*N];
#define _cp(a,b) ((a)<=(b))
int _tmp[N*N];
int inv(int n,int* a){
int l=n>>1,r=n-l,i,j;
int ret=(r>1?(inv(l,a)+inv(r,a+l)):0);
for (i=j=0;i<=l;_tmp[i+j]=a[i],i++)
for (ret+=j;j<r&&(i==l||!_cp(a[i],a[l+j]));_tmp[i+j]=a[l+j],j++);
memcpy(a,_tmp,sizeof(int)*n);
return ret;
}
int main()
{
int n;
while(scanf("%d",&n)==1 && n)
{
int num=0;
bool flag=true;
for(int i=0;i<n*n;i++)
{
scanf("%d",&g[i]);
if(flag && g[i]!=0)
num++;
if(g[i]==0)
flag=false;
}
int temp=inv(n*n,g);
temp-=num;
if(!(n&1))
temp+=(n-1-(num/n));
if(temp&1)
puts("NO");
else puts("YES");
}
return 0;
}

114
HDOJ/3601_autoAC.cpp Normal file
View File

@ -0,0 +1,114 @@
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define N 30009
#define lc (d<<1)
#define rc (d<<1|1)
#define mid (l+r>>1)
#define inf 0x3f3f3f3f
struct Tr{
int mx, sum;
}tr[N<<4];
int n, sun[N], tid[N], top[N], val[N], dep[N], tot, tmp[N], fa[N];
vector<int>V[N];
int dfs(int u, int f) {
int i, v, id = u, mx = 0, c = 1;
fa[u] = f;
for (i = 0;i < V[u].size();i++) {
v = V[u][i];
if (v == f) continue;
int tm = dfs(v, u);
if (tm > mx) mx = tm, id = v;
c += tm;
}
sun[u] = id;
return c;
}
void dfs1(int u, int d, int Top) {
int i, v;
dep[u] = d, tid[u] = ++tot, top[u] = Top;
if (tid[sun[u]] == -1) dfs1(sun[u], d+1, Top);
for (i = 0;i < V[u].size();i++) {
v = V[u][i];
if (tid[v] != -1) continue;
dfs1(v, d+1, v);
}
}
void Push(int d) {
tr[d].sum = tr[lc].sum+tr[rc].sum;
tr[d].mx = max(tr[lc].mx, tr[rc].mx);
}
void build(int d, int l, int r) {
if (l == r) {
tr[d].mx = tr[d].sum = val[l];
return;
}
build(lc, l, mid), build(rc, mid+1, r);
Push(d);
}
void update(int d, int l, int r, int pos, int v) {
if (l == r && pos == l) {
tr[d].mx = tr[d].sum = v;
return;
}
if (pos <= mid) update(lc, l, mid, pos, v);
else update(rc, mid+1, r, pos, v);
Push(d);
}
int query(int d, int l, int r, int L, int R, int k) {
if (l == L && r == R) {
if (k) return tr[d].mx;
return tr[d].sum;
}
if (R <= mid) return query(lc, l, mid, L, R, k);
else if (L > mid) return query(rc, mid+1, r, L, R, k);
else {
if (k) return max(query(lc, l, mid, L, mid, k), query(rc, mid+1, r, mid+1, R, k));
else return query(lc, l, mid, L, mid, k)+query(rc, mid+1, r, mid+1, R, k);
}
}
int M(int u, int v, int k) {
int re = 0, tm;
if (k) re = -inf;
while (top[u] != top[v]) {
if (dep[top[u]] < dep[top[v]]) swap(u, v);
tm = query(1, 1, tot, tid[top[u]], tid[u], k);
if (k) re = max(tm, re);
else re += tm;
u = fa[top[u]];
}
if (tid[u] > tid[v]) swap(u, v);
tm = query(1, 1, tot, tid[u], tid[v], k);
if (k) re = max(tm, re);
else re += tm;
return re;
}
int main() {
int i, j, u, v, m;
char w[10];
while (~scanf("%d", &n)) {
for (i = 1;i <= n;i++) V[i].clear();
for (i = 1;i < n;i++) {
scanf("%d%d", &u, &v);
V[u].push_back(v), V[v].push_back(u);
}
memset(tid, -1, sizeof(tid));
tot = 0;
for (i = 1;i <= n;i++) scanf("%d", &tmp[i]);
dfs(1, -1);
dfs1(1, 0, 1);
for (i = 1;i <= n;i++) val[tid[i]] = tmp[i];
build(1, 1, tot);
scanf("%d", &m);
while (m--) {
scanf("%s%d%d", w, &u, &v);
if (w[0] == 'C') {
update(1, 1, tot, tid[u], v);
}else if (w[1] == 'M') {
printf("%d\n", M(u, v, 1));
}else printf("%d\n", M(u, v, 0));
}
}
}

69
HDOJ/3602_autoAC.cpp Normal file
View File

@ -0,0 +1,69 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[110], b[110];
int dp[110][10100][2];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, m, k;
int sum = 0;
int num = 0;
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &a[i], &b[i]);
if(a[i] > k) continue;
a[i]++;
sum += b[i];
a[++num] = a[i];
b[num] = b[i];
}
n = num;
memset(dp, -1, sizeof(dp));
for(int i = 0; i <= n; i++)
{
dp[i][0][0] = 1;
dp[i][0][1] = 0;
}
for(int i = 1; i <= n; i++)
{
for(int j = sum; j >= b[i]; j--)
{
dp[i][j][0] = dp[i-1][j][0];
dp[i][j][1] = dp[i-1][j][1];
if(dp[i-1][j-b[i]][1] == -1) continue;
if(dp[i-1][j-b[i]][1] + a[i] <= k)
{
if(dp[i][j][0] == -1 || dp[i-1][j-b[i]][0] < dp[i][j][0] ||
(dp[i-1][j-b[i]][0] == dp[i][j][0] && dp[i-1][j-b[i]][1] + a[i] < dp[i][j][1]))
{
dp[i][j][0] = dp[i-1][j-b[i]][0];
dp[i][j][1] = dp[i-1][j-b[i]][1] + a[i];
}
}
else
{
if(dp[i][j][0] == -1 || dp[i-1][j-b[i]][0] + 1 < dp[i][j][0] ||
(dp[i-1][j-b[i]][0] + 1 == dp[i][j][0] && a[i] < dp[i][j][1]))
{
dp[i][j][0] = dp[i-1][j-b[i]][0] + 1;
dp[i][j][1] = a[i];
}
}
}
}
int rmax = 0;
for(int j = 0; j <= sum; j++)
if(dp[n][j][0] != -1 && dp[n][j][0] <= m && j > rmax)
{
rmax = j;
}
printf("%d\n", rmax);
}
return 0;
}

99
HDOJ/3603_autoAC.cpp Normal file
View File

@ -0,0 +1,99 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define maxn 300001
#define eps 1e-6
using namespace std;
int n;
int m;
int len[maxn];
int vis[maxn];
int mx[maxn][24];
int pre[maxn];
int search(int l,int r)
{
int t=l;
while(l<r)
{
int mid=l+r>>1;
if(pre[mid]<t)
{
l=mid+1;
}
else
{
r=mid;
}
}
return l;
}
void init_rmq()
{
int i,j;
int k=(int)(log2(n)+eps);
for(i=1; i<=n; i++)
{
mx[i][0]=len[i];
}
for(i=1; i<=k; i++)
{
for(j=1; j<=n; j++)
{
mx[j][i]=mx[j][i-1];
if(j+(1<<(i-1))<=n)
{
mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
}
}
}
}
int rmq(int l,int r)
{
int k=(int)(log2(r-l+1)+eps);
return max(mx[l][k],mx[r-(1<<k)+1][k]);
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
memset(len,0,sizeof(len));
memset(vis,-1,sizeof(vis));
memset(pre,-1,sizeof(pre));
for(i=1; i<=n; i++)
{
int temp;
scanf("%d",&temp);
if(vis[temp]==-1)
{
pre[i]=1;
}
else
{
pre[i]=vis[temp]+1;
}
pre[i]=max(pre[i],pre[i-1]);
len[i]=i-pre[i]+1;
vis[temp]=i;
}
init_rmq();
scanf("%d",&m);
while(m--)
{
int l,r;
scanf("%d %d",&l,&r);
if(l>r) swap(l,r);
int t=search(l,r);
if(t==r)
{
printf("%d\n",t-l+1);
}
else
{
printf("%d\n",max(t-l,rmq(t,r)));
}
}
}
return 0;
}

111
HDOJ/3605_autoAC.cpp Normal file
View File

@ -0,0 +1,111 @@
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int MAXN=100110;
const int MAXM=4000110;
const int INF=0x3f3f3f3f;
struct Node
{
int to,next,cap;
}edge[MAXM];
int tol;
int head[MAXN];
int gap[MAXN],dis[MAXN],pre[MAXN],cur[MAXN];
void init()
{
tol=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w,int rw=0)
{
edge[tol].to=v;edge[tol].cap=w;edge[tol].next=head[u];head[u]=tol++;
edge[tol].to=u;edge[tol].cap=rw;edge[tol].next=head[v];head[v]=tol++;
}
int sap(int start,int end,int nodenum)
{
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
memcpy(cur,head,sizeof(head));
int u=pre[start]=start,maxflow=0,aug=-1;
gap[0]=nodenum;
while(dis[start]<nodenum)
{
loop:
for(int &i=cur[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(edge[i].cap&&dis[u]==dis[v]+1)
{
if(aug==-1||aug>edge[i].cap)
aug=edge[i].cap;
pre[v]=u;
u=v;
if(v==end)
{
maxflow+=aug;
for(u=pre[u];v!=start;v=u,u=pre[u])
{
edge[cur[u]].cap-=aug;
edge[cur[u]^1].cap+=aug;
}
aug=-1;
}
goto loop;
}
}
int mindis=nodenum;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(edge[i].cap&&mindis>dis[v])
{
cur[u]=i;
mindis=dis[v];
}
}
if((--gap[dis[u]])==0)break;
gap[dis[u]=mindis+1]++;
u=pre[u];
}
return maxflow;
}
int num[1025];
int a[11];
int bit[11];
int main()
{
bit[0]=1;
for(int i=1;i<=10;i++)bit[i]=bit[i-1]*2;
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
int tmp=0;
for(int j=0;j<m;j++){scanf("%d",&a[j]);tmp+=a[j]*bit[j];}
num[tmp]++;
}
int start=0,end=1024+m+1,nodenum=2014+m+2;
for(int i=0;i<1024;i++)
{
if(num[i]==0)continue;
addedge(start,i+1,num[i]);
for(int j=0;j<10;j++)
if(i&bit[j] )
addedge(i+1,1024+j+1,INF);
}
int tmp;
for(int i=1;i<=m;i++)
{
scanf("%d",&tmp);
addedge(i+1024,end,tmp);
}
if(sap(start,end,nodenum)==n)printf("YES\n");
else printf("NO\n");
}
return 0;
}

130
HDOJ/3607_autoAC.cpp Normal file
View File

@ -0,0 +1,130 @@
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 100005
struct Node
{
int l,r;
int max_gold;
}tree[maxn*4];
struct Box
{
int height;
int gold;
int li;
int id;
}box[maxn];
int N,ans,cnt;
void build(int id,int l,int r)
{
tree[id].l=l;
tree[id].r=r;
tree[id].max_gold=0;
if(r>l)
{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
}
}
void update(int id,int idx,int val)
{
if(tree[id].l==tree[id].r)
{
tree[id].max_gold=max(tree[id].max_gold,val);
return;
}
int mid=(tree[id].l+tree[id].r)/2;
if(idx<=mid)
{
update(id*2,idx,val);
}
else
{
update(id*2+1,idx,val);
}
tree[id].max_gold=max(tree[id*2].max_gold,tree[id*2+1].max_gold);
}
int query(int id,int l,int r)
{
if(tree[id].l==l&&tree[id].r==r)
{
return tree[id].max_gold;
}
int mid=(tree[id].l+tree[id].r)/2;
if(r<=mid)
{
return query(id*2,l,r);
}
else if(l>mid)
{
return query(id*2+1,l,r);
}
else
{
return max(query(id*2,l,mid),query(id*2+1,mid+1,r));
}
}
int cmp1(Box a,Box b)
{
return a.height<b.height;
}
int cmp2(Box a,Box b)
{
return a.id<b.id;
}
void lisan()
{
sort(box,box+N,cmp1);
cnt=0;
box[0].li=0;
for(int i=1;i<N;i++)
{
if(box[i].height!=box[i-1].height)
{
cnt++;
box[i].li=cnt;
}
else
{
box[i].li=cnt;
}
}
sort(box,box+N,cmp2);
}
void solve()
{
lisan();
build(1,0,cnt);
ans=0;
for(int i=0;i<N;i++)
{
if(box[i].li==0)
{
update(1,0,box[i].gold);
ans=max(ans,box[i].gold);
}
else
{
int t=query(1,0,box[i].li-1);
update(1,box[i].li,t+box[i].gold);
ans=max(ans,t+box[i].gold);
}
}
}
int main()
{
while(scanf("%d",&N)==1)
{
for(int i=0;i<N;i++)
{
scanf("%d%d",&box[i].height,&box[i].gold);
box[i].id=i;
}
solve();
printf("%d\n",ans);
}
return 0;
}

68
HDOJ/3609_autoAC.cpp Normal file
View File

@ -0,0 +1,68 @@
#include<stdio.h>
typedef __int64 ll;
ll mod=100000000;
ll m[205];
ll eular(ll n)
{
ll i,ret=1;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
n=n/i;
ret=ret*(i-1);
while(n%i==0)
{
n=n/i;
ret=ret*i;
}
}
if(n==1)
break;
}
if(n>1)
ret=ret*(n-1);
return ret;
}
void init()
{
ll i;
m[1]=mod;
for(i=2;i<=204;i++)
m[i]=eular(m[i-1]);
}
ll power(ll a,ll b,ll c)
{
ll res=1;
while(b)
{
if(b%2==1)
res=res*a%c;
a=(a%c)*(a%c)%c;
b=b/2;
}
return res;
}
int main()
{
ll a,k,i,ans;
init();
while(scanf("%I64d%I64d",&a,&k)!=EOF)
{
ans=a;
if(a==0&&k%2==0)
{
printf("1\n");
continue;
}
for(i=k;i>=2;i--)
{
ans=ans%m[i];
if(ans==0)
ans=m[i];
ans=power(a,ans,m[i-1]);
}
printf("%I64d\n",ans%mod);
}
return 0;
}

29
HDOJ/3612_autoAC.cpp Normal file
View File

@ -0,0 +1,29 @@
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int sum[32], re, num;
int main()
{
int ca, n, k, i, j, po;
scanf("%d", &ca);
while(ca--)
{
scanf("%d%d", &n, &k);
memset(sum, 0, sizeof(sum));
for(i=0; i<n; i++)
{
scanf("%d", &num);
po=0;
while(num)
{
sum[po++]+=num&1;
num>>=1;
}
}
re=0;
for(i=0; i<32; i++)
re+=(sum[i]%(k+1));
puts(re==0?"Li wins":"Fernandes wins");
}
return 0;
}

46
HDOJ/3613_autoAC.cpp Normal file
View File

@ -0,0 +1,46 @@
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
using namespace std;
const int MAX=500000+10;
char s[MAX*2];
int p[MAX*2],sum[MAX],val[27];
int per[MAX],pos[MAX];
int main(){
int n;
cin>>n;
while(n--){
for(int i=0;i<26;++i)scanf("%d",&val[i]);
scanf("%s",s);
int len=strlen(s),id=0,ans=-INF,temp=0;
for(int i=1;i<=len;++i)sum[i]=sum[i-1]+val[s[i-1]-'a'];
for(int i=len;i>=0;--i){
s[i+i+2]=s[i];
s[i+i+1]='#';
}
s[0]='*';
for(int i=2;i<len+len+1;++i){
if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i);
else p[i]=1;
while(s[i-p[i]] == s[i+p[i]])++p[i];
if(id+p[id]<i+p[i])id=i;
if(i-p[i] == 0)per[p[i]-1]=n+1;
if(i+p[i] == len+len+2)pos[p[i]-1]=n+1;
}
for(int i=1;i<len;++i){
if(per[i] == n+1)temp+=sum[i];
if(pos[len-i] == n+1)temp+=sum[len]-sum[i];
if(temp>ans)ans=temp;
temp=0;
}
cout<<ans<<endl;
}
return 0;
}

79
HDOJ/3614_autoAC.cpp Normal file
View File

@ -0,0 +1,79 @@
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define MAXN 11
#define MOD 40007
using namespace std;
const int n=8;
int a[MAXN][MAXN];
int x;
int DX[MAXN][MAXN]=
{
{0,1,1,0,1,0,0,0},
{1,0,0,1,0,1,0,0},
{1,0,0,1,0,0,1,0},
{0,1,1,0,0,0,0,1},
{1,0,0,0,0,1,1,0},
{0,1,0,0,1,0,0,1},
{0,0,1,0,1,0,0,1},
{0,0,0,1,0,1,1,0}
};
void print(int a[MAXN][MAXN])
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++) cout<<a[i][j]<<" ";
cout<<endl;
}
}
void mult(int x[MAXN][MAXN],int y[MAXN][MAXN],int z[MAXN][MAXN])
{
int t[MAXN][MAXN];
memset(t,0,sizeof(t));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++) t[i][k]=(t[i][k]+x[i][j]*y[j][k])%MOD;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) z[i][j]=t[i][j];
}
void calc(int x[MAXN][MAXN],int y,int z[MAXN][MAXN])
{
int t[MAXN][MAXN];
int a[MAXN][MAXN];
memset(a,0,sizeof(a));
memset(t,0,sizeof(t));
for(int i=0;i<n;i++) a[i][i]=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) t[i][j]=x[i][j];
if(y%2==1)
mult(a,t,a);
y=y/2;
while(y>0)
{
mult(t,t,t);
if(y%2==1) mult(a,t,a);
y=y/2;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) z[i][j]=a[i][j];
}
void solve()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) a[i][j]=DX[i][j];
calc(a,x,a);
cout<<a[0][0]<<" "<<(a[3][0]+a[5][0]+a[6][0])%MOD<<" "<<(a[1][0]+a[2][0]+a[4][0])%MOD<<" "<<a[7][0]<<endl;
}
int main()
{
int casen;
scanf("%d",&casen);
while(casen--)
{
cin>>x;
solve();
}
return 0;
}

124
HDOJ/3616_autoAC.cpp Normal file
View File

@ -0,0 +1,124 @@
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 40;
const int maxpot = maxn*maxn*2;
const int maxm = maxpot*10;
const int INFI = 99999999;
const int dx[4] = {0,1,0,-1};
const int dy[4] = {1,0,-1,0};
int a[maxn][maxn];
int idx[maxn][maxn];
int L[maxpot],R[maxpot];
int head[maxpot],dep[maxpot],lis[maxpot];
int ne[maxm],pot[maxm],flow[maxm];
int S,T,tot,n,m;
void addedge(int a,int b,int c)
{
pot[++tot] = b; ne[tot] = head[a];
head[a] = tot; flow[tot] = c;
}
void connect(int a,int b,int c)
{
addedge(a,b,c);
addedge(b,a,0);
}
bool bfs()
{
for (int i=0;i<=T;i++) dep[i] = 0;
int h=1,t=1;
lis[1] = S;
dep[S] = 1;
while ( h<=t )
{
int v = lis[h];
for (int e=head[v];e!=-1;e=ne[e])
if ( flow[e]>0 && dep[pot[e]]==0 )
{
dep[pot[e]] = dep[v] + 1;
lis[++t] = pot[e];
}
h++;
}
return dep[T]>0;
}
int findpath(int v,int tmpflow)
{
if ( v==T ) return tmpflow;
int rec = 0,tmp;
for (int e=head[v];e!=-1;e=ne[e])
if ( flow[e]>0 && dep[pot[e]]==dep[v]+1 )
{
tmp = findpath(pot[e],min(tmpflow,flow[e]));
tmpflow -= tmp; rec += tmp;
flow[e] -= tmp; flow[e^1] += tmp;
if ( tmpflow==0 ) break;
}
dep[v] = 0;
return rec;
}
int dinic()
{
int ret = 0;
while ( bfs() )
ret += findpath(S,INFI);
return ret;
}
void build_graph()
{
int sum = 0;
int tx,ty;
int v,u;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
if ( a[i][j]!=-1 )
idx[i][j] = ++sum;
S = 0;
for (int i=1;i<=sum;i++)
{
L[i] = i;
R[i] = i + sum;
}
T = 2 * sum + 1;
memset(head,-1,sizeof(head));
tot = -1;
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
if ( a[i][j]!=-1 )
{
v = idx[i][j];
if ( a[i][j]!=0 )
connect(L[v],R[v],a[i][j]);
else
connect(L[v],R[v],INFI);
for (int t=0;t<4;t++)
{
tx = i + dx[t];
ty = j + dy[t];
if ( tx<0 || ty<0 || tx>=n || ty>=m ) continue;
u = idx[tx][ty];
if ( a[tx][ty]!=-1 )
connect(R[v],L[u],INFI);
}
if ( a[i][j]==0 )
connect(S,L[v],INFI);
if ( i==0 || j==0 || i==n-1 || j==m-1 )
connect(R[v],T,INFI);
}
}
int main()
{
int test;
scanf("%d",&test);
for (int cas=1;cas<=test;cas++)
{
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
scanf("%d",&a[i][j]);
build_graph();
int ans = dinic();
printf("%d\n",ans);
}
}

53
HDOJ/3617_autoAC.cpp Normal file
View File

@ -0,0 +1,53 @@
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <string.h>
#include <algorithm>
#define maxn 1010
using namespace std;
int cor[maxn];
struct Tr{
int a, b;
} r[maxn];
bool cmp(const Tr &a, const Tr &b){
return (a.a<b.a || a.a==b.a&&a.b<b.b);
}
bool equ(const Tr &a, const Tr &b){
return (a.a==b.a && a.b==b.b);
}
int n;
void init(){
scanf("%d", &n);
for (int i=0; i<n; i++) scanf("%d", &r[i].a);
for (int i=0; i<n; i++) scanf("%d", &r[i].b);
sort(r, r+n, cmp);
}
void solve(){
int i=0, last=0; memset(cor, 0, sizeof cor);
int ret = 0;
while (i<n){
int cnt=1;
while (i+1!=n && equ(r[i], r[i+1])){
i++; cnt++;
}
while (last!=r[i].a){
last++;
cor[last] = max(cor[last], cor[last-1]);
}
int tmp = (n+1 - (r[i].a+r[i].b) + 1);
int maxcor = min(tmp, cnt);
cor[last+tmp] = max(cor[last+tmp], cor[last] + maxcor);
ret = max(ret, cor[last+tmp]);
i++;
}
printf("%d\n", ret);
}
int main(int argc, char** argv) {
int test;
scanf("%d", &test);
while (test--){
init();
solve();
}
return 0;
}

116
HDOJ/3618_autoAC.cpp Normal file
View File

@ -0,0 +1,116 @@
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 409
int S,T;
struct edge
{
int v,flow,cost;
edge *next,*opp;
}A[500009],*adj[maxn];
#define NEW() &A[++ANS]
int ANS;
inline void addedge(int u,int v,int flow,int cost)
{
edge *ptr=NEW();
ptr->v=v;
ptr->flow=flow;
ptr->cost=cost;
ptr->next=adj[u]->next;
ptr->opp=&A[ANS^1];
adj[u]->next=ptr;
}
#define Inf 1000000000
int q[1000009],d[maxn];
bool vis[maxn];
edge *pre[maxn];
bool spfa()
{
memset(vis,0,sizeof(vis));
for(int i=S;i<=T;i++)
d[i]=Inf;
int head=0,tail=1,u,v;
q[0]=S;
d[S]=0;
while(head!=tail)
{
u=q[head++];
vis[u]=false;
for(edge *ptr=adj[u]->next;ptr!=NULL;ptr=ptr->next)
{
v=ptr->v;
if(ptr->flow&&d[v]>d[u]+ptr->cost)
{
d[v]=d[u]+ptr->cost;
pre[v]=ptr;
if(!vis[v])
{
vis[v]=true;
q[tail++]=v;
}
}
}
}
return d[T]!=Inf;
}
int solve()
{
int mincost=0;
while(spfa())
{
edge *ptr;
int low=Inf;
for(int i=T;i!=S;)
{
ptr=pre[i];
low=min(low,ptr->flow);
i=ptr->opp->v;
}
for(int i=T;i!=S;)
{
ptr=pre[i];
ptr->flow-=low;
ptr->opp->flow+=low;
i=ptr->opp->v;
}
if(d[T]>=0)
break;
mincost+=low*d[T];
}
return mincost;
}
int main()
{
int Q;
scanf("%d",&Q);
while(Q--)
{
int s,t,v,n;
S=0;
scanf("%d",&n);
ANS=-1;
for(int i=0;i<406;i++)
{
adj[i]=new edge();
adj[i]->next=NULL;
}
for(int k=1;k<=n;k++)
{
scanf("%d%d%d",&s,&t,&v);
s++;
t++;
addedge(s,t+1,1,-v);
addedge(t+1,s,0,v);
T=max(T,t+1);
}
for(int i=S;i<T;i++)
{
addedge(i,i+1,2,0);
addedge(i+1,i,0,0);
}
printf("%d\n",-solve());
}
return 0;
}

108
HDOJ/3619_autoAC.cpp Normal file
View File

@ -0,0 +1,108 @@
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
#define MIN(a,b) (a)>(b)?(b):(a)
const int INF = 0x3f3f3f3f ;
int T ,N ,M , K ,Sr,Sc,Er,Ec;
char maze[55][55] ;
unsigned int MA ;
int dr[4] = {-1, 1, 0, 0} ;
int dc[4] = {0,0,-1,1} ;
int key[51][51] ;
queue<int> que ;
bool in[55][55][1<<5] ;
int dis[55][55][1<<5] ;
bool relax(int r,int c ,int s ,int nr,int nc , int ns, int d){
if(dis[nr][nc][ns] > dis[r][c][s] + d){
dis[nr][nc][ns] = dis[r][c][s] + d ;
return true;
}
return false ;
}
void spfa(){
MA = (1 << K) - 1 ;
while(!que.empty()) que.pop() ;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++){
for(int k=0;k<=MA;k++){
in[i][j][k] = 0 ;
dis[i][j][k] = INF ;
}
}
}
dis[Sr][Sc][0] = 0 ;
in[Sr][Sc][0] = 1 ;
que.push(Sr); que.push(Sc); que.push(0);
while(!que.empty()){
int r = que.front() ; que.pop() ;
int c = que.front() ; que.pop() ;
int s = que.front() ; que.pop() ;
in[r][c][s] = 0 ;
for(int i=0;i<4;i++){
int nr = r + dr[i] ;
int nc = c + dc[i] ,ns;
if(nr<1||nc<1||nr>N||nc>M||maze[nr][nc]=='#') continue ;
ns = (s | key[nr][nc]) ;
if(maze[nr][nc]=='.'){
if(relax(r,c,s, nr,nc,ns,0) && !in[nr][nc][ns]){
in[nr][nc][ns] = 1 ;
que.push(nr) ; que.push(nc) ;que.push(ns) ;
}
}
else if(maze[nr][nc]>='1' && maze[nr][nc]<='9'){
if(relax(r,c,s, nr,nc,ns , maze[nr][nc]-'0') && !in[nr][nc][ns]){
in[nr][nc][ns] = 1 ;
que.push(nr) ; que.push(nc) ;que.push(ns) ;
}
}
else{
int a = maze[nr][nc] - 'A' ;
if((s&(1<<a)) != 0){
if(relax(r,c,s, nr,nc,ns ,0) && !in[nr][nc][ns]){
in[nr][nc][ns] = 1 ;
que.push(nr) ; que.push(nc) ;que.push(ns) ;
}
}
}
}
}
int ans = INF ;
for(int i=0;i<=MA;i++){
if(ans > dis[Er][Ec][i]){
ans = dis[Er][Ec][i] ;
}
}
if(ans == INF){
ans = -1 ;
}
printf("%d\n",ans);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&N,&M,&K);
for(int i=1;i<=N;i++){
scanf("%s",maze[i]+1);
for(int j=1;j<=M;j++){
if(maze[i][j]=='S'){
Sr = i ; Sc = j ;
maze[i][j] = '.' ;
}
if(maze[i][j] == 'T'){
Er = i ; Ec = j ;
maze[i][j] = '.' ;
}
}
}
memset(key , 0 ,sizeof(key));
for(int i=0;i<K;i++){
int a ,b ;
scanf("%d %d",&a , &b);
key[a][b] = (key[a][b] | (1<<i)) ;
}
spfa() ;
}
return 0 ;
}

137
HDOJ/3620_autoAC.cpp Normal file
View File

@ -0,0 +1,137 @@
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define N 201
using namespace std;
char Map[N][N];
int f[2][N][N], n, m;
void init(int x, int y) {
for (int i = 0; i < n; ++i) {
scanf("%s", Map[i]);
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
f[0][i][j] = -1;
}
}
f[0][x - 1][y - 1] = 0;
}
struct Queue {
int id[N], w[N], left, right;
void init() {
left = right = 0;
}
bool empty() {
return left == right;
}
void insert(int pos, int v, int len) {
if (left < right && abs(id[left] - pos) > len) {
++left;
}
if (v == -1) {
return;
}
while (left < right) {
int p = right - 1;
if (w[p] + abs(id[p] - pos) > v) {
break;
}
--right;
}
id[right] = pos, w[right] = v;
++right;
}
int left_id() {
return id[left];
}
} que;
void DP(int k, int len, int d) {
switch (d) {
case 1:
for (int j = 0; j < m; ++j) {
que.init();
for (int i = n - 1; i >= 0; --i) {
que.insert(i, f[1 - k][i][j], len);
if (Map[i][j] == 'x') {
que.init();
}
if (que.empty()) {
f[k][i][j] = -1;
} else {
f[k][i][j] = f[1 - k][que.left_id()][j] + que.left_id() - i;
}
}
}
break;
case 3:
for (int j = 0; j < m; ++j) {
que.init();
for (int i = 0; i < n; ++i) {
que.insert(i, f[1 - k][i][j], len);
if (Map[i][j] == 'x') {
que.init();
}
if (que.empty()) {
f[k][i][j] = -1;
} else {
f[k][i][j] = f[1 - k][que.left_id()][j] + i - que.left_id();
}
}
}
break;
case 2:
for (int i = 0; i < n; ++i) {
que.init();
for (int j = m - 1; j >= 0; --j) {
que.insert(j, f[1 - k][i][j], len);
if (Map[i][j] == 'x') {
que.init();
}
if (que.empty()) {
f[k][i][j] = -1;
} else {
f[k][i][j] = f[1 - k][i][que.left_id()] + que.left_id() - j;
}
}
}
break;
case 4:
for (int i = 0; i < n; ++i) {
que.init();
for (int j = 0; j < m; ++j) {
que.insert(j, f[1 - k][i][j], len);
if (Map[i][j] == 'x') {
que.init();
}
if (que.empty()) {
f[k][i][j] = -1;
} else {
f[k][i][j] = f[1 - k][i][que.left_id()] + j - que.left_id();
}
}
}
break;
}
}
int main(int argc, char** argv) {
int x, y, tot, T;
scanf("%d", &T);
while (T--) {
scanf("%d%d%d%d%d", &n, &m, &x, &y, &tot);
init(x, y);
for (int i = 1; i <= tot; ++i) {
int len, d;
scanf("%d%d", &len, &d);
DP(i % 2, len, d);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
ans = (ans < f[tot % 2][i][j] ? f[tot % 2][i][j] : ans);
}
}
printf("%d\n", ans);
}
return 0;
}

96
HDOJ/3622_autoAC.cpp Normal file
View File

@ -0,0 +1,96 @@
#include <cstdio>
#include <cstring>
#include <cmath>
#define MAXN 210
#define EPS 1e-3
using namespace std;
int n;
struct Edge{
int v,next;
Edge(){}
Edge(int _v,int _next):v(_v),next(_next){}
}edge[MAXN*MAXN];
int head[MAXN], size;
inline void initial(){
memset(head,-1,sizeof(int)*(n+2));
size = 0;
}
inline void add_edge(int u,int v){
edge[size] = Edge(v,head[u]);
head[u] = size ++;
}
int belong[MAXN];
bool vis[MAXN];
int depth;
int bcnt;
int dfn[MAXN], low[MAXN];
int stack[MAXN], tail ;
inline void Tarjan(int u){
dfn[u] = low[u] = depth ++;
vis[u] = 1;
stack[++tail] = u;
for(int i = head[u];i != -1;i = edge[i].next){
int v = edge[i].v;
if(dfn[v] == -1){
Tarjan(v);
if(low[u] > low[v])
low[u] = low[v];
}else if(vis[v] && low[u] > dfn[v]){
low[u] = dfn[v];
}
}
if(low[u] == dfn[u]){
bcnt ++;
int j;
do{
j = stack[tail--];
vis[j] = 0;
belong[j] = bcnt;
}while(j != u);
}
}
double x[MAXN], y[MAXN];
inline double Cal(int i,int j){
return (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]);
}
inline bool can(){
int N = n/2;
for(int i = 1;i <= N; ++i)
if(belong[i] == belong[i+N]) return false;
return true;
}
int main()
{
int N;
while(scanf("%d",&N) != EOF){
n = 2*N;
for(int i = 1;i <= N; ++i)
scanf("%lf%lf%lf%lf",&x[i],&y[i],&x[i+N],&y[i+N]);
double right = 10000.0*10000.0, left = 0.0, mid;
while(right - left >= EPS){
mid = (right + left)/2.0;
initial();
for(int i = 1;i < n; ++i)
for(int j = i + 1;j <= n; ++j){
if(Cal(i,j) < mid){
int u, v;
if(i <= N) u = i + N;
else u = i - N;
if(j <= N) v = j + N;
else v = j - N;
add_edge(i,v);
add_edge(j,u);
}
}
tail = depth = bcnt = 0;
memset(vis,0,sizeof(bool)*(n+2));
memset(dfn,-1,sizeof(int)*(n+2));
memset(low,0,sizeof(int)*(n+2));
for(int i = 1;i <= n; ++i)
if(dfn[i] == -1) Tarjan(i);
if(can()) left = mid;
else right = mid;
}
printf("%.2lf\n",sqrt(left)/2.0);
}
}

33
HDOJ/3625_autoAC.cpp Normal file
View File

@ -0,0 +1,33 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-7
#define LL long long
using namespace std;
LL fac[21]={1};
LL stir1[21][21];
int main(){
for(int i=1;i<21;i++)
fac[i]=fac[i-1]*i;
for(int i=1;i<=20;i++){
stir1[i][0]=0;
stir1[i][i]=1;
for(int j=1;j<i;j++)
stir1[i][j]=stir1[i-1][j-1]+(i-1)*stir1[i-1][j];
}
int t,n,k;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
if(n==1||k==0){
printf("0.0000\n");
continue;
}
LL sum=0;
for(int i=1;i<=k;i++)
sum+=stir1[n][i]-stir1[n-1][i-1];
printf("%.4f\n",(double)sum/fac[n]);
}
return 0;
}

54
HDOJ/3626_autoAC.cpp Normal file
View File

@ -0,0 +1,54 @@
#include<iostream>
#include<string.h>
using namespace std;
const int maxn =1010;
struct matrix{
int x,y;
};
matrix ma[maxn];
int flag[maxn];
int main(){
for(int n,cases=1;cin>>n && n!=0;cases++){
for(int i=0;i<n;i++)
cin>>ma[i].x>>ma[i].y;
cout<<(cases==1?"":"\n")<<"Case "<<cases<<":\n";
for(int i=0;i<n;i++){
int min,num=0;
memset(flag,0,sizeof(flag));
for(int j=0;j<n;j++){
if(ma[j].x>ma[i].x && ma[j].y>ma[i].y){
flag[j]=1;
num++;
min=j;
}
}
if(num==0)
cout<<"-1 -1\n";
else if(num==1)
cout<<ma[min].x<<" "<<ma[min].y<<"\n";
else{
for(int j=0;j<n;j++){
if(flag[j]==1 && ma[j].x<ma[min].x){
min=j;
}
}
num=0;
for(int j=0;j<n;j++){
if(flag[j]==1 && ma[j].x==ma[min].x){
num++;
flag[j]=2;
}
}
if(num ==1)
cout<<ma[min].x<<" "<<ma[min].y<<"\n";
else{
for(int j=0;j<n;j++){
if(flag[j]==2 && ma[j].y<ma[min].y)
min=j;
}
cout<<ma[min].x<<" "<<ma[min].y<<"\n";
}
}
}
}
}

131
HDOJ/3627_autoAC.cpp Normal file
View File

@ -0,0 +1,131 @@
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<string>
#include<map>
#include<set>
#include<cstring>
using namespace std;
map<int,set<int> > m;
map<int,set<int> >::iterator mi;
set<int>::iterator si;
set<int>s;
map<int,int>yy;
int n;
int tx,ty;
char c[11];
int temp,t2;
int tt;
int main()
{
int cas=1;
while(cin>>n)
{
if(n==0)
{
break;
}
if(cas!=1)
{
cout<<endl;
}
printf("Case %d:\n",cas++);
m.clear();
s.clear();
yy.clear();
for(int i=1;i<=n;i++)
{
scanf("%s",c);
scanf("%d%d",&tx,&ty);
if(c[0]=='a')
{
if(yy.find(ty) == yy.end())
{
yy[ty] = 1;
}
else
{
yy[ty]++;
}
if(s.find(tx)==s.end())
{
s.insert(tx);
}
mi = m.find(tx);
if(mi != m.end())
{
si = mi -> second.find(ty);
if(si!=mi -> second.end())
{
continue;
}
else
{
mi->second.insert(ty);
}
}
else
{
m[tx].insert(ty);
}
}
else if(c[0]=='f')
{
if(yy.upper_bound(ty) == yy.end())
{
printf("-1\n");
continue;
}
tt = tx;
while(true)
{
if(s.empty())
{
printf("-1\n");
break;
}
si = s.upper_bound(tt);
if(si!=s.end())
{
temp = *si;
tt = temp;
if(m[temp].empty())
{
continue;
}
si = m[temp].upper_bound(ty);
if(si != m[temp].end())
{
t2 = *si;
printf("%d %d\n",temp,t2);
break;
}
else
{
continue;
}
}
else
{
printf("-1\n");
break;
}
}
}
else if(c[0]=='r')
{
m[tx].erase(ty);
if(m[tx].empty())
{
s.erase(tx);
}
if(!--yy[ty])
{
yy.erase(ty);
}
}
}
}
return 0;
}

56
HDOJ/3628_autoAC.cpp Normal file
View File

@ -0,0 +1,56 @@
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
using namespace std;
#define eps (1e-9)
double r,v,w,X,E;
bool zero(double t)
{
return fabs(t)<eps;
}
double jifen(double t)
{
return (t*v*sqrt(r*r+t*t*v*v)+r*r*log(v*(t*v+sqrt(r*r+t*t*v*v))))/(2*v);
}
bool ok(double mid)
{
double tmp=X*sqrt(r*r*w*w+v*v)*(jifen(mid)-jifen(0));
if(tmp+eps>E)
return true;
return false;
}
int main()
{
while(scanf("%lf%lf%lf%lf%lf",&r,&w,&v,&X,&E)!=EOF)
{
if(zero(r)&&zero(w)&&zero(v)&&zero(X)&&zero(E))
break;
double left=0,right=30*24*3600.0,ans=-1,mid;
int cas=100;
if(zero(r))
{
printf("%.4lf\n",sqrt(2*E/v/v));
continue;
}
while(cas--)
{
mid=(left+right)/2;
if(ok(mid))
{
ans=mid;
right=mid;
}
else
{
left=mid;
}
}
printf("%.4lf\n",ans);
}
return 0;
}

46
HDOJ/3629_autoAC.cpp Normal file
View File

@ -0,0 +1,46 @@
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define eps 1e-8
#define pi acos(-1.0)
using namespace std;
const int N=1000;
struct Point{double x, y;}p[N];
double ans[2*N];
long long C(int a,int b){
long long ans=1;
for(int i=0;i<b;i++) ans*=(a-i);
for(int i=2;i<=b;i++) ans/=i;
return ans;
}
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
long long res=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==i) continue;
double tmp=atan2(p[j].y-p[i].y,p[j].x-p[i].x);
if(tmp<=-eps) tmp+=2*pi;
j<i?ans[j]=tmp:ans[j-1]=tmp;
}
sort(ans,ans+n-1);
int k=1;
long long re2=0;
for(int j=0;j<n-1;j++)
ans[j+n-1]=ans[j]+2*pi;
for(int j=0;j<n-1;j++){
while(fabs(ans[k]-ans[j])-pi<0) k++;
if(k-j-1>=2) re2+=C(k-j-1,2);
}
res+=C(n-1,3)-re2;
}
printf("%I64d\n",C(n,4)-res);
}
return 0;
}

115
HDOJ/3630_autoAC.cpp Normal file
View File

@ -0,0 +1,115 @@
#include"iostream"
#include"cstdio"
#include"cmath"
#include"cstring"
using namespace std;
const int N=155;
int n,m,q,s;
int dp[N][N][9][9],le[N][N],rg[N][N],sum[N][N];
int lowbit[N];
inline int max(int a,int b){
return a>b?a:b;
}
void RMQ()
{
int j1,j2,row,col;
int mx=int(log(1.0*n)/log(2.0));
int my=int(log(1.0*m)/log(2.0));
for(j1=0;j1<=mx;j1++)
{
for(j2=0;j2<=my;j2++)
{
if(!j1 && !j2) continue;
for(row=1;row+(1<<j1)-1<=n;row++)
{
for(col=1;col+(1<<j2)-1<=m;col++)
{
if(!j1)
dp[row][col][j1][j2]=max(dp[row][col][j1][j2-1],dp[row][col+(1<<(j2-1))][j1][j2-1]);
else
dp[row][col][j1][j2]=max(dp[row][col][j1-1][j2],dp[row+(1<<(j1-1))][col][j1-1][j2]);
}
}
}
}
}
int power[N];
inline int query(int x1,int y1,int x2,int y2)
{
int kx=power[x2-x1+1];
int ky=power[y2-y1+1];
int m1=dp[x1][y1][kx][ky];
int m2=dp[x2-(1<<kx)+1][y1][kx][ky];
int m3=dp[x1][y2-(1<<ky)+1][kx][ky];
int m4=dp[x2-(1<<kx)+1][y2-(1<<ky)+1][kx][ky];
return max(max(m1,m2),max(m3,m4));
}
void init()
{
int i,l,temp;
for(i=0;i<=150;i++) power[i]=log(double(i))/log(2.0);
for(i=1;i<=n;i++)
{
temp=0;
for(l=1;l<=m;l++)
{
scanf("%d",&dp[i][l][0][0]);
temp+=dp[i][l][0][0];
sum[i][l]=sum[i-1][l]+temp;
}
}
for(i=1;i<=n;i++) {le[i][0]=1;rg[i][m+1]=m;}
for(i=1;i<=n;i++)
{
for(l=1;l<=m;l++)
{
if(dp[i][l][0][0]==-1) le[i][l]=l+1;
else le[i][l]=le[i][l-1];
}
for(l=m;l>=1;l--)
{
if(dp[i][l][0][0]==-1) rg[i][l]=l-1;
else rg[i][l]=rg[i][l+1];
}
}
RMQ();
}
int main()
{
int T,Case;
int i,l;
int up;
int x1,y1,x2,y2,lmax,rmin;
int t,temp,ans;
cin>>T;
for(i=1;i<=150;i++) lowbit[i]=i&(-i);
for(Case=1;Case<=T;Case++)
{
if(Case>1) printf("\n");
printf("Case %d:\n",Case);
scanf("%d%d%d%d",&n,&m,&q,&s);
init();
while(q--)
{
ans=0;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(l=y1;l<=y2;l++)
{
up=x1;
lmax=y1;
rmin=y2;
for(i=x1;i<=x2;i++)
{
if(le[i][l]==l+1) {up=i+1;lmax=y1;rmin=y2;continue;}
if(lmax<le[i][l]) lmax=le[i][l];
if(rmin>rg[i][l]) rmin=rg[i][l];
temp=query(up,lmax,i,rmin);
t=(s-1)*temp+sum[i][rmin]-sum[i][lmax-1]-sum[up-1][rmin]+sum[up-1][lmax-1];
if(ans<t) ans=t;
}
}
printf("%d\n",ans);
}
}
return 0;
}

73
HDOJ/3631_autoAC.cpp Normal file
View File

@ -0,0 +1,73 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#define inf 99999999
using namespace std;
int map[305][305];
int mark[305];
void floyd(int k,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
int main()
{
int n,m,q;
int cas=1;
while(scanf("%d%d%d",&n,&m,&q))
{
if(n==0&&m==0&&q==0)
break;
int i,j;
memset(mark,0,sizeof(mark));
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
map[i][j]=(i==j?0:inf);
for(i=0;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(w<map[u][v])
map[u][v]=w;
}
if(cas!=1)
printf("\n");
printf("Case %d:\n",cas++);
for(i=0;i<q;i++)
{
int f;
scanf("%d",&f);
if(f==0)
{
int t;
scanf("%d",&t);
if(mark[t])
printf("ERROR! At point %d\n",t);
else
{
mark[t]=1;
floyd(t,n);
}
}
else
{
int u,v;
scanf("%d%d",&u,&v);
if(!mark[u]||!mark[v])
printf("ERROR! At path %d to %d\n",u,v);
else if(map[u][v]>=inf)
printf("No such path\n");
else
printf("%d\n",map[u][v]);
}
}
}
return 0;
}

54
HDOJ/3632_autoAC.cpp Normal file
View File

@ -0,0 +1,54 @@
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXD 210
int N, g[MAXD][MAXD], f[MAXD][MAXD], a[MAXD];
void init()
{
int i, j;
scanf("%d", &N);
for(i = 1; i <= N; i ++)
scanf("%d", &a[i]);
for(i = 1; i <= N; i ++)
for(j = 1; j <= N; j ++)
scanf("%d", &g[i][j]); }
int can(int i, int j, int k)
{
if(!f[i][k] || !f[k][j])
return 0;
return g[i][k] || g[j][k];
}
void solve()
{
int i, j, k, d, ans = 0;
for(i = 1; i <= N; i ++)
g[i][0] = g[i][N + 1] = 1, g[0][i] = g[N + 1][i] = 0;
for(i = 0; i < N + 1; i ++)
f[i][i + 1] = 1;
for(d = 2; d <= N; d ++)
for(i = 0; (j = i + d) <= N + 1; i ++)
{
for(k = i + 1; k < j; k ++)
if(can(i, j, k))
{
f[i][j] = 1;
break;
}
if(k == j) f[i][j] = 0;
}
for(i = 1; i <= N; i ++)
if(f[0][i] && f[i][N + 1])
ans = std::max(ans, a[i]);
printf("%d\n", ans);
}
int main() {
int t, tt;
scanf("%d", &t);
for(tt = 1; tt <= t; tt ++)
{
init();
printf("Case %d: ", tt);
solve();
}
return 0;
}

146
HDOJ/3633_autoAC.cpp Normal file
View File

@ -0,0 +1,146 @@
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define HASH 100007
#define MAXD 100010
#define INF 0x3f3f3f3f
int N, M, pre[65][MAXD], a[10][10];
char op[65][MAXD], g[10][10];
struct HashMap
{
int head[HASH], size, next[MAXD], st[MAXD], dif[MAXD], col[MAXD], dp[MAXD];
void init()
{
memset(head, -1, sizeof(head)), size = 0;
}
void push(int _st, int _dif, int _col, int _dp, int id, int p, char ch)
{
int i, h = ((_st << 6) + _col + 2000 + _dif) % HASH;
for(i = head[h]; i != -1; i = next[i])
if(st[i] == _st && dif[i] == _dif && col[i] == _col)
{
dp[i] += _dp;
return ;
}
st[size] = _st, dif[size] = _dif, col[size] = _col, dp[size] = _dp;
pre[id][size] = p, op[id][size] = ch;
next[size] = head[h], head[h] = size ++;
}
}hm[2];
void init()
{
int i, j;
scanf("%d%d", &N, &M);
for(i = 0; i < N; i ++) scanf("%s", g[i]);
for(i = 0; i < N; i ++)
for(j = 0; j < M; j ++) scanf("%d", &a[i][j]);
}
int code[10], h[10];
inline void decode(int *code, int m, int st)
{
for(int i = m - 1; i >= 0; i --) code[i] = st & 7, st >>= 3;
}
inline int encode(int *code, int m)
{
int i, st = 0, cnt = -1;
memset(h, -1, sizeof(h));
for(i = 0; i < m; i ++)
{
if(h[code[i]] == -1) h[code[i]] = ++ cnt;
st = st << 3 | h[code[i]];
}
return st;
}
void dp(int i, int j, int c, int cur)
{
int k;
for(k = 0; k < hm[cur].size; k ++)
{
int col = hm[cur].col[k], u = i ? (col >> j & 1) == c : 0, l = j ? (col >> j - 1 & 1) == c : 0, lu = i && j ? (col >> M) == c : 0;
if(u && l && lu) continue;
if(i == N - 1 && j == M - 1 && !u && !l && lu) continue;
decode(code, M, hm[cur].st[k]);
if(i && !u)
{
int t, s1 = 0, s2 = 0;
for(t = 0; t < M; t ++)
{
if(code[t] == code[j]) ++ s1;
if((col >> t & 1) != c) ++ s2;
}
if(s1 == 1)
{
if(s2 > 1) continue;
if(i < N - 1 || j < M - 2) continue;
}
}
if(l && u)
{
if(code[j] != code[j - 1])
for(int t = 0, x = code[j]; t < M; t ++)
if(code[t] == x) code[t] = code[j - 1];
}
else if(l && !u) code[j] = code[j - 1];
else if(!l && !u) code[j] = M;
if(col & 1 << j) col |= 1 << M;
else col &= ~(1 << M);
if(c) col |= 1 << j;
else col &= ~(1 << j);
hm[cur ^ 1].push(encode(code, M), hm[cur].dif[k] + (c ? a[i][j] : -a[i][j]), col, hm[cur].dp[k], i * M + j, k, c ? 'x' : 'o');
}
}
void print(int k)
{
int i, j;
for(i = N - 1; i >= 0; i --)
for(j = M - 1; j >= 0; j --)
g[i][j] = op[i * M + j][k], k = pre[i * M + j][k];
for(i = 0; i < N; i ++) printf("%s\n", g[i]);
}
void solve()
{
int i, j, k, cur = 0, ans = 0, min = INF;
hm[0].init();
hm[0].push(0, 0, 0, 1, 0, 0, 0);
for(i = 0; i < N; i ++)
for(j = 0; j < M; j ++)
{
hm[cur ^ 1].init();
if(g[i][j] != 'x') dp(i, j, 0, cur);
if(g[i][j] != 'o') dp(i, j, 1, cur);
cur ^= 1;
}
for(i = 0; i < hm[cur].size; i ++)
{
int s1 = 0;
memset(h, 0, sizeof(h));
decode(code, M, hm[cur].st[i]);
for(j = 0; j < M; j ++) if(!h[code[j]]) ++ s1, h[code[j]] = 1;
if(s1 <= 2)
{
if(std::abs(hm[cur].dif[i]) < min)
min = std::abs(hm[cur].dif[i]), ans = hm[cur].dp[i], k = i;
else if(std::abs(hm[cur].dif[i]) == min)
ans += hm[cur].dp[i];
}
}
if(min == INF) printf("0 0\n");
else
{
printf("%d %d\n", min, ans);
print(k);
}
}
int main()
{
int t, tt;
scanf("%d", &t);
for(tt = 1; tt <= t; tt ++)
{
init();
printf("Case %d: ", tt);
solve();
printf("\n");
}
return 0;
}

72
HDOJ/3634_autoAC.cpp Normal file
View File

@ -0,0 +1,72 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 205;
#define LL long long
typedef struct
{
LL x1,y1;
LL x2,y2;
LL sum;
LL v;
}Node;
Node T[N];
LL n;
bool cmp(Node a,Node b)
{
return a.v<b.v;
}
void Cover(LL x1,LL y1,LL x2,LL y2,LL k,LL c)
{
while(k<n&&(x1>=T[k].x2||x2<=T[k].x1||y1>=T[k].y2||y2<=T[k].y1)) k++;
if(k>=n)
{
T[c].sum+=(x2-x1)*(y2-y1)*T[c].v;
return;
}
if(x1<T[k].x1)
{
Cover(x1,y1,T[k].x1,y2,k+1,c);
x1=T[k].x1;
}
if(x2>T[k].x2)
{
Cover(T[k].x2,y1,x2,y2,k+1,c);
x2=T[k].x2;
}
if(y1<T[k].y1)
{
Cover(x1,y1,x2,T[k].y1,k+1,c);
y1=T[k].y1;
}
if(y2>T[k].y2)
{
Cover(x1,T[k].y2,x2,y2,k+1,c);
y2=T[k].y2;
}
}
int main()
{
LL i,k=1,t;
scanf("%I64d",&t);
while(t--)
{
scanf("%d",&n);
memset(T,0,sizeof(T));
for(i=0;i<n;i++)
{
T[i].v=0;
scanf("%I64d%I64d%I64d%I64d%I64d",&T[i].x1,&T[i].y1,&T[i].x2,&T[i].y2,&T[i].v);
T[i].sum=0;
}
stable_sort(T,T+n,cmp);
for(i=n-1;i>=0;i--)
Cover(T[i].x1,T[i].y1,T[i].x2,T[i].y2,i+1,i);
LL ans=0;
for(i=0;i<n;i++)
ans+=T[i].sum;
printf("Case %I64d: %I64d\n",k++,ans);
}
return 0;
}

70
HDOJ/3635_autoAC.cpp Normal file
View File

@ -0,0 +1,70 @@
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=10010;
int F[MAXN];
int num[MAXN];
int mo[MAXN];
int n;
void init()
{
for(int i=1;i<=n;i++)
{
F[i]=-1;
num[i]=1;
mo[i]=0;
}
}
int find(int x)
{
if(F[x]==-1)return x;
int t=F[x];
F[x]=find(F[x]);
mo[x]+=mo[t];
return F[x];
}
void bing(int a,int b)
{
int t1=find(a);
int t2=find(b);
if(t1!=t2)
{
F[t1]=t2;
num[t2]+=num[t1];
mo[t1]=1;
}
}
int main()
{
int m;
int T;
char str[10];
int a,b;
int iCase=0;
scanf("%d",&T);
while(T--)
{
iCase++;
scanf("%d%d",&n,&m);
init();
printf("Case %d:\n",iCase);
while(m--)
{
scanf("%s",&str);
if(str[0]=='T')
{
scanf("%d%d",&a,&b);
bing(a,b);
}
else
{
scanf("%d",&a);
int t=find(a);
printf("%d %d %d\n",t,num[t],mo[a]);
}
}
}
return 0;
}

72
HDOJ/3637_autoAC.cpp Normal file
View File

@ -0,0 +1,72 @@
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int size = 111111;
typedef long long ll;
typedef pair<int,int> pii;
ll gcd(ll a, ll b){
return b? gcd(b, a%b):a;
}
char ch[100];
ll a, b, c, d, n,t;
void get(ll &a, ll &b){
n = strlen(ch);
ll aa = 0, bb = 1, cc = 0, dd = 1, f = 0;
for(int i = 0; i < n && ch[i] != '[';i++){
if(ch[i] == '.'){
f = 1;
continue;
}
aa = 10 * aa + ch[i] - '0';
if(f)
bb *= 10;
}
f = gcd(aa, bb);
aa /= f;
bb /= f;
for(int i = 0; i < n; i++)
if(ch[i] == '['){
for(int j = i+1; ch[j] != ']'; j++){
cc = cc * 10 + ch[j] - '0';
dd *= 10;
}
dd--;
for(int j = i -1; ch[j] != '.';j--)
dd *= 10;
break;
}
f = gcd(cc, dd);
cc /= f;
dd /= f;
f = gcd(bb,dd);
b = bb/f*dd;
aa = dd/f*aa +bb/f*cc;
a = aa;
}
int work(ll a, ll b, ll c, ll d, ll p){
ll x = a *p / b + 1;
ll y = c *p /d;
if(c*p%d == 0)
y--;
if(x <= y)
return 1;
return 0;
}
int main()
{
cin >> t;
for(int ca = 1; ca <= t; ca++){
cin >> ch;
get(a,b);
cin >> ch;
get(c,d);
ll low = 1;
while(work(a,b,c,d,low) == 0)
low++;
ll x = a * low / b + 1;
printf("Case %d: %I64d/%I64d\n", ca, x, low);
}
}

129
HDOJ/3638_autoAC.cpp Normal file
View File

@ -0,0 +1,129 @@
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXN 60
int trans[] = {0, 2, 1, 4, 3};
int dx[] = {0, -1, 1, 0, 0}, dy[] = {0, 0, 0, -1, 1};
int ex[][9] =
{
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, -1, -1, -1, -2, -2, -2, -2, -2},
{0, 1, 1, 1, 2, 2, 2, 2, 2},
{0, -1, 0, 1, -2, -1, 0, 1, 2},
{0, -1, 0, 1, -2, -1, 0, 1, 2}
};
int ey[][9] =
{
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, -1, 0, 1, -2, -1, 0, 1, 2},
{0, -1, 0, 1, -2, -1, 0, 1, 2},
{0, -1, -1, -1, -2, -2, -2, -2, -2},
{0, 1, 1, 1, 2, 2, 2, 2, 2}
};
struct Monster
{
int x, y, d;
}mon[MAXN];
char b[MAXN];
int N, M, K, sx, sy, tx, ty, g[MAXN][MAXN], del[MAXN][MAXN], vis[MAXN][MAXN];
struct Point
{
int x, y, t;
Point(){}
Point(int _x, int _y, int _t) : x(_x), y(_y), t(_t){}
};
inline int inside(int x, int y)
{
return x >= 1 && x <= N && y >= 1 && y <= M;
}
void moveall()
{
int i, x, y;
for(i = 0; i < K; i ++)
{
x = mon[i].x + dx[mon[i].d], y = mon[i].y + dy[mon[i].d];
if(inside(x, y) && g[x][y]) mon[i].x = x, mon[i].y = y;
else mon[i].d = trans[mon[i].d];
}
}
void delblock()
{
int i, j, x, y;
for(i = 1; i <= N; i ++)
for(j = 1; j <= M; j ++) del[i][j] = 1 - g[i][j];
for(i = 0; i < K; i ++)
for(j = 0; j < 9; j ++)
{
x = mon[i].x + ex[mon[i].d][j], y = mon[i].y + ey[mon[i].d][j];
if(inside(x, y)) del[x][y] = 1;
}
}
void init()
{
int i, j;
scanf("%d%d", &N, &M);
for(i = 1; i <= N; i ++)
{
scanf("%s", b + 1);
for(j = 1; j <= M; j ++)
{
g[i][j] = b[j] != '*';
if(b[j]== 'A') sx = i, sy = j;
else if(b[j] == 'B') tx = i, ty = j;
}
}
scanf("%d", &K);
for(i = 0; i < K; i ++) scanf("%d%d%d", &mon[i].x, &mon[i].y, &mon[i].d);
}
void solve()
{
int i, j, x, y, cur, ans = -1;
cur = -1;
delblock();
if(del[sx][sy])
{
printf("璐ュ靛朵涓 峰ユ澶т\n");
return ;
}
std::queue <Point> q;
q.push(Point(sx, sy, 0));
while(!q.empty())
{
Point p = q.front();
q.pop();
if(p.t > 1000) break;
if(p.x == tx && p.y == ty)
{
ans = p.t;
break;
}
if(p.t > cur)
{
cur = p.t;
for(i = 1; i <= N; i ++)
for(j = 1; j <= M; j ++) vis[i][j] = 0;
moveall(), delblock();
}
for(i = 0; i < 5; i ++)
{
x = p.x + dx[i], y = p.y + dy[i];
if(inside(x, y) && !del[x][y] && !vis[x][y])
vis[x][y] = 1, q.push(Point(x, y, p.t + 1));
}
}
if(ans == -1) printf("璐ュ靛朵涓 峰ユ澶т\n");
else printf("%d\n", ans);
}
int main()
{
int t, tt;
scanf("%d", &t);
for(tt = 1; tt <= t; tt ++)
{
init();
printf("Case %d: ", tt);
solve();
}
return 0;
}

109
HDOJ/3639_autoAC.cpp Normal file
View File

@ -0,0 +1,109 @@
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
const int N=5006;
stack <int> s;
vector <int> adj[N], arc[N], com[N], ans;
int n, m, t, ind, T, sum;
int dfn[N], low[N], id[N], in[N];
bool vs[N];
void tarjan(int u)
{
dfn[u]=low[u]=T++;
s.push(u), vs[u]=1;
int len=(int)adj[u].size();
for(int i=0; i<len; i++)
{
int v=adj[u][i];
if(dfn[v]==-1)
{
tarjan(v);
if(low[u]>low[v]) low[u]=low[v];
}
else if(vs[v] && low[u]>dfn[v]) low[u]=dfn[v];
}
if(low[u]==dfn[u])
{
for(int v; 1; )
{
v=s.top();
s.pop(), vs[v]=0;
id[v]=ind, com[ind].push_back(v);
if(v==u) break;
}
ind++;
}
}
void DFS(int u)
{
vs[u]=1;
int len=(int)arc[u].size();
sum+=(int)com[u].size();
for(int i=0; i<len; i++)
{
int v=arc[u][i];
if(vs[v]) continue;
DFS(v);
}
}
int main()
{
scanf("%d", &t);
for(int ca=1; ca<=t; ca++)
{
scanf("%d%d", &n, &m);
for(int i=0; i<n; i++) adj[i].clear();
for(int i=0, a, b; i<m; i++)
{
scanf("%d%d", &a, &b);
adj[a].push_back(b);
}
for(int i=0; i<n; i++) vs[i]=0, dfn[i]=-1, com[i].clear();
ind=T=0;
while(!s.empty()) s.pop();
for(int i=0; i<n; i++) if(dfn[i]==-1) tarjan(i);
for(int i=0; i<ind; i++) arc[i].clear(), in[i]=0, dfn[i]=0;
for(int i=0; i<n; i++)
{
int len=(int)adj[i].size();
for(int j=0; j<len; j++)
{
int v=id[adj[i][j]];
int u=id[i];
if(u!=v) arc[v].push_back(u), in[u]++;
}
}
for(int i=0; i<ind; i++)
{
if(in[i]!=0) continue;
for(int j=0; j<ind; j++) vs[j]=0;
sum=0;
DFS(i);
dfn[i]=sum;
}
int Max=-0x3fffffff;
for(int i=0; i<ind; i++)
if(Max<dfn[i]) Max=dfn[i];
ans.clear();
for(int i=0; i<ind; i++)
{
if(dfn[i]!=Max) continue;
int len=(int)com[i].size();
for(int j=0; j<len; j++) ans.push_back(com[i][j]);
}
sort(ans.begin(), ans.end());
int len=(int)ans.size();
printf("Case %d: %d\n", ca, Max-1);
for(int i=0; i<len; i++)
{
printf("%d", ans[i]);
if(i==len-1) printf("\n");
else printf(" ");
}
}
return 0;
}

127
HDOJ/3640_autoAC.cpp Normal file
View File

@ -0,0 +1,127 @@
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
const int MAX = 100 + 10;
char Plant[MAX];
int P, M;
int Flag;
int E;
int MozNum;
void init(char plant[])
{
MozNum = 0;
E = strlen(plant) - 1;
P = M = 0;
for(int i = 0; i <= E; ++i)
{
if(plant[i] == 'P')
++P;
else
++M;
}
}
int run(int apNum, int ppNum, int mozNum)
{
int flag = Flag;
int pLife = 10, mozLife = 50;
while(ppNum > 0 && mozNum > 0)
{
if(flag > 0)
{
--flag;
mozLife -= apNum;
}
else
{
pLife -= mozNum;
mozLife -= apNum;
}
if(pLife <= 0)
{
pLife = 10;
apNum--;
ppNum--;
flag = 1;
}
if(mozLife <= 0)
{
mozLife = 50;
mozNum--;
}
}
if(ppNum <= 0 && mozNum > 0)
return 1;
if(ppNum <= 0 && mozNum <= 0)
return 0;
if(ppNum > 0)
return -1;
}
int main()
{
int T;
scanf("%d", &T);
for(int t = 1; t <= T; ++t)
{
scanf("%s", Plant);
init(Plant);
if(Plant[E] == 'M')
{
E--;
MozNum++;
Flag = 2;
}
else
Flag = 1;
while(E >= 0)
{
if(Plant[E] == 'M')
{
if(Flag > 1)
{
--Flag;
if(P >= 50)
++MozNum;
continue;
}
else
MozNum++;
M--;
E--;
Flag = 2;
}
else
{
int pNum = 0;
for(int i = E; i >= 0; --i)
{
if(Plant[i] == 'M')
break;
else
pNum++;
}
int left = 1, right = 2 * MAX, mid;
while(left < right)
{
mid = (left + right) >> 1;
if(run(P, pNum, mid) > 0)
right = mid;
else
left = mid + 1;
}
MozNum += left;
P -= pNum;
E -= pNum + 1;
Flag = 2;
}
}
if(Plant[0] == 'M')
++MozNum;
printf("Case %d: %d\n", t, MozNum);
}
return 0;
}

120
HDOJ/3641_autoAC.cpp Normal file
View File

@ -0,0 +1,120 @@
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <algorithm>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define MAXN 205
#define INF 100000000
#define eps 1e-9
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
bool tag[101];
__int64 p[101];
int cnt = 0;
void get_prime()
{
cnt = 0;
for (__int64 i = 2; i < 101; i++)
{
if (!tag[i])
p[cnt++] = i;
for (__int64 j = 0; j < cnt && p[j] * i < 101; j++)
{
tag[i*p[j]] = 1;
if (i % p[j] == 0)
break;
}
}
}
__int64 a[105];
__int64 b[105];
__int64 num[105];
__int64 tmp[105];
int main()
{
__int64 sum = 0;
__int64 i, j;
int t, n;
scanf("%d", &t);
get_prime();
while(t--)
{
memset(num, 0, sizeof(num));
__int64 high = 96000000099999999LL;
__int64 low = 0LL;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%I64d%I64d", &a[i], &b[i]);
for(j = 0; j < cnt && p[j] * p[j] <= a[i]; j++)
{
__int64 ct = 0;
if(a[i] % p[j] == 0)
{
while(a[i] % p[j] == 0)
{
ct++;
a[i] /= p[j];
}
}
num[p[j]] += ct * b[i];
}
if(a[i] > 1)
{
num[a[i]] += b[i];
}
}
__int64 ans = 0;
while(low <= high)
{
__int64 mid = (low + high) / 2;
memset(tmp, 0, sizeof(tmp));
for(i = 0; i < cnt && p[i] < 100; i++)
{
for(j = p[i]; j <= mid; j *= p[i])
{
tmp[p[i]] += mid / j;
}
}
int big = 0;
for(i = 0; p[i] < 100; i++)
{
if(num[p[i]] == 0) continue;
if(num[p[i]] > tmp[p[i]])
{
big = -1;
break;
}
}
int cn = 0;
for(i = 0; p[i] < 100; i++)
if(num[p[i]] > 0) cn++;
int nc = 0;
for(i = 0; p[i] < 100; i++)
{
if(num[p[i]] == 0) continue;
if(tmp[p[i]] >= num[p[i]]) nc++;
}
if(nc == cn) big = 1;
if(big == 0)
break;
else if(big == -1)
{
low = mid + 1;
}
else if(big == 1)
{
high = mid - 1;
}
}
printf("%I64d\n", low);
}
return 0;
}

141
HDOJ/3642_autoAC.cpp Normal file
View File

@ -0,0 +1,141 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lz 2*u,l,mid
#define rz 2*u+1,mid+1,r
const int maxn=2222;
typedef long long lld;
int flag[4*maxn];
lld sum1[4*maxn], sum2[4*maxn], sum3[4*maxn];
int X[maxn], Z[maxn];
struct Node
{
int lx, rx, y, z1, z2, s;
Node() {}
Node(int lx_, int rx_ , int y_, int zm_, int zl_, int s_)
{
lx=lx_, rx=rx_, y=y_, z1=zm_, z2=zl_, s=s_;
}
bool operator<(const Node &S) const
{
if(y==S.y) return s>S.s;
else return y<S.y;
}
} line[maxn], tmp[maxn];
void push_up(int u, int l, int r)
{
if(flag[u]>=3)
{
sum3[u]=sum2[u]=sum1[u]=X[r+1]-X[l];
}
else if(flag[u]==2)
{
sum2[u]=sum1[u]=X[r+1]-X[l];
if(l==r)sum3[u]=0;
else
sum3[u]=sum1[2*u]+sum1[2*u+1];
}
else if(flag[u]==1)
{
sum1[u]=X[r+1]-X[l];
if(l==r)sum2[u]=sum3[u]=0;
else
{
sum2[u]=sum1[2*u]+sum1[2*u+1];
sum3[u]=sum2[2*u]+sum2[2*u+1];
}
}
else
{
if(l==r)sum1[u]=sum2[u]=sum3[u]=0;
else
{
sum1[u]=sum1[2*u]+sum1[2*u+1];
sum2[u]=sum2[2*u]+sum2[2*u+1];
sum3[u]=sum3[2*u]+sum3[2*u+1];
}
}
}
void Update(int u, int l, int r, int tl, int tr, int c)
{
if(tl>tr) return ;
if(tl<=l&&r<=tr)
{
flag[u]+=c;
push_up(u,l,r);
return ;
}
int mid=(l+r)>>1;
if(tr<=mid) Update(lz,tl,tr,c);
else if(tl>mid) Update(rz,tl,tr,c);
else
{
Update(lz,tl,mid,c);
Update(rz,mid+1,tr,c);
}
push_up(u,l,r);
}
int find(int tmp, int n)
{
int l=1, r=n, mid;
while(l<=r)
{
mid=(l+r)>>1;
if(X[mid]==tmp) return mid;
else if(X[mid]<tmp) l=mid+1;
else r=mid-1;
}
}
int main()
{
int T, n, tcase=0;
cin >> T;
while(T--)
{
cin >> n ;
int num=0;
for(int i=0; i<n; i++)
{
int x1, y1, x2, y2, z1, z2;
scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
line[++num]=Node(x1,x2,y1,z1,z2,1);
X[num]=x1, Z[num]=z1;
line[++num]=Node(x1,x2,y2,z1,z2,-1);
X[num]=x2, Z[num]=z2;
}
sort(line+1,line+num+1);
sort(X+1,X+num+1);
sort(Z+1,Z+num+1);
int ep=1, m=1;
for(int i=2; i<=num; i++)
if(X[i]!=X[ep]) X[++ep]=X[i];
for(int i=2; i<=num; i++)
if(Z[i]!=Z[m]) Z[++m]=Z[i];
lld ans=0;
for(int j=1; j<m; j++)
{
memset(flag,0,sizeof(flag));
memset(sum1,0,sizeof(sum1));
memset(sum2,0,sizeof(sum2));
memset(sum3,0,sizeof(sum3));
lld tp=0, cnt=0;
for(int i=1; i<=num; i++)
{
if(line[i].z1<=Z[j]&&Z[j]<line[i].z2)
tmp[++cnt]=line[i];
}
for(int i=1; i<cnt; i++)
{
int l=find(tmp[i].lx,ep);
int r=find(tmp[i].rx,ep)-1;
Update(1,1,ep-1,l,r,tmp[i].s);
tp+=(lld)sum3[1]*(lld)(tmp[i+1].y-tmp[i].y);
}
ans+=(lld)tp*(lld)(Z[j+1]-Z[j]);
}
printf("Case %d: %I64d\n",++tcase,ans);
}
return 0;
}

137
HDOJ/3644_autoAC.cpp Normal file
View File

@ -0,0 +1,137 @@
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 100;
const double eps = 1e-3;
const int times = 5;
const double INF = 99999999;
int n;
struct point
{
double x, y, r;
} p[maxn], test[maxn];
inline int dblcmp( double x )
{
if( fabs(x) < eps )
return 0;
return x > 0 ? 1 : -1;
}
inline double sqr( double x )
{
return x*x;
}
double dis( point& aa, point& bb )
{
return sqrt(sqr(aa.x-bb.x)+sqr(aa.y-bb.y));
}
double cross( point& k, point& aa, point& bb )
{
return (k.x-aa.x)*(k.y-bb.y)-(k.y-aa.y)*(k.x-bb.x);
}
double seg_point_dis( point& l1, point& l2, point& k )
{
double a, b, c;
a = dis(l1, k);
b = dis(l2, k);
c = dis(l1, l2);
if( dblcmp(a*a+c*c-b*b) < 0 )
return a;
else if( dblcmp(b*b+c*c-a*a) < 0 )
return b;
else
return fabs(cross(k, l1, l2)/c);
}
bool point_inside( point& aa )
{
int i, cnt = 0;
double t;
for( i = 0; i < n; ++i )
{
if( (p[i].y <= aa.y && p[i+1].y > aa.y) ||
(p[i+1].y <= aa.y && p[i].y > aa.y) )
{
if( !dblcmp(p[i].y-p[i+1].y) )
{
if( dblcmp(p[i].y-aa.y) == 0 )
cnt++;
t = -INF;
}
else
t = p[i+1].x - (p[i+1].x-p[i].x)*(p[i+1].y-aa.y)/(p[i+1].y-p[i].y);
if( dblcmp( t - aa.x ) >= 0 )
cnt++;
}
}
return cnt%2;
}
void cal( point& aa )
{
double t;
aa.r = INF;
for( int i = 0; i < n; ++i )
{
t = seg_point_dis(p[i], p[i+1], aa);
aa.r = min(aa.r, t);
}
}
int main()
{
int i, j;
double R, delte, maxx, maxy, minx, miny, ang;
point temp;
bool ok;
while( scanf("%d", &n), n )
{
ok = 0;
maxx = maxy = 0;
minx = miny = INF;
for( i = 0; i < n; ++i )
{
scanf("%lf %lf", &p[i].x, &p[i].y);
maxx = max(maxx, p[i].x);
maxy = max(maxy, p[i].y);
minx = min(minx, p[i].x);
miny = min(miny, p[i].y);
}
p[n] = p[0];
for( i = 0; i < n; ++i )
{
test[i].x = (p[i].x+p[i+1].x)/2;
test[i].y = (p[i].y+p[i+1].y)/2;
test[i].r = 0;
}
scanf("%lf", &R);
maxx -= minx; maxy -= miny;
delte = sqrt(maxx*maxx+maxy*maxy)/2;
while( !ok && delte > eps )
{
for( i = 0; !ok && i < n; ++i )
{
for( j = 0; !ok && j < times; ++j )
{
ang = rand();
temp.x = test[i].x + delte*cos(ang);
temp.y = test[i].y + delte*sin(ang);
if( point_inside(temp) )
{
cal(temp);
if( temp.r > test[i].r )
{
test[i] = temp;
if( dblcmp(temp.r-R) >= 0 )
ok = 1;
}
}
}
}
delte *= 0.90;
}
if( ok )
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

122
HDOJ/3645_autoAC.cpp Normal file
View File

@ -0,0 +1,122 @@
#include <cstdio>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
using namespace std;
typedef vector<int> vi;
map<string, int> pos;
map<int, int> line;
const char *resetTime = "[0000/00/00 00:00:00]";
int ttEvent, ttLine;
struct Line{
char timeMark[30];
int line;
int id;
}lineInform[50001];
struct Author{
char name[35];
int pri;
char syncTime[30];
vi modify;
}author[10001];
struct Event{
char timeMark[30];
int op;
int id;
}event[50001];
bool cmpEvent(const Event a, const Event b){
return strcmp(a.timeMark, b.timeMark) < 0;
}
bool cmpLine(const Line a, const Line b){
return a.line < b.line;
}
void pre(int n){
int k;
char tm1[30], tm2[15], op[10];
ttEvent = ttLine = 0;
pos.clear();
line.clear();
for (int i = 0; i < n; i++){
scanf("%s%d%d", author[i].name, &author[i].pri, &k);
pos[author[i].name] = i;
author[i].modify.clear();
while (k--){
scanf("%s%s%s", tm1, tm2, op);
strcat(tm1, " ");
strcat(tm1, tm2);
strcpy(event[ttEvent].timeMark, tm1);
if (!strcmp(op, "SYNC")){
event[ttEvent].op = -1;
}
else if (!strcmp(op, "SUBMIT")){
event[ttEvent].op = -2;
}
else{
assert(!strcmp(op, "MODIFY"));
scanf("%d", &event[ttEvent].op);
if (!line.count(event[ttEvent].op)){
line[event[ttEvent].op] = ttLine;
strcpy(lineInform[ttLine].timeMark, resetTime);
lineInform[ttLine++].line = event[ttEvent].op;
}
}
event[ttEvent++].id = i;
}
}
sort(event, event + ttEvent, cmpEvent);
}
void run(){
for (int i = 0; i < ttEvent; i++){
switch (event[i].op){
case -2:
{
int id = event[i].id;
int pri = author[id].pri;
for (vi::iterator ii = author[id].modify.begin(); ii != author[id].modify.end(); ii++){
int linePos = line[*ii];
int lineID = lineInform[linePos].id;
//printf("cmp %s %s\n", lineInform[linePos].timeMark, author[id].syncTime);
if (strcmp(lineInform[linePos].timeMark, author[id].syncTime) < 0){
strcpy(lineInform[linePos].timeMark, event[i].timeMark);
lineInform[linePos].id = id;
}
else if (author[lineID].pri < pri){
strcpy(lineInform[linePos].timeMark, event[i].timeMark);
lineInform[linePos].id = id;
}
}
strcpy(author[id].syncTime, event[i].timeMark);
author[id].modify.clear();
}
break;
case -1:
{
strcpy(author[event[i].id].syncTime, event[i].timeMark);
author[event[i].id].modify.clear();
}break;
default:
{
author[event[i].id].modify.push_back(event[i].op);
}
}
}
sort(lineInform, lineInform + ttLine, cmpLine);
}
void print(){
for (int i = 0; i < ttLine; i++){
if (strcmp(lineInform[i].timeMark, resetTime)) printf("%d %s BY %s\n", lineInform[i].line, lineInform[i].timeMark, author[lineInform[i].id].name);
}
puts("END");
}
int main(){
int n;
while (~scanf("%d", &n) && n){
pre(n);
run();
print();
}
return 0;
}

83
HDOJ/3646_autoAC.cpp Normal file
View File

@ -0,0 +1,83 @@
#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <vector>
#include <cstring>
#include <algorithm>
#define INF 0x7ffffffffffLL
#define N 10010
#define M 100010
#define LL long long
#define mod 95041567
using namespace std;
struct node{
int index;
int val;
};
int n, m, k, MAX;
int fb[N], life[M];
node dp[N][110];
node cal(int x, int y, bool f){
node v = dp[x - 1][y];
int z = fb[x];
if(f) v = dp[x - 1][y - 1], z *= 2;
bool flag = 0;
while(v.index <= k){
if(v.val > z){
if(!flag) v.val -= z;
return v;
}
else{
if(v.index) flag = 1;
z -= v.val;
v.val = life[++v.index];
if(v.index > 1 && z == 0) return v;
}
}
return v;
}
int main()
{
while(scanf("%d %d %d", &n, &m, &k) != EOF){
if(n + m + k ==0) break;
for(int i = 1; i <= n; ++i)
scanf("%d", &fb[i]);
for(int i = 1; i <= k; ++i)
scanf("%d", &life[i]);
if(!k){
printf("0\n");
continue;
}
MAX = 0;
dp[0][0].index = 0, dp[0][0].val = 0;
for(int i = 1; i <= n; ++i){
int p = min(i, m);
for(int j = 0; j <= p; ++j){
node x = cal(i, j, 0);
if(!j){
dp[i][j] = x;
MAX = max(MAX, dp[i][j].index - 1);
continue;
}
node y = cal(i, j, 1);
if(j == i){
dp[i][j] = y;
MAX = max(MAX, dp[i][j].index - 1);
continue;
}
if(x.index > y.index) dp[i][j] = x;
else if(x.index < y.index) dp[i][j] = y;
else if(x.val > y.val) dp[i][j] = y;
else dp[i][j] = x;
MAX = max(MAX, dp[i][j].index - 1);
}
if(p <= m) dp[i][p + 1] = dp[i][p];
}
printf("%d\n", MAX);
}
return 0;
}

96
HDOJ/3648_autoAC.cpp Normal file
View File

@ -0,0 +1,96 @@
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int rr, c[1111111];
int lowbit(int x)
{
return x & (-x);
}
void add(int i, int val)
{
while(i <= rr){
c[i] += val;
i += lowbit(i);
}
}
int sum(int i)
{
int s = 0;
while(i > 0){
s += c[i];
i -= lowbit(i);
}
return s;
}
int mat[555][555];
int ans[555][555];
int mm;
int Bin()
{
int l = 1, r = rr;
while(l < r){
int m = (l + r) >> 1;
if(sum(m) >= mm) r = m;
else l = m + 1;
}
return l - 1;
}
int main()
{
int n, r;
while(scanf("%d %d", &n, &r) == 2){
if(!n && !r) {
break;
}
r = (r << 1) + 1;
mm = (r * r + 1) >> 1;
rr = -1;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
scanf("%d", &mat[i][j]);
rr = max(rr, mat[i][j] + 1);
}
memset(c, 0, sizeof(c));
for(int i = 0; i < r; i++){
for(int j = 0; j < r - 1; j++){
add(mat[i][j] + 1, 1);
}
}
for(int i = 0; ; ){
for(int j = r - 1; j < n; j++){
for(int k = 0; k < r; k++)
add(mat[i + k][j] + 1, 1);
ans[i][j - (r - 1)] = Bin();
for(int k = 0; k < r; k++)
add(mat[i + k][j - (r - 1)] + 1, -1);
}
for(int j = n - 1; j >= n - (r - 1); j--)
add(mat[i][j] + 1, -1);
i++;
if(i + (r - 1) >= n) break;
for(int j = n - 1; j >= n - (r - 1); j--)
add(mat[i + (r - 1)][j] + 1, 1);
for(int j = n - r; j >= 0; j--){
for(int k = 0; k < r; k++)
add(mat[i + k][j] + 1, 1);
ans[i][j] = Bin();
for(int k = 0; k < r; k++)
add(mat[i + k][j + (r - 1)] + 1, -1);
}
for(int j = 0; j < (r - 1); j++)
add(mat[i][j] + 1, -1);
i++;
if(i + (r - 1) >= n) break;
for(int j = 0; j < (r - 1); j++)
add(mat[i + (r - 1)][j] + 1, 1);
}
for(int i = 0; i <= n - r; i++){
for(int j = 0; j <= n - r; j++){
printf("%d ", ans[i][j]);
}
printf("\n");
}
}
return 0;
}

24
HDOJ/3649_autoAC.cpp Normal file
View File

@ -0,0 +1,24 @@
#include <iostream>
#include <cstdio>
using namespace std;
int red[10],black[10],first;
int solve(){
if(black[1]-red[1]==1) return first;
if(red[4]-1>10-black[4]) return 0;
if(red[4]-1<10-black[4]) return 1;
int sg=0;
sg^=(black[2]-red[2]-1);
sg^=(black[3]-red[3]-1);
sg^=(black[1]-red[1])%2;
if(sg) return first;
else return first^1;
}
int main(){
while(scanf("%d",&first)!=EOF){
for(int i=1;i<=4;i++) scanf("%d",&red[i]);
for(int i=1;i<=4;i++) scanf("%d",&black[i]);
if ( !solve() ) printf("Red\n");
else printf("Black\n");
}
return 0;
}

35
HDOJ/3650_autoAC.cpp Normal file
View File

@ -0,0 +1,35 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 86444
using namespace std;
int s[N],e[N],n;
inline void read()
{
memset(s,0,sizeof s);
memset(e,0,sizeof e);
for(int i=1,a,b;i<=n;i++)
{
scanf("%d%d",&a,&b);
if(a>b) swap(a,b);
s[a]++; e[b]++;
}
}
inline void go()
{
int ans=0,res=0;
for(int i=0;i<=86400;i++)
{
res+=s[i];
ans=max(ans,res);
res-=e[i];
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%d",&n),n) read(),go();
return 0;
}

32
HDOJ/3651_autoAC.cpp Normal file
View File

@ -0,0 +1,32 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
const int inf=1e9;
string st;
int dp[110][15][15];
int DP(int len,int x,int y){
if(len==0) return 0;
if(dp[len][x][y]!=-1) return dp[len][x][y];
int ans=inf,pos=st[st.length()-len]-'0';
if(pos==0) pos=10;
for(int i=0;i<pos;i++){
int tmp=DP(len-1,i,pos)+max(abs(i-x),abs(y-pos)+1 );
if(tmp<ans) ans=tmp;
}
for(int i=pos+1;i<=10;i++){
int tmp=DP(len-1,pos,i)+ max(abs(i-y),abs(x-pos)+1 );
if(tmp<ans) ans=tmp;
}
return dp[len][x][y]=ans;
}
int main(){
while(cin>>st){
memset(dp,-1,sizeof(dp));
cout<<DP(st.length(),5,6)<<endl;
}
return 0;
}

48
HDOJ/3652_autoAC.cpp Normal file
View File

@ -0,0 +1,48 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int bit[15];
int dp[15][15][3];
int dfs(int pos,int mod,int have,int lim)
{
int num,i,ans,mod_x,have_x;
if(pos<=0)
return mod == 0 && have == 2;
if(!lim && dp[pos][mod][have] != -1)
return dp[pos][mod][have];
num = lim?bit[pos]:9;
ans = 0;
for(i = 0; i<=num; i++)
{
mod_x = (mod*10+i)%13;
have_x = have;
if(have == 0 && i == 1)
have_x = 1;
if(have == 1 && i != 1)
have_x = 0;
if(have == 1 && i == 3)
have_x = 2;
ans+=dfs(pos-1,mod_x,have_x,lim&&i==num);
}
if(!lim)
dp[pos][mod][have] = ans;
return ans;
}
int main()
{
int n,len;
while(~scanf("%d",&n))
{
memset(bit,0,sizeof(bit));
memset(dp,-1,sizeof(dp));
len = 0;
while(n)
{
bit[++len] = n%10;
n/=10;
}
printf("%d\n",dfs(len,0,0,1));
}
return 0;
}

120
HDOJ/3654_autoAC.cpp Normal file
View File

@ -0,0 +1,120 @@
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define LL __int64
const int N = 1e9;
using namespace std;
int r, d[10005], n[40], pr[10005], qpr[10005], tq;
void Pr()
{
int i, j;
memset( pr, 1, sizeof(pr) );
pr[1] = 0;
for( i = 2; i <= 10000; i ++ )
if( pr[i] )
{
j = i+i;
while( j <= 10000 )
{
pr[j] = 0;
j += i;
}
qpr[tq++] = i;
}
}
int Gcd( int a, int b )
{
if( !b )
return a;
else
return Gcd( b, a%b );
}
void Op()
{
memset( d, 0, sizeof(d) );
int t, i, j, tt;
for( j = 0; j < r; j ++ )
{
t = n[j];
for( i = 0; i < tq && t > 1; i ++ )
if( !( t % qpr[i] ) )
{
tt = 1;
t/=qpr[i];
while( !( t%qpr[i] ) )
{
tt ++;
t/=qpr[i];
}
d[ qpr[i] ] = d[ qpr[i] ] > tt ? d[ qpr[i] ] : tt;
}
}
}
int main()
{
int i, j, k, ti, qu[10004], top, na, mu[30];
LL qa[30], t, ans;
Pr();
while( ~scanf( "%d", &r ) )
{
for( i = 0; i < r; i ++ )
{
scanf( "%d%d", n+i, &k );
k = Gcd( n[i], k );
n[i] /= k;
}
Op();
ans = 1;
top = 0;
for( i = 0; i < tq; i ++ )
if( d[ qpr[i] ] > 0)
{
ans *= d[ qpr[i] ]+1;
qu[ top++ ] = qpr[i];
}
if( top > 0 && qu[0] == 2 )
na = 2;
else
na = 1;
printf( "%I64d\n", ans-na );
ans = ans < 16+na ? ans : 16+na;
qa[0] = 1;
mu[0] = 0;
for( k = 1; k < ans; k ++ )
{
t = N*(LL)N;
for( i = 0; i < k; i ++ )
if( mu[i] < top && qu[ mu[i] ] * qa[i] < t )
t = qu[ mu[i] ]*qa[i];
qa[k] = t;
mu[k] = -1;
for( j = 0; j <= k; j ++ )
if( mu[j] < 0 || ( mu[j] < top && qu[ mu[j] ] * qa[j] == qa[k] ) )
{
for( i = mu[j]+1; i < top; i ++ )
{
ti = 0;
t = qa[j];
while( !( t % qu[i] ) )
{
ti ++;
t /= qu[i];
}
if( ti < d[ qu[i] ] )
break;
}
mu[j] = i;
}
}
if( na < ans )
{
printf( "%I64d", qa[na] );
na ++;
for( j = 1; na < ans && j < 16; na ++, j ++ )
printf( " %I64d", qa[na] );
printf( "\n" );
}
}
return 0;
}

99
HDOJ/3655_autoAC.cpp Normal file
View File

@ -0,0 +1,99 @@
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define N 3010
#define M 200010
#define inf 200000000
typedef long long ll;
using namespace std;
int n,m;
int head[N],cnt;
int dp[4][N];
bool vis[N];
vector<int>vv;
struct Edge{
int v,c,ne;
}edge[M*2];
void addedge(int u,int v,int w){
edge[cnt].v=v;
edge[cnt].c=w;
edge[cnt].ne=head[u];
head[u]=cnt++;
edge[cnt].v=u;
edge[cnt].c=w;
edge[cnt].ne=head[v];
head[v]=cnt++;
}
void init(){
memset(head,-1,sizeof(head));
cnt=0;
}
void SPFA(int u){
queue<int>q;
int i;
for(i=1;i<=n;i++){
dp[u][i]=inf;
vis[i]=0;
}
q.push(u);
dp[u][u]=0;
vis[u]=1;
while(!q.empty()){
int v=q.front();
q.pop();
for(int i=head[v];i!=-1;i=edge[i].ne){
int vv=edge[i].v;
if(dp[u][v]+edge[i].c<dp[u][vv]){
dp[u][vv]=dp[u][v]+edge[i].c;
if(!vis[vv]){
vis[vv]=1;
q.push(vv);
}
}
}
vis[v]=0;
}
}
int main(){
int i,j,u,v,w;
while(scanf("%d %d",&n,&m)==2){
init();
for(i=1;i<=m;i++){
scanf("%d %d %d",&u,&v,&w);
addedge(u,v,w);
}
for(i=1;i<=3;i++)
SPFA(i);
vv.clear();
for(i=1;i<=n;i++){
int flag=1;
for(j=head[i];j!=-1;j=edge[j].ne){
int num=0;
if(dp[1][edge[j].v]+edge[j].c==dp[1][i])num++;
if(dp[2][edge[j].v]+edge[j].c==dp[2][i])num++;
if(dp[3][edge[j].v]+edge[j].c==dp[3][i])num++;
if(num>1){
flag=0;
break;
}
}
if(flag && dp[1][i]!=inf && dp[2][i]!=inf && dp[3][i]!=inf)
vv.push_back(i);
}
int len=vv.size();
if(len){
printf("%d\n",len);
for(i=0;i<len;i++){
if(!i)
printf("%d",vv[i]);
else
printf(" %d",vv[i]);
}
printf("\n");
}
else
printf("impossible\n");
}
return 0;
}

168
HDOJ/3656_autoAC.cpp Normal file
View File

@ -0,0 +1,168 @@
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int oo=0x3f3f3f3f;
const int MAX=120;
const int head=0;
int up[MAX*MAX],down[MAX*MAX],left[MAX*MAX],right[MAX*MAX];
int cnt[MAX],h[MAX],col[MAX*MAX];
int K,ans;
int nc;
void remove(const int& c){
for(int i=down[c];i!=c;i=down[i]){
left[right[i]]=left[i];
right[left[i]]=right[i];
cnt[col[i]]--;
}
}
void resume(const int& c){
for(int i=up[c];i!=c;i=up[i]){
left[right[i]]=i;
right[left[i]]=i;
cnt[col[i]]++;
}
}
int evalute(){
bool vis[MAX]={0};
int ret=0;
for(int i=right[head];i!=head;i=right[i]){
if(!vis[i]){
ret++;
vis[i]=true;
for(int j=down[i];j!=i;j=down[j]){
for(int k=right[j];k!=j;k=right[k]){
vis[col[k]]=true;
}
}
}
}
return ret;
}
bool dfs(const int& k){
if(k+evalute()>ans){
return false;
}
if(right[head]==head){
return true;
}
int s=oo,c=0;
for(int i=right[head];i!=head;i=right[i]){
if(cnt[i]<s){
s=cnt[i];
c=i;
if(cnt[i]<=1){
break;
}
}
}
for(int i=down[c];i!=c;i=down[i]){
remove(i);
for(int j=right[i];j!=i;j=right[j]){
remove(j);
}
if(dfs(k+1)){
return true;
}
for(int j=left[i];j!=i;j=left[j]){
resume(j);
}
resume(i);
}
return false;
}
void init(){
for(int i=0;i<=nc;i++){
h[i]=-1;
left[i]=i-1;
right[i]=i+1;
up[i]=down[i]=i;
cnt[i]=0;
col[i]=i;
}
left[head]=nc;
right[nc]=head;
K=nc;
for(int i=1;i<=nc;i++){
h[i]=-1;
}
}
void add(const int& r,const int& c){
K++;
col[K]=c;
up[K]=c;
down[K]=down[c];
if(h[r]==-1){
h[r]=right[K]=K;
}
left[K]=h[r];
right[K]=right[h[r]];
left[right[K]]=K;
right[left[K]]=K;
up[down[K]]=K;
down[up[K]]=K;
}
struct Node{
int x,y;
}city[MAX];
int dis[MAX][MAX];
int que[MAX*MAX],top;
int sqr(int x){
return x*x;
}
int operator*(const Node& a,const Node& b){
return sqr(a.x-b.x)+sqr(a.y-b.y);
}
void build(const int& mid){
init();
for(int i=1;i<=nc;i++){
for(int j=1;j<=nc;j++){
if(dis[i][j]<=mid){
add(i,j);
}
}
}
}
void run(){
int l=0,r=top;
int mid,ans;
while(l<=r){
mid=(l+r)/2;
build(que[mid]);
if(dfs(0)){
ans=que[mid];
r=mid-1;
}else{
l=mid+1;
}
}
printf("%.6f\n",sqrt((double)ans));
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&nc,&ans);
for(int i=1;i<=nc;i++){
scanf("%d%d",&city[i].x,&city[i].y);
}
top=0;
for(int i=1;i<=nc;i++){
for(int j=1;j<=nc;j++){
que[top++]=dis[i][j]=city[i]*city[j];
}
}
int tmp=top;
sort(que,que+top);
top=1;
for(int i=1;i<tmp;i++){
if(que[i]!=que[i-1]){
que[top++]=que[i];
}
}
run();
}
return 0;
}

102
HDOJ/3657_autoAC.cpp Normal file
View File

@ -0,0 +1,102 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 55
#define MAXM 55*55
#define inf 1<<30
using namespace std;
struct Edge{
int v,cap,next;
}edge[MAXM*11];
int map[MAXN][MAXN];
int head[MAXM];
int pre[MAXM];
int cur[MAXM];
int level[MAXM];
int gap[MAXM];
int vs,vt,NV,n,m,k,NE;
bool mark[MAXN][MAXN];
int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
void Insert(int u,int v,int cap,int cc=0){
edge[NE].cap=cap;edge[NE].v=v;
edge[NE].next=head[u];head[u]=NE++;
edge[NE].cap=cc;edge[NE].v=u;
edge[NE].next=head[v];head[v]=NE++;
}
int SAP(int vs,int vt){
memset(level,0,sizeof(level));
memset(pre,-1,sizeof(pre));
memset(gap,0,sizeof(gap));
for(int i=0;i<=NV;i++)cur[i]=head[i];
int u=pre[vs]=vs;
int maxflow=0,aug=-1;
gap[0]=NV;
while(level[vs]<NV){
loop :
for(int &i=cur[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(edge[i].cap&&level[u]==level[v]+1){
aug==-1?(aug=edge[i].cap):(aug=min(aug,edge[i].cap));
pre[v]=u;
u=v;
if(v==vt){
maxflow+=aug;
for(u=pre[v];v!=vs;v=u,u=pre[u]){
edge[cur[u]].cap-=aug;
edge[cur[u]^1].cap+=aug;
}
aug=-1;
}
goto loop;
}
}
int minlevel=NV;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(edge[i].cap&&minlevel>level[v]){
cur[u]=i;
minlevel=level[v];
}
}
if((--gap[level[u]])==0)break;
level[u]=minlevel+1;
gap[level[u]]++;
u=pre[u];
}
return maxflow;
}
int main(){
int u,v,sum;
while(~scanf("%d%d%d",&n,&m,&k)){
vs=0,vt=n*m+1,NV=vt+1,sum=0,NE=0;
memset(mark,false,sizeof(mark));
memset(head,-1,sizeof(head));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&map[i][j]);
sum+=map[i][j];
}
}
for(int i=1;i<=k;i++){
scanf("%d%d",&u,&v);
mark[u][v]=true;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if((i+j)%2==1){
mark[i][j]?Insert(vs,(i-1)*m+j,inf):Insert(vs,(i-1)*m+j,map[i][j]);
for(int l=0;l<4;l++){
int xx=i+dir[l][0],yy=j+dir[l][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m){
Insert((i-1)*m+j,(xx-1)*m+yy,(map[i][j]&map[xx][yy])*2);
}
}
}else{
mark[i][j]?Insert((i-1)*m+j,vt,inf):Insert((i-1)*m+j,vt,map[i][j]);
}
}
}
printf("%d\n",sum-SAP(vs,vt));
}
return 0;
}

86
HDOJ/3658_autoAC.cpp Normal file
View File

@ -0,0 +1,86 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
#define LL __int64
const int mod=1000000007;
struct matrix{
LL f[52][52];
};
matrix mul(matrix a,matrix b)
{
int i,j,k;
matrix c;
memset(c.f,0,sizeof(c.f));
for(i=0;i<52;i++)
{
for(j=0;j<52;j++)
{
for(k=0;k<52;k++)
{
c.f[i][j]+=a.f[i][k]*b.f[k][j]%mod;
}
c.f[i][j]%=mod;
}
}
return c;
}
matrix pow_mod(matrix a,int b)
{
matrix s;
int i,j;
memset(s.f,0,sizeof(s.f));
for(i=0;i<52;i++)
s.f[i][i]=1;
while(b)
{
if(b&1)
s=mul(s,a);
a=mul(a,a);
b=b>>1;
}
return s;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int i,j,k,n,a[100];
scanf("%d",&n);
for(i=0;i<26;i++)
{
a[i]=i;
a[i+26]=32+i;
}
matrix e,ee;
memset(e.f,0,sizeof(e.f));
memset(ee.f,0,sizeof(ee.f));
for(j=0;j<52;j++)
{
for(i=0;i<52;i++)
{
if(abs(a[j]-a[i])<32)e.f[i][j]=1;
if(abs(a[j]-a[i])<=32)ee.f[i][j]=1;
}
}
e=pow_mod(e,n-1);
ee=pow_mod(ee,n-1);
LL ans=0;
for(i=0;i<52;i++)
{
for(j=0;j<52;j++)
{
ans+=ee.f[i][j]-e.f[i][j];
}
}
printf("%I64d\n",(ans%mod+mod)%mod);
}
}

120
HDOJ/3659_autoAC.cpp Normal file
View File

@ -0,0 +1,120 @@
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
using namespace std;
#define maxn 15000
struct point{
double x,y;
bool operator == (const point &a) const{
return a.x==x && a.y==y;
}
}temp;
struct line{
point a,b;
}po[maxn];
int n;
bool cmp(const line &a,const line &b){
return a.a.x < b.a.x;
}
int function6(int l,int r){
int i,k,j;
for(i=l;i<=r;i++){
for(j=l;j<=r;j++){
if(i==j) continue;
if(po[i].a==po[j].a || po[i].a==po[j].b) break;
}
if(j==r+1){ printf("6");return 0;}
for(j=l;j<=r;j++){
if(i==j) continue;
if(po[i].b==po[j].a || po[i].b==po[j].b) break;
}
if(j==r+1){ printf("6");return 0;}
}
printf("0");
return 0;
}
int function5(int l,int r){
int i,j,k,count,t;
line rec[10],tem;
bool flag[10];
memset(flag,false,sizeof(flag));
t=0;
for(i=l;i<=r;i++){
count=0;
for(j=l;j<=r;j++){
if(i==j)continue;
if(po[i].a==po[j].a || po[i].a==po[j].b)
count++;
}
if(count==0){ rec[t]=po[i];flag[t++]=false;}
if(count>=2){ printf("3"); return 0;}
count=0;
for(j=l;j<=r;j++){
if(i==j)continue;
if(po[i].b==po[j].a || po[i].b==po[j].b)
count++;
}
if(count>=2){ printf("3"); return 0;}
if(count==0){ rec[t]=po[i];flag[t++]=true;}
}
if(MIN(rec[0].a.y,rec[0].b.y) < MIN(rec[1].a.y,rec[1].b.y)){
if(flag[0]){printf("2");return 0;}
else {printf("5");return 0;}
}
else if(MIN(rec[0].a.y,rec[0].b.y) == MIN(rec[1].a.y,rec[1].b.y)){
if(rec[0].a.x > rec[1].b.x){
if(flag[0]){printf("2");return 0;}
else {printf("5");return 0;}
}
else {
if(flag[1]){printf("2");return 0;}
else {printf("5");return 0;}
}
}
else{
if(flag[1]){printf("2");return 0;}
else {printf("5");return 0;}
}
return 0;
}
int main(){
int i,j,k,l,r;
double Max;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%lf%lf%lf%lf",&po[i].a.x,&po[i].a.y,&po[i].b.x,&po[i].b.y);
if(po[i].a.x > po[i].b.x)
temp=po[i].a,po[i].a=po[i].b,po[i].b=temp;
else if(po[i].a.x == po[i].b.x && po[i].a.y > po[i].b.y)
temp=po[i].a,po[i].a=po[i].b,po[i].b=temp;
}
sort(po,po+n,cmp);
l=0,r=0;
Max=po[0].b.x;
for(i=1;i<n;i++){
if(po[i].a.x-Max > 5.0 || i==n-1){
if(i!=n-1)
r=i-1;
else
r=i;
switch(r-l+1){
case 2:printf("1");break;
case 4:printf("4");break;
case 3:printf("7");break;
case 7:printf("8");break;
case 6:function6(l,r);break;
case 5:function5(l,r);break;
default:while(1);
}
l=i;
Max=po[i].b.x;
}
Max=MAX(Max,po[i].b.x);
}
printf("\n");
}
return 0;
}

33
HDOJ/3661_autoAC.cpp Normal file
View File

@ -0,0 +1,33 @@
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAXN=1001;
int a[MAXN];
int b[MAXN];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,t;
int sum;
while(scanf("%d%d",&n,&t)!=EOF)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
scanf("%d",&b[i]);
sort(a,a+n);
sort(b,b+n,cmp);
sum=0;
for(i=0;i<n;i++)
{
if(a[i]+b[i]-t>0)
sum+=a[i]+b[i]-t;
}
printf("%d\n",sum);
}
return 0;
}

249
HDOJ/3662_autoAC.cpp Normal file
View File

@ -0,0 +1,249 @@
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
const int MAXN=550;
const double eps=1e-8;
struct Point
{
double x,y,z;
Point(){}
Point(double xx,double yy,double zz):x(xx),y(yy),z(zz){}
Point operator -(const Point p1)
{
return Point(x-p1.x,y-p1.y,z-p1.z);
}
Point operator +(const Point p1)
{
return Point(x+p1.x,y+p1.y,z+p1.z);
}
Point operator *(const Point p)
{
return Point(y*p.z-z*p.y,z*p.x-x*p.z,x*p.y-y*p.x);
}
Point operator *(double d)
{
return Point(x*d,y*d,z*d);
}
Point operator / (double d)
{
return Point(x/d,y/d,z/d);
}
double operator ^(Point p)
{
return (x*p.x+y*p.y+z*p.z);
}
};
struct CH3D
{
struct face
{
int a,b,c;
bool ok;
};
int n;
Point P[MAXN];
int num;
face F[8*MAXN];
int g[MAXN][MAXN];
double vlen(Point a)
{
return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);
}
Point cross(const Point &a,const Point &b,const Point &c)
{
return Point((b.y-a.y)*(c.z-a.z)-(b.z-a.z)*(c.y-a.y),
(b.z-a.z)*(c.x-a.x)-(b.x-a.x)*(c.z-a.z),
(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)
);
}
double area(Point a,Point b,Point c)
{
return vlen((b-a)*(c-a));
}
double volume(Point a,Point b,Point c,Point d)
{
return (b-a)*(c-a)^(d-a);
}
double dblcmp(Point &p,face &f)
{
Point m=P[f.b]-P[f.a];
Point n=P[f.c]-P[f.a];
Point t=p-P[f.a];
return (m*n)^t;
}
void deal(int p,int a,int b)
{
int f=g[a][b];
face add;
if(F[f].ok)
{
if(dblcmp(P[p],F[f])>eps)
dfs(p,f);
else
{
add.a=b;
add.b=a;
add.c=p;
add.ok=true;
g[p][b]=g[a][p]=g[b][a]=num;
F[num++]=add;
}
}
}
void dfs(int p,int now)
{
F[now].ok=0;
deal(p,F[now].b,F[now].a);
deal(p,F[now].c,F[now].b);
deal(p,F[now].a,F[now].c);
}
bool same(int s,int t)
{
Point &a=P[F[s].a];
Point &b=P[F[s].b];
Point &c=P[F[s].c];
return fabs(volume(a,b,c,P[F[t].a]))<eps &&
fabs(volume(a,b,c,P[F[t].b]))<eps &&
fabs(volume(a,b,c,P[F[t].c]))<eps;
}
void create()
{
int i,j,tmp;
face add;
num=0;
if(n<4)return;
bool flag=true;
for(i=1;i<n;i++)
{
if(vlen(P[0]-P[i])>eps)
{
swap(P[1],P[i]);
flag=false;
break;
}
}
if(flag)return;
flag=true;
for(i=2;i<n;i++)
{
if(vlen((P[0]-P[1])*(P[1]-P[i]))>eps)
{
swap(P[2],P[i]);
flag=false;
break;
}
}
if(flag)return;
flag=true;
for(int i=3;i<n;i++)
{
if(fabs((P[0]-P[1])*(P[1]-P[2])^(P[0]-P[i]))>eps)
{
swap(P[3],P[i]);
flag=false;
break;
}
}
if(flag)return;
for(i=0;i<4;i++)
{
add.a=(i+1)%4;
add.b=(i+2)%4;
add.c=(i+3)%4;
add.ok=true;
if(dblcmp(P[i],add)>0)swap(add.b,add.c);
g[add.a][add.b]=g[add.b][add.c]=g[add.c][add.a]=num;
F[num++]=add;
}
for(i=4;i<n;i++)
{
for(j=0;j<num;j++)
{
if(F[j].ok&&dblcmp(P[i],F[j])>eps)
{
dfs(i,j);
break;
}
}
}
tmp=num;
for(i=num=0;i<tmp;i++)
if(F[i].ok)
F[num++]=F[i];
}
double area()
{
double res=0;
if(n==3)
{
Point p=cross(P[0],P[1],P[2]);
res=vlen(p)/2.0;
return res;
}
for(int i=0;i<num;i++)
res+=area(P[F[i].a],P[F[i].b],P[F[i].c]);
return res/2.0;
}
double volume()
{
double res=0;
Point tmp(0,0,0);
for(int i=0;i<num;i++)
res+=volume(tmp,P[F[i].a],P[F[i].b],P[F[i].c]);
return fabs(res/6.0);
}
int triangle()
{
return num;
}
int polygon()
{
int i,j,res,flag;
for(i=res=0;i<num;i++)
{
flag=1;
for(j=0;j<i;j++)
if(same(i,j))
{
flag=0;
break;
}
res+=flag;
}
return res;
}
Point barycenter()
{
Point ans(0,0,0),o(0,0,0);
double all=0;
for(int i=0;i<num;i++)
{
double vol=volume(o,P[F[i].a],P[F[i].b],P[F[i].c]);
ans=ans+(o+P[F[i].a]+P[F[i].b]+P[F[i].c])/4.0*vol;
all+=vol;
}
ans=ans/all;
return ans;
}
double ptoface(Point p,int i)
{
return fabs(volume(P[F[i].a],P[F[i].b],P[F[i].c],p)/vlen((P[F[i].b]-P[F[i].a])*(P[F[i].c]-P[F[i].a])));
}
};
CH3D hull;
int main()
{
while(scanf("%d",&hull.n)==1)
{
for(int i=0;i<hull.n;i++)
{
scanf("%lf%lf%lf",&hull.P[i].x,&hull.P[i].y,&hull.P[i].z);
}
hull.create();
printf("%d\n",hull.polygon());
}
return 0;
}

178
HDOJ/3663_autoAC.cpp Normal file
View File

@ -0,0 +1,178 @@
#include <iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
const int N = 61;
const int M = N * 15 * 6 * N + 10;
int n,m,D;
int s[M],h[M],u[M],d[M],l[M],r[M],col[M],row[M],ans[M],aans[N][3];
int num;
bool flag[N][N];
map<int,int>lcm;
bool vis[N];
bool ok;
int idx[6][6] = {
{0,0,0,0,0,0},
{0,1,0,0,0,0},
{0,2,6,0,0,0},
{0,3,7,10,0,0},
{0,4,8,11,13,0},
{0,5,9,12,14,15},
};
void init()
{
int i,c;
memset(h,0,sizeof(h));
memset(s,0,sizeof(s));
memset(vis,false,sizeof(vis));
memset(flag,false,sizeof(flag));
c = D * n;
for(i = 0;i <= c;i ++)
{
u[i] = d[i] = i;
l[i] = (i + c) % (c + 1);
r[i] = (i + 1) % (c + 1);
}
num = c + 1;
lcm.clear();
lcm[1] = 11;
lcm[2] = 12;lcm[6] = 22;
lcm[3] = 13;lcm[7] = 23;lcm[10] = 33;
lcm[4] = 14;lcm[8] = 24;lcm[11] = 34;lcm[13] = 44;
lcm[5] = 15;lcm[9] = 25;lcm[12] = 35;lcm[14] = 45;lcm[15] = 55;
}
void insert(int i,int j)
{
if(h[i])
{
r[num] = h[i];
l[num] = l[h[i]];
l[r[num]] = num;
r[l[num]] = num;
}
else
h[i] = l[num] = r[num] = num;
s[j] ++;
u[num] = u[j];
d[num] = j;
d[u[j]] = num;
u[j] = num;
col[num] = j;
row[num] = i;
num ++;
}
void remove(int x)
{
int i,j;
l[r[x]] = l[x];
r[l[x]] = r[x];
for(i = d[x];i != x;i = d[i])
for(j = r[i];j != i;j = r[j])
{
u[d[j]] = u[j];
d[u[j]] = d[j];
s[col[j]] --;
}
}
void resume(int x)
{
int i,j;
for(i = u[x];i != x;i = u[i])
for(j = l[i];j != i;j = l[j])
{
s[col[j]] ++;
u[d[j]] = d[u[j]] = j;
}
l[r[x]] = r[l[x]] = x;
}
void dfs(int k)
{
if(ok)
return;
int i,j;
if(!r[0])
{
ok = true;
memset(aans,0,sizeof(aans));
for(i = 0;i < k;i ++)
{
int ii = (ans[i] - 1)/15 + 1;
int jj = ans[i] - (ii - 1) * 15;
aans[ii][0] = lcm[jj]/10;
aans[ii][1] = lcm[jj]%10;
}
for(i = 1;i <= n;i ++)
printf("%d %d\n",aans[i][0],aans[i][1]);
return;
}
int mx = M;
int c;
for(i = r[0];i;i = r[i])
{
if(s[i] < mx)
{
mx = s[i];
c = i;
}
}
remove(c);
int tmp;
for(i = d[c];i != c;i = d[i])
{
tmp = (row[i] - 1)/15 + 1;
if(vis[tmp] == true)
continue;
vis[tmp] = true;
ans[k] = row[i];
for(j = r[i];j != i;j = r[j])
remove(col[j]);
dfs(k + 1);
if(ok)
return;
for(j = l[i];j != i;j = l[j])
resume(col[j]);
vis[tmp] = false;
}
resume(c);
}
int main()
{
int a,b,i,j,ii,jj,st,ed;
while(scanf("%d",&n) != EOF)
{
scanf("%d%d",&m,&D);
init();
while(m --)
{
scanf("%d%d",&a,&b);
flag[a][b] = flag[b][a] = true;
}
for(i = 1;i <= n;i ++)
flag[i][i] = true;
for(i = 1;i <= n;i ++)
{
scanf("%d%d",&st,&ed);
int base = (i - 1) * 15;
for(ii = st;ii <= ed;ii ++)
{
for(jj = st;jj <= ii;jj ++)
{
for(j = 1;j <= n;j ++)
if(flag[i][j] == true)
{
for(int ai = jj;ai <= ii;ai ++)
insert(base + idx[ii][jj],(j - 1) * D + ai);
}
}
}
}
ok = false;
dfs(0);
if(ok == false)
puts("No solution");
puts("");
}
return 0;
}

23
HDOJ/3664_autoAC.cpp Normal file
View File

@ -0,0 +1,23 @@
#include <iostream>
#include <cstdio>
#define N 1005
#define mod 1000000007
#define ll __int64
using namespace std;
ll f[N][N];
void init()
{
int i,j;
for (i=1;i<N;i++)
{
f[i][0]=1;
for (j=1;j<i;j++) f[i][j]=((j+1)*f[i-1][j]+(i-j)*f[i-1][j-1])%mod;
}
}
int main()
{
int n,k;
init();
while (scanf("%d%d",&n,&k)!=EOF) cout<<f[n][k]<<endl;
return 0;
}

40
HDOJ/3665_autoAC.cpp Normal file
View File

@ -0,0 +1,40 @@
#include<stdio.h>
#define INF 99999999
int n,dis[15][15];
int mark[15];
void Floyed(){
int i,j,k;
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
int main(){
while(scanf("%d",&n)!=EOF){
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j)
dis[i][j]=0;
else
dis[i][j]=INF;
int m;
int s,l;
for(i=0;i<n;i++){
scanf("%d%d",&m,&mark[i]);
for(j=0;j<m;j++){
scanf("%d%d",&s,&l);
dis[i][s]=l;
}
}
Floyed();
int min=INF;
for(i=0;i<n;i++)
if(mark[i])
if(min>dis[0][i])
min=dis[0][i];
printf("%d\n",min);
}
return 0;
}

95
HDOJ/3666_autoAC.cpp Normal file
View File

@ -0,0 +1,95 @@
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
const int V = 808, E=400000;
const double INF=1e5;
double d[V],cost[E];
int n,m,verNum;
int head[V],pnt[E],nxt[E],e;
int cnt[V];
double u,l;
void addedge(int u,int v,double c)
{
pnt[e]=v;
cost[e]=c;
nxt[e]=head[u];
head[u]=e++;
}
bool relax(int u,int v,double w)
{
if(d[v]>d[u]+w)
{
d[v]=d[u]+w;
return 1;
}
return 0;
}
int spfa()
{
int vis[V];
int i;
//int Q[E];
queue<int> Q;
for(i=1;i<verNum;++i)
{
cnt[i] = 0;
d[i]=INF;
vis[i]=0;
}
vis[0]=1;
d[0]=0;
cnt[0] = 1;
//int top=1;
//Q[0]=0;
Q.push(0);
int u,v;
double w;
int nm = sqrt(verNum * 1.0); //涓寮归借跺澶╁ㄦ
while(!Q.empty())
{
//u=Q[--top];
u = Q.front();
Q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=nxt[i])
{
v=pnt[i];
w=cost[i];
if(relax(u,v,w) && !vis[v])
{
if(++cnt[v] > nm)
return 0;
//Q[top++]=v;
Q.push(v);
vis[v]=1;
}
}
}
return 1;
}
int main()
{
while(scanf("%d%d%lf%lf",&n,&m,&l,&u) == 4)
{
double c,ll = log(l),uu = log(u);
int i,j;
verNum = n + m;
memset(head,-1,sizeof(head));
e = 0;
for(i = 0; i < n; ++i)
for(j = 0; j < m; ++j)
{
scanf("%lf",&c);
c = log(c);
addedge(i,j+n,c-ll);
addedge(j+n,i,uu-c);
}
if(spfa())
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

119
HDOJ/3667_autoAC.cpp Normal file
View File

@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int N=300;
int head[N];
const int MAXE=5000000;
const int inf=1<<30;
int n,m,k;
int cnt,s,t;
int H[]={1,3,5,7,9};
int d[N],pre[N];
int ans=0;
bool vis[N];
int q[MAXE];
struct Edge
{
int u,v,c,w,next;
}edge[MAXE];
void addedge(int u,int v,int w,int c)
{
edge[cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].c=c;
edge[cnt].next=head[u];
head[u]=cnt++;
edge[cnt].v=u;
edge[cnt].u=v;
edge[cnt].w=-w;
edge[cnt].c=0;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int SPFA()
{
int l,r;
memset(pre,-1,sizeof(pre));
memset(vis,0,sizeof(vis));
for(int i=0;i<=t;i++) d[i]=inf;
d[s]=0;
l=0;r=0;
q[r++]=s;
vis[s]=1;
while(l<r)
{
int u=q[l++];
vis[u]=0;
for(int j=head[u];j!=-1;j=edge[j].next)
{
int v=edge[j].v;
if(edge[j].c>0&&d[u]+edge[j].w<d[v])
{
d[v]=d[u]+edge[j].w;
pre[v]=j;
if(!vis[v])
{
vis[v]=1;
q[r++]=v;
}
}
}
}
if(d[t]==inf)
return 0;
return 1;
}
void MCMF()
{
int flow=0;
while(SPFA())
{
int u=t;
int mini=inf;
while(u!=s)
{
if(edge[pre[u]].c<mini)
mini=edge[pre[u]].c;
u=edge[pre[u]].u;
}
flow+=mini;
ans+=d[t]*mini;
u=t;
while(u!=s)
{
edge[pre[u]].c-=mini;
edge[pre[u]^1].c+=mini;
u=edge[pre[u]].u;
}
}
if (flow<k)
printf("-1\n");
else
printf("%d\n",ans);
}
int main()
{
while (scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int u,v,c,w;
cnt=0;
s=0;
t=n;
ans=0;
memset(head,-1,sizeof(head));
addedge(s,1,0,k);
for (int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&u,&v,&w,&c);
for (int j=0;j<c;j++)
{
addedge(u,v,H[j]*w,1);
}
}
addedge(n,t,0,inf);
MCMF();
}
}

20
HDOJ/3668_autoAC.cpp Normal file
View File

@ -0,0 +1,20 @@
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <cmath>
using namespace std;
const double PI = acos(-1.0);
double H,R, volume,ans,total;
int main(){
while (scanf("%lf%lf",&R,&H) != EOF){
total = 2*PI*R*R*H;
if (H >= 2*R){
volume = R*R*R*2/3;
}
else {
volume = H*H*sqrt(R*R-H*H*1/4)*1/4 + R*R*R*2/3 - R*R*sqrt(R*R-H*H*1/4) + (R*R-H*H*1/4)*sqrt(R*R-H*H*1/4)*1/3;
}
ans = total - 8*volume;
printf("%.4lf\n",ans);
}
}

55
HDOJ/3669_autoAC.cpp Normal file
View File

@ -0,0 +1,55 @@
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <iomanip>
#define INF 1ll<<60
typedef long long LL;
using namespace std;
const int MAX=50000+10;
int n,k,index,head,tail,Id;
LL dp[MAX][2],q[MAX];
struct Node{
LL w,h;
bool operator<(const Node &a)const{
return h>a.h;
}
}s[MAX];
LL GetY(int k,int k2){
return dp[k][index^1]-dp[k2][index^1];
}
LL GetX(int k,int k2){
return s[k2+1].h-s[k+1].h;
}
void DP(){
index=0;
memset(dp,0,sizeof dp);
for(int i=1;i<=n;++i)dp[i][index]=INF;
for(int j=1;j<=k;++j){
index=index^1;
head=tail=0;
q[tail++]=0;
Id=0;
for(int i=1;i<=n;++i){
if(s[i].w <= s[Id].w)continue;
Id=i;
while(head+1<tail && GetY(q[head+1],q[head])<=GetX(q[head+1],q[head])*s[i].w)++head;
dp[i][index]=dp[q[head]][index^1]+s[i].w*s[q[head]+1].h;
while(head+1<tail && GetY(i,q[tail-1])*GetX(q[tail-1],q[tail-2])<=GetY(q[tail-1],q[tail-2])*GetX(i,q[tail-1]))--tail;
q[tail++]=i;
}
}
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;++i)scanf("%I64d%I64d",&s[i].w,&s[i].h);
sort(s+1,s+n+1);
DP();
printf("%I64d\n",dp[Id][index]);
}
return 0;
}

89
HDOJ/3670_autoAC.cpp Normal file
View File

@ -0,0 +1,89 @@
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
typedef long long LL;
const int N = 65536, M = 101000;
int p[20][M], n;
int lowbit(int t)
{
return t&(t^(t-1));
}
int sum(int k, int end)
{
int ans = 0;
end++;
while(end > 0)
{
ans += p[k][end];
end -= lowbit(end);
}
return ans;
}
void add(int k, int pos, int num)
{
pos++;
while(pos < M)
{
p[k][pos] += num;
pos += lowbit(pos);
}
}
void init()
{
memset(p, 0, sizeof(p));
int w, t;
for(int i=1; i<=n; i++)
{
scanf("%d", &w);
t = 0;
while(t<16)
{
add(t,w%(1<<(t+1)),1);
t++;
}
}
}
void solve(int k)
{
LL ans = 0;
int now = 0;
char ss[10];
int w, tail;
while(scanf("%s", ss) && ss[0] != 'E')
{
scanf("%d", &w);
if(ss[0] == 'C')
{
now += w;
now %= N;
}
else
{
tail = now%(1<<w);
if(now&(1<<w))
{
ans += sum(w, (1<<w)-tail-1);
ans += sum(w, (1<<(w+1))-1) - sum(w,(1<<w+1)-tail-1);
}
else
{
ans += sum(w, (1<<(w+1)) - tail-1) - sum(w, (1<<w)-1);
ans += sum(w, (1<<w)-1) - sum(w, (1<<w)-tail-1 );
}
}
}
printf("Case %d: %I64d\n", k, ans);
}
int main()
{
int t=0;
while(scanf("%d", &n) && n!=-1)
{
init();
t++;
solve(t);
}
return 0;
}

105
HDOJ/3671_autoAC.cpp Normal file
View File

@ -0,0 +1,105 @@
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1050, M = 21000;
struct EDGE
{
int u, v, next;
}edge[M];
int num, head[N], low[N], lp[N], step;
int n, m, ans=0, f, root;
void add(int u, int v)
{
edge[num].u = u;
edge[num].v = v;
edge[num].next = head[u];
head[u] = num++;
}
void init()
{
num = 0;
memset(head, -1, sizeof(head));
int u, v;
for(int i=0; i<m; i++)
{
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
}
int tarjan(int u)
{
lp[u] = low[u] = ++step;
int tp = 0,v, cc=1;
bool flag = 0;
for(int i = head[u];i != -1;i = edge[i].next)
{
v = edge[i].v;
if(v == f) continue;
if(!lp[v])
{
cc++;
tp++;
tarjan(v);
low[u] = min(low[u],low[v]);
if(u != root&&lp[u] <= low[v])
flag = 1;
}
else low[u] = min(low[u],lp[v]);
}
if(u == root && tp > 1)
flag = 1;
if(flag) ans++;
return cc;
}
void solve()
{
int result = 0;
int now, path[N] = {0};
for(int i=1; i<=n; i++)
{
memset(low, 0, sizeof(low));
memset(lp, 0, sizeof(lp));
step = 1;
now = ans = 0;
f = i;
for(int j=1; j<=n; j++)
{
if(!lp[j] && j!=i)
{
root = j;
path[++now] = tarjan(j);
}
}
if(now > 2) result += n-1;
else if(now == 2)
{
sort(path+1, path+3);
if(path[1] == 1)
{
if(path[2] != 1)
result += n-2;
}
else result += n-1;
}
else result += ans;
}
printf("%d\n", result/2);
}
int main()
{
int t=0;
while(scanf("%d%d", &n, &m) != EOF)
{
if(n==0 && m==0)
break;
init();
t++;
printf("Case %d: ", t);
solve();
}
return 0;
}

62
HDOJ/3672_autoAC.cpp Normal file
View File

@ -0,0 +1,62 @@
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
using namespace std;
#define MAXN 600
#define INF 0x3f3f3f3f
struct Node{
int v,e;
Node *next;
}*edge[MAXN],space[MAXN<<1];
int f[MAXN][MAXN][2],C,son[MAXN];
void addedge(int x,int y,int z){
Node *p=&space[C++];
p->v=x; p->e=z; p->next=edge[y];
edge[y]=p;
}
void dfs(int x,int fa){
f[x][1][0]=0; f[x][1][1]=0;
son[x]=1;
for (Node *p=edge[x]; p; p=p->next){
if (p->v!=fa){
int y=p->v;
dfs(y,x);
son[x]+=son[y];
for (int i=son[x];i>1;i--)
for (int j=1;j<=son[y];j++){
f[x][i][0]=min(f[x][i][0],f[x][i-j][0]+f[y][j][0]+(p->e)*2);
f[x][i][1]=min(f[x][i][1],f[x][i-j][0]+f[y][j][1]+p->e);
f[x][i][1]=min(f[x][i][1],f[x][i-j][1]+f[y][j][0]+(p->e)*2);
}
}
}
}
int main(){
int caseT=0,x,y,z,n,Q,t;
while (scanf("%d",&n),n){
C=0;
for (int i=0;i<=n;i++) edge[i]=NULL;
for (int i=1;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
addedge(x+1,y+1,z); addedge(y+1,x+1,z);
}
memset(son,0,sizeof(son));
for (int i=0;i<=n;i++)
for (int j=0;j<=n;j++) f[i][j][0]=f[i][j][1]=INF;
dfs(1,0);
scanf("%d",&Q);
printf("Case %d:\n",++caseT);
for (int i=1;i<=Q;i++){
scanf("%d",&t);
int ans=1;
for (int i=n;i>=1;i--){
if (f[1][i][0]<=t||f[1][i][1]<=t){
ans=i; break;
}
}
printf("%d\n",ans);
}
}
return 0;
}

58
HDOJ/3673_autoAC.cpp Normal file
View File

@ -0,0 +1,58 @@
#include<iostream>
#include<set>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans;
unsigned int m;
int l[2000000];
int t[2000000];
int a[200000];
struct cmp
{
bool operator()(int x,int y)const
{
if(l[x]<l[y])return true;
else if(l[x]==l[y]&&t[x]>t[y]) return true;
return false;
}
};
set<int,cmp> myset;
set<int,cmp>::reverse_iterator it;
int main()
{
int sec=0;
while(scanf("%u%d",&m,&n),m||n)
{
sec++;ans=0;
myset.clear();
memset(l,0,sizeof(l));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
if(myset.count(a[i])==0)
{
if(myset.size()<m)
{
l[a[i]]=1;t[a[i]]=i;myset.insert(a[i]);
}
else
{
ans++;
it=myset.rbegin();
myset.erase(*it);
l[a[i]]=1;t[a[i]]=i;myset.insert(a[i]);
}
}
else
{
myset.erase(a[i]);
l[a[i]]++;
myset.insert(a[i]);
}
}
printf("Case %d: %d\n",sec,ans);
}
return 0;
}

74
HDOJ/3674_autoAC.cpp Normal file
View File

@ -0,0 +1,74 @@
#include<stdio.h>
#include<algorithm>
#define N 200009
typedef long long LL;
using namespace std;
int n,m,a[N],b[N],c[N],L[N],R[N];
LL d[N],s1[N],s2[N],sum[N];
LL max(LL aa, LL bb)
{
if(aa > bb)return aa;
return bb;
}
void make()
{
int i,j,k,l;
for(i=1;i<=n;i++)
{
k = i-1;
while(k > 0 && a[k] <= a[i])k = b[k];
b[i] = k;
}
for(i=n;i>0;i--)
{
k = i+1;
while(k <= n && a[k] <= a[i])k = c[k];
c[i] = k;
}
}
int main()
{
int i,j,k,l,cas=0;
while(scanf("%d %d",&n,&m) != EOF)
{
if(n == 0 && m == 0)break;
sum[0] = 0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i] = sum[i-1] + a[i];
}
make();
L[1] = a[1]; for(i=2;i<=n;i++) { L[i] = a[i]; if(L[i] < L[i-1])L[i] = L[i-1]; }
R[n] = a[n]; for(i=n-1;i>0;i--) { R[i] = a[i]; if(R[i] < R[i+1])R[i] = R[i+1]; }
s1[1] = 0;
for(i=2;i<=n;i++)
{
s1[i] = s1[i-1] + max(L[i-1] - a[i], 0);
}
s2[n] = 0;
for(i=n-1;i>0;i--)
{
s2[i] = s2[i+1] + max(R[i+1] - a[i], 0);
}
for(i=1;i<=n;i++)
{
d[i] = 0;
k = b[i];
if(k < 1)d[i] += s1[i];
else
{
l = i-k-1; d[i] += (LL)l*a[i] - (sum[i-1]-sum[k]);
}
k = c[i];
if(k > n)d[i] += s2[i];
else
{
l = k-i-1; d[i] += (LL)l*a[i] - (sum[k-1]-sum[i]);
}
}
sort(d+1, d+1+n);
printf("Case %d: %I64d\n",++cas,d[n-m+1]);
}
return 0;
}

90
HDOJ/3675_autoAC.cpp Normal file
View File

@ -0,0 +1,90 @@
#include <stdio.h>
#include <string.h>
const int Mod=9973;
int cnt[2],box[2][Mod],now,pre;
struct edge{
int to,next,num;
} e[2][120000];
void add(int u,int num)
{
int idx=u%Mod;
for(int p=box[pre][idx];p!=-1;p=e[pre][p].next)
if (e[pre][p].to==u)
{
if (e[pre][p].num>num) e[pre][p].num=num;
return ;
}
e[pre][cnt[pre]].to=u;e[pre][cnt[pre]].num=num;
e[pre][cnt[pre]].next=box[pre][idx];box[pre][idx]=cnt[pre]++;
}
int a[100][20];
int b[20];
int base[20];
bool ok1(int i,int j)
{
return (a[i][j]>a[i][j-1]&&a[i][j-1]>a[i][j-2])||
(a[i][j]<a[i][j-1]&&a[i][j-1]<a[i][j-2]);
}
bool ok2(int i,int j)
{
return (a[i][j]>a[i-1][j]&&a[i-1][j]>a[i-2][j])||
(a[i][j]<a[i-1][j]&&a[i-1][j]<a[i-2][j]);
}
int main()
{
int n,m;
int T=0;
base[0]=1;
for(int i=1;i<=10;i++) base[i]=base[i-1]<<2;
while(scanf("%d %d",&n,&m)==2)
{
if (n==0&&m==0) break;
memset(box[0],-1,sizeof(box[0]));
cnt[0]=0;
now=1;pre=0;
add(0,0);
now=0;pre=1;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
memset(box[pre],-1,sizeof(box[pre]));
cnt[pre]=0;
for(int p=0;p<cnt[now];p++)
{
int v=e[now][p].to;
int tmp=v;
int num=e[now][p].num;
int k=0;
while(v)
{
b[k++]=v&3;
v>>=2;
}
while(k<=m) b[k++]=0;
tmp-=b[j+1]*base[j+1]+b[0];
if (i==0) b[j+1]=0;
if (j==0) b[0]=0;
if (a[i][j]<=0)
{
add(tmp,num);
continue;
}
if (b[0]==0) add(tmp+1,num+1); else
if (b[0]==1&&a[i][j]!=a[i][j-1]) add(tmp+2,num) ; else
if (ok1(i,j)) add(tmp+2,num); else
add(tmp+1,num+1);
if (b[j+1]==0) add(tmp+base[j+1],num+1); else
if (b[j+1]==1&&a[i][j]!=a[i-1][j]) add(tmp+2*base[j+1],num); else
if (ok2(i,j)) add(tmp+2*base[j+1],num); else
add(tmp+base[j+1],num+1);
}
now^=1;pre^=1;
}
int ans=n*m;
for(int i=0;i<cnt[now];i++)
if (ans>e[now][i].num) ans=e[now][i].num;
printf("Case %d: %d\n",++T,ans);
}
return 0;
}

18
HDOJ/3677_autoAC.cpp Normal file
View File

@ -0,0 +1,18 @@
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int L,N,i,T,a[10];
int t=0,time;
while(cin>>L>>N>>T)
{
if(L==0) break;
for(i=0;i<N;i++)
cin>>a[i];
sort(a,a+N);
time=T*(N-1)+L/a[0];
cout<<"Case "<<++t<<": "<<time<<endl;
}
return 0;
}

64
HDOJ/3678_autoAC.cpp Normal file
View File

@ -0,0 +1,64 @@
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<map>
#include<complex>
using namespace std;
typedef long long lld;
#define pb push_back
#define mp make_pair
#define X first
#define Y second
lld s[2010];
int main()
{
int n;
int cc=1;
while(scanf("%d",&n)!=EOF)
{
if(n == 0)
break;
lld sum=0;
bool zero=true;
for(int i=0;i<n;i++)
{
scanf("%I64d",&s[i]);
s[i+n]=s[i];
sum+=s[i];
if(s[i] != 0)
zero=false;
}
if(sum < 0)
{
printf("Case %d: -1\n",cc++);
continue;
}
if(sum == 0 && !zero)
{
printf("Case %d: -1\n",cc++);
continue;
}
lld ans=0;
for(int i=0;i<n;i++)
{
lld now=0;
for(int j=0;j<n;j++)
{
now+=s[i+j];
if(now < 0)
{
lld x=-now/sum;
if(x*sum != -now)
x++;
ans+=x;
}
}
}
printf("Case %d: %I64d\n",cc++,ans);
}
return 0;
}

36
HDOJ/3679_autoAC.cpp Normal file
View File

@ -0,0 +1,36 @@
#include<iostream>
using namespace std;
int main()
{
int a[4][1000],b;
int n,i,j,count,t;
t=0;
while(cin>>n)
{
count=0;
if(n==0) break;
for(i=1;i<3;i++)
for(j=1;j<=n;j++)
{
cin>>b;
if(i<3)
a[i][b]=j;
}
for(j=1;j<=n;j++)
cin>>a[3][j];
for(j=1;j<=n;j++)
{
if(a[1][j]<=a[3][j])
count=count+3;
else
{
if(a[1][j]<a[2][j])
count=count+2;
else
count=count+1;
}
}
cout<<"Case "<<++t<<": "<<count<<endl;
}
return 0;
}

130
HDOJ/3681_autoAC.cpp Normal file
View File

@ -0,0 +1,130 @@
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
char gp[16][16];
int nd[16][2],dp[1<<16][16],n,m,fis,ac,cnt=0,dis[16][16];
int dr[4][2]={1,0,-1,0,0,1,0,-1};
int bfs(int x,int y,int xx,int yy)
{
queue<int> a,b;
int vd[16][16];
memset(vd,-1,sizeof(vd));
if(xx==x&&y==yy) return 0;
a.push(x);
b.push(y);
vd[x][y]=0;
while(a.empty()==0)
{
int nx=a.front(),ny=b.front();
a.pop();b.pop();
for(int i=0;i<4;i++)
{
int dx=nx+dr[i][0],dy=ny+dr[i][1];
if(dx<0||dx>=n||dy<0||dy>=m||vd[dx][dy]!=-1||gp[dx][dy]=='D')continue;
vd[dx][dy]=vd[nx][ny]+1;
a.push(dx);b.push(dy);
if(dx==xx&&dy==yy)return vd[dx][dy];
}
}
return -1;
}
bool check(int gs)
{
memset(dp,-1,sizeof(dp));
dp[1<<fis][fis]=gs;
int ans=-1;
for(int i=0;i<(1<<cnt);i++)
for(int j=0;j<cnt;j++)
{
if((i&(1<<j))==0)continue;
if((i&(ac))==ac)
if(dp[i][j]!=-1)
return true;
for(int k=0;k<cnt;k++)
{
if(dp[i][j]==-1||k==j||(i&(1<<k))||dis[j][k]==-1)continue;
int tem=dp[i][j]-dis[j][k];
if(tem<0)continue;
dp[i+(1<<k)][k]=max(dp[i+(1<<k)][k],tem);
if(gp[nd[k][0]][nd[k][1]]=='G')dp[i+(1<<k)][k]=gs;
}
}
return false;
}
void init()
{
int i,j;
for(int i=0;i<cnt;i++)
for(int j=0;j<cnt;j++)
{
if(i==j)dis[i][j]=0;
else
dis[i][j]=bfs(nd[i][0],nd[i][1],nd[j][0],nd[j][1]);
}
}
int main()
{
int l,r,mid;
while(1)
{
scanf("%d%d",&n,&m);
if(n==0&&m==0)return 0;
getchar();
ac=0;cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%c",&gp[i][j]);
if(gp[i][j]=='F')
{
fis=cnt;
nd[cnt][0]=i;
nd[cnt][1]=j;
ac+=1<<cnt;
cnt++;
}
else
if(gp[i][j]=='G')
{
nd[cnt][0]=i;
nd[cnt][1]=j;
cnt++;
}
else
if(gp[i][j]=='Y')
{
nd[cnt][0]=i;
nd[cnt][1]=j;
ac+=1<<cnt;
cnt++;
}
}
getchar();
}
init();
l=0,r=300;
int ans=1<<30;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))
{
r=mid-1;
ans=min(mid,ans);
}
else
l=mid+1;
}
if(ans==(1<<30))
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}

53
HDOJ/3682_autoAC.cpp Normal file
View File

@ -0,0 +1,53 @@
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 1001
int num[MAXN*MAXN];
int main(int argc, char** argv) {
int T;
scanf("%d", &T);
while (T--) {
int n, m;
scanf("%d%d", &n, &m);
getchar();
char a, b;
int valA, valB;
int len = 0, i;
while (m--) {
scanf("%c=%d,%c=%d", &a, &valA, &b, &valB);
getchar();
if (a == 'X') {
if (b == 'Y')
for (i = 1; i <= n; ++i)
num[len++] = valA * n * n + valB * n + i;
else
for (i = 1; i <= n; ++i)
num[len++] = valA * n * n + i * n + valB;
} else if (a == 'Y') {
if (b == 'X')
for (i = 1; i <= n; ++i)
num[len++] = valB * n * n + valA * n + i;
else
for (i = 1; i <= n; ++i)
num[len++] = i * n * n + valA * n + valB;
} else {
if (b == 'X')
for (i = 1; i <= n; ++i)
num[len++] = valB * n * n + i * n + valA;
else
for (i = 1; i <= n; ++i)
num[len++] = i * n * n + valB * n + valA;
}
}
sort(num, num + len);
int sum(1);
int p = 0;
for (i = 1; i < len; ++i) {
if (num[i] != num[p])
p = i, ++sum;
}
printf("%d\n", sum);
}
return 0;
}

146
HDOJ/3683_autoAC.cpp Normal file
View File

@ -0,0 +1,146 @@
#include<stdio.h>
#include<string.h>
int a[20][20],nx,ny;
char b[][10]={"white","black"};
int judge(int now)
{
int i,j;
for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
if(i<11&&j<11)
if(a[i][j]==now&&a[i+1][j+1]==now
&&a[i+2][j+2]==now&&a[i+3][j+3]==now
&&a[i+4][j+4]==now)
return 1;
if(i<11)
if(a[i][j]==now&&a[i+1][j]==now
&&a[i+2][j]==now&&a[i+3][j]==now
&&a[i+4][j]==now)
return 1;
if(j<11)
if(a[i][j]==now&&a[i][j+1]==now
&&a[i][j+2]==now&&a[i][j+3]==now
&&a[i][j+4]==now)
return 1;
if(i>3&&j<11)
if(a[i][j]==now&&a[i-1][j+1]==now
&&a[i-2][j+2]==now&&a[i-3][j+3]==now
&&a[i-4][j+4]==now)
return 1;
}
return 0;
}
int judge1(int now)
{
int i,j,num=0,ok;
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(a[i][j]<0)
{
a[i][j]=now;
ok=judge(now);
a[i][j]=-1;
if(ok)
{
nx=i;
ny=j;
return 1;
}
}
return 0;
}
int judge2(int now)
{
int i,j,num=0,ok;
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(a[i][j]<0)
{
a[i][j]=!now;
ok=judge(!now);
a[i][j]=-1;
if(ok)
{
num++;
nx=i;
ny=j;
if(num==2)
return num;
}
}
return num;
}
int judge3(int now)
{
int i,j,ok;
if(judge2(now)==1)
{
i=nx;
j=ny;
a[i][j]=now;
if(judge2(!now)==2)
{
nx=i;
ny=j;
return 1;
}
else
return 0;
}
for(i=0;i<15;i++)
for(j=0;j<15;j++)
if(a[i][j]<0)
{
a[i][j]=now;
ok=judge2(!now);
a[i][j]=-1;
if(ok==2)
{
nx=i;
ny=j;
return 1;
}
}
return 0;
}
int main()
{
int i,j,k,n,x,y,now;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
memset(a,-1,sizeof(a));
now=1;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&k);
if(k)
now--;
else
now++;
a[x][y]=k;
}
if(now!=0&&now!=1)
{
printf("Invalid.\n");
continue;
}
if(n<=5)
{
printf("Cannot win in 3 moves.\n");
continue;
}
if(judge1(now))
printf("Place %s at (%d,%d) to win in 1 move.\n",b[now],nx,ny);
else if(judge2(now)==2)
printf("Lose in 2 moves.\n");
else if(judge3(now))
printf("Place %s at (%d,%d) to win in 3 moves.\n",b[now],nx,ny);
else
printf("Cannot win in 3 moves.\n");
}
return 0;
}

200
HDOJ/3684_autoAC.cpp Normal file
View File

@ -0,0 +1,200 @@
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
typedef struct pnode
{
double x,y,d;
pnode( double a, double b ) {x = a;y = b;}
pnode(){};
}point;
point P[ 105 ][ 1005 ];
point P0,Pn;
int Q[ 105 ];
int top[ 105 ];
typedef struct lnode
{
double x,y,dx,dy,d;
int id,hit,sign;
lnode( point a, point b ) {x = a.x;y = a.y;dx = b.x-a.x;dy = b.y-a.y;}
lnode(){};
}line;
line L[ 10005 ];
typedef struct knode
{
int size;
line l[ 1005 ];
point a[ 1005 ];
point b[ 1005 ];
}slope;
slope S[ 105 ];
double dist( point a, point b )
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double dist( point a, line l )
{
return fabs(l.dx*(a.y-l.y)-l.dy*(a.x-l.x))/sqrt(l.dx*l.dx+l.dy*l.dy);
}
double crossproduct( point a, point b, point c )
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double parameter( line l, point a )
{
if ( l.dx ) return (a.x-l.x)/l.dx*l.sign;
else return (a.y-l.y)/l.dy*l.sign;
}
bool l_cross_l( line a, line b )
{
double t1 = b.dx*(a.y-b.y)-b.dy*(a.x-b.x);
double t2 = b.dx*(a.y+a.dy-b.y)-b.dy*(a.x+a.dx-b.x);
return t1*t2 <= 0;
}
point crosspoint( line l, point a, point b )
{
line m = line( a, b );
if ( m.dx*l.dy == m.dy*l.dx ) {
if ( dist( point( l.x, l.y ), a ) < dist( point( l.x, l.y ), b ) )
return a;
else return b;
}else {
double a1 = -l.dy,b1 = l.dx,c1 = l.dx*l.y-l.dy*l.x;
double a2 = -m.dy,b2 = m.dx,c2 = m.dx*m.y-m.dy*m.x;
double x = (c1*b2-c2*b1)/(a1*b2-a2*b1);
double y = (c1*a2-c2*a1)/(b1*a2-b2*a1);
return point( x, y );
}
}
double angle( line a, line b )
{
return (a.dx*b.dx+a.dy*b.dy)/sqrt(a.dx*a.dx+a.dy*a.dy)/sqrt(b.dx*b.dx+b.dy*b.dy);
}
bool cmp1( point a, point b )
{
if ( a.x == b.x ) return a.y < b.y;
else return a.x < b.x;
}
bool cmp2( point a, point b )
{
double cp = crossproduct( P0, a, b );
if ( cp == 0 ) return a.d < b.d;
else return cp > 0;
}
bool cmp3( line a, line b )
{
return a.dy*b.dx < b.dy*a.dx;
}
bool cmp4( line a, line b )
{
return a.id < b.id;
}
void Graham( int N, int M )
{
point *p,q;
double d1,d2,a1,a2;
for ( int i = 0 ; i < N ; ++ i ) {
p = &P[i][0];
sort( p+0, p+Q[i], cmp1 );
P0 = p[0];
for ( int j = 1 ; j < Q[i] ; ++ j )
p[j].d = dist( P0, p[j] );
sort( p+1, p+Q[i], cmp2 );
if ( Q[i] > 2 ) {
int top = 2;
for ( int j = 3 ; j < Q[i] ; ++ j ) {
while ( top > 0 && crossproduct( p[top-1], p[top], p[j] ) <= 0 ) -- top;
p[++ top] = p[j];
}
p[++ top] = p[0];
int now = 1;
for ( int j = 2 ; j <= top ; ++ j )
if ( crossproduct( p[now-1], p[now], p[j] ) == 0 ) p[now] = p[j];
else p[++ now] = p[j];
Q[i] = now;
}
int L1 = 0,L2 = 0;
if ( Q[i] > 1 ) L2 = 1;
for ( int j = 1 ; j < Q[i] ; ++ j )
if ( p[j].x > p[(j+1)%Q[i]].x ) {
L2 = j;break;
}
int Ln = L2;
line lt = line( point(0,0), point(0,-1) );
S[i].size = -1;
while ( p[L1].x <= p[(L1+1)%Q[i]].x || p[L2].x >= p[(L2+1)%Q[i]].x ) {
a1 = angle( lt, line( p[L1], p[(L1+1)%Q[i]] ) );
a2 = angle( lt, line( p[(L2+1)%Q[i]], p[L2] ) );
S[i].size ++;
S[i].a[S[i].size] = p[L1];
S[i].b[S[i].size] = p[L2];
if ( a1 > a2 && p[L1].x <= p[(L1+1)%Q[i]].x ) {
lt = line( p[L1], p[(L1+1)%Q[i]] );
L1 = (L1+1)%Q[i];
}else {
lt = line( p[(L2+1)%Q[i]], p[L2] );
L2 = (L2+1)%Q[i];
}
S[i].l[S[i].size] = lt;
}
S[i].size ++;
S[i].a[S[i].size] = p[0];
S[i].b[S[i].size] = p[Ln];
S[i].l[S[i].size] = line( point(0,0), point(0,1) );
}
int now[101];
for ( int i = 0 ; i < N ; ++ i )
now[i] = 0;
sort( L, L+M , cmp3 );
for ( int i = 0 ; i < M ; ++ i ) {
L[i].hit = -1;
for ( int j = 0 ; j < N ; ++ j ) {
while ( cmp3( S[j].l[now[j]], L[i] ) ) ++ now[j];
if ( l_cross_l( line( S[j].a[now[j]], S[j].b[now[j]] ), L[i] ) ) {
q = crosspoint( L[i], S[j].a[now[j]], S[j].b[now[j]] );
d2 = dist( q, point( L[i].x, L[i].y ) );
if ( parameter( L[i], q ) < 0 ) continue;
if ( L[i].hit == -1 ) {
L[i].hit = j;
L[i].d = d2;
}else if ( L[i].d > d2 ) {
L[i].hit = j;
L[i].d = d2;
}
}
}
}
sort( L, L+M, cmp4 );
for ( int i = 0 ; i < M ; ++ i )
if ( L[i].hit != -1 )
printf("HIT %d\n",L[i].hit);
else printf("MISS\n");
}
int main()
{
int T,N,M;
while ( scanf("%d",&T) != EOF )
while ( T -- ) {
scanf("%d",&N);
for ( int i = 0 ; i < N ; ++ i ) {
scanf("%d",&Q[i]);
for ( int j = 0 ; j < Q[i] ; ++ j )
scanf("%lf%lf",&P[i][j].x,&P[i][j].y);
}
scanf("%d",&M);
for ( int i = 0 ; i < M ; ++ i ) {
scanf("%lf%lf%lf%lf",&L[i].x,&L[i].y,&L[i].dx,&L[i].dy);
L[i].id = i;
if ( L[i].dx < 0 ) {
L[i].dx *= -1;
L[i].dy *= -1;
L[i].sign = -1;
}else L[i].sign = 1;
}
Graham( N, M );
printf("*****\n");
}
return 0;
}

101
HDOJ/3685_autoAC.cpp Normal file
View File

@ -0,0 +1,101 @@
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=100010;
const double ZERO=1e-8;
struct node
{
double x,y;
}q[MAXN],p[MAXN];
int N,M;
void Init()
{
scanf("%d",&N);
for (int i=0;i<N;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
}
double det(node a,node b,node c)
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dot(node a,node b,node c)
{
return (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y);
}
double det3(node a,node b,node c)
{
double s=det(a,b,c);
if (fabs(s)<=ZERO) return 0;
if (s<0) return -1; else return 1;
}
void Graham_scan(node *c,int &M0,int base,node q)
{
while (M0>base && det3(c[M0-2],c[M0-1],q)<=0) --M0;
c[M0]=q;
++M0;
}
bool cmp(node a,node b)
{
if ((a.y<b.y) || (a.y==b.y && a.x<b.x)) return 1; else return 0;
}
node c[MAXN];
void Graham(node *p,int N0,node *q,int &M0)
{
for (int i=0;i<=N0;++i) q[i]=p[i];
sort(q,q+N0,cmp);
M0=0;
for (int i=0;i<N0;++i)
Graham_scan(c,M0,1,q[i]);
int M1=M0;
for (int i=N0-1;i>=0;--i)
Graham_scan(c,M0,M1,q[i]);
for (int i=0;i<M0;++i)
q[i]=c[i];
}
int Find(node a,node b,node c)
{
double s=dot(b,a,c);
if (s>ZERO) return 0; else return 1;
}
bool Cleck(node a,node b,node c)
{
return ((!Find(a,b,c))&&(!Find(a,c,b)));
}
void Solve()
{
node o,o1;
double s=0,s1;
o.x=o.y=0;
for (int i=1;i<N-1;++i)
{
o1.x=(p[0].x+p[i].x+p[i+1].x)/3;
o1.y=(p[0].y+p[i].y+p[i+1].y)/3;
s1=det(p[0],p[i],p[i+1]);
s+=s1;
o.x+=o1.x*s1;
o.y+=o1.y*s1;
}
o.x/=s;
o.y/=s;
Graham(p,N,q,M);
q[M]=q[0];
int ans=0;
for (int i=0;i<M;++i)
if (Cleck(o,q[i],q[i+1])) ++ans;
printf("%d\n",ans);
}
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
Init();
Solve();
}
return 0;
}

152
HDOJ/3686_autoAC.cpp Normal file
View File

@ -0,0 +1,152 @@
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define pb push_back
const int maxn = 10000 + 10;
const int maxm = 100000 + 10;
struct Edge {
int u, to, next, vis, id;
}edge[maxm<<1];
int head[maxn<<1], dfn[maxn<<1], low[maxn], st[maxm], iscut[maxn], subnet[maxn], bian[maxm];
int E, time, top, btot;
vector<int> belo[maxn];
void newedge(int u, int to) {
edge[E].u = u;
edge[E].to = to;
edge[E].next = head[u];
edge[E].vis = 0;
head[u] = E++;
}
void init(int n) {
for(int i = 0;i <= n; i++) {
head[i] = -1;
dfn[i] = iscut[i] = subnet[i] = 0;
belo[i].clear();
}
E = time = top = btot = 0;
}
void dfs(int u) {
dfn[u] = low[u] = ++time;
for(int i = head[u];i != -1;i = edge[i].next) {
if(edge[i].vis) continue;
edge[i].vis = edge[i^1].vis = 1;
int to = edge[i].to;
st[++top] = i;
if(!dfn[to]) {
dfs(to);
low[u] = min(low[u], low[to]);
if(low[to] >= dfn[u]) {
subnet[u]++;
iscut[u] = 1;
btot++;
do {
int now = st[top--];
belo[edge[now].u].pb(btot);
belo[edge[now].to].pb(btot);
bian[edge[now].id] = btot;
to = edge[now].u;
}while(to != u);
}
}
else
low[u] = min(low[u], low[to]);
}
}
int B[maxn<<2], F[maxn<<2], d[maxn<<2][20], pos[maxn<<2], tot, dep[maxn<<1];
bool treecut[maxn<<1];
void RMQ_init(int n) {
for(int i = 1;i <= n; i++) d[i][0] = B[i];
for(int j = 1;(1<<j) <= n; j++)
for(int i = 1;i + j - 1 <= n; i++)
d[i][j] = min(d[i][j-1], d[i + (1<<(j-1))][j-1]);
}
int RMQ(int L, int R) {
int k = 0;
while((1<<(k+1)) <= R-L+1) k++;
return min(d[L][k], d[R-(1<<k)+1][k] );
}
int lca(int a, int b) {
if(pos[a] > pos[b]) swap(a, b);
int ans = RMQ(pos[a], pos[b]);
return F[ans];
}
void DFS(int u) {
dfn[u] = ++time;
B[++tot] = dfn[u];
F[time] = u;
pos[u] = tot;
for(int i = head[u];i != -1;i = edge[i].next){
int to = edge[i].to;
if(!dfn[to]) {
if(treecut[u])
dep[to] = dep[u] + 1;
else
dep[to] = dep[u];
DFS(to);
B[++tot] = dfn[u];
}
}
}
void solve(int n) {
for(int i = 0;i <= n; i++) {
dfn[i] = 0;
}
time = tot = 0;
for(int i = 1;i <= n; i++) if(!dfn[i]) {
dep[i] = 0;
DFS(i);
}
RMQ_init(tot);
int m, u, to;
scanf("%d", &m);
while(m--) {
scanf("%d%d", &u, &to);
u = bian[u]; to = bian[to];
if(u < 0 || to < 0) {
printf("0\n"); continue;
}
int LCA = lca(u, to);
if(u == LCA)
printf("%d\n", dep[to] - dep[u] - treecut[u]);
else if(to == LCA)
printf("%d\n", dep[u] - dep[to] - treecut[to]);
else
printf("%d\n", dep[u] + dep[to] - 2*dep[LCA] - treecut[LCA]);
}
}
int main() {
int n, m, u, to;
while(scanf("%d%d", &n, &m) != -1 && n){
init(n);
for(int i = 1;i <= m; i++) {
scanf("%d%d", &u, &to);
edge[E].id = i;
newedge(u, to);
edge[E].id = i;
newedge(to, u);
}
for(int i = 1;i <= n;i ++) if(!dfn[i]) {
dfs(i);
subnet[i]--;
if(subnet[i] <= 0) iscut[i] = 0;
}
int ditot = btot;
for(int i = 1;i <= btot; i++) treecut[i] = 0;
for(int i = 1;i <= btot+n; i++) head[i] = -1;
E = 0;
for(int i = 1;i <= n; i++) if(iscut[i]) {
sort(belo[i].begin(), belo[i].end());
ditot++;
treecut[ditot] = 1;
newedge(belo[i][0], ditot);
newedge(ditot, belo[i][0]);
for(int j = 1;j < belo[i].size(); j++) if(belo[i][j] != belo[i][j-1]) {
newedge(belo[i][j], ditot);
newedge(ditot, belo[i][j]);
}
}
solve(ditot);
}
return 0;
}

53
HDOJ/3687_autoAC.cpp Normal file
View File

@ -0,0 +1,53 @@
#include "stdio.h"
#include "string.h"
#include "iostream"
#include "algorithm"
using namespace std;
int inf=0x3f3f3f3f;
int Fabs(int a)
{
if (a<0) return -a; else return a;
}
int Min(int a,int b)
{
if (a<b) return a;
else return b;
}
struct node
{
int num;
int x[210];
}mark[210];
int main()
{
int n,m,i,j,k,sum,ans;
int dp[210][210];
while (scanf("%d%d",&n,&m)!=EOF)
{
if (n==0 && m==0) break;
memset(mark,0,sizeof(mark));
for (i=1;i<=n*n;i++)
{
scanf("%d%d",&j,&k);
mark[j].num++;
mark[j].x[mark[j].num]=k;
}
for (i=1;i<=n;i++)
sort(mark[i].x+1,mark[i].x+1+n);
memset(dp,0,sizeof(dp));
for (i=1;i<=n;i++)
for (j=1;j<=m-n+1;j++)
for (k=1;k<=n;k++)
dp[i][j]+=Fabs(mark[i].x[k]-j-k+1);
ans=inf;
for (j=1;j<=m-n+1;j++)
{
sum=0;
for (i=1;i<=n;i++)
sum+=dp[i][j];
ans=Min(sum,ans);
}
printf("%d\n",ans);
}
return 0;
}

87
HDOJ/3688_autoAC.cpp Normal file
View File

@ -0,0 +1,87 @@
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
#define inf 100000
int n,m;
int a[101][10010];
int r[101][10010],c[101][10010];
int que[10010][2],p,q;
inline int max(int x,int y){return x<y?y:x;}
inline int min(int x,int y){return x<y?x:y;}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if (n==0 && m==0) return 0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
r[i][j]=c[i][j]=inf;
}
int ans=-1;
while(1)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
r[i][j]=c[i][j]=inf;
for (int i=1;i<=n;i++)
{
p=1;q=0;
for (int j=1;j<=m;j++)
{
while(p<=q && a[i][j]+j-1>=que[q][1]) q--;
que[++q][0]=j;que[q][1]=a[i][j]+j-1;
while(p<=q && que[q][1]<j) q--;
if (p<=q)
r[i][j]=j-que[q][0]+1;
}
p=1;q=0;
for (int j=m;j>=1;j--)
{
while(p<=q && j-a[i][j]+1<=que[q][1]) q--;
que[++q][0]=j;que[q][1]=j-a[i][j]+1;
while(p<=q && que[q][1]>j) q--;
if (p<=q)
r[i][j]=min(r[i][j], que[q][0]-j+1);
}
}
for (int j=1;j<=m;j++)
{
p=1;q=0;
for (int i=1;i<=n;i++)
{
while(p<=q && a[i][j]+i-1>=que[q][1]) q--;
que[++q][0]=i;que[q][1]=a[i][j]+i-1;
while(p<=q && que[q][1]<i) q--;
if (p<=q) c[i][j]=i-que[q][0]+1;
}
p=1;q=0;
for (int i=n;i>=1;i--)
{
while(p<=q && i-a[i][j]+1<=que[q][1]) q--;
que[++q][0]=i;que[q][1]=i-a[i][j]+1;
while(p<=q && que[q][1]>i) q--;
if (p<=q) c[i][j]=min(c[i][j], que[q][0]-i+1);
}
}
int tmp=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
tmp=max(tmp,max(c[i][j],r[i][j]));
}
if (tmp==ans) break;
ans=tmp;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
a[i][j]=(a[i][j]<tmp?0:a[i][j]);
}
}
if (ans<inf) printf("%d\n",ans);
else printf("NO ANSWER!\n");
}
return 0;
}

87
HDOJ/3689_autoAC.cpp Normal file
View File

@ -0,0 +1,87 @@
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 1005
int cnt;
struct node
{
int flag;
int next[26],fail;
} head[MAX];
queue<int> q;
double pt[30],dp[MAX][30];
void build(char *s,int idx)
{
int len=strlen(s),k;
for(int i=0; i<len; ++i)
{
k=s[i]-'a';
if(head[idx].next[k]==0)
head[idx].next[k]=(cnt++);
idx=head[idx].next[k];
}
head[idx].flag=1;
}
void build_fail(int idx)
{
int now;
queue<int> q;
head[idx].fail=0;
q.push(idx);
for(; !q.empty();)
{
now=q.front();
q.pop();
for(int i=0; i<26; ++i)
if(head[now].next[i])
{
if(now==0) head[head[now].next[i]].fail=0;
else head[head[now].next[i]].fail=head[head[now].fail].next[i];
q.push(head[now].next[i]);
}
else
{
if(now==0) head[now].next[i]=0;
else head[now].next[i]=head[head[now].fail].next[i];
}
}
}
int main()
{
int n,m,v;
double t;
char s[1005];
for(; scanf("%d%d",&n,&m);)
{
if(n+m==0) break;
memset(pt,0,sizeof(pt));
memset(dp,0,sizeof(dp));
memset(head,0,sizeof(head));
cnt=1;
for(int i=1; i<=n; ++i)
{
scanf("%s%lf",s,&t);
pt[s[0]-'a']=t;
}
scanf("%s",s);
build(s,0);
build_fail(0);
dp[0][0]=1;
for(int i=0; i<m; ++i)
for(int j=0; j<cnt-1; ++j)
if(i>=j)
{
for(int k=0; k<26; ++k)
{
v=head[j].next[k];
dp[i+1][v]+=(dp[i][j]*pt[k]);
}
}
double ans=0;
for(int i=0; i<=m; i++)
ans+=dp[i][cnt-1];
printf("%.2f%%\n",ans*100);
}
return 0;
}

120
HDOJ/3690_autoAC.cpp Normal file
View File

@ -0,0 +1,120 @@
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <queue>
#include <set>
#include <utility>
#define MAX(a , b) ((a) > (b) ? (a) : (b))
#define sqr(x) ((x) * (x))
#define mp make_pair
typedef long long ll;
using namespace std;
const int maxn = 12;
const int maxm = 400000;
const int kr = 1;
const int prime = 999997;
struct ddd
{
int x,y;
int step;
};
struct node
{
int x,y;
int next;
}edge[maxm];
int head[prime],vec[maxn][2];
queue <ddd> Q;
int sx,sy,tx,ty,a,b,c,d,n,idx;
void init()
{
memset(head,-1,sizeof(head));
idx = 0;
return;
}
int ha(int x,int y)
{
return (((x << 15) ^ y) % prime + prime) % prime;
}
bool addedge(int key,int x,int y)
{
for(int i=head[key];i != -1;i=edge[i].next)
{
if(edge[i].x == x && edge[i].y == y) return false;
}
edge[idx].x = x;
edge[idx].y = y;
edge[idx].next = head[key];
head[key] = idx++;
return true;
}
void read()
{
d = 0;
scanf("%d %d %d %d",&sx,&sy,&tx,&ty);
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&vec[i][0],&vec[i][1]);
d = MAX(d , sqr(vec[i][0]) + sqr(vec[i][1]));
}
a = ty - sy;
b = sx - tx;
c = sy * tx - sx * ty;
return;
}
bool IsValid(int x,int y)
{
if(sqr(x - sx) + sqr(y - sy) <= sqr(kr) * d) return true;
if(sqr(x - tx) + sqr(y - ty) <= sqr(kr) * d) return true;
if((tx - sx) * (x - sx) + (ty - sy) * (y - sy) < 0) return false;
if((sx - tx) * (x - tx) + (sy - ty) * (y - ty) < 0) return false;
if(sqr(ll(a) * x + b * y + c) <= ll(d) * (sqr(a) + sqr(b))) return true;
return false;
}
void bfs()
{
while(!Q.empty()) Q.pop();
ddd cur,tmp;
tmp.x = sx;
tmp.y = sy;
tmp.step = 0;
Q.push(tmp);
addedge(ha(sx , sy) , sx , sy);
while(!Q.empty())
{
cur = Q.front();
Q.pop();
if(cur.x == tx && cur.y == ty)
{
printf("%d\n",cur.step);
return;
}
for(int i=0;i<n;i++)
{
int xx = cur.x + vec[i][0];
int yy = cur.y + vec[i][1];
if(IsValid(xx , yy) && addedge(ha(xx , yy) , xx , yy))
{
tmp.x = xx;
tmp.y = yy;
tmp.step = cur.step + 1;
Q.push(tmp);
}
}
}
puts("IMPOSSIBLE");
return;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
init();
read();
bfs();
}
return 0;
}

69
HDOJ/3691_autoAC.cpp Normal file
View File

@ -0,0 +1,69 @@
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=400;
const int INF=0x7fffffff;
int N,M,S;
int a[MAXN][MAXN],dis[MAXN];
bool visit[MAXN],d[MAXN];
int StoerWagner(int N)
{
int p=N,ans=INF,Max,t,s,k,i;
memset(d,0,sizeof(d));
while (--p>0)
{
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
i=1;
while (d[i]) i++;
visit[i]=1;
for (int j=1;j<=N;j++)
if (!d[j] && !visit[j])
dis[j]=a[i][j];
t=s=i;
for (;i<=N;i++)
{
Max=0;
for (int j=1;j<=N;j++)
if (!d[j] && !visit[j] && Max<dis[j])
Max=dis[k=j];
if (!Max) break;
visit[k]=1;
for (int j=1;j<=N;j++)
if (!d[j] && !visit[j])
dis[j]+=a[k][j];
s=t;
t=k;
}
if (ans>dis[t]) ans=dis[t];
d[t]=1;
for (int j=1;j<=N;j++)
if (!d[j])
{
a[s][j]+=a[t][j];
a[j][s]+=a[j][t];
}
}
return ans;
}
int main()
{
while (1)
{
scanf("%d%d%d",&N,&M,&S);
if (!N && !M && !S) break;
memset(a,0,sizeof(a));
for (int i=1;i<=M;i++)
{
int x,y,d;
scanf("%d%d%d",&x,&y,&d);
a[x][y]+=d;
a[y][x]+=d;
}
printf("%d\n",StoerWagner(N));
}
return 0;
}

113
HDOJ/3692_autoAC.cpp Normal file
View File

@ -0,0 +1,113 @@
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
typedef struct p1node
{
double a,b,c,d;
}plane;
plane Pl;
typedef struct p2node
{
double x,y,z;
}point;
point temp;
point P[ 105 ];
point S[ 105 ];
int shadow( plane p, point s, int n )
{
double D = p.a*s.x+p.b*s.y+p.c*s.z;
if ( D-p.d < 0 ) {
p.a *= -1;p.b *= -1;p.c *= -1;
p.d *= -1;
D *= -1;
}
int count = 0;
for ( int i = 0 ; i < n ; ++ i ) {
double det = p.a*P[i].x+p.b*P[i].y+p.c*P[i].z-D;
if ( det < 0 ) count ++;
}
if ( count == 0 ) return 0;
if ( count != n ) return n+1;
for ( int i = 0 ; i < n ; ++ i ) {
double dx = P[i].x - s.x;
double dy = P[i].y - s.y;
double dz = P[i].z - s.z;
double t = (p.d-p.a*s.x-p.b*s.y-p.c*s.z)/(p.a*dx+p.b*dy+p.c*dz);
P[i].x = s.x + t*dx;
P[i].y = s.y + t*dy;
P[i].z = s.z + t*dz;
}
return n;
}
void change( plane p, int n )
{
if ( p.a*p.a + p.b*p.b == 0 ) return;
for ( int i = 0 ; i < n ; ++ i ) {
double cosC = p.b/sqrt(p.a*p.a+p.b*p.b);
double sinC = p.a/sqrt(p.a*p.a+p.b*p.b);
temp.x = P[i].x*cosC-P[i].y*sinC;
temp.y = P[i].x*sinC+P[i].y*cosC;
temp.z = P[i].z;
P[i] = temp;
double cosA = p.c/sqrt(p.a*p.a+p.b*p.b+p.c*p.c);
double sinA = sqrt(p.a*p.a+p.b*p.b)/sqrt(p.a*p.a+p.b*p.b+p.c*p.c);
temp.x = P[i].x;
temp.y = P[i].y*cosA-P[i].z*sinA;
temp.z = P[i].y*sinA+P[i].z*cosA;
P[i] = temp;
}
}
double crossproduct( point a, point b, point c )
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
bool cmp1( point a, point b )
{
if ( a.x == b.x )
return a.y < b.y;
return a.x < b.x;
}
bool cmp2( point a, point b )
{
return crossproduct( P[0], a, b )>0;
}
void Graham( int n )
{
sort( P+0, P+n, cmp1 );
sort( P+1, P+n, cmp2 );
int top = -1;
if ( n > 0 ) S[++ top] = P[0];
if ( n > 1 ) S[++ top] = P[1];
if ( n > 2 ) {
for ( int i = 2 ; i < n ; ++ i ) {
while ( crossproduct( S[top-1], S[top], P[i] ) < 0 ) -- top;
S[++ top] = P[i];
}
}
double area = 0.0;
for ( int i = 2 ; i <= top ; ++ i )
area += crossproduct( S[0], S[i-1], S[i] );
printf("%.2lf\n",area*0.5);
}
int main()
{
int n;
while ( cin >> Pl.a >> Pl.b >> Pl.c >> Pl.d ) {
if ( Pl.a == 0 && Pl.b == 0 && Pl.c == 0 ) break;
cin >> n;
for ( int i = 0 ; i <= n ; ++ i )
cin >> P[i].x >> P[i].y >> P[i].z;
int s_count = shadow( Pl, P[n], n );
if ( !s_ )
cout << "0.00" << endl;
else if ( s_count > n )
cout << "Infi" << endl;
else {
change( Pl, s_ );
Graham( s_ );
}
}
}

122
HDOJ/3693_autoAC.cpp Normal file
View File

@ -0,0 +1,122 @@
#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define Maxn 55
#define m 30
#define M 1000000003
int sa[Maxn],n,k,num;
ll sum[m+5];
ll dp[Maxn][Maxn],bina[m+5];
void init()
{
bina[0]=1;
for(int i=1;i<=m;i++)
bina[i]=bina[i-1]*2;
}
int Sum1(ll tmp)
{
int res=0;
for(int i=1;i<=n;i++)
if(sa[i]&tmp)
res++;
return res;
}
ll left(int a,int b)
{
if(!b)
return 1;
else
return (sa[a]&(bina[b]-1))+1;
}
ll Cal(int pos,int num,int s,int need)
{
if(s==0)
{
if((num&1)!=need)
return 0;
else
{
if(pos==0)
return 1;
else
return sum[pos-1];
}
}
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<num;j++)
{
dp[i][j]=0;
if(bina[pos]&sa[i])
{
if(i==s)
dp[i][j]=dp[i-1][j]%M;
else if(i>s)
dp[i][j]=(dp[i-1][j]*bina[pos])%M;
}
else
dp[i][j]=(dp[i-1][j]*left(i,pos))%M;
if(bina[pos]&sa[i])
{
if(i!=s)
{
if(j)
dp[i][j]=(dp[i][j]+dp[i-1][j-1]*left(i,pos))%M;
}
}
}
ll res=0;
for(int i=0;i<num;i++)
if((i&1)==need)
res=(res+dp[n][i])%M;
return res;
}
int main()
{
init();
while(~scanf("%d%d",&n,&k))
{
if(n+k==0)
break;
for(int i=1;i<=n;i++)
scanf("%d",&sa[i]);
memset(sum,0,sizeof(sum));
for(int pos=0;pos<=m;pos++)
{
ll tmp=bina[pos];
num=Sum1(tmp);
int need;
if(k&tmp)
need=1;
else
need=0;
for(int i=0;i<=n;i++)
if(!i||(tmp&sa[i]))
sum[pos]=(sum[pos]+Cal(pos,num,i,need))%M;
}
printf("%I64d\n",sum[m]);
}
return 0;
}

79
HDOJ/3694_autoAC.cpp Normal file
View File

@ -0,0 +1,79 @@
#include<cstdio>
#include<iostream>
#include<utility>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int M=15;
const double inf=1e250;
struct point
{
double x,y;
bool operator < (const point a)const
{
if(y==a.y)
return x<a.x;
return y<a.y;
}
}p[M],stac[M];
int n,top;
double dis(point a,point b)
{
return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}
double xmult(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
double cross(point p0,point p1,point p2)
{
double x1=p1.x-p0.x,y1=p1.y-p0.y;
double x2=p2.x-p0.x,y2=p2.y-p0.y;
return xmult(x1,y1,x2,y2);
}
void covex_hull()
{
sort(p,p+n);
stac[0]=p[0];
stac[1]=p[1];
top=1;
for(int i=2;i<n;i++)
{
while(top>0 && cross(stac[top],p[i],stac[top-1])<=0)
top--;
stac[++top]=p[i];
}
int temp=top;
for(int i=n-2;i>=0;i--)
{
while(top>temp && cross(stac[top],p[i],stac[top-1])<=0)
top--;
stac[++top]=p[i];
}
}
int main()
{
while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y,&p[3].x,&p[3].y)==8)
{
if(p[0].x==-1 && p[0].y==-1 && p[1].x==-1 && p[1].y==-1 && p[2].x==-1 && p[2].y==-1 && p[3].x==-1 && p[3].y==-1)
break;
n=4;
covex_hull();
double ans;
if(top==4)
{
ans=dis(stac[0],stac[2])+dis(stac[1],stac[3]);
}
else
{
ans=inf;
ans=min(ans,dis(p[0],p[1])+dis(p[0],p[2])+dis(p[0],p[3]));
ans=min(ans,dis(p[1],p[0])+dis(p[1],p[2])+dis(p[1],p[3]));
ans=min(ans,dis(p[2],p[1])+dis(p[2],p[0])+dis(p[2],p[3]));
ans=min(ans,dis(p[3],p[1])+dis(p[3],p[2])+dis(p[3],p[0]));
}
printf("%.4lf\n",ans);
}
return 0;
}

152
HDOJ/3695_autoAC.cpp Normal file
View File

@ -0,0 +1,152 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 5200005;
const int MAX_NODE = 3000005;
const int SIGMA_SIZE = 26;
char str[MAXN];
char buf[MAXN];
struct node{
node* fail;
node* next[SIGMA_SIZE];
bool isword;
int id;
void init(){
id=0;
isword=false;
memset(next, 0, sizeof(next));
}
};
class AC_Automation{
public:
void init();
void insert(char*,int);
void getFail();
int find(char*);
private:
node* new_node();
int ID(char ch){return ch-'A';}
private:
node Heap[MAX_NODE];
node* root;
int size;
};
node* AC_Automation::new_node(){
Heap[size].init();
return &Heap[size++];
}
void AC_Automation::init(){
size=0;
root=new_node();
}
void AC_Automation::insert(char* str,int id){
node* p=root;
for( ; *str; ++str){
int ch=ID(*str);
if(p->next[ch] == NULL)
p->next[ch] = new_node();
p = p->next[ch];
}
p->isword=true;
p->id=id;
}
void AC_Automation::getFail(){
queue<node*>Q;
Q.push(root);
while(!Q.empty()){
node* tmp=Q.front(); Q.pop();
for(int i=0; i<SIGMA_SIZE; ++i){
node*& now = tmp->next[i];
if(now != NULL){
Q.push(now);
if(tmp==root) now->fail=root;
else{
node* p=tmp->fail;
while(p != NULL){
if(p->next[i] != NULL){
now->fail = p->next[i];
break;
}
p = p->fail;
}
if(p==NULL) now->fail=root;
}
}
else{
if(tmp==root) now = root;
else now=tmp->fail->next[i];
}
}
}
}
int AC_Automation::find(char* str){
node* p=root;
int cnt=0;
for( ; *str; ++str){
int ch=ID(*str);
p = p->next[ch];
if(p==NULL) p=root;
node* tmp=p;
while(tmp!=root && tmp->isword){
++cnt;
tmp->isword=false;
tmp = tmp->fail;
}
}
return cnt;
}
inline void rev(char* str, int len){
char ch;
for(int i=0, k=len-1; i<len/2; ++i,--k){
ch=str[i]; str[i]=str[k]; str[k]=ch;
}
}
inline void change(char* str,char* now){
memset(now, 0, sizeof(now));
int len=strlen(str);
int i;
for(i=0; i<len; ++i){
if(str[i]=='['){
++i;
int num=0;
while(str[i]>='0' && str[i]<='9'){
num = num*10 + str[i] - '0';
++i;
}
while(num--){
*now = str[i];
++now;
}
++i;
}
else{
*now=str[i];
++now;
}
}
}
AC_Automation ac;
int main(){
int n,nCase;
char pat[1005];
scanf("%d",&nCase);
while(nCase--){
ac.init();
scanf("%d%*c",&n);
for(int i=1; i<=n; ++i){
gets(pat);
ac.insert(pat, i);
}
ac.getFail();
memset(buf, 0, sizeof(buf));
memset(str, 0, sizeof(str));
gets(buf);
change(buf,str);
int ans=ac.find(str);
rev(str,strlen(str));
printf("%d\n", ans+ac.find(str));
}
return 0;
}

77
HDOJ/3696_autoAC.cpp Normal file
View File

@ -0,0 +1,77 @@
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 10005
using namespace std;
int n,m,num,adj[N],q[N];
bool f[N];
double low[N],p[N],w[N];
struct edge
{
int v,pre;
double w;
edge(){}
edge(int vv,double ww,int p){v=vv;w=ww;pre=p;}
}e[N*5];
void insert(int u,int v,double w)
{
e[num]=edge(v,w,adj[u]);
adj[u]=num++;
}
void spfa(int x)
{
int i,v,head=0,tail=0;
memset(f,0,sizeof(f));
memset(low,-0x3f,sizeof(low));
low[x]=0;
q[++tail]=x;
while(head!=tail)
{
x=q[head=(head+1)%N];
f[x]=0;
for(i=adj[x];~i;i=e[i].pre)
if(low[v=e[i].v]<low[x]+e[i].w)
{
low[v]=low[x]+e[i].w;
if(!f[v])
{
f[v]=1;
q[tail=(tail+1)%N]=v;
}
}
}
}
int main()
{
while(scanf("%d",&n),n)
{
int i,k,a,b;
double t,ans=0;
num=0;
memset(adj,-1,sizeof(adj));
for(i=1;i<=n;i++)
scanf("%lf%lf",p+i,w+i);
scanf("%d",&m);
while(m--)
{
scanf("%d",&k);
scanf("%d",&a);
for(i=1;i<k;i++)
{
scanf("%lf%d",&t,&b);
insert(b,a,log(t));
a=b;
}
}
for(i=1;i<=n;i++)
insert(0,i,log(p[i]));
spfa(0);
for(i=1;i<=n;i++)
{
if(p[i]<exp(low[i]))
p[i]=exp(low[i]);
ans+=p[i]*w[i];
}
printf("%.2f\n",ans);
}
}

63
HDOJ/3697_autoAC.cpp Normal file
View File

@ -0,0 +1,63 @@
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define inf 0x3fffffff
#define N 1100
struct node {
int l,r;
}f[N];
int ff[N];
double d;
int Min(int aa,int bb) {
return aa>bb?bb:aa;
}
int Max(int aa,int bb) {
return aa>bb?aa:bb;
}
int cmp(const void *a,const void *b)
{
return (*(struct node *)a).r-(*(struct node *)b).r;
}
int main() {
int n,i,j;
int minn,maxx,tot,kk,k,ss,endd;
while(scanf("%d",&n),n) {
minn=inf;
maxx=-1;
for(i=0;i<n;i++) {
scanf("%d%d",&f[i].l,&f[i].r);
minn=Min(f[i].l,minn);
maxx=Max(f[i].r,maxx);
}
qsort(f,n,sizeof(f[0]),cmp);
endd=0;
for(i=minn;i<=maxx;i++) {
tot=0;
memset(ff,0,sizeof(ff));
for(j=0;j<n;j++) {
kk=(f[j].l-i)/5;
if(kk*5+i!=f[j].l)
kk=kk*5+i+5;
else
kk=f[j].l;
k=(f[j].r-i)/5;
if(k*5+i==f[j].r)
k=f[j].r-5;
else
k=5*k+i;
k=Min(k,kk);
for(ss=k;ss<f[j].r;ss+=5) {
if(ff[ss]==0&&ss>=f[j].l&&ss<f[j].r) {
tot++;
ff[ss]=1;
break;
}
}
}
if(endd<tot)
endd=tot;
}
printf("%d\n",endd);
}
return 0;
}

95
HDOJ/3698_autoAC.cpp Normal file
View File

@ -0,0 +1,95 @@
#include<cstdio>
#include<cstring>
using namespace std;
#define inf 1073741823
#define N 105
#define M 5005
int t[N][M];
int f[N][M];
int dp[N][M];
int summ[M<<2],add[M<<2];
inline int min(int a,int b)
{
return a<b?a:b;
}
void push_down(int idx)
{
if(add[idx]!=inf)
{
add[idx<<1]=min(add[idx<<1],add[idx]);
add[idx<<1|1]=min(add[idx<<1|1],add[idx]);
summ[idx<<1]=min(summ[idx<<1],add[idx<<1]);
summ[idx<<1|1]=min(summ[idx<<1|1],add[idx<<1|1]);
add[idx]=inf;
}
}
void build(int l,int r,int idx)
{
summ[idx]=inf;
add[idx]=inf;
if(l==r) return;
int mid=(l+r)>>1;
build(l,mid,idx<<1);
build(mid+1,r,idx<<1|1);
}
void update(int a,int b,int w,int l,int r,int idx)
{
if(a<=l&&r<=b)
{
add[idx]=min(w,add[idx]);
summ[idx]=min(add[idx],summ[idx]);
return;
}
int mid=(l+r)>>1;
push_down(idx);
if(a<=mid) update(a,b,w,l,mid,idx<<1);
if(mid<b) update(a,b,w,mid+1,r,idx<<1|1);
summ[idx]=min(summ[idx<<1],summ[idx<<1|1]);
}
int query(int a,int b,int l,int r,int idx)
{
if(a<=l&&r<=b)
return summ[idx];
int mid=(l+r)>>1;
push_down(idx);
int res=inf;
if(a<=mid) res=min(res,query(a,b,l,mid,idx<<1));
if(mid<b) res=min(res,query(a,b,mid+1,r,idx<<1|1));
return res;
}
inline void scan(int &n)
{
char cc ;
for(;cc=getchar(),cc<'0'||cc>'9';);
n=cc-'0';
for(;cc=getchar(),cc>='0'&&cc<='9';)
n=n*10+cc-'0';
}
int main()
{
int n,m;
for(;scanf("%d%d",&n,&m)&&(n!=0||m!=0);)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scan(t[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scan(f[i][j]);
for(int i=1;i<=m;++i)
dp[1][i]=t[1][i];
for(int i=2;i<=n;++i)
{
build(1,m,1);
for(int j=1;j<=m;++j)
update(j-f[i-1][j],j+f[i-1][j],dp[i-1][j],1,m,1);
for(int j=1;j<=m;++j)
dp[i][j]=query(j-f[i][j],j+f[i][j],1,m,1)+t[i][j];
}
int ans=inf;
for(int i=1;i<=m;++i)
ans=min(ans,dp[n][i]);
printf("%d\n",ans);
}
return 0;
}

93
HDOJ/3699_autoAC.cpp Normal file
View File

@ -0,0 +1,93 @@
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int tot, sct, lena, lenb, lenc;
char s1[10], s2[10], s3[10], save[10], save0[10], dig[10];
char ss1[10], ss2[10], ss3[10], soso[10];
void solve(int cct)
{
if(cct >= sct)
{
int aa, bb, cc;
for(int i = 0; i < sct; i++)
{
for(int j = 0; j < lena; j++)
if(ss1[j] == save[i])
s1[j] = dig[i];
for(int j = 0; j < lenb; j++)
if(ss2[j] == save[i])
s2[j] = dig[i];
for(int j = 0; j < lenc; j++)
if(ss3[j] == save[i])
s3[j] = dig[i];
sscanf(s1, "%d", &aa);
sscanf(s2, "%d", &bb);
sscanf(s3, "%d", &cc);
}
if(aa * bb == cc)
++tot;
if(aa - bb == cc)
++tot;
if(aa + bb == cc)
++tot;
if(bb != 0 && aa / bb == cc && aa % bb == 0)
++tot;
return ;
}
int flag;
if(strlen(save0) && strchr(save0, save[cct]) != NULL)
flag = 1;
else
flag = 0;
for(int j = flag; j < 10; j++)
if(strchr(soso, ('0' + j)) == NULL)
{
soso[cct] = '0' + j;
dig[cct] = '0' + j;
solve(cct + 1);
soso[cct] = '\0';
}
return ;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int zct = 0;
tot = sct = 0;
memset(s1, 0, sizeof(s1));
memset(s2, 0, sizeof(s2));
memset(s3, 0, sizeof(s3));
memset(save, 0, sizeof(save));
memset(save0, 0, sizeof(save0));
memset(soso, 0, sizeof(soso));
scanf("%s%s%s", ss1, ss2, ss3);
strcpy(s1, ss1);
strcpy(s2, ss2);
strcpy(s3, ss3);
lena = strlen(s1), lenb = strlen(s2), lenc = strlen(s3);
if(strchr(save0, s1[0]) == NULL && lena > 1)
save0[zct++] = s1[0];
if(strchr(save0, s2[0]) == NULL && lenb > 1)
save0[zct++] = s2[0];
if(strchr(save0, s3[0]) == NULL && lenc > 1)
save0[zct++] = s3[0];
for(int i = 0; i < lena; i++)
if(strchr(save, s1[i]) == NULL)
save[sct++] = s1[i];
for(int i = 0; i < lenb; i++)
if(strchr(save, s2[i]) == NULL)
save[sct++] = s2[i];
for(int i = 0; i < lenc; i++)
if(strchr(save, s3[i]) == NULL)
save[sct++] = s3[i];
solve(0);
printf("%d\n", tot);
}
return 0;
}