mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Powered By HC TECH : AutoACer Engine
4300-4399
This commit is contained in:
parent
1c7c39b791
commit
53497060fc
54
HDOJ/4300_autoAC.cpp
Normal file
54
HDOJ/4300_autoAC.cpp
Normal file
|
@ -0,0 +1,54 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
char a[100001],c[100001];
|
||||
int ne[100001];
|
||||
int main()
|
||||
{
|
||||
int T,i,j,len,nima[27],mid;
|
||||
char b[27];
|
||||
while(scanf("%d",&T)!=EOF)
|
||||
{
|
||||
getchar();
|
||||
while(T--)
|
||||
{
|
||||
scanf("%s%s",b+1,a+1);
|
||||
for(i=1;i<=26;i++)
|
||||
nima[b[i]-'a']=i-1;
|
||||
len=strlen(a+1);
|
||||
for(i=1;i<=len;i++)
|
||||
c[i]='a'+nima[a[i]-'a'];
|
||||
i=1;j=0;ne[1]=0;
|
||||
while(i<len)
|
||||
{
|
||||
if(j==0||c[i]==c[j])
|
||||
{
|
||||
i++;j++;
|
||||
ne[i]=j;
|
||||
}
|
||||
else
|
||||
j=ne[j];
|
||||
}
|
||||
if(len%2==0)
|
||||
i=len/2+1;
|
||||
else
|
||||
i=len/2+2;
|
||||
j=1;mid=i;
|
||||
while(i<=len)
|
||||
{
|
||||
if(j==0||a[i]==c[j])
|
||||
{
|
||||
i++;j++;
|
||||
}
|
||||
else
|
||||
j=ne[j];
|
||||
}
|
||||
for(i=1;i<=len;i++)
|
||||
printf("%c",a[i]);
|
||||
for(i=j;i<j+len-2*j+2;i++)
|
||||
printf("%c",c[i]);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
36
HDOJ/4301_autoAC.cpp
Normal file
36
HDOJ/4301_autoAC.cpp
Normal file
|
@ -0,0 +1,36 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <math.h>
|
||||
#include <cstdlib>
|
||||
#include <queue>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define N 1050
|
||||
#define mod 100000007
|
||||
int dp[N][N*2][2];
|
||||
int main ()
|
||||
{
|
||||
memset(dp,0,sizeof(dp));
|
||||
dp[1][1][0]=1;
|
||||
dp[1][2][1]=1;
|
||||
for(int i=1;i<=1000;++i)
|
||||
{
|
||||
for(int j=1;j<=2*i;++j)
|
||||
{
|
||||
dp[i+1][j][0]=(dp[i+1][j][0]+dp[i][j][0]+2*dp[i][j][1])%mod;
|
||||
dp[i+1][j+1][0]=(dp[i+1][j+1][0]+dp[i][j][1]+dp[i][j][0])%mod;
|
||||
dp[i+1][j][1]=(dp[i+1][j][1]+dp[i][j][1])%mod;
|
||||
dp[i+1][j+1][1]=(dp[i+1][j+1][1]+2*dp[i][j][0]+2*dp[i][j][1])%mod;
|
||||
dp[i+1][j+2][1]=(dp[i+1][j+2][1]+dp[i][j][0]+dp[i][j][1])%mod;
|
||||
}
|
||||
}
|
||||
int n,k;
|
||||
int t;scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d",&n,&k);
|
||||
printf("%d\n",(dp[n][k][0]+dp[n][k][1])%mod);
|
||||
}
|
||||
return 0;
|
||||
}
|
86
HDOJ/4302_autoAC.cpp
Normal file
86
HDOJ/4302_autoAC.cpp
Normal file
|
@ -0,0 +1,86 @@
|
|||
#include <queue>
|
||||
#include <iostream>
|
||||
#define LL __int64
|
||||
using namespace std;
|
||||
struct cmp
|
||||
{
|
||||
bool operator()(LL a, LL b)
|
||||
{
|
||||
return a > b;
|
||||
}
|
||||
};
|
||||
int main()
|
||||
{
|
||||
int t,l,n,f1,f2;
|
||||
LL sum,a,b,x,y;
|
||||
int i,j;
|
||||
scanf("%d", &t);
|
||||
for(j = 0; j < t; j++)
|
||||
{
|
||||
priority_queue<LL> asc;
|
||||
priority_queue<LL, vector<LL>, cmp> desc;
|
||||
scanf("%d%d", &l, &n);
|
||||
y = 0;
|
||||
sum = 0;
|
||||
for(i = 0; i < n; i++)
|
||||
{
|
||||
scanf("%d", &f2);
|
||||
if(!f2)
|
||||
{
|
||||
scanf("%I64d", &x);
|
||||
if(x > y) desc.push(x);
|
||||
else asc.push(x);
|
||||
}
|
||||
else
|
||||
{
|
||||
a = b = -1;
|
||||
if(!asc.empty()) b = asc.top();
|
||||
if(!desc.empty()) a = desc.top();
|
||||
if(b == y)
|
||||
{
|
||||
asc.pop();
|
||||
continue;
|
||||
}
|
||||
if(a+1 && b+1)
|
||||
{
|
||||
if(a-y > y-b)
|
||||
{
|
||||
sum += y-b;
|
||||
y = b;
|
||||
asc.pop();
|
||||
f1 = 0;
|
||||
}
|
||||
else if(a-y == y-b)
|
||||
{
|
||||
sum += a-y;
|
||||
if(f1) {y = a; desc.pop();}
|
||||
else {y = b; asc.pop();}
|
||||
}
|
||||
else
|
||||
{
|
||||
sum += a-y;
|
||||
y = a;
|
||||
desc.pop();
|
||||
f1 = 1;
|
||||
}
|
||||
}
|
||||
else if(a+1)
|
||||
{
|
||||
sum += a-y;
|
||||
y = a;
|
||||
desc.pop();
|
||||
f1 = 1;
|
||||
}
|
||||
else if(b+1)
|
||||
{
|
||||
sum += y-b;;
|
||||
y = b;
|
||||
asc.pop();
|
||||
f1 = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case %d: %I64d\n", j+1, sum);
|
||||
}
|
||||
return 0;
|
||||
}
|
71
HDOJ/4303_autoAC.cpp
Normal file
71
HDOJ/4303_autoAC.cpp
Normal file
|
@ -0,0 +1,71 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<set>
|
||||
#include<vector>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define pb push_back
|
||||
#define NN 301000
|
||||
typedef pair<int,int> pii;
|
||||
vector<pii> ed[NN];
|
||||
long long ans;
|
||||
int son[NN],fc[NN];
|
||||
int val[NN];
|
||||
void dfs2(int u,int fa,int ecol,int fcnt){
|
||||
ans+=((long long)son[u]-fc[u])*fcnt*val[u];
|
||||
int i,j,sz=ed[u].size(),v,tcol=-1,vv,tfcnt;
|
||||
int totc=0,tott=0;
|
||||
for(i=0,j=0;i<sz;++i){
|
||||
v=ed[u][i].second;
|
||||
if (v==fa) continue;
|
||||
if (tcol!=ed[u][i].first){
|
||||
tcol=ed[u][i].first;
|
||||
totc=0;
|
||||
if (j<sz&&ed[u][j].second==fa) ++j;
|
||||
for(;j<sz&&ed[u][j].first==tcol;++j){
|
||||
vv=ed[u][j].second;
|
||||
if (vv==fa) continue;
|
||||
totc=totc+son[vv]-fc[vv];
|
||||
}
|
||||
tott+=totc;
|
||||
}
|
||||
ans+=((long long)son[u]-tott)*(son[v]-fc[v])*val[u];
|
||||
if (ecol==ed[u][i].first) tfcnt=son[u]-totc;
|
||||
else tfcnt=son[u]-totc+fcnt;
|
||||
dfs2(v,u,ed[u][i].first,tfcnt);
|
||||
}
|
||||
}
|
||||
int dfs1(int u,int fa,int ecol){
|
||||
son[u]=1;
|
||||
fc[u]=0;
|
||||
int i,sz=ed[u].size(),v,tmp;
|
||||
sort(ed[u].begin(),ed[u].end());
|
||||
for(i=0;i<sz;++i){
|
||||
if (ed[u][i].second==fa) continue;
|
||||
v=ed[u][i].second;
|
||||
tmp=dfs1(v,u,ed[u][i].first);
|
||||
son[u]+=tmp;
|
||||
if (ecol==ed[u][i].first) fc[u]+=tmp;
|
||||
}
|
||||
return son[u]-fc[u];
|
||||
}
|
||||
int main(){
|
||||
int n,i,a,b,c;
|
||||
while(scanf("%d",&n)!=EOF){
|
||||
for(i=1;i<=n;++i){
|
||||
scanf("%d",&val[i]);
|
||||
ed[i].clear();
|
||||
}
|
||||
for(i=1;i<n;++i){
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
ed[a].pb(make_pair(c,b));
|
||||
ed[b].pb(make_pair(c,a));
|
||||
}
|
||||
dfs1(1,-1,-1);
|
||||
ans=0;
|
||||
dfs2(1,-1,-1,0);
|
||||
printf("%I64d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
89
HDOJ/4304_autoAC.cpp
Normal file
89
HDOJ/4304_autoAC.cpp
Normal file
|
@ -0,0 +1,89 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
int coef[20],delt[20],inx[20],base[20];
|
||||
int mark[1000010],pri[1000010],priN;
|
||||
__int64 dp[2000][20];
|
||||
void init()
|
||||
{
|
||||
int i,j;
|
||||
for(i=2; i<=1000000; i++) mark[i]=i;
|
||||
for(i=2; i<=1000000; i++)
|
||||
{
|
||||
if(mark[i]==i) pri[priN++]=i;
|
||||
for(j=0; j<priN&&i*pri[j]<=1000000; j++)
|
||||
{
|
||||
mark[i*pri[j]]=pri[j];
|
||||
if(i%pri[j]==0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void deal()
|
||||
{
|
||||
__int64 u,ans,num,t,tmpv;
|
||||
int cnt,i,j,k,l,prod,tot,amn,m;
|
||||
scanf("%I64d", &u);
|
||||
for(cnt=0,num=u; num-1;)
|
||||
{
|
||||
if(num>1000000)
|
||||
{
|
||||
t=num;
|
||||
for(j=0; j<priN; j++)
|
||||
{
|
||||
if(num%pri[j]==0)
|
||||
{
|
||||
t=pri[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else t=mark[num];
|
||||
inx[cnt]=0;
|
||||
while(num%t==0) num/=t,inx[cnt]++;
|
||||
cnt++;
|
||||
}
|
||||
for(tot=0,prod=1,i=cnt-1; i>=0; i--)
|
||||
{
|
||||
tot+=inx[i],base[i]=prod,prod*=(inx[i]+1);
|
||||
}
|
||||
for(i=0; i<=tot; i++) for(j=0; j<prod; j++) dp[j][i]=0;
|
||||
dp[0][0]=1;
|
||||
for(i=1; i<prod; i++)
|
||||
{
|
||||
for(j=0; j<cnt; j++) delt[j]=i/base[j]%(inx[j]+1);
|
||||
for(j=prod-1; j>=0; j--)
|
||||
{
|
||||
amn=0x3fffffff;
|
||||
for(k=0; k<cnt; k++)
|
||||
{
|
||||
coef[k]=j/base[k]%(inx[k]+1);
|
||||
if(delt[k])
|
||||
{
|
||||
tmpv=(inx[k]-coef[k])/delt[k];
|
||||
if(tmpv<amn) amn=tmpv;
|
||||
}
|
||||
}
|
||||
for(l=1; l<=amn; l++)
|
||||
{
|
||||
for(k=0; k+l<=tot; k++)
|
||||
{
|
||||
tmpv=dp[j][k];
|
||||
for(m=1; m<=l; m++) tmpv*=m+k,tmpv/=m;
|
||||
dp[j+i*l][k+l]+=tmpv;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(ans=dp[prod-1][tot]*dp[prod-1][tot],i=0; i<tot; i++)
|
||||
{
|
||||
ans+=(dp[prod-1][i]+dp[prod-1][i+1])*(dp[prod-1][i]+dp[prod-1][i+1]);
|
||||
}
|
||||
printf("%I64d\n", ans);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
int t;
|
||||
scanf("%d", &t);
|
||||
while(t--) deal();
|
||||
return 0;
|
||||
}
|
141
HDOJ/4305_autoAC.cpp
Normal file
141
HDOJ/4305_autoAC.cpp
Normal file
|
@ -0,0 +1,141 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <math.h>
|
||||
using namespace std;
|
||||
struct Point
|
||||
{
|
||||
int x,y;
|
||||
Point(int _x = 0,int _y = 0)
|
||||
{
|
||||
x = _x,y = _y;
|
||||
}
|
||||
Point operator - (const Point &b)const
|
||||
{
|
||||
return Point(x-b.x,y-b.y);
|
||||
}
|
||||
int operator ^(const Point &b)const
|
||||
{
|
||||
return x*b.y - y*b.x;
|
||||
}
|
||||
void input()
|
||||
{
|
||||
scanf("%d%d",&x,&y);
|
||||
}
|
||||
};
|
||||
struct Line
|
||||
{
|
||||
Point s,e;
|
||||
Line(){}
|
||||
Line(Point _s,Point _e)
|
||||
{
|
||||
s = _s;
|
||||
e = _e;
|
||||
}
|
||||
};
|
||||
bool onSeg(Point P,Line L)
|
||||
{
|
||||
return
|
||||
((L.s-P)^(L.e-P)) == 0 &&
|
||||
(P.x-L.s.x)*(P.x-L.e.x) <= 0 &&
|
||||
(P.y-L.s.y)*(P.y-L.e.y) <= 0;
|
||||
}
|
||||
int sqdis(Point a,Point b)
|
||||
{
|
||||
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
|
||||
}
|
||||
const int MOD = 10007;
|
||||
int INV[MOD];
|
||||
long long inv(long long a,long long m)
|
||||
{
|
||||
if(a == 1)return 1;
|
||||
return inv(m%a,m)*(m-m/a)%m;
|
||||
}
|
||||
struct Matrix
|
||||
{
|
||||
int mat[330][330];
|
||||
void init()
|
||||
{
|
||||
memset(mat,0,sizeof(mat));
|
||||
}
|
||||
int det(int n)
|
||||
{
|
||||
for(int i = 0;i < n;i++)
|
||||
for(int j = 0;j < n;j++)
|
||||
mat[i][j] = (mat[i][j]%MOD+MOD)%MOD;
|
||||
int res = 1;
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
for(int j = i;j < n;j++)
|
||||
if(mat[j][i]!=0)
|
||||
{
|
||||
for(int k = i;k < n;k++)
|
||||
swap(mat[i][k],mat[j][k]);
|
||||
if(i != j)
|
||||
res = (-res+MOD)%MOD;
|
||||
break;
|
||||
}
|
||||
if(mat[i][i] == 0)
|
||||
{
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
for(int j = i+1;j < n;j++)
|
||||
{
|
||||
int mut = (mat[j][i]*inv(mat[i][i],MOD))%MOD;
|
||||
for(int k = i;k < n;k++)
|
||||
mat[j][k] = (mat[j][k]-(mat[i][k]*mut)%MOD+MOD)%MOD;
|
||||
}
|
||||
res = (res * mat[i][i])%MOD;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
};
|
||||
Point p[330];
|
||||
int n,R;
|
||||
bool check(int k1,int k2)
|
||||
{
|
||||
if(sqdis(p[k1],p[k2]) > R*R)return false;
|
||||
for(int i = 0;i < n;i++)
|
||||
if(i!=k1 && i!=k2)
|
||||
if(onSeg(p[i],Line(p[k1],p[k2])))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
int g[330][330];
|
||||
int main()
|
||||
{
|
||||
for(int i = 1;i < MOD;i++)
|
||||
INV[i] = inv(i,MOD);
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d%d",&n,&R);
|
||||
for(int i = 0;i < n;i++)
|
||||
p[i].input();
|
||||
memset(g,0,sizeof(g));
|
||||
for(int i = 0;i < n;i++)
|
||||
for(int j = i+1;j <n;j++)
|
||||
if(check(i,j))
|
||||
g[i][j] = g[j][i] = 1;
|
||||
Matrix ret;
|
||||
ret.init();
|
||||
for(int i = 0;i < n;i++)
|
||||
for(int j = 0;j < n;j++)
|
||||
if(i != j && g[i][j])
|
||||
{
|
||||
ret.mat[i][j] = -1;
|
||||
ret.mat[i][i]++;
|
||||
}
|
||||
printf("%d\n",ret.det(n-1));
|
||||
}
|
||||
return 0;
|
||||
}
|
343
HDOJ/4306_autoAC.cpp
Normal file
343
HDOJ/4306_autoAC.cpp
Normal file
|
@ -0,0 +1,343 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int MAXN = 305;
|
||||
const int MAXM = 100010;
|
||||
struct Edge
|
||||
{
|
||||
int v, next;
|
||||
} shift[MAXN*MAXN*2], edge[MAXN*MAXN*4];
|
||||
int shiftNumber, edgeNumber;
|
||||
int shiftHead[MAXN*MAXN*2], edgeHead[MAXN*MAXN*2];
|
||||
int a[MAXN][MAXN], b[MAXN][MAXN];
|
||||
int al[MAXN*MAXN], bl[MAXN*MAXN];
|
||||
int ta[MAXN], tb[MAXN];
|
||||
int na[MAXM], nb[MAXM];
|
||||
int pa[MAXM][2], pb[MAXM][2];
|
||||
bool va[MAXM], vb[MAXM];
|
||||
int n, nn, ca, cb;
|
||||
int differ[MAXN*MAXN], differNumber;
|
||||
int maxNumber;
|
||||
bool inStack[MAXN*MAXN*2];
|
||||
int dfn[MAXN*MAXN*2], low[MAXN*MAXN*2];
|
||||
int stack[MAXN*MAXN*2], belong[MAXN*MAXN*2];
|
||||
int top, index, componentNumber;
|
||||
inline int min(int x, int y)
|
||||
{
|
||||
return x < y ? x : y;
|
||||
}
|
||||
inline int max(int x, int y)
|
||||
{
|
||||
return x > y ? x : y;
|
||||
}
|
||||
inline void swap(int &x, int &y)
|
||||
{
|
||||
int temp = x;
|
||||
x = y;
|
||||
y = temp;
|
||||
}
|
||||
inline int getPosition(int x, int y)
|
||||
{
|
||||
return x * n + y;
|
||||
}
|
||||
inline int getRow(int pos)
|
||||
{
|
||||
return pos / n;
|
||||
}
|
||||
inline int getColumn(int pos)
|
||||
{
|
||||
return pos % n;
|
||||
}
|
||||
void clearEdges()
|
||||
{
|
||||
shiftNumber = 0;
|
||||
edgeNumber = 0;
|
||||
memset(shiftHead, -1, sizeof(shiftHead));
|
||||
memset(edgeHead, -1, sizeof(edgeHead));
|
||||
}
|
||||
inline void addShift(int u, int v)
|
||||
{
|
||||
shift[shiftNumber].v = v;
|
||||
shift[shiftNumber].next = shiftHead[u];
|
||||
shiftHead[u] = shiftNumber ++;
|
||||
}
|
||||
inline void addEdge(int u, int v)
|
||||
{
|
||||
edge[edgeNumber].v = v;
|
||||
edge[edgeNumber].next = edgeHead[u];
|
||||
edgeHead[u] = edgeNumber ++;
|
||||
}
|
||||
void transpose()
|
||||
{
|
||||
for(int i=0; i<n; ++i)
|
||||
{
|
||||
for(int j=i+1; j<n; ++j)
|
||||
{
|
||||
swap(a[i][j], a[j][i]);
|
||||
swap(b[i][j], b[j][i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
void getDifference()
|
||||
{
|
||||
differ[al[0]] = 0;
|
||||
differNumber = 1;
|
||||
for(int i=1; i<nn; ++i)
|
||||
{
|
||||
if(al[i] != al[i-1])
|
||||
{
|
||||
differ[al[i]] = differNumber ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
void getNumberPosition()
|
||||
{
|
||||
memset(na, 0, sizeof(na));
|
||||
memset(nb, 0, sizeof(nb));
|
||||
for(int i=0; i<n; ++i)
|
||||
{
|
||||
for(int j=0; j<n; ++j)
|
||||
{
|
||||
pa[a[i][j]][na[a[i][j]]++] = getPosition(i, j);
|
||||
pb[b[i][j]][nb[b[i][j]]++] = getPosition(i, j);
|
||||
}
|
||||
}
|
||||
}
|
||||
bool isUnreachable()
|
||||
{
|
||||
sort(al, al + nn);
|
||||
sort(bl, bl + nn);
|
||||
for(int i=0; i<nn; ++i)
|
||||
{
|
||||
if(al[i] != bl[i])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool isReachableByOneStep()
|
||||
{
|
||||
for(int i=0; i<n; ++i)
|
||||
{
|
||||
for(int j=0; j<n; ++j)
|
||||
{
|
||||
ta[j] = a[i][j];
|
||||
tb[j] = b[i][j];
|
||||
}
|
||||
sort(ta, ta + n);
|
||||
sort(tb, tb + n);
|
||||
for(int j=0; j<n; ++j)
|
||||
{
|
||||
if(ta[j] != tb[j])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
int myStack[MAXN * MAXN * 8];
|
||||
int myStackTop;
|
||||
void push(int x)
|
||||
{
|
||||
myStack[myStackTop ++] = x;
|
||||
}
|
||||
int pop()
|
||||
{
|
||||
return myStack[-- myStackTop];
|
||||
}
|
||||
bool isEmpty()
|
||||
{
|
||||
return myStackTop == 0;
|
||||
}
|
||||
void dfs(int x, int depth)
|
||||
{
|
||||
int i, t;
|
||||
myStackTop = 0;
|
||||
start:
|
||||
dfn[x] = low[x] = index ++;
|
||||
inStack[x] = true;
|
||||
stack[top++] = x;
|
||||
for(i=edgeHead[x]; i!=-1; i=edge[i].next)
|
||||
{
|
||||
if(dfn[edge[i].v] == -1)
|
||||
{
|
||||
push(x);
|
||||
push(depth);
|
||||
push(i);
|
||||
push(t);
|
||||
x = edge[i].v;
|
||||
depth = depth + 1;
|
||||
goto start;
|
||||
ret:
|
||||
low[x] = min(low[x], low[edge[i].v]);
|
||||
}
|
||||
else if(inStack[edge[i].v])
|
||||
{
|
||||
low[x] = min(low[x] ,dfn[edge[i].v]);
|
||||
}
|
||||
}
|
||||
if(dfn[x] == low[x])
|
||||
{
|
||||
do
|
||||
{
|
||||
t = stack[--top];
|
||||
inStack[t] = false;
|
||||
belong[t] = componentNumber;
|
||||
}
|
||||
while(t != x);
|
||||
++ componentNumber;
|
||||
}
|
||||
if(isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
t = pop();
|
||||
i = pop();
|
||||
depth = pop();
|
||||
x = pop();
|
||||
goto ret;
|
||||
}
|
||||
void tarjan()
|
||||
{
|
||||
memset(inStack, false, sizeof(inStack));
|
||||
memset(dfn, -1, sizeof(dfn));
|
||||
memset(low, -1, sizeof(low));
|
||||
top = index = componentNumber = 0;
|
||||
for(int i=0; i<differNumber*2; ++i)
|
||||
{
|
||||
if(dfn[i] == -1)
|
||||
{
|
||||
dfs(i, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
bool isReachableByTwoStep()
|
||||
{
|
||||
clearEdges();
|
||||
for(int i=1; i<=maxNumber; ++i)
|
||||
{
|
||||
if(na[i] == 1)
|
||||
{
|
||||
addShift(getPosition(getRow(pa[i][0]), getColumn(pb[i][0])), differ[i]<<1);
|
||||
addShift(getPosition(getRow(pa[i][0]), getColumn(pb[i][0])), (differ[i]<<1) + 1);
|
||||
}
|
||||
else if(na[i] == 2)
|
||||
{
|
||||
addShift(getPosition(getRow(pa[i][0]), getColumn(pb[i][1])), differ[i]<<1);
|
||||
addShift(getPosition(getRow(pa[i][0]), getColumn(pb[i][0])), (differ[i]<<1) + 1);
|
||||
addShift(getPosition(getRow(pa[i][1]), getColumn(pb[i][0])), differ[i]<<1);
|
||||
addShift(getPosition(getRow(pa[i][1]), getColumn(pb[i][1])), (differ[i]<<1) + 1);
|
||||
}
|
||||
}
|
||||
for(int i=0; i<n; ++i)
|
||||
{
|
||||
for(int j=0; j<n; ++j)
|
||||
{
|
||||
for(int k=shiftHead[getPosition(i, j)]; k!=-1; k=shift[k].next)
|
||||
{
|
||||
for(int l=shift[k].next; l!=-1; l=shift[l].next)
|
||||
{
|
||||
if((shift[k].v ^ 1) == shift[l].v)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
addEdge(shift[k].v, shift[l].v ^ 1);
|
||||
addEdge(shift[l].v, shift[k].v ^ 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tarjan();
|
||||
for(int i=0; i<differNumber; ++i)
|
||||
{
|
||||
if(belong[i<<1] == belong[(i<<1)+1])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int caseNumber;
|
||||
scanf("%d", &caseNumber);
|
||||
for(int cas=1; cas<=caseNumber; ++cas)
|
||||
{
|
||||
scanf("%d%d%d", &n, &ca, &cb);
|
||||
nn = n * n;
|
||||
bool isSame = true;
|
||||
maxNumber = 0;
|
||||
for(int i=0,k=0; i<n; ++i)
|
||||
{
|
||||
for(int j=0; j<n; ++j)
|
||||
{
|
||||
scanf("%d", &a[i][j]);
|
||||
al[k++] = a[i][j];
|
||||
maxNumber = max(maxNumber, a[i][j]);
|
||||
}
|
||||
}
|
||||
for(int i=0,k=0; i<n; ++i)
|
||||
{
|
||||
for(int j=0; j<n; ++j)
|
||||
{
|
||||
scanf("%d", &b[i][j]);
|
||||
bl[k++] = b[i][j];
|
||||
if(a[i][j] != b[i][j])
|
||||
{
|
||||
isSame = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case #%d: ", cas);
|
||||
if(isSame)
|
||||
{
|
||||
printf("0\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isUnreachable())
|
||||
{
|
||||
printf("Take off the shoes!\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
int ans = min(ca * 2 + cb, cb * 2 + ca);
|
||||
if(isReachableByOneStep())
|
||||
{
|
||||
ans = ca;
|
||||
}
|
||||
transpose();
|
||||
if(ans > cb)
|
||||
{
|
||||
if(isReachableByOneStep())
|
||||
{
|
||||
ans = cb;
|
||||
}
|
||||
}
|
||||
if(ans > ca + cb)
|
||||
{
|
||||
getDifference();
|
||||
getNumberPosition();
|
||||
if(isReachableByTwoStep())
|
||||
{
|
||||
ans = ca + cb;
|
||||
}
|
||||
else
|
||||
{
|
||||
transpose();
|
||||
getNumberPosition();
|
||||
if(isReachableByTwoStep())
|
||||
{
|
||||
ans = ca + cb;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%d\n", ans);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
91
HDOJ/4307_autoAC.cpp
Normal file
91
HDOJ/4307_autoAC.cpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
#define MAXD 1010
|
||||
#define MAXM 2004010
|
||||
#define INF 0x7fffffff
|
||||
int N, first[MAXD], e, v[MAXM], next[MAXM], flow[MAXM];
|
||||
int S, T, d[MAXD], q[MAXD], work[MAXD];
|
||||
long long SUM;
|
||||
void add(int x, int y, int z)
|
||||
{
|
||||
v[e] = y, flow[e] = z;
|
||||
next[e] = first[x], first[x] = e ++;
|
||||
}
|
||||
void init()
|
||||
{
|
||||
int i, j, x, a;
|
||||
scanf("%d", &N);
|
||||
S = 0, T = N + 1;
|
||||
memset(first, -1, sizeof(first[0]) * (T + 1));
|
||||
SUM = e = 0;
|
||||
for(i = 1; i <= N; i ++)
|
||||
{
|
||||
a = 0;
|
||||
for(j = 1; j <= N; j ++)
|
||||
{
|
||||
scanf("%d", &x), a += x;
|
||||
add(i, j, x), add(j, i, 0);
|
||||
}
|
||||
SUM += a;
|
||||
add(S, i, a), add(i, S, 0);
|
||||
}
|
||||
for(i = 1; i <= N; i ++)
|
||||
{
|
||||
scanf("%d", &x);
|
||||
add(i, T, x), add(T, i, 0);
|
||||
}
|
||||
}
|
||||
int bfs()
|
||||
{
|
||||
int i, j, rear = 0;
|
||||
memset(d, -1, sizeof(d[0]) * (T + 1));
|
||||
d[S] = 0, q[rear ++] = S;
|
||||
for(i = 0; i < rear; i ++)
|
||||
for(j = first[q[i]]; j != -1; j = next[j])
|
||||
if(flow[j] && d[v[j]] == -1)
|
||||
{
|
||||
d[v[j]] = d[q[i]] + 1, q[rear ++] = v[j];
|
||||
if(v[j] == T) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int dfs(int cur, int a)
|
||||
{
|
||||
if(cur == T)
|
||||
return a;
|
||||
for(int &i = work[cur]; i != -1; i = next[i])
|
||||
if(flow[i] && d[v[i]] == d[cur] + 1)
|
||||
if(int t = dfs(v[i], std::min(a, flow[i])))
|
||||
{
|
||||
flow[i] -= t, flow[i ^ 1] += t;
|
||||
return t;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
long long dinic()
|
||||
{
|
||||
long long ans = 0;
|
||||
while(bfs())
|
||||
{
|
||||
memcpy(work, first, sizeof(first[0]) * (T + 1));
|
||||
while(int t = dfs(S, INF))
|
||||
ans += t;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
void solve()
|
||||
{
|
||||
printf("%lld\n", SUM - dinic());
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
scanf("%d", &t);
|
||||
while(t --)
|
||||
{
|
||||
init();
|
||||
solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
34
HDOJ/4310_autoAC.cpp
Normal file
34
HDOJ/4310_autoAC.cpp
Normal file
|
@ -0,0 +1,34 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
struct Node
|
||||
{
|
||||
int dps;
|
||||
int hp;
|
||||
}a[30];
|
||||
int cmp(Node x,Node y)
|
||||
{
|
||||
return x.hp*y.dps<y.hp*x.dps;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,i;
|
||||
int sum,ans;
|
||||
while(~scanf("%d",&t))
|
||||
{
|
||||
sum = ans = 0;
|
||||
for(i = 0;i<t;i++)
|
||||
{
|
||||
scanf("%d%d",&a[i].dps,&a[i].hp);
|
||||
sum+=a[i].dps;
|
||||
}
|
||||
sort(a,a+t,cmp);
|
||||
for(i = 0;i<t;i++)
|
||||
{
|
||||
ans+=sum*a[i].hp;
|
||||
sum-=a[i].dps;
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
55
HDOJ/4311_autoAC.cpp
Normal file
55
HDOJ/4311_autoAC.cpp
Normal file
|
@ -0,0 +1,55 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#define MAXN 100010
|
||||
using namespace std;
|
||||
struct point{long long x,y;}a[MAXN];
|
||||
bool cmp(point A,point B)
|
||||
{
|
||||
if(A.x<B.x) return true;
|
||||
if(A.x==B.x&&A.y<B.y) return true;
|
||||
return false;
|
||||
}
|
||||
long long ABS(long long A)
|
||||
{
|
||||
if(A<0) A=-A;
|
||||
return A;
|
||||
}
|
||||
long long work(int k,int n)
|
||||
{
|
||||
int i;
|
||||
long long ans=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
ans+=ABS(a[k].x-a[i].x);
|
||||
ans+=ABS(a[k].y-a[i].y);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int test,n,s,e,i;
|
||||
long long ans,t;
|
||||
scanf("%d",&test);
|
||||
while(test--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
scanf("%I64d%I64d",&a[i].x,&a[i].y);
|
||||
}
|
||||
sort(a,a+n,cmp);
|
||||
s=n/2-250;e=n/2+250;
|
||||
if(s<0) s=0;
|
||||
if(e>n-1) e=n-1;
|
||||
ans=1;ans<<=60;
|
||||
for(i=s;i<=e;i++)
|
||||
{
|
||||
t=work(i,n);
|
||||
if(ans>t) ans=t;
|
||||
}
|
||||
cout<<ans<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
59
HDOJ/4312_autoAC.cpp
Normal file
59
HDOJ/4312_autoAC.cpp
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
typedef long long int Int64;
|
||||
int N;
|
||||
struct Point
|
||||
{
|
||||
Int64 x, y, sum;
|
||||
}e[100005];
|
||||
bool cmpx(Point a, Point b)
|
||||
{
|
||||
return a.x < b.x;
|
||||
}
|
||||
bool cmpy(Point a, Point b)
|
||||
{
|
||||
return a.y < b.y;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T, t;
|
||||
Int64 sum, Min;
|
||||
scanf("%d", &T);
|
||||
while (T--) {
|
||||
Min = 1LL << 62;
|
||||
scanf("%d", &N);
|
||||
for (int i = 1; i <= N; ++i) {
|
||||
scanf("%I64d %I64d", &e[i].x, &e[i].y);
|
||||
t = e[i].x, e[i].x += e[i].y;
|
||||
e[i].y -= t, e[i].sum = 0;
|
||||
}
|
||||
sort(e+1, e+1+N, cmpx);
|
||||
sum = 0;
|
||||
for (int i = 1; i <= N; ++i) {
|
||||
e[i].sum += (i-1) * e[i].x - sum;
|
||||
sum += e[i].x;
|
||||
}
|
||||
sum = 0;
|
||||
for (int i = N; i >= 1; --i) {
|
||||
e[i].sum += sum - (N-i) * e[i].x;
|
||||
sum += e[i].x;
|
||||
}
|
||||
sort(e+1, e+1+N, cmpy);
|
||||
sum = 0;
|
||||
for (int i = 1; i <= N; ++i) {
|
||||
e[i].sum += (i-1) * e[i].y - sum;
|
||||
sum += e[i].y;
|
||||
}
|
||||
sum = 0;
|
||||
for (int i = N; i >= 1; --i) {
|
||||
e[i].sum += sum - (N-i) * e[i].y;
|
||||
Min = min(Min, e[i].sum);
|
||||
sum += e[i].y;
|
||||
}
|
||||
printf("%I64d\n", Min >> 1);
|
||||
}
|
||||
return 0;
|
||||
}
|
77
HDOJ/4313_autoAC.cpp
Normal file
77
HDOJ/4313_autoAC.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
const int maxn = 100010;
|
||||
int t, n, k;
|
||||
int mach[maxn], father[maxn];
|
||||
struct Edge {
|
||||
int u, v, c;
|
||||
}edge;
|
||||
vector<Edge> vv;
|
||||
bool cmp(Edge a, Edge b)
|
||||
{
|
||||
return a.c > b.c;
|
||||
}
|
||||
void initSet()
|
||||
{
|
||||
for (int i = 0; i < maxn; ++i) {
|
||||
father[i] = i;
|
||||
mach[i] = 0;
|
||||
}
|
||||
}
|
||||
int find(int x)
|
||||
{
|
||||
if (x != father[x]) {
|
||||
father[x] = find(father[x]);
|
||||
}
|
||||
return father[x];
|
||||
}
|
||||
void merge(int a, int b)
|
||||
{
|
||||
a = find(a);
|
||||
b = find(b);
|
||||
if (a == b) return ;
|
||||
if (a < b) {
|
||||
father[b] = a;
|
||||
mach[a] += mach[b];
|
||||
} else {
|
||||
father[a] = b;
|
||||
mach[b] += mach[a];
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
scanf("%d", &t);
|
||||
while (t--) {
|
||||
scanf("%d%d", &n, &k);
|
||||
vv.clear();
|
||||
initSet();
|
||||
int u, v, c;
|
||||
__int64 ans = 0;
|
||||
for (int i = 0; i < n - 1; ++i) {
|
||||
scanf("%d%d%d", &u, &v, &c);
|
||||
edge.u = u; edge.v = v; edge.c = c;
|
||||
vv.push_back(edge);
|
||||
ans += c;
|
||||
}
|
||||
for (int i = 0; i < k; ++i) {
|
||||
scanf("%d", &u);
|
||||
mach[u] = 1;
|
||||
}
|
||||
sort(vv.begin(), vv.end(), cmp);
|
||||
for (int i = 0; i < n - 1; ++i) {
|
||||
u = find(vv[i].u);
|
||||
v = find(vv[i].v);
|
||||
if (mach[u] + mach[v] <= 1) {
|
||||
merge(u, v);
|
||||
ans -= vv[i].c;
|
||||
}
|
||||
}
|
||||
printf("%I64d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
44
HDOJ/4314_autoAC.cpp
Normal file
44
HDOJ/4314_autoAC.cpp
Normal file
|
@ -0,0 +1,44 @@
|
|||
#include<iostream>
|
||||
#include<stdio.h>
|
||||
#include<algorithm>
|
||||
const int N=3000;
|
||||
const int inf=1e9;
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int a,b;
|
||||
void read(){ scanf("%d%d",&a,&b); }
|
||||
bool operator <(const node tmp)const { return a+b<tmp.a+tmp.b; }
|
||||
}no[N];
|
||||
int opt[N][N],n,h;
|
||||
int solve()
|
||||
{
|
||||
int sum=0;
|
||||
for(int i=1;i<=n;i++) sum+=no[i].a;
|
||||
for(int j=1;j<=n;j++) opt[0][j]=inf;
|
||||
opt[0][0]=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
opt[i][0]=0;
|
||||
for(int j=1;j<=n;j++){
|
||||
opt[i][j]=opt[i-1][j];
|
||||
if(sum-opt[i-1][j-1]+no[i].b>=h)
|
||||
opt[i][j]=min(opt[i][j],opt[i-1][j-1]+no[i].a);
|
||||
}
|
||||
}
|
||||
for(int j=n;j>=0;j--)
|
||||
if(opt[n][j]!=inf)
|
||||
return j;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d",&n)!=-1)
|
||||
{
|
||||
for(int i=1;i<=n;i++)
|
||||
no[i].read();
|
||||
scanf("%d",&h);
|
||||
sort(no+1,no+n+1);
|
||||
cout<<solve()<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
27
HDOJ/4315_autoAC.cpp
Normal file
27
HDOJ/4315_autoAC.cpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include<stdio.h>
|
||||
#define N 1001
|
||||
int n,k,a[N],i,tmp,sg;
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&k)!=-1)
|
||||
{
|
||||
a[0]=-1;
|
||||
for(i=1;i<=n;i++)
|
||||
scanf("%d",&a[i]);
|
||||
if(k==1)
|
||||
{
|
||||
puts("Alice");
|
||||
continue;
|
||||
}
|
||||
sg=0;
|
||||
for(i=n;i>0;i-=2)
|
||||
sg^=(tmp=a[i]-a[i-1]-1);
|
||||
if(n%2==1&&k==2)
|
||||
sg=sg^(tmp-1)^tmp;
|
||||
if(sg==0)
|
||||
puts("Bob");
|
||||
else
|
||||
puts("Alice");
|
||||
}
|
||||
return 0;
|
||||
}
|
216
HDOJ/4316_autoAC.cpp
Normal file
216
HDOJ/4316_autoAC.cpp
Normal file
|
@ -0,0 +1,216 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int MAXN = 1001;
|
||||
const double eps = 1e-12;
|
||||
int dblcmp(double x)
|
||||
{
|
||||
if(fabs(x) < eps)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return x > 0 ? 1 : -1;
|
||||
}
|
||||
struct Point
|
||||
{
|
||||
double x, y, z;
|
||||
inline void input2d()
|
||||
{
|
||||
scanf("%lf%lf",&x,&y);
|
||||
z = 100.0;
|
||||
}
|
||||
inline void input3d()
|
||||
{
|
||||
scanf("%lf%lf%lf",&x,&y,&z);
|
||||
}
|
||||
bool operator < (const Point &point) const
|
||||
{
|
||||
if(y == point.y)
|
||||
{
|
||||
return x < point.x;
|
||||
}
|
||||
return y < point.y;
|
||||
}
|
||||
}machine[MAXN], light[3], shadow[3][MAXN], final[MAXN * 3];
|
||||
int n, shadowNumber[3], shadowPoly[3][MAXN], shadowPolyTop[3], finalNumber;
|
||||
double operator * (const Point &x, const Point &y)
|
||||
{
|
||||
return x.x * y.y - x.y * y.x;
|
||||
}
|
||||
Point operator - (const Point &x, const Point &y)
|
||||
{
|
||||
Point r;
|
||||
r.x = x.x - y.x;
|
||||
r.y = x.y - y.y;
|
||||
return r;
|
||||
}
|
||||
bool operator == (const Point &a, const Point &b)
|
||||
{
|
||||
return fabs(a.x - b.x) < eps && fabs(a.y - b.y) < eps;
|
||||
}
|
||||
struct Line
|
||||
{
|
||||
Point a, b;
|
||||
double ang;
|
||||
}line[MAXN*3], stack[MAXN*3];
|
||||
int lineNumber, stackTop;
|
||||
bool operator < (const Line &x, const Line &y)
|
||||
{
|
||||
if(fabs(x.ang - y.ang) < eps)
|
||||
{
|
||||
return (y.b - x.a) * (x.b - y.a) > eps;
|
||||
}
|
||||
return x.ang < y.ang;
|
||||
}
|
||||
Point operator * (const Line &x, const Line &y)
|
||||
{
|
||||
double a1 = (y.b - x.a) * (y.a - x.a);
|
||||
double a2 = (y.a - x.b) * (y.b - x.b);
|
||||
Point r;
|
||||
r.x = (x.a.x * a2 + x.b.x * a1) / (a1 + a2);
|
||||
r.y = (x.a.y * a2 + x.b.y * a1) / (a1 + a2);
|
||||
return r;
|
||||
}
|
||||
bool mult(const Point &s, const Point &e, const Point &o)
|
||||
{
|
||||
return (s.x - o.x) * (e.y - o.y) >= (e.x - o.x) * (s.y - o.y);
|
||||
}
|
||||
void graham(Point p[], int n, int res[], int &top)
|
||||
{
|
||||
int len;
|
||||
top = 1;
|
||||
sort(p, p + n);
|
||||
if(n == 0) return;
|
||||
res[0] = 0;
|
||||
if(n == 1) return;
|
||||
res[1] = 1;
|
||||
if(n == 2) return;
|
||||
res[2] = 2;
|
||||
for(int i=2;i<n;++i)
|
||||
{
|
||||
while(top && mult(p[i], p[res[top]], p[res[top-1]]))
|
||||
{
|
||||
-- top;
|
||||
}
|
||||
res[++top] = i;
|
||||
}
|
||||
len = top;
|
||||
res[++top] = n - 2;
|
||||
for(int i=n-3;i>=0;--i)
|
||||
{
|
||||
while(top!=len && mult(p[i], p[res[top]], p[res[top-1]]))
|
||||
{
|
||||
-- top;
|
||||
}
|
||||
res[++top] = i;
|
||||
}
|
||||
}
|
||||
double cross(Point &a, Point &b, Point &o)
|
||||
{
|
||||
return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
|
||||
}
|
||||
bool judgeOut(const Line &x, const Point &p)
|
||||
{
|
||||
return (p - x.a) * (x.b - x.a) > eps;
|
||||
}
|
||||
bool isParellel(const Line &x, const Line &y)
|
||||
{
|
||||
return fabs((x.b - x.a) * (y.b - y.a)) < eps;
|
||||
}
|
||||
double getArea(Point p[], int n)
|
||||
{
|
||||
double ans = 0.0;
|
||||
for(int i=2;i<n;++i)
|
||||
{
|
||||
ans += fabs(cross(p[i], p[i-1], p[0]));
|
||||
}
|
||||
return ans * 0.5;
|
||||
}
|
||||
void halfPlane()
|
||||
{
|
||||
finalNumber = 0;
|
||||
sort(line, line + lineNumber);
|
||||
stackTop = 1;
|
||||
int bottom = 0, tmp = 1;
|
||||
for(int i=1;i<lineNumber;++i)
|
||||
{
|
||||
if(line[i].ang - line[i-1].ang > eps)
|
||||
{
|
||||
line[tmp++] = line[i];
|
||||
}
|
||||
}
|
||||
lineNumber = tmp;
|
||||
stack[0] = line[0], stack[1] = line[1];
|
||||
for(int i=2;i<lineNumber;++i)
|
||||
{
|
||||
if(isParellel(stack[stackTop], stack[stackTop-1]) || isParellel(stack[bottom], stack[bottom+1]))
|
||||
{
|
||||
return;
|
||||
}
|
||||
while(bottom < stackTop && judgeOut(line[i], stack[stackTop] * stack[stackTop - 1]))
|
||||
{
|
||||
-- stackTop;
|
||||
}
|
||||
while(bottom < stackTop && judgeOut(line[i], stack[bottom] * stack[bottom + 1]))
|
||||
{
|
||||
++ bottom;
|
||||
}
|
||||
stack[++stackTop] = line[i];
|
||||
}
|
||||
while(bottom < stackTop && judgeOut(stack[bottom], stack[stackTop] * stack[stackTop - 1]))
|
||||
{
|
||||
-- stackTop;
|
||||
}
|
||||
while(bottom < stackTop && judgeOut(stack[stackTop], stack[bottom] * stack[bottom + 1]))
|
||||
{
|
||||
++ bottom;
|
||||
}
|
||||
if(stackTop <= bottom + 1)
|
||||
{
|
||||
return;
|
||||
}
|
||||
stack[++stackTop] = stack[bottom];
|
||||
for(int i=bottom;i<stackTop;++i)
|
||||
{
|
||||
final[finalNumber ++] = stack[i] * stack[i+1];
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d", &n))
|
||||
{
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
machine[i].input3d();
|
||||
}
|
||||
for(int i=0;i<3;++i)
|
||||
{
|
||||
light[i].input2d();
|
||||
}
|
||||
lineNumber = 0;
|
||||
for(int i=0;i<3;++i)
|
||||
{
|
||||
shadowNumber[i] = 0;
|
||||
for(int j=0;j<n;++j)
|
||||
{
|
||||
shadow[i][j].x = 100.0 * (light[i].x - machine[j].x) / (machine[j].z - 100.0) + light[i].x;
|
||||
shadow[i][j].y = 100.0 * (light[i].y - machine[j].y) / (machine[j].z - 100.0) + light[i].y;
|
||||
}
|
||||
graham(shadow[i], n, shadowPoly[i], shadowPolyTop[i]);
|
||||
shadowPoly[i][shadowPolyTop[i]] = shadowPoly[i][0];
|
||||
for(int j=0;j<shadowPolyTop[i];++j)
|
||||
{
|
||||
line[lineNumber].a = shadow[i][shadowPoly[i][j]];
|
||||
line[lineNumber].b = shadow[i][shadowPoly[i][j+1]];
|
||||
line[lineNumber].ang = atan2(line[lineNumber].b.y - line[lineNumber].a.y,
|
||||
line[lineNumber].b.x - line[lineNumber].a.x);
|
||||
++ lineNumber;
|
||||
}
|
||||
}
|
||||
halfPlane();
|
||||
printf("%.2lf\n", getArea(final, finalNumber));
|
||||
}
|
||||
return 0;
|
||||
}
|
79
HDOJ/4317_autoAC.cpp
Normal file
79
HDOJ/4317_autoAC.cpp
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int M=1<<11;
|
||||
const int MAX=0x1f1f1f1f;
|
||||
int s[25],dp[25][M];
|
||||
int t[M];
|
||||
int a[11];
|
||||
int main()
|
||||
{
|
||||
int N,i,j,k,len,tmp,r;
|
||||
for(i=0;i<M;i++)
|
||||
{
|
||||
tmp=0;
|
||||
j=i;
|
||||
while(j!=0)
|
||||
{
|
||||
tmp+=(j&1);
|
||||
j=j>>1;
|
||||
}
|
||||
t[i]=tmp;
|
||||
}
|
||||
while(scanf("%d",&N)!=EOF)
|
||||
{
|
||||
memset(s,0,sizeof(s));;
|
||||
for(i=0;i<N;i++)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
}
|
||||
if(N<2)
|
||||
{
|
||||
printf("impossible\n");
|
||||
continue;
|
||||
}
|
||||
for(i=1;i<=22;i++)
|
||||
{
|
||||
for(j=0;j<N;j++)
|
||||
{
|
||||
if(a[j]&(1<<(i-1)))
|
||||
{
|
||||
s[i]|=(1<<j);
|
||||
}
|
||||
}
|
||||
if(s[i]!=0)
|
||||
len=i+1;
|
||||
}
|
||||
memset(dp,MAX,sizeof(dp));
|
||||
dp[0][0]=0;
|
||||
for(r=1;r<=len;r++)
|
||||
{
|
||||
for(j=0;j<(1<<N);j++)
|
||||
{
|
||||
if(dp[r-1][j]<MAX)
|
||||
{
|
||||
tmp=j&s[r];
|
||||
for(k=tmp;k<(1<<N);k++)
|
||||
{
|
||||
if((k&tmp)==tmp&&
|
||||
((s[r]^j)&(k^tmp))==(k^tmp)&&
|
||||
((t[(s[r]^j)^(k^tmp)]&1)==0||t[(s[r]^j)^(k^tmp)]<N))
|
||||
{
|
||||
dp[r][k]=min(dp[r][k],dp[r-1][j]+(t[k^tmp]+(t[(s[r]^j)^(k^tmp)]&1))*(1<<(r-1)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int Min=MAX;
|
||||
for(j=0;j<(1<<N);j++)
|
||||
{
|
||||
if((s[j]&1)==0)
|
||||
Min=min(Min,dp[len][j]);
|
||||
}
|
||||
printf("%d\n",Min);
|
||||
}
|
||||
return 0;
|
||||
}
|
56
HDOJ/4318_autoAC.cpp
Normal file
56
HDOJ/4318_autoAC.cpp
Normal file
|
@ -0,0 +1,56 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
struct p
|
||||
{
|
||||
int a[50][2];
|
||||
}p[50010];
|
||||
double b[51000];
|
||||
queue<int> q;
|
||||
int s,t,n;
|
||||
double m;
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d",&n)!=EOF)
|
||||
{
|
||||
memset(p,-1,sizeof(p));
|
||||
for(int i=0;i<51000;i++)
|
||||
b[i]=-1;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
int x;
|
||||
scanf("%d",&x);
|
||||
for(int j=0;j<x;j++)
|
||||
{
|
||||
scanf("%d",&p[i].a[j][0]);
|
||||
scanf("%d",&p[i].a[j][1]);
|
||||
}
|
||||
}
|
||||
scanf("%d%d%lf",&s,&t,&m);
|
||||
b[s]=0;
|
||||
q.push(s);
|
||||
int hd;
|
||||
while(!q.empty())
|
||||
{
|
||||
hd=q.front();
|
||||
q.pop();
|
||||
for(int i=0;i<50;i++)
|
||||
{
|
||||
if(p[hd].a[i][0]==hd)
|
||||
continue;
|
||||
if(p[hd].a[i][0]!=-1&&(b[p[hd].a[i][0]]+1<1e-8||b[p[hd].a[i][0]]>b[hd]+(100.0-b[hd])*p[hd].a[i][1]/100))
|
||||
{
|
||||
q.push(p[hd].a[i][0]);
|
||||
b[p[hd].a[i][0]]=b[hd]+(100.0-b[hd])*p[hd].a[i][1]/100;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(b[t]+1<1e-8)
|
||||
cout<<"IMPOSSIBLE!\n";
|
||||
else
|
||||
printf("%.2lf\n",m*b[t]/100);
|
||||
}
|
||||
return 0;
|
||||
}
|
183
HDOJ/4319_autoAC.cpp
Normal file
183
HDOJ/4319_autoAC.cpp
Normal file
|
@ -0,0 +1,183 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
const int MAXN = 100010;
|
||||
struct Point
|
||||
{
|
||||
__int64 x, y;
|
||||
}point[MAXN], high[2][MAXN], low[2][MAXN], merge[MAXN * 2];
|
||||
int pointNumber, highNumber[2], lowNumber[2], mergeNumber;
|
||||
int n, stack[MAXN], top;
|
||||
__int64 a[MAXN];
|
||||
Point operator + (const Point &a, const Point &b)
|
||||
{
|
||||
Point r;
|
||||
r.x = a.x + b.x;
|
||||
r.y = a.y + b.y;
|
||||
return r;
|
||||
}
|
||||
Point operator - (const Point &a, const Point &b)
|
||||
{
|
||||
Point r;
|
||||
r.x = a.x - b.x;
|
||||
r.y = a.y - b.y;
|
||||
return r;
|
||||
}
|
||||
inline __int64 operator * (const Point &a, const Point &b)
|
||||
{
|
||||
return a.x * b.y - a.y * b.x;
|
||||
}
|
||||
inline __int64 absolute(int x)
|
||||
{
|
||||
return x >= 0 ? x : -x;
|
||||
}
|
||||
inline double max(const double &x, const double &y)
|
||||
{
|
||||
return x > y ? x : y;
|
||||
}
|
||||
inline __int64 cross(const Point &a, const Point &b, const Point &o)
|
||||
{
|
||||
return (a - o) * (b - o);
|
||||
}
|
||||
void getBound(Point result[], int &resultNumber, bool isHigh)
|
||||
{
|
||||
if(pointNumber == 1)
|
||||
{
|
||||
result[0] = point[0];
|
||||
resultNumber = 1;
|
||||
return;
|
||||
}
|
||||
stack[0] = 0;
|
||||
stack[1] = 1;
|
||||
top = 2;
|
||||
if(isHigh)
|
||||
{
|
||||
for(int i=2;i<pointNumber;++i)
|
||||
{
|
||||
while(top >= 2 && cross(point[stack[top-2]], point[i], point[stack[top-1]]) < 0)
|
||||
{
|
||||
-- top;
|
||||
}
|
||||
stack[top++] = i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int i=2;i<pointNumber;++i)
|
||||
{
|
||||
while(top >= 2 && cross(point[stack[top-2]], point[i], point[stack[top-1]]) > 0)
|
||||
{
|
||||
-- top;
|
||||
}
|
||||
stack[top++] = i;
|
||||
}
|
||||
}
|
||||
resultNumber = top;
|
||||
for(int i=0;i<top;++i)
|
||||
{
|
||||
result[i].x = point[stack[i]].x;
|
||||
result[i].y = point[stack[i]].y;
|
||||
}
|
||||
}
|
||||
void mergeBound(Point p1[], int len1, Point p2[], int len2, bool isHigh)
|
||||
{
|
||||
merge[mergeNumber++] = p1[0] + p2[0];
|
||||
int pNum1 = 1, pNum2 = 1;
|
||||
while(pNum1 < len1 || pNum2 < len2)
|
||||
{
|
||||
if(pNum1 == len1)
|
||||
{
|
||||
merge[mergeNumber++] = p1[pNum1 - 1] + p2[pNum2 ++];
|
||||
}
|
||||
else if(pNum2 == len2)
|
||||
{
|
||||
merge[mergeNumber++] = p1[pNum1 ++] + p2[pNum2 - 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
Point temp0 = p1[pNum1 - 1] + p2[pNum2 - 1];
|
||||
Point temp1 = p1[pNum1] + p2[pNum2 - 1];
|
||||
Point temp2 = p1[pNum1 - 1] + p2[pNum2];
|
||||
if(isHigh)
|
||||
{
|
||||
if(cross(temp1, temp2, temp0) < 0)
|
||||
{
|
||||
merge[mergeNumber++] = temp1;
|
||||
++ pNum1;
|
||||
}
|
||||
else
|
||||
{
|
||||
merge[mergeNumber++] = temp2;
|
||||
++ pNum2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(cross(temp1, temp2, temp0) > 0)
|
||||
{
|
||||
merge[mergeNumber++] = temp1;
|
||||
++ pNum1;
|
||||
}
|
||||
else
|
||||
{
|
||||
merge[mergeNumber++] = temp2;
|
||||
++ pNum2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
double solve(int l, int r)
|
||||
{
|
||||
if(l == r)
|
||||
{
|
||||
return absolute(a[l]);
|
||||
}
|
||||
int mid = (l + r) >> 1;
|
||||
double ansL = solve(l, mid);
|
||||
double ansR = solve(mid + 1, r);
|
||||
double ans = max(ansL, ansR);
|
||||
__int64 sum = 0;
|
||||
pointNumber = 0;
|
||||
for(int i=mid;i>=l;--i)
|
||||
{
|
||||
sum += a[i];
|
||||
point[pointNumber].x = mid - i + 1;
|
||||
point[pointNumber].y = sum;
|
||||
++ pointNumber;
|
||||
}
|
||||
getBound(high[0], highNumber[0], true);
|
||||
getBound(low[0], lowNumber[0], false);
|
||||
sum = 0;
|
||||
pointNumber = 0;
|
||||
for(int i=mid+1;i<=r;++i)
|
||||
{
|
||||
sum += a[i];
|
||||
point[pointNumber].x = i - mid;
|
||||
point[pointNumber].y = sum;
|
||||
++ pointNumber;
|
||||
}
|
||||
getBound(high[1], highNumber[1], true);
|
||||
getBound(low[1], lowNumber[1], false);
|
||||
mergeNumber = 0;
|
||||
mergeBound(high[0], highNumber[0], high[1], highNumber[1], true);
|
||||
mergeBound(low[0], lowNumber[0], low[1], lowNumber[1], false);
|
||||
for(int i=0;i<mergeNumber;++i)
|
||||
{
|
||||
ans = max(ans, fabs((double)merge[i].y) / sqrt((double)merge[i].x));
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d", &n))
|
||||
{
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
scanf("%I64d", &a[i]);
|
||||
}
|
||||
double ans = solve(0, n - 1);
|
||||
printf("%.6lf\n", ans * ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
57
HDOJ/4320_autoAC.cpp
Normal file
57
HDOJ/4320_autoAC.cpp
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
typedef long long int Int64;
|
||||
int p[1000005], rec[100005], cnt;
|
||||
void getprime()
|
||||
{
|
||||
int k;
|
||||
for (int i = 4; i <= 1000000; i += 2) {
|
||||
p[i] = 1;
|
||||
}
|
||||
for (int i = 3; i <= 1000; i += 2) {
|
||||
k = 2 * i;
|
||||
for (int j = i * i; j <= 1000000; j += k) {
|
||||
p[j] = 1;
|
||||
}
|
||||
}
|
||||
rec[1] = 2;
|
||||
cnt = 1;
|
||||
for (int i = 3; i <= 1000000; i += 2) {
|
||||
if (!p[i]) {
|
||||
rec[++cnt] = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T, LIM, flag, ca = 0;
|
||||
Int64 a, b;
|
||||
getprime();
|
||||
scanf("%d", &T);
|
||||
while (T--) {
|
||||
flag = 0;
|
||||
scanf("%I64d %I64d", &a, &b);
|
||||
LIM = (int)sqrt(double(a));
|
||||
for (int i = 1; rec[i] <= LIM; ++i) {
|
||||
if (a % rec[i] == 0) {
|
||||
if (b % rec[i] != 0) {
|
||||
flag = 1;
|
||||
break;
|
||||
}
|
||||
while (a % rec[i] == 0) {
|
||||
a /= rec[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (a != 1 && b % a != 0) {
|
||||
flag = 1;
|
||||
}
|
||||
printf("Case #%d: ", ++ca);
|
||||
printf(flag ? "NO\n" : "YES\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
48
HDOJ/4321_autoAC.cpp
Normal file
48
HDOJ/4321_autoAC.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
void Solve(LL a,LL b,LL n)
|
||||
{
|
||||
LL cnt=0;
|
||||
LL max=b+a*n;
|
||||
for(LL i=0;i<64;i++)
|
||||
{
|
||||
LL m=(LL)1<<i;
|
||||
LL mm=m;
|
||||
if(m>max) break;
|
||||
m<<=1;
|
||||
LL cur=a+b;
|
||||
LL j=0;
|
||||
while(j<m&&j<n)
|
||||
{
|
||||
LL upper=cur+(mm-(cur%mm))-(LL)1;
|
||||
LL step=(upper-cur)/a+(LL)1;
|
||||
if(j+step>=n) step=n-j;
|
||||
if(j+step>=m) step=m-j;
|
||||
if(cur&(LL)1<<i)
|
||||
{
|
||||
cnt+=step*(n/m);
|
||||
if(j+step<(n%m)) cnt+=step;
|
||||
else if(j<(n%m)) cnt+=(n%m)-j;
|
||||
}
|
||||
cur+=a*step;
|
||||
j+=step;
|
||||
}
|
||||
}
|
||||
cout<<cnt<<endl;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,k=1;
|
||||
LL a,b,n,i,j;
|
||||
cin>>t;
|
||||
while(t--)
|
||||
{
|
||||
cin>>a>>b>>n;
|
||||
cout<<"Case #"<<k++<<": ";
|
||||
Solve(a,b,n);
|
||||
}
|
||||
return 0;
|
||||
}
|
115
HDOJ/4323_autoAC.cpp
Normal file
115
HDOJ/4323_autoAC.cpp
Normal file
|
@ -0,0 +1,115 @@
|
|||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<string.h>
|
||||
#include<iostream>
|
||||
#include<vector>
|
||||
#include<string>
|
||||
#include<math.h>
|
||||
#include<map>
|
||||
#include<set>
|
||||
#include<stack>
|
||||
#include<queue>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
int dp[40][40];
|
||||
char s1[100], s2[100], st[10010][30];
|
||||
const int inf = 0x7f7f7f7f;
|
||||
struct node
|
||||
{
|
||||
char word[30];
|
||||
node *next[30];
|
||||
}root;
|
||||
node p[100000];
|
||||
int num, flag, vnum, fuck;
|
||||
map<string,int>mp;
|
||||
int f[100000];
|
||||
void init( )
|
||||
{
|
||||
for( int i = 0; i < 40; i++)
|
||||
for( int j = 0; j < 40; j++)
|
||||
dp[i][j] = inf;
|
||||
}
|
||||
int diff( char *s1, char *s2)
|
||||
{
|
||||
init();
|
||||
int x = strlen(s1+1);
|
||||
int y = strlen(s2+1);
|
||||
for( int i = 0; i <= x; i++)
|
||||
dp[i][0] = i;
|
||||
for( int j = 0; j <= y; j++)
|
||||
dp[0][j] = j;
|
||||
for( int i = 1; i <= x; i++)
|
||||
{
|
||||
for( int j = 1; j <= y; j++)
|
||||
{
|
||||
dp[i][j] = min(min(dp[i-1][j]+1, dp[i][j-1]+1), dp[i-1][j-1]+ !(s1[i]==s2[j]) );
|
||||
}
|
||||
}
|
||||
return dp[x][y];
|
||||
}
|
||||
void insert(node *q, char *str)
|
||||
{
|
||||
node *l = q;
|
||||
while( l )
|
||||
{
|
||||
int dis = diff( l->word, str);
|
||||
if( ! l->next[dis] )
|
||||
{
|
||||
l->next[dis] = &p[num++];
|
||||
strcpy(l->next[dis]->word + 1, str + 1);
|
||||
break;
|
||||
}
|
||||
l = l->next[dis];
|
||||
}
|
||||
}
|
||||
void sfind(node *q, char *str, int d)
|
||||
{
|
||||
if( flag )
|
||||
return ;
|
||||
node *l = q;
|
||||
if( l == NULL )
|
||||
return;
|
||||
int dis = diff(str, l->word);
|
||||
if( dis <= d )
|
||||
{
|
||||
fuck++;
|
||||
}
|
||||
for( int x = dis-d; x <= dis+d; x++)
|
||||
{
|
||||
if( x >= 0 && x <= 20 && l->next[x] )
|
||||
sfind(l->next[x], str, d);
|
||||
}
|
||||
}
|
||||
int main( )
|
||||
{
|
||||
int N, M, d, cnt, T, abc = 1;
|
||||
char str[1000];
|
||||
scanf("%d",&T);
|
||||
while( T-- )
|
||||
{
|
||||
scanf("%d%d",&N,&M);
|
||||
memset(p,0,sizeof(p));
|
||||
for( int i = 0; i < 30; i++)
|
||||
root.next[i] = NULL;
|
||||
num = 0;
|
||||
int cnum = 1;
|
||||
strcpy(st[0] + 1, root.word+1);
|
||||
for( int i = 1; i <= N; i++)
|
||||
{
|
||||
scanf("%s",st[i]+1);
|
||||
insert(&root, st[i]);
|
||||
}
|
||||
d = 1;
|
||||
printf("Case #%d:\n", abc++);
|
||||
for( int i = 1; i <= M; i++)
|
||||
{
|
||||
vnum = 0;
|
||||
flag = 0;
|
||||
fuck = 0;
|
||||
scanf("%s%d",str+1, &d);
|
||||
sfind(&root, str, d);
|
||||
printf("%d\n", fuck);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
42
HDOJ/4324_autoAC.cpp
Normal file
42
HDOJ/4324_autoAC.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
const int N=2010;
|
||||
int n,indeg[N];
|
||||
char str[N][N];
|
||||
int main(){
|
||||
int t,cases=0;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
scanf("%d",&n);
|
||||
int flag=0;
|
||||
memset(indeg,0,sizeof(indeg));
|
||||
int i,j;
|
||||
for(i=0;i<n;i++){
|
||||
scanf("%s",str[i]);
|
||||
for(j=0;j<n;j++)
|
||||
if(str[i][j]=='1')
|
||||
indeg[j]++;
|
||||
}
|
||||
for(i=0;i<n;i++){
|
||||
for(j=0;j<n;j++)
|
||||
if(indeg[j]==0)
|
||||
break;
|
||||
if(j==n){
|
||||
flag=1;
|
||||
break;
|
||||
}else{
|
||||
indeg[j]--;
|
||||
for(int k=0;k<n;k++)
|
||||
if(str[j][k]=='1')
|
||||
indeg[k]--;
|
||||
}
|
||||
}
|
||||
if(flag)
|
||||
printf("Case #%d: Yes\n",++cases);
|
||||
else
|
||||
printf("Case #%d: No\n",++cases);
|
||||
}
|
||||
return 0;
|
||||
}
|
74
HDOJ/4325_autoAC.cpp
Normal file
74
HDOJ/4325_autoAC.cpp
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define lson u<<1
|
||||
#define rson u<<1|1
|
||||
const int maxn=100010;
|
||||
int st[maxn],ed[maxn];
|
||||
int q[maxn],dat[maxn<<1];
|
||||
struct Node{
|
||||
int lef,rig,delta;
|
||||
}T[maxn<<2];
|
||||
void Build(int u,int l,int r){
|
||||
T[u].lef=l;
|
||||
T[u].rig=r;
|
||||
T[u].delta=0;
|
||||
if(l==r)return;
|
||||
int mid=(l+r)>>1;
|
||||
Build(lson,l,mid);
|
||||
Build(rson,mid+1,r);
|
||||
}
|
||||
void PushDown(int u){
|
||||
if(T[u].delta>0){
|
||||
T[lson].delta+=T[u].delta;
|
||||
T[rson].delta+=T[u].delta;
|
||||
T[u].delta=0;
|
||||
}
|
||||
}
|
||||
void Update(int u,int l,int r){
|
||||
if(l<=T[u].lef&&T[u].rig<=r){T[u].delta++;return;}
|
||||
else {
|
||||
PushDown(u);
|
||||
if(l<=T[lson].rig)Update(lson,l,r);
|
||||
if(r>=T[rson].lef)Update(rson,l,r);
|
||||
}
|
||||
}
|
||||
int Query(int u,int index){
|
||||
if(T[u].lef==T[u].rig)return T[u].delta;
|
||||
else {
|
||||
PushDown(u);
|
||||
if(index<=T[lson].rig)return Query(lson,index);
|
||||
else return Query(rson,index);
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
int t,n,m;
|
||||
int cnt;
|
||||
scanf("%d",&t);
|
||||
for(int cas=1;cas<=t;cas++){
|
||||
scanf("%d%d",&n,&m);
|
||||
cnt=0;
|
||||
for(int i=1;i<=n;i++){
|
||||
scanf("%d%d",&st[i],&ed[i]);
|
||||
dat[cnt++]=st[i];
|
||||
dat[cnt++]=ed[i];
|
||||
}
|
||||
for(int i=1;i<=m;i++){
|
||||
scanf("%d",&q[i]);
|
||||
dat[cnt++]=q[i];
|
||||
}
|
||||
sort(dat,dat+cnt);
|
||||
cnt=unique(dat,dat+cnt)-dat;
|
||||
Build(1,1,cnt);
|
||||
for(int i=1;i<=n;i++){
|
||||
st[i]=lower_bound(dat,dat+cnt,st[i])-dat+1;
|
||||
ed[i]=lower_bound(dat,dat+cnt,ed[i])-dat+1;
|
||||
Update(1,st[i],ed[i]);
|
||||
}
|
||||
printf("Case #%d:\n",cas);
|
||||
for(int i=1;i<=m;i++){
|
||||
q[i]=lower_bound(dat,dat+cnt,q[i])-dat+1;
|
||||
printf("%d\n",Query(1,q[i]));
|
||||
}
|
||||
}
|
||||
}
|
102
HDOJ/4326_autoAC.cpp
Normal file
102
HDOJ/4326_autoAC.cpp
Normal file
|
@ -0,0 +1,102 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cstdlib>
|
||||
#include<cmath>
|
||||
using namespace std;
|
||||
#define maxn 102
|
||||
#define eps 1e-10
|
||||
double g[maxn][maxn];
|
||||
double x[maxn];
|
||||
int n,m,k;
|
||||
void add(int cnt,int i,int j,double val)
|
||||
{
|
||||
int t=i*n+j;
|
||||
if(i==m)
|
||||
{
|
||||
if(j==1)
|
||||
g[cnt][m*n+1]+=-1.0*val;
|
||||
return;
|
||||
}
|
||||
g[cnt][t]+=val;
|
||||
}
|
||||
void gauss(int n,int m)
|
||||
{
|
||||
int row,col,i,j,k;
|
||||
for(row=1,col=1;row<n,col<m;row++,col++)
|
||||
{
|
||||
k=row;
|
||||
for(i=row+1;i<=n;i++)
|
||||
if(fabs(g[i][col])>fabs(g[k][col]))
|
||||
k=i;
|
||||
if(k!=row)
|
||||
{
|
||||
for(i=col; i<=m; i++)
|
||||
swap(g[k][i],g[row][i]);
|
||||
}
|
||||
for(i=row+1; i<=n; i++)
|
||||
{
|
||||
if(fabs(g[i][col])<eps)
|
||||
continue;
|
||||
double t=g[i][col]/g[row][col];
|
||||
g[i][col]=0.0;
|
||||
for(j=col+1;j<=m;j++)
|
||||
g[i][j]-=t*g[row][j];
|
||||
}
|
||||
}
|
||||
for(i=n;i>=1;i--)
|
||||
{
|
||||
x[i]=g[i][m];
|
||||
for(j=i+1;j<=n;j++)
|
||||
x[i]-=x[j]*g[i][j];
|
||||
x[i]/=g[i][i];
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,cs,nn=0;
|
||||
scanf("%d",&cs);
|
||||
while(cs--){
|
||||
scanf("%d%d%d",&n,&m,&k);
|
||||
memset(g,0,sizeof(g));
|
||||
int cnt=0;
|
||||
for(i=0;i<m;i++)
|
||||
for(j=1;j<=n;j++)
|
||||
{
|
||||
cnt++;
|
||||
add(cnt,i,j,1.0);
|
||||
if(j==1)
|
||||
{
|
||||
add(cnt,i+1,j,-0.25);
|
||||
add(cnt,1,n-2,-0.75);
|
||||
}
|
||||
else if(j==2)
|
||||
{
|
||||
add(cnt,i+1,n-2,-0.25);
|
||||
add(cnt,1,1,-0.25);
|
||||
add(cnt,1,n-1,-0.5);
|
||||
}
|
||||
else if(j==3)
|
||||
{
|
||||
add(cnt,i+1,n-1,-0.25);
|
||||
add(cnt,1,1,-0.25);
|
||||
add(cnt,1,n-1,-0.25);
|
||||
add(cnt,1,n,-0.25);
|
||||
}
|
||||
else if(j==4)
|
||||
{
|
||||
add(cnt,i+1,n,-0.25);
|
||||
add(cnt,1,n,-0.5);
|
||||
add(cnt,1,1,-0.25);
|
||||
}
|
||||
else
|
||||
{
|
||||
add(cnt,i+1,j-3,-0.25);
|
||||
add(cnt,1,j-3,-0.75);
|
||||
}
|
||||
}
|
||||
gauss(cnt,cnt+1);
|
||||
printf("Case #%d: %.6lf\n",++nn,x[k]);
|
||||
}
|
||||
return 0;
|
||||
}
|
161
HDOJ/4327_autoAC.cpp
Normal file
161
HDOJ/4327_autoAC.cpp
Normal file
|
@ -0,0 +1,161 @@
|
|||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const double INF = 1000000000.0;
|
||||
const int maxn = 1010;
|
||||
const double eps = 1e-12;
|
||||
inline double sgn(double x) {return fabs(x)<eps?0:(x>0?1:-1);}
|
||||
struct Point{
|
||||
double x,y;
|
||||
Point(double tx=0,double ty=0){x=tx;y=ty;}
|
||||
bool operator == (const Point& t) const {
|
||||
return sgn(x-t.x)==0 && sgn(y-t.y)==0;
|
||||
}
|
||||
Point operator - (const Point& t) const {
|
||||
Point tmp;
|
||||
tmp.x = x - t.x;
|
||||
tmp.y = y - t.y;
|
||||
return tmp;
|
||||
}
|
||||
}p[maxn],tmp[maxn],pp[maxn],GP;
|
||||
struct Seg{Point s,e;};
|
||||
struct Line {
|
||||
double a, b, c;
|
||||
};
|
||||
double cross(Point a,Point b,Point c){return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}
|
||||
inline Point intersect(Point x,Point y,double a,double b,double c){
|
||||
double u = fabs(a * x.x + b * x.y + c);
|
||||
double v = fabs(a * y.x + b * y.y + c);
|
||||
return Point( (x.x * v + y.x * u) / (u + v) , (x.y * v + y.y * u) / (u + v) );
|
||||
}
|
||||
int n,ban_tot;
|
||||
void CUT1(double a,double b,double c){
|
||||
int i,tot=0;
|
||||
for(int i = 1; i <= ban_tot; ++i){
|
||||
if(a*p[i].x + b*p[i].y + c >= eps) pp[++tot] = p[i];
|
||||
else {
|
||||
if(a*p[i-1].x + b*p[i-1].y + c > eps){
|
||||
pp[++tot] = intersect(p[i],p[i-1],a,b,c);
|
||||
}
|
||||
if(a*p[i+1].x + b*p[i+1].y + c > eps){
|
||||
pp[++tot] = intersect(p[i],p[i+1],a,b,c);
|
||||
}
|
||||
}
|
||||
} ban_tot=tot;
|
||||
pp[tot+1]=pp[1];pp[0]=pp[tot];
|
||||
memcpy(p,pp,sizeof(pp));
|
||||
}
|
||||
void CUT2(double a,double b,double c){
|
||||
int i,tot=0;
|
||||
for(int i = 1; i <= ban_tot; ++i){
|
||||
if(!(a*p[i].x + b*p[i].y + c > eps) ) pp[++tot] = p[i];
|
||||
else {
|
||||
if(a*p[i-1].x + b*p[i-1].y + c < -eps){
|
||||
pp[++tot] = intersect(p[i],p[i-1],a,b,c);
|
||||
}
|
||||
if(a*p[i+1].x + b*p[i+1].y + c < -eps){
|
||||
pp[++tot] = intersect(p[i],p[i+1],a,b,c);
|
||||
}
|
||||
}
|
||||
} ban_tot=tot;
|
||||
pp[tot+1]=pp[1];pp[0]=pp[tot];
|
||||
memcpy(p,pp,sizeof(pp));
|
||||
}
|
||||
Line Turn(Point s, Point e) {
|
||||
Line ln;
|
||||
ln.a = s.y - e.y;
|
||||
ln.b = e.x - s.x;
|
||||
ln.c = s.x*e.y - e.x*s.y;
|
||||
return ln;
|
||||
}
|
||||
Line make(Point a,Point b)
|
||||
{
|
||||
double x0=(a.x+b.x)/2;
|
||||
double y0=(a.y+b.y)/2;
|
||||
Line tmp=Turn(a,b);
|
||||
Line ans;
|
||||
ans.a=tmp.b;
|
||||
ans.b=-tmp.a;
|
||||
ans.c=tmp.a*y0-tmp.b*x0;
|
||||
return ans;
|
||||
}
|
||||
Line ln[maxn];
|
||||
inline double PPdis(Point a, Point b) {
|
||||
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
|
||||
}
|
||||
inline double PLdis(Point p,Point l1,Point l2){
|
||||
return fabs(cross(p,l1,l2))/PPdis(l1,l2);
|
||||
}
|
||||
double calc(Point *p,int n)
|
||||
{
|
||||
if(n<3) return 0;
|
||||
double area=0,V=0;
|
||||
for(int i=0;i<n;i++) area+=p[(i+1)%n].y*(p[i].x-p[(i+2)%n].x);
|
||||
area/=2;
|
||||
area=fabs(area);
|
||||
double H=10;
|
||||
int pos=0;
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
if(2-p[i].x-p[i].y<H)
|
||||
{
|
||||
H=2-p[i].x-p[i].y;
|
||||
pos=i;
|
||||
}
|
||||
}
|
||||
V+=area*H;
|
||||
for(int i=pos+1;;i++)
|
||||
{
|
||||
int id1=i%n;
|
||||
int id2=(i+1)%n;
|
||||
if(id2==pos) break;
|
||||
double h=PLdis(p[pos],p[id1],p[id2]);
|
||||
double s=((2-p[id1].x-p[id1].y-H) + (2-p[id2].x-p[id2].y-H)) * PPdis(p[id1],p[id2])/2;
|
||||
V+=s*h/3;
|
||||
}
|
||||
return V;
|
||||
}
|
||||
double ans[110];
|
||||
int main(){
|
||||
int t,ca=1,n;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
for(int i=1;i<=n;i++) scanf("%lf%lf",&tmp[i].x,&tmp[i].y);
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
p[1]=Point(0,0);
|
||||
p[2]=Point(0,1);
|
||||
p[3]=Point(1,1);
|
||||
p[4]=Point(1,0);
|
||||
p[0]=p[4];
|
||||
p[5]=p[1];
|
||||
ban_tot=4;
|
||||
double x0=tmp[i].x,y0=tmp[i].y;
|
||||
for(int j=1;j<=n;j++)
|
||||
{
|
||||
if(i==j) continue;
|
||||
Line mid_line = make(tmp[i],tmp[j]);
|
||||
double a=mid_line.a,b=mid_line.b,c=mid_line.c;
|
||||
if(a*x0+b*y0+c >= eps)
|
||||
{
|
||||
CUT1(a,b,c);
|
||||
}
|
||||
else
|
||||
{
|
||||
CUT2(a,b,c);
|
||||
}
|
||||
}
|
||||
double tmpv=calc(p,ban_tot);
|
||||
ans[i]=tmpv;
|
||||
}
|
||||
printf("Case #%d:\n",ca++);
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
printf("%.6lf\n",ans[i]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
210
HDOJ/4328_autoAC.cpp
Normal file
210
HDOJ/4328_autoAC.cpp
Normal file
|
@ -0,0 +1,210 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
char map[1010][1010];
|
||||
int lefts[1010][1010],heights[1010][1010],rights[1010][1010];
|
||||
int CountSingle(int n,int m,char sing){
|
||||
int ret=0;
|
||||
for(int i=1;i<=n;i++){
|
||||
if(i==1){
|
||||
int l=0;
|
||||
for(int j=1;j<=m;j++){
|
||||
if(map[i][j]!=sing){
|
||||
heights[i][j]=0;
|
||||
lefts[i][j]=m+1;
|
||||
l=j;
|
||||
}
|
||||
else{
|
||||
heights[i][j]=1;
|
||||
lefts[i][j]=l+1;
|
||||
}
|
||||
}
|
||||
int r=m+1;
|
||||
for(int j=m;j>=1;j--){
|
||||
if(map[i][j]!=sing){
|
||||
rights[i][j]=0;
|
||||
r=j;
|
||||
}
|
||||
else{
|
||||
rights[i][j]=r-1;
|
||||
ret=max(ret,heights[i][j]*2+2*(rights[i][j]-lefts[i][j]+1));
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
int l=0;
|
||||
for(int j=1;j<=m;j++){
|
||||
if(map[i][j]!=sing){
|
||||
heights[i][j]=0;
|
||||
lefts[i][j]=m+1;
|
||||
l=j;
|
||||
}
|
||||
else{
|
||||
if(map[i-1][j]==sing){
|
||||
heights[i][j]=heights[i-1][j]+1;
|
||||
lefts[i][j]=max(lefts[i-1][j],l+1);
|
||||
}
|
||||
else{
|
||||
heights[i][j]=1;
|
||||
lefts[i][j]=l+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
int r=m+1;
|
||||
for(int j=m;j>=1;j--){
|
||||
if(map[i][j]!=sing){
|
||||
rights[i][j]=0;
|
||||
r=j;
|
||||
}
|
||||
else{
|
||||
if(map[i-1][j]==sing){
|
||||
rights[i][j]=min(rights[i-1][j],r-1);
|
||||
ret=max(ret,heights[i][j]*2+2*(rights[i][j]-lefts[i][j]+1));
|
||||
}
|
||||
else{
|
||||
rights[i][j]=r-1;
|
||||
ret=max(ret,heights[i][j]*2+2*(rights[i][j]-lefts[i][j]+1));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int CountCross(int n,int m){
|
||||
int ret=0;
|
||||
for(int i=1;i<=n;i++){
|
||||
if(i==1){
|
||||
int l=0;
|
||||
for(int j=1;j<=m;j++){
|
||||
if(j==1){
|
||||
heights[i][j]=1;
|
||||
lefts[i][j]=1;
|
||||
}
|
||||
else{
|
||||
if(map[i][j-1]==map[i][j]){
|
||||
lefts[i][j]=j;
|
||||
l=j-1;
|
||||
heights[i][j]=1;
|
||||
}
|
||||
else{
|
||||
lefts[i][j]=l+1;
|
||||
heights[i][j]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
int r=m+1;
|
||||
for(int j=m;j>=1;j--){
|
||||
if(j==m){
|
||||
heights[i][j]=1;
|
||||
rights[i][j]=m;
|
||||
}
|
||||
else{
|
||||
if(map[i][j]==map[i][j+1]){
|
||||
heights[i][j]=1;
|
||||
rights[i][j]=j;
|
||||
r=j+1;
|
||||
}
|
||||
else{
|
||||
rights[i][j]=r-1;
|
||||
heights[i][j]=1;
|
||||
}
|
||||
}
|
||||
ret=max(ret,heights[i][j]*2+2*(rights[i][j]-lefts[i][j]+1));
|
||||
}
|
||||
}
|
||||
else{
|
||||
int l=0;
|
||||
for(int j=1;j<=m;j++){
|
||||
if(j==1){
|
||||
if(map[i][j]!=map[i-1][j]){
|
||||
heights[i][j]=heights[i-1][j]+1;
|
||||
lefts[i][j]=1;
|
||||
}
|
||||
else{
|
||||
heights[i][j]=1;
|
||||
lefts[i][j]=1;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(map[i][j]!=map[i-1][j]){
|
||||
heights[i][j]=heights[i-1][j]+1;
|
||||
if(map[i][j]==map[i][j-1]){
|
||||
lefts[i][j]=j;
|
||||
l=j-1;
|
||||
}
|
||||
else{
|
||||
lefts[i][j]=max(lefts[i-1][j],l+1);
|
||||
}
|
||||
}
|
||||
else{
|
||||
heights[i][j]=1;
|
||||
if(map[i][j]==map[i][j-1]){
|
||||
lefts[i][j]=j;
|
||||
l=j-1;
|
||||
}
|
||||
else{
|
||||
lefts[i][j]=l+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int r=m+1;
|
||||
for(int j=m;j>=1;j--){
|
||||
if(j==m){
|
||||
if(map[i][j]!=map[i-1][j]){
|
||||
heights[i][j]=heights[i-1][j]+1;
|
||||
rights[i][j]=m;
|
||||
}
|
||||
else{
|
||||
heights[i][j]=1;
|
||||
rights[i][j]=m;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(map[i][j]!=map[i-1][j]){
|
||||
heights[i][j]=heights[i-1][j]+1;
|
||||
if(map[i][j]==map[i][j+1]){
|
||||
rights[i][j]=j;
|
||||
r=j+1;
|
||||
}
|
||||
else{
|
||||
rights[i][j]=min(rights[i-1][j],r-1);
|
||||
}
|
||||
}
|
||||
else{
|
||||
heights[i][j]=1;
|
||||
if(map[i][j]==map[i][j+1]){
|
||||
rights[i][j]=j;
|
||||
r=j+1;
|
||||
}
|
||||
else{
|
||||
rights[i][j]=r-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret=max(ret,heights[i][j]*2+2*(rights[i][j]-lefts[i][j]+1));
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main(){
|
||||
int ansR,ansB,ansC,kase=0;
|
||||
int T,n,m;
|
||||
scanf("%d",&T);
|
||||
while(T--){
|
||||
scanf("%d%d",&n,&m);
|
||||
getchar();
|
||||
for(int i=1;i<=n;i++)
|
||||
gets(map[i]+1);
|
||||
ansR=CountSingle(n,m,'R');
|
||||
ansB=CountSingle(n,m,'B');
|
||||
ansC=CountCross(n,m);
|
||||
cout<<"Case #"<<++kase<<": "<<max(ansR,max(ansB,ansC))<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
74
HDOJ/4329_autoAC.cpp
Normal file
74
HDOJ/4329_autoAC.cpp
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<map>
|
||||
#include<string>
|
||||
#include<iostream>
|
||||
using namespace std;
|
||||
int main(){
|
||||
int t,T,i,j,k,n;
|
||||
int sta;
|
||||
double sum[110],ans;
|
||||
int all[110];
|
||||
int ss,num;
|
||||
string str;
|
||||
char sss[10010];
|
||||
map<string,int> m[100];
|
||||
scanf("%d",&T);
|
||||
for(t=1;t<=T;t++){
|
||||
memset(all,0,sizeof(all));
|
||||
memset(sum,0,sizeof(sum));
|
||||
scanf("%d",&n);
|
||||
for(i=0;i<n;i++){
|
||||
scanf("%s",str);
|
||||
getline(cin,str);
|
||||
for(j=0;j<str.length() && str[j]==' ';j++);
|
||||
sta=j;
|
||||
for(;j<str.length();j++){
|
||||
if(str[j]==' '){
|
||||
m[i].insert(make_pair(str.substr(sta,j-sta),1));
|
||||
all[i]++;
|
||||
for(;j<str.length() && str[j]==' ';j++);
|
||||
sta=j;
|
||||
if(sta==str.length())break;
|
||||
j--;
|
||||
}
|
||||
}
|
||||
if(sta!=str.length()){
|
||||
m[i].insert(make_pair(str.substr(sta,j-sta),1));
|
||||
all[i]++;
|
||||
}
|
||||
}
|
||||
for(i=0;i<n;i++){
|
||||
scanf("%s",str);
|
||||
getline(cin,str);
|
||||
for(j=0;j<str.length() && str[j]==' ';j++);
|
||||
sta=j;
|
||||
ss=num=0;
|
||||
for(;j<str.length();j++){
|
||||
if(str[j]==' '){
|
||||
num++;
|
||||
if(m[i].find(str.substr(sta,j-sta))!=m[i].end()){
|
||||
ss++;
|
||||
sum[i]+=(double)ss/num;
|
||||
}
|
||||
for(;j<str.length() && str[j]==' ';j++);
|
||||
sta=j;
|
||||
if(sta==str.length())break;
|
||||
j--;
|
||||
}
|
||||
}
|
||||
if(sta!=str.length()){
|
||||
num++;
|
||||
if(m[i].find(str.substr(sta,j-sta))!=m[i].end()){
|
||||
ss++;
|
||||
sum[i]+=(double)ss/num;
|
||||
}
|
||||
}
|
||||
sum[i]/=all[i];
|
||||
}
|
||||
ans=0;
|
||||
for(i=0;i<n;i++)
|
||||
ans+=sum[i];
|
||||
printf("Case #%d: %.6lf\n",t,ans/n);
|
||||
}
|
||||
}
|
231
HDOJ/4330_autoAC.cpp
Normal file
231
HDOJ/4330_autoAC.cpp
Normal file
|
@ -0,0 +1,231 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const double eps = 1e-8;
|
||||
int getNumberOnce(char stage[10][10])
|
||||
{
|
||||
bool remove[10][10];
|
||||
memset(remove, false, sizeof(remove));
|
||||
for(int i=0;i<8;++i)
|
||||
{
|
||||
for(int j=0;j<8;++j)
|
||||
{
|
||||
if(i<6)
|
||||
{
|
||||
if(stage[i][j])
|
||||
{
|
||||
if(stage[i][j] == stage[i+1][j])
|
||||
{
|
||||
if(stage[i][j] == stage[i+2][j])
|
||||
{
|
||||
remove[i][j] = true;
|
||||
remove[i+1][j] = true;
|
||||
remove[i+2][j] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(j<6)
|
||||
{
|
||||
if(stage[i][j])
|
||||
{
|
||||
if(stage[i][j] == stage[i][j+1])
|
||||
{
|
||||
if(stage[i][j] == stage[i][j+2])
|
||||
{
|
||||
remove[i][j] = true;
|
||||
remove[i][j+1] = true;
|
||||
remove[i][j+2] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int num = 0;
|
||||
for(int i=0;i<8;++i)
|
||||
{
|
||||
for(int j=0;j<8;++j)
|
||||
{
|
||||
if(remove[i][j])
|
||||
{
|
||||
stage[i][j] = 0;
|
||||
++ num;
|
||||
}
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
void fallDown(char stage[10][10])
|
||||
{
|
||||
for(int j=0;j<8;++j)
|
||||
{
|
||||
int k = 7;
|
||||
for(int i=7;i>=0;--i)
|
||||
{
|
||||
if(stage[i][j])
|
||||
{
|
||||
stage[k--][j] = stage[i][j];
|
||||
}
|
||||
}
|
||||
for(int i=k;i>=0;--i)
|
||||
{
|
||||
stage[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
int getNumber(char stage[10][10])
|
||||
{
|
||||
int num = 0;
|
||||
while(true)
|
||||
{
|
||||
int temp = getNumberOnce(stage);
|
||||
if(temp == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
num += temp;
|
||||
fallDown(stage);
|
||||
}
|
||||
return num;
|
||||
}
|
||||
char stage[10][10];
|
||||
bool simpleJudge()
|
||||
{
|
||||
char temp[10][10];
|
||||
memcpy(temp, stage, sizeof(temp));
|
||||
return getNumber(temp) >= 8;
|
||||
}
|
||||
struct Point
|
||||
{
|
||||
int x, y;
|
||||
};
|
||||
int getPow5(int x)
|
||||
{
|
||||
int res = 1;
|
||||
while(x--)
|
||||
{
|
||||
res *= 5;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
double completeJudge(char stage[10][10], int remain)
|
||||
{
|
||||
char temp[10][10];
|
||||
memcpy(temp, stage, sizeof(temp));
|
||||
int num = getNumberOnce(temp);
|
||||
if(num >= remain)
|
||||
{
|
||||
return 1.0;
|
||||
}
|
||||
if(num == 0)
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
remain -= num;
|
||||
fallDown(temp);
|
||||
Point stack[8];
|
||||
int top = 0;
|
||||
for(int i=0;i<8;++i)
|
||||
{
|
||||
for(int j=0;j<8;++j)
|
||||
{
|
||||
if(!temp[i][j])
|
||||
{
|
||||
stack[top].x = i;
|
||||
stack[top].y = j;
|
||||
++ top;
|
||||
}
|
||||
}
|
||||
}
|
||||
int total = getPow5(top);
|
||||
double ret = 0.0;
|
||||
for(int i=0;i<total;++i)
|
||||
{
|
||||
int bit = i;
|
||||
for(int j=0;j<top;++j)
|
||||
{
|
||||
temp[stack[j].x][stack[j].y] = '0' + (bit % 5);
|
||||
bit /= 5;
|
||||
}
|
||||
ret += completeJudge(temp, remain);
|
||||
}
|
||||
return ret / total;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int caseNumber;
|
||||
scanf("%d", &caseNumber);
|
||||
for(int cas=1;cas<=caseNumber;++cas)
|
||||
{
|
||||
for(int i=0;i<8;++i)
|
||||
{
|
||||
scanf("%s", stage[i]);
|
||||
}
|
||||
double ans = 0.0;
|
||||
bool end = false;
|
||||
for(int i=0;i<8 && !end;++i)
|
||||
{
|
||||
for(int j=0;j<8 && !end;++j)
|
||||
{
|
||||
if(i!=7)
|
||||
{
|
||||
swap(stage[i][j], stage[i+1][j]);
|
||||
if(simpleJudge())
|
||||
{
|
||||
ans = 1.0;
|
||||
end = true;
|
||||
}
|
||||
swap(stage[i][j], stage[i+1][j]);
|
||||
}
|
||||
if(j!=7)
|
||||
{
|
||||
swap(stage[i][j], stage[i][j+1]);
|
||||
if(simpleJudge())
|
||||
{
|
||||
ans = 1.0;
|
||||
end = true;
|
||||
}
|
||||
swap(stage[i][j], stage[i][j+1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!end)
|
||||
{
|
||||
double temp;
|
||||
for(int i=0;i<8 && !end;++i)
|
||||
{
|
||||
for(int j=0;j<8 && !end;++j)
|
||||
{
|
||||
if(i!=7)
|
||||
{
|
||||
swap(stage[i][j], stage[i+1][j]);
|
||||
temp = completeJudge(stage, 8);
|
||||
ans = max(ans, temp);
|
||||
swap(stage[i][j], stage[i+1][j]);
|
||||
}
|
||||
if(ans > 1.0 - eps)
|
||||
{
|
||||
ans = 1.0;
|
||||
end = true;
|
||||
}
|
||||
if(j!=7)
|
||||
{
|
||||
swap(stage[i][j], stage[i][j+1]);
|
||||
temp = completeJudge(stage, 8);
|
||||
ans = max(ans, temp);
|
||||
swap(stage[i][j], stage[i][j+1]);
|
||||
}
|
||||
if(ans > 1.0 - eps)
|
||||
{
|
||||
ans = 1.0;
|
||||
end = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case #%d: %.3lf\n", cas, ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
125
HDOJ/4331_autoAC.cpp
Normal file
125
HDOJ/4331_autoAC.cpp
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <algorithm>
|
||||
#define MAXN 1005
|
||||
using namespace std;
|
||||
int N, G[MAXN][MAXN], c[MAXN], idx;
|
||||
int dgn[MAXN];
|
||||
int l[MAXN][MAXN], r[MAXN][MAXN], u[MAXN][MAXN], d[MAXN][MAXN];
|
||||
struct Node
|
||||
{
|
||||
int x, sign, key;
|
||||
bool operator < (Node temp) const
|
||||
{
|
||||
if (x != temp.x) {
|
||||
return x < temp.x;
|
||||
}
|
||||
else {
|
||||
return sign < temp.sign;
|
||||
}
|
||||
}
|
||||
}p[MAXN<<1];
|
||||
int lowbit(int x)
|
||||
{
|
||||
return x & -x;
|
||||
}
|
||||
void addpoint(int a, int b)
|
||||
{
|
||||
++idx;
|
||||
p[idx].x = a, p[idx].sign = 0;
|
||||
p[idx].key = a;
|
||||
++idx;
|
||||
p[idx].x = b, p[idx].sign = 1;
|
||||
p[idx].key = a;
|
||||
}
|
||||
void add(int x)
|
||||
{
|
||||
for (int i = x; i <= N; i += lowbit(i)) {
|
||||
c[i] += 1;
|
||||
}
|
||||
}
|
||||
int sum(int x)
|
||||
{
|
||||
int ret = 0;
|
||||
for (int i = x; i > 0; i -= lowbit(i)) {
|
||||
ret += c[i];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int solve()
|
||||
{
|
||||
int ret = 0;
|
||||
for (int i = N; i >= 1; --i) {
|
||||
idx = -1;
|
||||
for (int j = 1; j <= (N-i+1); ++j) {
|
||||
if (G[i+j-1][j]) {
|
||||
addpoint(j, j+min(r[i+j-1][j], d[i+j-1][j])-1);
|
||||
dgn[j] = j - min(u[i+j-1][j], l[i+j-1][j])+1;
|
||||
}
|
||||
}
|
||||
if (idx == -1) { continue; }
|
||||
sort(p, p+idx+1);
|
||||
memset(c, 0, sizeof (c));
|
||||
for (int k = 0; k <= idx; ++k) {
|
||||
if (!p[k].sign) {
|
||||
ret -= sum(p[k].key);
|
||||
add(dgn[p[k].x]);
|
||||
}
|
||||
else {
|
||||
ret += sum(p[k].key);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int j = 2; j <= N; ++j) {
|
||||
idx = -1;
|
||||
for (int i = 1; i <= (N-j+1); ++i) {
|
||||
if (G[i][j+i-1]) {
|
||||
addpoint(i, i+min(r[i][j+i-1], d[i][j+i-1])-1);
|
||||
dgn[i] = i - min(u[i][j+i-1], l[i][j+i-1])+1;
|
||||
}
|
||||
}
|
||||
if (idx == -1) { continue; }
|
||||
sort(p, p+idx+1);
|
||||
memset(c, 0, sizeof (c));
|
||||
for (int k = 0; k <= idx; ++k) {
|
||||
if (!p[k].sign) {
|
||||
ret -= sum(p[k].key);
|
||||
add(dgn[p[k].x]);
|
||||
}
|
||||
else {
|
||||
ret += sum(p[k].key);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T, ca = 0;
|
||||
scanf("%d", &T);
|
||||
while (T--) {
|
||||
scanf("%d", &N);
|
||||
memset(d, 0, sizeof (d));
|
||||
memset(r, 0, sizeof (r));
|
||||
for (int i = 1; i<= N; ++i) {
|
||||
for (int j = 1; j <= N; ++j) {
|
||||
scanf("%d", &G[i][j]);
|
||||
if (G[i][j]) {
|
||||
u[i][j] = G[i-1][j] ? u[i-1][j] + 1 : 1;
|
||||
l[i][j] = G[i][j-1] ? l[i][j-1] + 1 : 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = N; i >= 1; --i) {
|
||||
for (int j = N; j >= 1; --j) {
|
||||
if (G[i][j]) {
|
||||
d[i][j] = G[i+1][j] ? d[i+1][j] + 1 : 1;
|
||||
r[i][j] = G[i][j+1] ? r[i][j+1] + 1 : 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case %d: %d\n", ++ca, solve());
|
||||
}
|
||||
return 0;
|
||||
}
|
145
HDOJ/4332_autoAC.cpp
Normal file
145
HDOJ/4332_autoAC.cpp
Normal file
|
@ -0,0 +1,145 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
typedef __int64 LL ;
|
||||
const LL Mod = 1000000007LL ;
|
||||
const int m = (1 << 8) ;
|
||||
const int mm = 70 ;
|
||||
bool ok[m] ;
|
||||
int a[8] , N ;
|
||||
int min[m] ;
|
||||
struct Matrix{
|
||||
LL mat[mm][mm] ;
|
||||
void init(){
|
||||
memset( mat, 0 ,sizeof(mat) ) ;
|
||||
}
|
||||
}M[31] , res ,mid ;
|
||||
LL ans[mm] ;
|
||||
bool is_ok(int s){
|
||||
if( s==0 ) return true ;
|
||||
if( s==m-1 ) return true ;
|
||||
int val[8] ;
|
||||
int i ;
|
||||
for(i=0;i<8;i++)
|
||||
if( s&a[i] ) val[i] = 1 ;
|
||||
else val[i] = 0;
|
||||
i = 0 ;
|
||||
while( val[i] ) ++ i ;
|
||||
for(int ii=0;ii<8;ii++ ){
|
||||
if( val[ (ii+i)%8 ] == 0 ) continue ;
|
||||
if( ii+1<8 && val[ (ii+i+1)%8 ] ){
|
||||
ii ++ ;
|
||||
}
|
||||
else return false ;
|
||||
}
|
||||
return true ;
|
||||
}
|
||||
int getmin( int n ){
|
||||
int val[8] ;
|
||||
for(int i=0;i<8;i++) {
|
||||
if( n&a[i] ) val[i] = 1 ;
|
||||
else val[i] = 0 ;
|
||||
}
|
||||
int v = 0 ;
|
||||
int res = n ;
|
||||
for(int ii=0;ii<8;ii++)
|
||||
if( val[ (2+ii)%8 ] ) v |= a[ ii ] ;
|
||||
if( res > v ) res = v ;
|
||||
v = 0 ;
|
||||
for(int ii=0;ii<8;ii++)
|
||||
if( val[ (4+ii)%8 ] ) v |= a[ ii ] ;
|
||||
if( res > v ) res =v ;
|
||||
v = 0 ;
|
||||
for(int ii=0;ii<8;ii++)
|
||||
if( val[ (6+ii)%8 ] ) v |= a[ ii ] ;
|
||||
if( res > v ) res =v ;
|
||||
return res ;
|
||||
}
|
||||
std::map<int , int> mp ;
|
||||
bool vis[m + 10][m + 10] ;
|
||||
void deal(int sou , int to){
|
||||
int val[8] ;
|
||||
for(int i=0;i<8;i++){
|
||||
if( to&a[i] ) val[i] = 1 ;
|
||||
else val[i] = 0 ;
|
||||
}
|
||||
LL v1 , v2 ;
|
||||
v1 = sou ;
|
||||
for(int j=0; j<=6;j+=2 ){
|
||||
v2 = 0 ;
|
||||
for(int jj=0;jj<8;jj++){
|
||||
if( val[ (j+jj)%8 ] ) v2 |= a[jj] ;
|
||||
}
|
||||
if( ( v1|v2 )==m-1 && ok[ v1&v2 ] && !vis[v1][v2] ){
|
||||
M[0].mat[ mp[ min[v1] ] ][ mp[ min[v2] ] ] ++ ;
|
||||
vis[v1][v2] = 1 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
void build_matrix(){
|
||||
M[0].init() ;
|
||||
memset( vis , 0 , sizeof(vis) );
|
||||
std::map<int, int>::iterator it1 ,it2 ;
|
||||
for( it1 = mp.begin() ; it1!=mp.end() ; it1++ ){
|
||||
for( it2=mp.begin() ; it2!=mp.end() ; it2++ ){
|
||||
deal( it1->first , it2->first ) ;
|
||||
}
|
||||
}
|
||||
M[0].mat[mm-1][mm-1] = 2 ;
|
||||
for(int ii=1;ii<=30;ii++){
|
||||
for(int i=0;i<mm;i++){
|
||||
for(int j=0;j<mm;j++){
|
||||
mid.mat[i][j] = 0 ;
|
||||
for(int k=0;k<mm;k++){
|
||||
mid.mat[i][j] = ( mid.mat[i][j] + M[ii-1].mat[i][k] * M[ii-1].mat[k][j] % Mod ) % Mod ;
|
||||
}
|
||||
}
|
||||
}
|
||||
M[ii] = mid ;
|
||||
}
|
||||
}
|
||||
void init(){
|
||||
a[0] = 1 ;
|
||||
for(int i=1;i<8;i++) a[i] = a[i-1]<<1 ;
|
||||
for(int i=0;i<m;i++) min[i] = getmin(i) ;
|
||||
for(int i=0;i<m;i++){
|
||||
ok[i] = is_ok( i ) ;
|
||||
mp[ min[i] ] = 1 ;
|
||||
}
|
||||
std::map<int,int>::iterator it = mp.begin() ;
|
||||
int ss = 0 ;
|
||||
for( it ; it != mp.end(); it ++ ){
|
||||
it->second = ss ++ ;
|
||||
}
|
||||
build_matrix() ;
|
||||
}
|
||||
void calc( int n ){
|
||||
memset( ans , 0 , sizeof(ans) ) ;
|
||||
int jj = 0 ;
|
||||
ans[ mm-1 ] = 1 ;
|
||||
LL CC[mm] ;
|
||||
while( n ){
|
||||
if( n&1 ){
|
||||
for(int i=0;i<mm;i++){
|
||||
CC[i] = 0;
|
||||
for(int j=0;j<mm;j++){
|
||||
CC[i] = ( CC[i] + ans[j] * M[jj].mat[i][j]% Mod ) % Mod ;
|
||||
}
|
||||
}
|
||||
for(int i=0;i<mm;i++) ans[i] = CC[i] ;
|
||||
}
|
||||
n >>= 1 ; jj ++ ;
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
init() ;
|
||||
int T ;scanf("%d",&T) ;
|
||||
int cas = 0 ;
|
||||
while( T-- ){
|
||||
scanf("%d",&N) ;
|
||||
calc(N + 1) ;
|
||||
printf("Case %d: %I64d\n",++cas,ans[0] ) ;
|
||||
}
|
||||
return 0 ;
|
||||
}
|
55
HDOJ/4333_autoAC.cpp
Normal file
55
HDOJ/4333_autoAC.cpp
Normal 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 999999999
|
||||
using namespace std;
|
||||
const int MAX=100000+10;
|
||||
char s[MAX*2];
|
||||
int ne[MAX];
|
||||
void get_next(char *a,int len){
|
||||
int i=-1,j=0;
|
||||
ne[0]=-1;
|
||||
while(j<len){
|
||||
if(i == -1 || a[i] == a[j])ne[++j]=++i;
|
||||
else i=ne[i];
|
||||
}
|
||||
}
|
||||
void get_extend(char *a,int len){
|
||||
int k=0,i=1;
|
||||
ne[0]=len;
|
||||
while(k+1<len && a[k] == a[k+1])++k;
|
||||
ne[1]=k;
|
||||
k=1;
|
||||
while(++i<len/2){
|
||||
int maxr=k+ne[k]-1;
|
||||
ne[i]=min(ne[i-k],max(maxr-i+1,0));
|
||||
while(i+ne[i]<len && a[ne[i]] == a[i+ne[i]])++ne[i];
|
||||
if(i+ne[i]>k+ne[k])k=i;
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
int t,num=0;
|
||||
cin>>t;
|
||||
while(t--){
|
||||
scanf("%s",s);
|
||||
int len=strlen(s);
|
||||
get_next(s,len);
|
||||
int temp=len%(len-ne[len]) == 0?len/(len-ne[len]):1;
|
||||
for(int i=0;i<=len;++i)s[i+len]=s[i];
|
||||
get_extend(s,len+len);
|
||||
int a=0,b=0,c=0;
|
||||
for(int i=0;i<len;++i){
|
||||
if(ne[i]>=len)++b;
|
||||
else if(s[ne[i]]<s[i+ne[i]])++c;
|
||||
else ++a;
|
||||
}
|
||||
cout<<"Case "<<++num<<": "<<a/temp<<' '<<b/temp<<' '<<c/temp<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
91
HDOJ/4334_autoAC.cpp
Normal file
91
HDOJ/4334_autoAC.cpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
int n;
|
||||
__int64 que[5][210],a[41000],b[41000];
|
||||
int cmp(const void*a,const void*b)
|
||||
{
|
||||
if(*(__int64 *)a-*(__int64 *)b > 0)
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
void fun()
|
||||
{
|
||||
int i,f,ji=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
for(f=0;f<n;f++)
|
||||
{
|
||||
a[ji]=que[0][i]+que[1][f];
|
||||
ji++;
|
||||
}
|
||||
}
|
||||
qsort(a,n*n,sizeof(a[0]),cmp);
|
||||
ji=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
for(f=0;f<n;f++)
|
||||
{
|
||||
b[ji]=que[2][i]+que[3][f];
|
||||
ji++;
|
||||
}
|
||||
}
|
||||
qsort(b,n*n,sizeof(b[0]),cmp);
|
||||
}
|
||||
int sea(__int64 x)
|
||||
{
|
||||
int head=0,tail=n*n-1;
|
||||
while(1)
|
||||
{
|
||||
if(x == a[head]+b[tail])
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if(a[head]+b[tail] > x)
|
||||
{
|
||||
tail--;
|
||||
if(-1 == tail)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
head++;
|
||||
if(n*n == head)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,num,f,g;
|
||||
scanf("%d",&num);
|
||||
for(i=0;i<num;i++)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
for(f=0;f<5;f++)
|
||||
{
|
||||
for(g=0;g<n;g++)
|
||||
{
|
||||
scanf("%I64d",&que[f][g]);
|
||||
}
|
||||
}
|
||||
fun();
|
||||
for(g=0;g<n;g++)
|
||||
{
|
||||
if(1 == sea(-que[4][g]))
|
||||
{
|
||||
printf("Yes\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(g == n)
|
||||
{
|
||||
printf("No\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
79
HDOJ/4335_autoAC.cpp
Normal file
79
HDOJ/4335_autoAC.cpp
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<queue>
|
||||
#include<vector>
|
||||
#include<cmath>
|
||||
#define LL unsigned long long
|
||||
#define eps 1e-6
|
||||
#define zero(a) fabs(a)<eps
|
||||
using namespace std;
|
||||
LL get_eular(LL m){
|
||||
LL ret=1;
|
||||
for(LL i=2;i*i<=m;i++)
|
||||
if(m%i==0){
|
||||
ret*=i-1;
|
||||
m/=i;
|
||||
while(m%i==0){
|
||||
m/=i;
|
||||
ret*=i;
|
||||
}
|
||||
}
|
||||
if(m>1)
|
||||
ret*=m-1;
|
||||
return ret;
|
||||
}
|
||||
LL PowMod(LL a,LL b,LL MOD){
|
||||
LL ret=1;
|
||||
while(b){
|
||||
if(b&1)
|
||||
ret=(ret*a)%MOD;
|
||||
a=(a*a)%MOD;
|
||||
b>>=1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
LL b,p,m,ring[100005];
|
||||
int main(){
|
||||
int t,cas=0;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
scanf("%I64u%I64u%I64u",&b,&p,&m);
|
||||
printf("Case #%d: ",++cas);
|
||||
if(p==1){
|
||||
if(m==18446744073709551615ULL)
|
||||
printf("18446744073709551616\n");
|
||||
else
|
||||
printf("%I64u\n",m+1);
|
||||
continue;
|
||||
}
|
||||
LL i=0,phi=get_eular(p),fac=1,ans=0;
|
||||
for(i=0;i<=m&&fac<=phi;i++){
|
||||
if(PowMod(i,fac,p)==b)
|
||||
ans++;
|
||||
fac*=i+1;
|
||||
}
|
||||
fac=fac%phi;
|
||||
for(;i<=m&&fac;i++){
|
||||
if(PowMod(i,fac+phi,p)==b)
|
||||
ans++;
|
||||
fac=(fac*(i+1))%phi;
|
||||
}
|
||||
if(i<=m){
|
||||
LL cnt=0;
|
||||
for(int j=0;j<p;j++){
|
||||
ring[j]=PowMod(i+j,phi,p);
|
||||
if(ring[j]==b)
|
||||
cnt++;
|
||||
}
|
||||
LL idx=(m-i+1)/p;
|
||||
ans+=cnt*idx;
|
||||
LL remain=(m-i+1)%p;
|
||||
for(int j=0;j<remain;j++)
|
||||
if(ring[j]==b)
|
||||
ans++;
|
||||
}
|
||||
printf("%I64u\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
30
HDOJ/4336_autoAC.cpp
Normal file
30
HDOJ/4336_autoAC.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
int n;
|
||||
double f[1<<20], p[25];
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d", &n)!=EOF)
|
||||
{
|
||||
for(int i=0; i<n; i++)
|
||||
scanf("%lf", &p[i]);
|
||||
int all=(1<<n)-1;
|
||||
f[all]=0;
|
||||
for(int s=all-1; s>=0; s--)
|
||||
{
|
||||
double temp=0;
|
||||
f[s]=1;
|
||||
for(int i=0; i<n; i++)
|
||||
{
|
||||
if(s&(1<<i)) continue;
|
||||
f[s]+=f[s|(1<<i)]*p[i];
|
||||
temp+=p[i];
|
||||
}
|
||||
f[s]/=temp;
|
||||
}
|
||||
printf("%lf\n", f[0]);
|
||||
}
|
||||
}
|
75
HDOJ/4337_autoAC.cpp
Normal file
75
HDOJ/4337_autoAC.cpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
using namespace std;
|
||||
#define V 200
|
||||
int n,m;
|
||||
bool c[V][V];
|
||||
int x[V];
|
||||
bool flag[V];
|
||||
void hamilton()
|
||||
{
|
||||
int i, k;
|
||||
bool s[V];
|
||||
for(i = 0; i < n; i++)
|
||||
{
|
||||
x[i] = -1;
|
||||
s[i] = false;
|
||||
}
|
||||
k = 1;
|
||||
s[0] = true;
|
||||
x[0] = 0;
|
||||
while(k >= 0)
|
||||
{
|
||||
x[k]++;
|
||||
while(x[k] < n)
|
||||
if(!s[x[k]] && c[x[k - 1]][x[k]])
|
||||
break;
|
||||
else
|
||||
x[k]++;
|
||||
if((x[k] < n) && (k != n - 1))
|
||||
{
|
||||
s[x[k]] = true;
|
||||
k++;
|
||||
}
|
||||
else if((x[k] < n) && k == n - 1 && c[x[k]][x[0]])
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
x[k] = -1;
|
||||
k--;
|
||||
s[x[k]] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int a,b;
|
||||
while(cin >> n >> m){
|
||||
memset(c,0,sizeof(c));
|
||||
memset(flag,0,sizeof(flag));
|
||||
memset(x,0,sizeof(x));
|
||||
for(int i=0;i<m;i++){
|
||||
cin >> a >> b;
|
||||
c[a-1][b-1]=c[b-1][a-1]=true;
|
||||
}
|
||||
hamilton();
|
||||
bool f=0;
|
||||
for(int i=0;i<n;i++){
|
||||
flag[x[i]]=1;
|
||||
}
|
||||
for(int i=0;i<n;i++){
|
||||
if(!flag[i]) f=1;
|
||||
}
|
||||
if(f) cout <<"no solution" <<endl;
|
||||
else{
|
||||
for(int i=0;i<n;i++){
|
||||
if(i==n-1) cout << x[i]+1 <<endl;
|
||||
else cout << x[i]+1 <<" ";
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
186
HDOJ/4338_autoAC.cpp
Normal file
186
HDOJ/4338_autoAC.cpp
Normal file
|
@ -0,0 +1,186 @@
|
|||
#pragma comment(linker, "/STACK:102400000,102400000")
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
using namespace std;
|
||||
const int N=200005;
|
||||
#define Log 22
|
||||
struct Edge
|
||||
{
|
||||
int v;
|
||||
Edge *nxt;
|
||||
}memo[N*10],*cur,*h_bef[N],*h_aft[N];
|
||||
void addEdge(int u,int v,Edge* head[])
|
||||
{
|
||||
cur->v=v; cur->nxt=head[u];
|
||||
head[u]=cur++;
|
||||
}
|
||||
int bnum,bn[N];
|
||||
vector<int> block[N];
|
||||
bool iscut[N];
|
||||
bool vis[N];
|
||||
stack<int> stk;
|
||||
int dfn[N],low[N],son_root,idx;
|
||||
int lab[N],id[N],son[N],fa[N];
|
||||
int dp[N][Log],dep[N];
|
||||
void tarjan(int pt_u,int pt_pre)
|
||||
{
|
||||
stack<int> stk_tar;
|
||||
stk_tar.push(pt_u); fa[pt_u]=pt_pre;
|
||||
while(stk_tar.size())
|
||||
{
|
||||
int u=stk_tar.top();
|
||||
int pre=fa[u];
|
||||
if(dfn[u]==0) dfn[u]=low[u]=++idx,stk.push(u);
|
||||
Edge* it;
|
||||
for(it=h_bef[u];it;it=it->nxt)
|
||||
{
|
||||
int v=it->v;
|
||||
if(v==pre) continue;
|
||||
if(fa[v]==-1)
|
||||
{
|
||||
fa[v]=u; stk_tar.push(v);
|
||||
h_bef[u]=it;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(fa[v]==u)
|
||||
{
|
||||
low[u]=min(low[u],low[v]);
|
||||
if(dfn[u]<=low[v])
|
||||
{
|
||||
if(pre==-1) son_root++;
|
||||
else iscut[u]=1;
|
||||
while(1)
|
||||
{
|
||||
int top=stk.top(); stk.pop();
|
||||
block[bnum].push_back(top);
|
||||
if(top==v) break;
|
||||
}
|
||||
block[bnum].push_back(u);
|
||||
bnum++;
|
||||
}
|
||||
}
|
||||
else low[u]=min(low[u],dfn[v]);
|
||||
}
|
||||
}
|
||||
if(it==NULL) stk_tar.pop();
|
||||
}
|
||||
}
|
||||
void dfs(int u,int pre,int cnt,int iid)
|
||||
{
|
||||
dep[u]=dep[ dp[u][0] ]+1;
|
||||
for(int i=1;i<Log;i++) dp[u][i]= dp[ dp[u][i-1] ][ i-1 ];
|
||||
id[u]=iid; son[u]=cnt+bn[u];
|
||||
for(Edge* it=h_aft[u];it;it=it->nxt)
|
||||
{
|
||||
int v=it->v;
|
||||
if(v!=pre)
|
||||
{
|
||||
dp[v][0]=u;
|
||||
dfs(v,u,son[u],iid);
|
||||
}
|
||||
}
|
||||
}
|
||||
int lca(int u,int v)
|
||||
{
|
||||
if(dep[u]<dep[v]) swap(u,v);
|
||||
for(int st=(1<<(Log-1)),i=Log-1;i>=0;st>>=1,i--)
|
||||
{
|
||||
if(st<=dep[u]-dep[v])
|
||||
{
|
||||
u=dp[u][i];
|
||||
}
|
||||
}
|
||||
if(u==v) return u;
|
||||
for(int i=Log-1;i>=0;i--)
|
||||
{
|
||||
if(dp[u][i]!=dp[v][i])
|
||||
{
|
||||
u=dp[u][i];
|
||||
v=dp[v][i];
|
||||
}
|
||||
}
|
||||
return dp[u][0];
|
||||
}
|
||||
void init()
|
||||
{
|
||||
cur=memo;
|
||||
memset(h_bef,0,sizeof(h_bef));
|
||||
memset(h_aft,0,sizeof(h_aft));
|
||||
memset(dp,0,sizeof(dp));
|
||||
bnum=0; idx=0; son_root=0;
|
||||
while(stk.size()) stk.pop();
|
||||
for(int i=0;i<N;i++)
|
||||
{
|
||||
block[i].clear();
|
||||
dfn[i]=0; low[i]=0; lab[i]=-1;
|
||||
id[i]=i; iscut[i]=0; bn[i]=0;
|
||||
son[i]=0; dep[i]=0; vis[i]=0;
|
||||
fa[i]=-1;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,m,Q,t_cnt=0;
|
||||
while(scanf("%d%d",&n,&m)!=EOF)
|
||||
{
|
||||
init();
|
||||
for(int i=0;i<m;i++)
|
||||
{
|
||||
int u,v; scanf("%d%d",&u,&v);
|
||||
addEdge(u,v,h_bef);
|
||||
addEdge(v,u,h_bef);
|
||||
}
|
||||
for(int i=0;i<n;i++) if(dfn[i]==0)
|
||||
{
|
||||
son_root=0;
|
||||
tarjan(i,-2);
|
||||
if(son_root>1) iscut[i]=1;
|
||||
}
|
||||
int k=0;
|
||||
for(int i=0;i<n;i++) if(iscut[i])
|
||||
{
|
||||
lab[i]=k; bn[k]=1; k++;
|
||||
}
|
||||
for(int i=0;i<bnum;i++)
|
||||
{
|
||||
for(int j=0;j<(int)block[i].size();j++)
|
||||
{
|
||||
int u=block[i][j];
|
||||
if(iscut[u])
|
||||
{
|
||||
addEdge(lab[u],k,h_aft);
|
||||
addEdge(k,lab[u],h_aft);
|
||||
}
|
||||
else lab[u]=k;
|
||||
}
|
||||
bn[k]=(int)block[i].size();
|
||||
k++;
|
||||
}
|
||||
for(int i=0;i<k;i++) if(dep[i]==0) dfs(i,-1,0,i);
|
||||
scanf("%d",&Q);
|
||||
printf("Case #%d:\n",++t_cnt);
|
||||
while(Q--)
|
||||
{
|
||||
int s,t; scanf("%d%d",&s,&t);
|
||||
if(s==t) printf("%d\n",n-1);
|
||||
else if(lab[s]==-1||lab[t]==-1||id[lab[s]]!=id[lab[t]]) printf("%d\n",n);
|
||||
else
|
||||
{
|
||||
s=lab[s]; t=lab[t];
|
||||
int parent=lca(s,t);
|
||||
int cnt=son[s]+son[t]-2*son[parent]+bn[parent];
|
||||
int len=dep[s]+dep[t]-2*dep[parent];
|
||||
int ans=cnt-len;
|
||||
printf("%d\n",n-ans);
|
||||
}
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
return 0;
|
||||
}
|
91
HDOJ/4339_autoAC.cpp
Normal file
91
HDOJ/4339_autoAC.cpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
#include"iostream"
|
||||
#include"cstdio"
|
||||
#include"cstring"
|
||||
using namespace std;
|
||||
const int N=1000010;
|
||||
int ltr[N<<2];
|
||||
char s[2][N];
|
||||
void build(int l,int r,int k)
|
||||
{
|
||||
if(l==r)
|
||||
{
|
||||
if(s[0][l]==s[1][l]) ltr[k]=1;
|
||||
else ltr[k]=0;
|
||||
return ;
|
||||
}
|
||||
int mid=(l+r)>>1;
|
||||
int l_son=k<<1;
|
||||
int r_son=l_son+1;
|
||||
build(l,mid,l_son);
|
||||
build(mid+1,r,r_son);
|
||||
ltr[k]=ltr[l_son];
|
||||
if(ltr[l_son]==mid-l+1) ltr[k]+=ltr[r_son];
|
||||
}
|
||||
void update(int l,int r,int z,int aim,char c,int k)
|
||||
{
|
||||
if(l==r)
|
||||
{
|
||||
s[z][aim]=c;
|
||||
ltr[k]=s[0][aim]==s[1][aim];
|
||||
return ;
|
||||
}
|
||||
int mid=(l+r)>>1;
|
||||
int l_son=k<<1;
|
||||
int r_son=l_son+1;
|
||||
if(aim<=mid)update(l,mid,z,aim,c,l_son);
|
||||
else update(mid+1,r,z,aim,c,r_son);
|
||||
ltr[k]=ltr[l_son];
|
||||
if(ltr[l_son]==mid-l+1) ltr[k]+=ltr[r_son];
|
||||
}
|
||||
int find(int l,int r,int aim,int k)
|
||||
{
|
||||
if(l==aim) return ltr[k];
|
||||
int mid=(l+r)>>1;
|
||||
int l_son=k<<1;
|
||||
int r_son=l_son+1;
|
||||
int ans;
|
||||
if(aim<=mid)
|
||||
{
|
||||
ans=find(l,mid,aim,l_son);
|
||||
if(ans==mid-aim+1) ans+=find(mid+1,r,mid+1,r_son);
|
||||
}
|
||||
else ans=find(mid+1,r,aim,r_son);
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,Case;
|
||||
int i;
|
||||
int len,q;
|
||||
int x,a,b;
|
||||
char c[10];
|
||||
cin>>T;
|
||||
for(Case=1;Case<=T;Case++)
|
||||
{
|
||||
scanf("%s%s",s[0]+1,s[1]+1);
|
||||
i=1;
|
||||
while(s[0][i] && s[1][i]) i++;
|
||||
len=i-1;
|
||||
i=1;
|
||||
build(1,len,1);
|
||||
cin>>q;
|
||||
printf("Case %d:\n",Case);
|
||||
while(q--)
|
||||
{
|
||||
scanf("%d",&x);
|
||||
if(x==1)
|
||||
{
|
||||
scanf("%d%d%s",&a,&b,c);
|
||||
if(b+1>len) continue;
|
||||
update(1,len,a-1,b+1,c[0],1);
|
||||
}
|
||||
else
|
||||
{
|
||||
scanf("%d",&b);
|
||||
if(b+1>len) printf("0\n");
|
||||
else printf("%d\n",find(1,len,b+1,1));
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
69
HDOJ/4340_autoAC.cpp
Normal file
69
HDOJ/4340_autoAC.cpp
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<iostream>
|
||||
#include<vector>
|
||||
#include<string>
|
||||
#include<set>
|
||||
#include<algorithm>
|
||||
#include<map>
|
||||
#include<iostream>
|
||||
using namespace std;
|
||||
const int inf = 100000;
|
||||
const int maxn = 101;
|
||||
vector<int> edge[maxn];
|
||||
int a[maxn],b[maxn];
|
||||
int f[maxn][2],g[maxn][2];
|
||||
void dfs(int u,int fa)
|
||||
{
|
||||
f[u][0]=0;
|
||||
g[u][0]=0;
|
||||
int sz=edge[u].size();
|
||||
int m1=inf,m2=inf;
|
||||
bool leaf=true;
|
||||
for(int i=0;i<sz;i++)
|
||||
{
|
||||
int v=edge[u][i];
|
||||
if(v==fa) continue;
|
||||
dfs(v,u);
|
||||
leaf=false;
|
||||
int tmp=min(f[v][0],g[v][1]);
|
||||
f[u][0]+=tmp;
|
||||
m1=min(m1,f[v][1]-tmp);
|
||||
tmp=min(g[v][0],f[v][1]);
|
||||
g[u][0]+=tmp;
|
||||
m2=min(m2,g[v][1]-tmp);
|
||||
}
|
||||
if(leaf)
|
||||
{
|
||||
f[u][1]=a[u];
|
||||
f[u][0]=a[u]/2;
|
||||
g[u][1]=b[u];
|
||||
g[u][0]=b[u]/2;
|
||||
}
|
||||
else
|
||||
{
|
||||
f[u][1]=f[u][0] + min(a[u],m1+a[u]/2);
|
||||
f[u][0]+=a[u]/2;
|
||||
g[u][1]=g[u][0] + min(b[u],m2+b[u]/2);
|
||||
g[u][0]+=b[u]/2;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while(scanf("%d",&n)!=EOF)
|
||||
{
|
||||
for(int i=0;i<=n;i++) edge[i].clear();
|
||||
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
|
||||
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
|
||||
for(int i=1,u,v;i<n;i++)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
edge[u].push_back(v);
|
||||
edge[v].push_back(u);
|
||||
}
|
||||
dfs(1,0);
|
||||
printf("%d\n",min(f[1][1],g[1][1]));
|
||||
}
|
||||
return 0;
|
||||
}
|
77
HDOJ/4341_autoAC.cpp
Normal file
77
HDOJ/4341_autoAC.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<queue>
|
||||
#include<set>
|
||||
#include<map>
|
||||
#include<vector>
|
||||
#include<stack>
|
||||
#include<cmath>
|
||||
#include<string>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const int sigma_size=26;
|
||||
const int N=200+100;
|
||||
const int MAXN=40000+100;
|
||||
const double eps=1e-8;
|
||||
const int inf=0x3fffffff;
|
||||
const int mod=1000000000+7;
|
||||
#define L(x) (x<<1)
|
||||
#define R(x) (x<<1|1)
|
||||
int n,T;
|
||||
int dp[MAXN],res[MAXN],st[MAXN];
|
||||
struct node{
|
||||
int x,y,t,val;
|
||||
}p[N];
|
||||
vector<int>G[N];
|
||||
bool judge(node a,node b){
|
||||
return a.x*b.y == b.x*a.y;
|
||||
}
|
||||
bool cmp(int a,int b){
|
||||
return p[a].x*p[a].x+p[a].y*p[a].y<p[b].x*p[b].x+p[b].y*p[b].y;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int kase=0;
|
||||
while(~scanf("%d%d",&n,&T)){
|
||||
for(int i=1;i<=n;i++)
|
||||
scanf("%d%d%d%d",&p[i].x,&p[i].y,&p[i].t,&p[i].val);
|
||||
int cnt=0;
|
||||
for(int i=1;i<=n;i++){
|
||||
int flag=1;
|
||||
for(int j=0;j<cnt;j++){
|
||||
if(!flag)
|
||||
break;
|
||||
if(judge(p[i],p[G[j][0]])){
|
||||
G[j].push_back(i);
|
||||
flag=0;
|
||||
}
|
||||
}
|
||||
if(!flag)
|
||||
continue;
|
||||
G[cnt].clear(); G[cnt++].push_back(i);
|
||||
}
|
||||
memset(dp,0,sizeof(dp));
|
||||
for(int i=0;i<cnt;i++){
|
||||
sort(G[i].begin(),G[i].end(),cmp);
|
||||
memcpy(res,dp,sizeof(dp));
|
||||
memcpy(st,dp,sizeof(dp));
|
||||
int val=0,t=0;
|
||||
for(int j=0;j<G[i].size();j++){
|
||||
int id=G[i][j];
|
||||
t+=p[id].t; val+=p[id].val;
|
||||
if(t>T)
|
||||
break;
|
||||
for(int k=T;k>=t;k--)
|
||||
if(res[k]<=res[k-t]+val)
|
||||
res[k]=res[k-t]+val;
|
||||
for(int k=t;k<=T;k++)
|
||||
dp[k]=max(dp[k],res[k]);
|
||||
memcpy(res,st,sizeof(st));
|
||||
}
|
||||
}
|
||||
printf("Case %d: %d\n",++kase,dp[T]);
|
||||
}
|
||||
return 0;
|
||||
}
|
20
HDOJ/4342_autoAC.cpp
Normal file
20
HDOJ/4342_autoAC.cpp
Normal file
|
@ -0,0 +1,20 @@
|
|||
#include<stdio.h>
|
||||
#include<math.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
long long a;
|
||||
while(T--)
|
||||
{
|
||||
scanf("%I64d",&a);
|
||||
double temp=ceil((1+sqrt(1+4*a))/2)-1;
|
||||
long long n=(long long)temp;
|
||||
long long res1=n+a;
|
||||
long long res2=n*(n+1)*(2*n+1)/3-3*(n+1)*n/2+n+(n+a-n*n+1)*n;
|
||||
printf("%I64d %I64d\n",res1,res2);
|
||||
}
|
||||
return 0;
|
||||
}
|
72
HDOJ/4343_autoAC.cpp
Normal file
72
HDOJ/4343_autoAC.cpp
Normal file
|
@ -0,0 +1,72 @@
|
|||
#include<iostream>
|
||||
#include<stdio.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int N=100050;
|
||||
int n,m,opt[20][N*2],x[N*2],cnt;
|
||||
struct node
|
||||
{
|
||||
int l,r;
|
||||
void read(){ scanf("%d%d",&l,&r); x[cnt++]=l; x[cnt++]=r; }
|
||||
void print(){ printf("%d %d\n",l,r); }
|
||||
bool operator <(const node tmp) const{ return l<tmp.l||(l==tmp.l&&r<tmp.r); }
|
||||
}no[N];
|
||||
inline int getid(int val,bool f)
|
||||
{
|
||||
if(!f) return lower_bound(x,x+cnt,val)-x;
|
||||
return upper_bound(x,x+cnt,val)-x-1;
|
||||
}
|
||||
int calc(int l,int r)
|
||||
{
|
||||
if(l>r) return 0;
|
||||
if(l==cnt||r==-1) return 0;
|
||||
int ret=0;
|
||||
for(int i=19;i>=0;i--){
|
||||
if(opt[i][l]<=r) {
|
||||
ret+=(1<<i);
|
||||
l=opt[i][l];
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&m)!=-1)
|
||||
{
|
||||
cnt=0;
|
||||
for(int i=0;i<n;i++){
|
||||
no[i].read();
|
||||
}
|
||||
sort(no,no+n);
|
||||
sort(x,x+cnt);
|
||||
cnt=unique(x,x+cnt)-x;
|
||||
for(int i=0;i<n;i++){
|
||||
no[i].l=getid(no[i].l,0);
|
||||
no[i].r=getid(no[i].r,1);
|
||||
}
|
||||
x[cnt]=cnt;
|
||||
int mn=cnt,r=n;
|
||||
for(int i=cnt-1;i>=0;i--)
|
||||
{
|
||||
while(r>0&&no[r-1].l>=i){
|
||||
r--;
|
||||
mn=min(mn,no[r].r);
|
||||
}
|
||||
opt[0][i]=mn;
|
||||
}
|
||||
for(int i=0;i<20;i++) opt[i][cnt]=cnt;
|
||||
for(int i=1;i<20;i++){
|
||||
for(int j=0;j<cnt;j++){
|
||||
opt[i][j]=opt[i-1][opt[i-1][j]];
|
||||
}
|
||||
}
|
||||
while(m--)
|
||||
{
|
||||
int l,r;
|
||||
scanf("%d%d",&l,&r);
|
||||
l=getid(l,0); r=getid(r,1);
|
||||
printf("%d\n",calc(l,r));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
142
HDOJ/4344_autoAC.cpp
Normal file
142
HDOJ/4344_autoAC.cpp
Normal file
|
@ -0,0 +1,142 @@
|
|||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
#define Times 10
|
||||
typedef __int64 LL;
|
||||
map<LL,int>m;
|
||||
LL Random(LL n)
|
||||
{
|
||||
return ((double)rand()/RAND_MAX*n+0.5);
|
||||
}
|
||||
LL multi(LL a,LL b,LL mod)
|
||||
{
|
||||
LL ans=0;
|
||||
while(b)
|
||||
{
|
||||
if(b&1)
|
||||
{
|
||||
b--;
|
||||
ans=(ans+a)%mod;
|
||||
}
|
||||
else
|
||||
{
|
||||
b/=2;
|
||||
a=(a+a)%mod;
|
||||
}
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
LL Pow(LL a,LL b,LL mod)
|
||||
{
|
||||
LL ans=1;
|
||||
while(b)
|
||||
{
|
||||
if(b&1)
|
||||
{
|
||||
b--;
|
||||
ans=multi(ans,a,mod);
|
||||
}
|
||||
else
|
||||
{
|
||||
b/=2;
|
||||
a=multi(a,a,mod);
|
||||
}
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
bool witness(LL a,LL n)
|
||||
{
|
||||
LL d=n-1;
|
||||
while(!(d&1))
|
||||
d>>=1;
|
||||
LL t=Pow(a,d,n);
|
||||
while(d!=n-1 && t!=1 && t!=n-1)
|
||||
{
|
||||
t=multi(t,t,n);
|
||||
d<<=1;
|
||||
}
|
||||
return t==n-1 || d&1;
|
||||
}
|
||||
bool miller_rabin(LL n)
|
||||
{
|
||||
if(n==2)
|
||||
return true;
|
||||
if(n<2||!(n&1))
|
||||
return false;
|
||||
for(int i=1;i<=Times;i++)
|
||||
{
|
||||
LL a=Random(n-2)+1;
|
||||
if(!witness(a,n))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
LL gcd(LL a,LL b)
|
||||
{
|
||||
if(b==0)
|
||||
return a;
|
||||
return gcd(b,a%b);
|
||||
}
|
||||
LL pollard_rho(LL n,LL c)
|
||||
{
|
||||
LL x,y,d,i=1,k=2;
|
||||
x=Random(n-1)+1;
|
||||
y=x;
|
||||
while(1)
|
||||
{
|
||||
i++;
|
||||
x=(multi(x,x,n)+c)%n;
|
||||
d=gcd(y-x,n);
|
||||
if(1<d&&d<n)
|
||||
return d;
|
||||
if(y==x)
|
||||
return n;
|
||||
if(i==k)
|
||||
{
|
||||
y=x;
|
||||
k<<=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
void find(LL n,LL c)
|
||||
{
|
||||
if(n==1)
|
||||
return ;
|
||||
if(miller_rabin(n))
|
||||
{
|
||||
m[n]++;
|
||||
return ;
|
||||
}
|
||||
LL p=n;
|
||||
while(p>=n)
|
||||
p=pollard_rho(p,c--);
|
||||
find(p,c);
|
||||
find(n/p,c);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
cin>>t;
|
||||
while(t--)
|
||||
{
|
||||
LL n;
|
||||
cin>>n;
|
||||
m.clear();
|
||||
find(n,2013724);
|
||||
if(m.size()==1)
|
||||
cout<<1<<" "<<n/m.begin()->first<<endl;
|
||||
else
|
||||
{
|
||||
LL ans=0;
|
||||
map<LL,int>::iterator it=m.begin();
|
||||
for(;it!=m.end();it++)
|
||||
ans+=Pow(it->first,it->second,n);
|
||||
cout<<m.size()<<" "<<ans<<endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
48
HDOJ/4345_autoAC.cpp
Normal file
48
HDOJ/4345_autoAC.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
const int MAXN=1100;
|
||||
int prime[MAXN+1];
|
||||
int getPrime()
|
||||
{
|
||||
memset(prime,0,sizeof(prime));
|
||||
for(int i=2;i<=MAXN;i++)
|
||||
{
|
||||
if(!prime[i]) prime[++prime[0]]=i;
|
||||
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
|
||||
{
|
||||
prime[prime[j]*i]=1;
|
||||
if(i%prime[j]==0)break;
|
||||
}
|
||||
}
|
||||
return prime[0];
|
||||
}
|
||||
long long dp[MAXN][MAXN];
|
||||
long long DP(int n,int i)
|
||||
{
|
||||
if(dp[n][i]!=-1)return dp[n][i];
|
||||
if(prime[i]>n)
|
||||
{
|
||||
dp[n][i]=1;
|
||||
return dp[n][i];
|
||||
}
|
||||
int k=0;
|
||||
dp[n][i]=0;
|
||||
while(k<=n)
|
||||
{
|
||||
dp[n][i]+=DP(n-k,i+1);
|
||||
if(k==0)k=prime[i];
|
||||
else k*=prime[i];
|
||||
}
|
||||
return dp[n][i];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
getPrime();
|
||||
memset(dp,-1,sizeof(dp));
|
||||
int n;
|
||||
while(scanf("%d",&n)!=EOF)
|
||||
{
|
||||
printf("%I64d\n",DP(n,1));
|
||||
}
|
||||
return 0;
|
||||
}
|
47
HDOJ/4346_autoAC.cpp
Normal file
47
HDOJ/4346_autoAC.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
#define mod 1000000007
|
||||
int t;
|
||||
long long mod_pow(int a,int n,int p)
|
||||
{
|
||||
long long ret=1;
|
||||
long long A=a;
|
||||
while(n){
|
||||
if (n & 1)
|
||||
ret=(ret*A)%p;
|
||||
A=(A*A)%p;
|
||||
n>>=1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main(){
|
||||
scanf("%d",&t);
|
||||
while( t -- ){
|
||||
char str[808];
|
||||
scanf("%s",str);
|
||||
int len = strlen(str);
|
||||
int unknown = 0, r_num = 0;
|
||||
for(int i = 0; i < len; i ++){
|
||||
if(str[i] == '?') unknown ++;
|
||||
else if(str[i] == 'R') r_num ++;
|
||||
}
|
||||
long long unbea = (r_num == 0);
|
||||
for(int i = 0; i < len; i ++){
|
||||
if(str[i] == 'R' || str[i] == '?'){
|
||||
int x = (str[i] == 'R');
|
||||
unbea = (unbea + (x == r_num) ) % mod;
|
||||
for(int dis = 1; dis + i < len; dis += 2){
|
||||
int y = x;
|
||||
for(int sta = i + dis; sta < len; sta += dis){
|
||||
y += (str[sta] == 'R');
|
||||
if(str[sta] == 'G') break;
|
||||
unbea = (unbea + (y == r_num) )% mod;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%I64d\n",mod_pow(2,unknown,mod) - unbea);
|
||||
}
|
||||
return 0;
|
||||
}
|
76
HDOJ/4347_autoAC.cpp
Normal file
76
HDOJ/4347_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include<queue>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int N=55555,K=5;
|
||||
const int inf=0x3f3f3f3f;
|
||||
#define sqr(x) (x)*(x)
|
||||
int k,n,idx;
|
||||
struct point
|
||||
{
|
||||
int x[K];
|
||||
bool operator < (const point &u) const
|
||||
{
|
||||
return x[idx]<u.x[idx];
|
||||
}
|
||||
}po[N];
|
||||
typedef pair<double,point>tp;
|
||||
priority_queue<tp>nq;
|
||||
struct kdTree
|
||||
{
|
||||
point pt[N<<2];
|
||||
int son[N<<2];
|
||||
void build(int l,int r,int rt=1,int dep=0)
|
||||
{
|
||||
if(l>r) return;
|
||||
son[rt]=r-l;
|
||||
son[rt*2]=son[rt*2+1]=-1;
|
||||
idx=dep%k;
|
||||
int mid=(l+r)/2;
|
||||
nth_element(po+l,po+mid,po+r+1);
|
||||
pt[rt]=po[mid];
|
||||
build(l,mid-1,rt*2,dep+1);
|
||||
build(mid+1,r,rt*2+1,dep+1);
|
||||
}
|
||||
void query(point p,int m,int rt=1,int dep=0)
|
||||
{
|
||||
if(son[rt]==-1) return;
|
||||
tp nd(0,pt[rt]);
|
||||
for(int i=0;i<k;i++) nd.first+=sqr(nd.second.x[i]-p.x[i]);
|
||||
int dim=dep%k,x=rt*2,y=rt*2+1,fg=0;
|
||||
if(p.x[dim]>=pt[rt].x[dim]) swap(x,y);
|
||||
if(~son[x]) query(p,m,x,dep+1);
|
||||
if(nq.size()<m) nq.push(nd),fg=1;
|
||||
else
|
||||
{
|
||||
if(nd.first<nq.top().first) nq.pop(),nq.push(nd);
|
||||
if(sqr(p.x[dim]-pt[rt].x[dim])<nq.top().first) fg=1;
|
||||
}
|
||||
if(~son[y]&&fg) query(p,m,y,dep+1);
|
||||
}
|
||||
}kd;
|
||||
void print(point &p)
|
||||
{
|
||||
for(int j=0;j<k;j++) printf("%d%c",p.x[j],j==k-1?'\n':' ');
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&k)!=EOF)
|
||||
{
|
||||
for(int i=0;i<n;i++) for(int j=0;j<k;j++) scanf("%d",&po[i].x[j]);
|
||||
kd.build(0,n-1);
|
||||
int t,m;
|
||||
for(scanf("%d",&t);t--;)
|
||||
{
|
||||
point ask;
|
||||
for(int j=0;j<k;j++) scanf("%d",&ask.x[j]);
|
||||
scanf("%d",&m); kd.query(ask,m);
|
||||
printf("the closest %d points are:\n", m);
|
||||
point pt[20];
|
||||
for(int j=0;!nq.empty();j++) pt[j]=nq.top().second,nq.pop();
|
||||
for(int j=m-1;j>=0;j--) print(pt[j]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
109
HDOJ/4348_autoAC.cpp
Normal file
109
HDOJ/4348_autoAC.cpp
Normal file
|
@ -0,0 +1,109 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
const int maxn = 100010;
|
||||
int n, m;
|
||||
struct Node {
|
||||
long long d, td;
|
||||
int timelabel;
|
||||
Node() {};
|
||||
Node(long long _d, long long _td, int t) {
|
||||
d = _d; td = _td; timelabel = t;
|
||||
}
|
||||
};
|
||||
vector<Node> bit[maxn];
|
||||
long long a[maxn], sum[maxn] = {0};
|
||||
inline int lowbit(int x)
|
||||
{
|
||||
return x & (-x);
|
||||
}
|
||||
inline void update(int x, long long w, int timelabel)
|
||||
{
|
||||
int size;
|
||||
long long tw = w * x;
|
||||
while (x <= n) {
|
||||
size = bit[x].size();
|
||||
bit[x].push_back(bit[x][size-1]);
|
||||
size++;
|
||||
bit[x][size-1].d += w;
|
||||
bit[x][size-1].td += tw;
|
||||
bit[x][size-1].timelabel = timelabel;
|
||||
x += lowbit(x);
|
||||
}
|
||||
}
|
||||
inline long long getsum(int x, int timelabel)
|
||||
{
|
||||
long long sd = 0, std = 0;
|
||||
int size, ox = x;
|
||||
while (x > 0) {
|
||||
size = bit[x].size();
|
||||
while (bit[x][size-1].timelabel > timelabel) {
|
||||
size--;
|
||||
}
|
||||
sd += bit[x][size-1].d;
|
||||
std += bit[x][size-1].td;
|
||||
x -= lowbit(x);
|
||||
}
|
||||
return (ox + 1) * sd - std;
|
||||
}
|
||||
inline long long getans(int x, int y, int timelabel)
|
||||
{
|
||||
return sum[y] - sum[x-1] + getsum(y, timelabel) - getsum(x - 1, timelabel);
|
||||
}
|
||||
inline void back(int timelabel)
|
||||
{
|
||||
int size;
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
size = bit[i].size();
|
||||
while (bit[i][size-1].timelabel > timelabel) {
|
||||
bit[i].pop_back();
|
||||
size--;
|
||||
}
|
||||
}
|
||||
}
|
||||
void build()
|
||||
{
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
bit[i].clear();
|
||||
bit[i].push_back(Node(0LL, 0LL, 0));
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int cas = 0;
|
||||
while (scanf("%d%d", &n, &m) != EOF) {
|
||||
if (cas++) printf("\n");
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
scanf("%lld\n", &a[i]);
|
||||
sum[i] = sum[i-1] + a[i];
|
||||
}
|
||||
char op[3];
|
||||
int x, y, z;
|
||||
int timelabel = 0;
|
||||
build();
|
||||
while (m--) {
|
||||
scanf("%s", op);
|
||||
if (op[0] == 'Q') {
|
||||
scanf("%d%d", &x, &y);
|
||||
printf("%lld\n", getans(x, y, timelabel));
|
||||
} else if (op[0] == 'C') {
|
||||
scanf("%d%d%d", &x, &y, &z);
|
||||
timelabel++;
|
||||
update(x, z, timelabel);
|
||||
update(y + 1, -z, timelabel);
|
||||
} else if (op[0] == 'H') {
|
||||
scanf("%d%d%d", &x, &y, &z);
|
||||
printf("%lld\n", getans(x, y, z));
|
||||
} else {
|
||||
scanf("%d", &x);
|
||||
timelabel = x;
|
||||
back(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
24
HDOJ/4349_autoAC.cpp
Normal file
24
HDOJ/4349_autoAC.cpp
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include"cstdlib"
|
||||
#include"cstdio"
|
||||
#include"cstring"
|
||||
#include"cmath"
|
||||
#include"stack"
|
||||
#include"algorithm"
|
||||
#include"iostream"
|
||||
#define ll __int64
|
||||
using namespace std;
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while(cin>>n)
|
||||
{
|
||||
int cnt=0;
|
||||
while(n)
|
||||
{
|
||||
if(n%2==1) cnt++;
|
||||
n/=2;
|
||||
}
|
||||
printf("%d\n",1<<cnt);
|
||||
}
|
||||
return 0;
|
||||
}
|
41
HDOJ/4350_autoAC.cpp
Normal file
41
HDOJ/4350_autoAC.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
int ans[10000][53];
|
||||
int main(){
|
||||
int T, op, left, right;
|
||||
scanf("%d", &T);
|
||||
for(int t=1; t<=T; t++){
|
||||
for(int i=1; i<=52; i++)
|
||||
scanf("%d", &ans[0][i]);
|
||||
scanf("%d %d %d", &op, &left, &right);
|
||||
int len = 1;
|
||||
while(1){
|
||||
int tag = 1;
|
||||
for(int i=left; i<=right; i++)
|
||||
ans[len][tag++] = ans[len-1][i];
|
||||
for(int i=1; i<left; i++)
|
||||
ans[len][tag++] = ans[len-1][i];
|
||||
for(int i=right+1; i<=52; i++)
|
||||
ans[len][tag++] = ans[len-1][i];
|
||||
bool flag = true;
|
||||
for(int i=1; i<=52; i++)
|
||||
if(ans[0][i] != ans[len][i]){
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
if(flag){
|
||||
tag = op%len;
|
||||
printf("Case #%d:", t);
|
||||
for(int i=1; i<=52; i++)
|
||||
printf(" %d", ans[tag][i]);
|
||||
printf("\n");
|
||||
break;
|
||||
}
|
||||
len++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
125
HDOJ/4351_autoAC.cpp
Normal file
125
HDOJ/4351_autoAC.cpp
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
typedef struct
|
||||
{
|
||||
int l,r,sum;
|
||||
int lsum,rsum,midsum;
|
||||
}Tree;
|
||||
Tree tree[500005];
|
||||
int a[100005];
|
||||
int c[2000][2000];
|
||||
int ans,rans;
|
||||
int Count(int t)
|
||||
{
|
||||
if (t==0) return 0;
|
||||
int s=0;
|
||||
while(t)
|
||||
{
|
||||
s+=t%10;
|
||||
t/=10;
|
||||
}
|
||||
s%=9;
|
||||
if (s==0) return 9;
|
||||
return s;
|
||||
}
|
||||
int Pre()
|
||||
{
|
||||
int i,j,x,y;
|
||||
for (i=0;i<1024;i++)
|
||||
{
|
||||
for (j=i;j<1024;j++)
|
||||
{
|
||||
c[i][j]=0;
|
||||
for (x=0;x<10;x++)
|
||||
{
|
||||
if ((i & (1<<x))==0) continue;
|
||||
for (y=0;y<10;y++)
|
||||
{
|
||||
if ((j & (1<<y))==0) continue;
|
||||
c[i][j]=(c[i][j]|(1<<Count(x+y)));
|
||||
}
|
||||
}
|
||||
c[j][i]=c[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
void Build(int t,int l,int r)
|
||||
{
|
||||
tree[t].l=l;
|
||||
tree[t].r=r;
|
||||
if (l==r)
|
||||
{
|
||||
tree[t].sum=a[l];
|
||||
tree[t].lsum=(1<<a[l]);
|
||||
tree[t].rsum=(1<<a[l]);
|
||||
tree[t].midsum=(1<<a[l]);
|
||||
return;
|
||||
}
|
||||
int mid=(l+r)/2;
|
||||
Build(2*t+1,l,mid);
|
||||
Build(2*t+2,mid+1,r);
|
||||
tree[t].sum=Count(tree[2*t+1].sum+tree[2*t+2].sum);
|
||||
tree[t].lsum=(tree[2*t+1].lsum | c[1<<tree[2*t+1].sum][tree[2*t+2].lsum]);
|
||||
tree[t].rsum=(tree[2*t+2].rsum | c[tree[2*t+1].rsum][1<<tree[2*t+2].sum]);
|
||||
tree[t].midsum=(tree[2*t+1].midsum | tree[2*t+2].midsum | c[tree[2*t+1].rsum][tree[2*t+2].lsum]);
|
||||
}
|
||||
void Query(int t,int x,int y)
|
||||
{
|
||||
int l,r;
|
||||
l=tree[t].l;
|
||||
r=tree[t].r;
|
||||
if (l==x && r==y)
|
||||
{
|
||||
ans=(ans | tree[t].midsum | c[rans][tree[t].lsum]);
|
||||
rans=(c[rans][1<<tree[t].sum] | tree[t].rsum);
|
||||
return;
|
||||
}
|
||||
int mid=(l+r)/2;
|
||||
if (mid>=x) Query(2*t+1,x,min(y,mid));
|
||||
if (mid<y) Query(2*t+2,max(x,mid+1),y);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,i,j,n,x,y,m,s,cnt=1;
|
||||
Pre();
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
for (i=0;i<n;i++)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
a[i]=Count(a[i]);
|
||||
}
|
||||
Build(0,0,n-1);
|
||||
scanf("%d",&m);
|
||||
printf("Case #%d:\n",cnt++);
|
||||
while(m--)
|
||||
{
|
||||
scanf("%d%d",&x,&y);
|
||||
ans=rans=0;
|
||||
Query(0,x-1,y-1);
|
||||
s=0;
|
||||
for (i=9;i>=0;i--)
|
||||
{
|
||||
if (ans>=(1<<i))
|
||||
{
|
||||
ans-=(1<<i);
|
||||
if (s==0) printf("%d",i);
|
||||
else printf(" %d",i);
|
||||
s++;
|
||||
if (s==5) break;
|
||||
}
|
||||
}
|
||||
for (i=s;i<5;i++)
|
||||
{
|
||||
printf(" -1");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
if (T>0) printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
81
HDOJ/4352_autoAC.cpp
Normal file
81
HDOJ/4352_autoAC.cpp
Normal file
|
@ -0,0 +1,81 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<bitset>
|
||||
#include<cstdlib>
|
||||
#include<cmath>
|
||||
#include<iostream>
|
||||
#include<string>
|
||||
#include<vector>
|
||||
#include<queue>
|
||||
#include<deque>
|
||||
#include<set>
|
||||
#include<map>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const int N = 20;
|
||||
ll dp[N][10][1<<10][11];
|
||||
int has[1<<10];
|
||||
int ne[1<<10][10];
|
||||
int bit[N],K;
|
||||
int go(int mask,int number){
|
||||
int pos = -1;
|
||||
for(int i = number;i <=9;i++)
|
||||
if(mask & (1<<i)){
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
if(pos == -1)mask |= 1<<number;
|
||||
else{
|
||||
mask ^= 1<<pos;
|
||||
mask |= 1<<number;
|
||||
}
|
||||
return mask;
|
||||
}
|
||||
void init(){
|
||||
memset(dp,-1,sizeof(dp));
|
||||
for(int i=0;i<1<<10;i++){
|
||||
has[i] = 0;
|
||||
for(int j=0;j<10;j++)
|
||||
if(i&(1<<j))has[i]++;
|
||||
}
|
||||
for(int i = 0;i < 1<<10;i++)
|
||||
for(int j = 0;j < 10;j++)
|
||||
ne[i][j] = go(i,j);
|
||||
for(int i = 0;i < 15;i++){
|
||||
for(int j=0;j<10;j++){
|
||||
}
|
||||
}
|
||||
}
|
||||
ll dfs(int pos,int number,int mask,bool isZero,bool flag){
|
||||
if(pos == 0)return has[mask] == K;
|
||||
if(flag && ~dp[pos][number][mask][K])return dp[pos][number][mask][K];
|
||||
ll ans = 0;
|
||||
int u = flag ? 9:bit[pos];
|
||||
for(int d = 0;d <= u;d++){
|
||||
if(isZero && d == 0)ans += dfs(pos-1,d,0,1,flag || d < u);
|
||||
else{
|
||||
ans += dfs(pos-1,d,ne[mask][d],0,flag || d < u);
|
||||
}
|
||||
}
|
||||
if(flag)dp[pos][number][mask][K] = ans ;
|
||||
return ans;
|
||||
}
|
||||
ll solve(ll n){
|
||||
int len = 0;
|
||||
while(n){
|
||||
bit[++len] = n % 10;
|
||||
n /= 10;
|
||||
}
|
||||
return dfs(len,0,0,1,0);
|
||||
}
|
||||
int main(){
|
||||
init();
|
||||
ll L,R;
|
||||
int T;cin >> T;
|
||||
for(int cas = 1;cas <= T;cas++){
|
||||
cin >> L >> R >> K;
|
||||
cout<<"Case #"<<cas<<": "<<solve(R) - solve(L - 1)<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
62
HDOJ/4353_autoAC.cpp
Normal file
62
HDOJ/4353_autoAC.cpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
using namespace std;
|
||||
struct point{
|
||||
int x, y;
|
||||
point() {}
|
||||
point(int a, int b) : x(a), y(b){}
|
||||
void input(){
|
||||
scanf("%d%d", &x, &y);
|
||||
}
|
||||
friend point operator - (const point &a, const point &b){
|
||||
return point(a.x - b.x, a.y - b.y);
|
||||
}
|
||||
friend bool operator < (const point &a, const point &b){
|
||||
return a.x < b.x;
|
||||
}
|
||||
};
|
||||
const int maxn = 200 + 10, maxm = 500 + 10;
|
||||
point po[maxn], mi[maxm];
|
||||
int det(point a, point b){
|
||||
return a.x * b.y - a.y * b.x;
|
||||
}
|
||||
int num[maxn][maxn];
|
||||
int n, m, cs;
|
||||
void init(point a, point b, int &cnt){
|
||||
int x1 = a.x, x2 = b.x;
|
||||
for (int i = 0; i < m; i++)
|
||||
if (mi[i].x >= x1 && mi[i].x < x2)
|
||||
if (det(mi[i] - a, b - a) > 0)
|
||||
cnt += 1;
|
||||
}
|
||||
int main(){
|
||||
scanf("%d", &cs);
|
||||
for (int kase = 1; kase <= cs; ++kase){
|
||||
scanf("%d%d", &n, &m);
|
||||
for (int i = 0; i < n; i++)
|
||||
po[i].input();
|
||||
for (int i = 0; i < m; i++)
|
||||
mi[i].input();
|
||||
sort(po, po + n);
|
||||
for (int i = 0; i < n; i++)
|
||||
for (int j = i + 1; j < n; j++)
|
||||
init(po[i], po[j], num[i][j] = 0);
|
||||
printf("Case #%d: ", kase);
|
||||
double ans = -1;
|
||||
for (int i = 0; i < n; i++)
|
||||
for (int j = i + 1; j < n; j++)
|
||||
for (int k = j + 1; k < n; k++){
|
||||
int cnt = num[i][k] - num[i][j] - num[j][k];
|
||||
if (!cnt) continue;
|
||||
double area = det(po[j] - po[i], po[k] - po[i]) / 2.0;
|
||||
double tmp = area / (double)cnt;
|
||||
if (ans == -1 || ans > tmp) ans = tmp;
|
||||
}
|
||||
if (ans == -1) puts("-1");
|
||||
else printf("%.6lf\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
108
HDOJ/4354_autoAC.cpp
Normal file
108
HDOJ/4354_autoAC.cpp
Normal file
|
@ -0,0 +1,108 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<bitset>
|
||||
#include<cstdlib>
|
||||
#include<cmath>
|
||||
#include<iostream>
|
||||
#include<string>
|
||||
#include<vector>
|
||||
#include<queue>
|
||||
#include<deque>
|
||||
#include<set>
|
||||
#include<map>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int C = 5005;
|
||||
const int N = 2005;
|
||||
const int M = 1005;
|
||||
int cnt[N];
|
||||
int vis[C];
|
||||
int dp[C][2];
|
||||
int c, n, k, m;
|
||||
vector<int>v[N];
|
||||
struct city
|
||||
{
|
||||
int x, y;
|
||||
bool operator<(const city &a) const
|
||||
{
|
||||
return x<a.x;
|
||||
}
|
||||
}ct[C];
|
||||
int min(int x, int y)
|
||||
{
|
||||
if(x==-1) return y;
|
||||
return x<y?x:y;
|
||||
}
|
||||
void dfs(int s)
|
||||
{
|
||||
vis[s] = 1;
|
||||
dp[s][1] = 1;
|
||||
dp[s][0] = 0;
|
||||
for(int i=0; i<v[s].size(); i++)
|
||||
{
|
||||
int ss = v[s][i];
|
||||
if(vis[ss]==1 || cnt[ss]==0) continue;
|
||||
dfs(ss);
|
||||
dp[s][1] += dp[ss][0];
|
||||
dp[s][0] += max(dp[ss][1], dp[ss][0]);
|
||||
}
|
||||
}
|
||||
bool ok(int l, int r)
|
||||
{
|
||||
int res = 0;
|
||||
memset(vis, 0, sizeof(vis));
|
||||
for(int i = l; i<=r; i++)
|
||||
if(vis[ ct[i].y ]==0)
|
||||
{
|
||||
dfs( ct[i].y );
|
||||
res += max( dp[ ct[i].y ][0], dp[ ct[i].y ][1] );
|
||||
}
|
||||
if(res>=k) return true;
|
||||
else return false;
|
||||
}
|
||||
int solve()
|
||||
{
|
||||
int kk, l, r;
|
||||
kk = l = r = 1;
|
||||
cnt[ ct[1].y ]++;
|
||||
int ans = -1;
|
||||
while(r<=c)
|
||||
{
|
||||
if(kk>=k && ok(l, r))
|
||||
{
|
||||
ans = min(ans, ct[r].x - ct[l].x);
|
||||
cnt[ ct[l].y ]--;
|
||||
if( cnt[ ct[l].y ]==0 ) kk--;
|
||||
l++;
|
||||
}
|
||||
else
|
||||
{
|
||||
r++;
|
||||
cnt[ ct[r].y ]++;
|
||||
if( cnt[ ct[r].y ]==1 ) kk++;
|
||||
}
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t, tt=0, i, x, y;
|
||||
scanf("%d", &t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d%d%d", &c, &n, &k, &m);
|
||||
for(i=1; i<=n; i++) v[i].clear();
|
||||
memset(cnt, 0, sizeof(cnt));
|
||||
memset(vis, 0, sizeof(vis));
|
||||
for(i=1; i<=c; i++) scanf("%d%d", &ct[i].x, &ct[i].y);
|
||||
sort(ct+1, ct+1+c);
|
||||
for(i=1; i<=m; i++)
|
||||
{
|
||||
scanf("%d%d", &x, &y);
|
||||
v[x].push_back(y);
|
||||
v[y].push_back(x);
|
||||
}
|
||||
printf("Case #%d: %d\n", ++tt, solve());
|
||||
}
|
||||
return 0;
|
||||
}
|
47
HDOJ/4355_autoAC.cpp
Normal file
47
HDOJ/4355_autoAC.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
const int N = 10e4+1;
|
||||
const float eps = 1e-2;
|
||||
struct po
|
||||
{
|
||||
double x;
|
||||
double w;
|
||||
} point[N];
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
for(int cases = 1; cases<=t; cases++)
|
||||
{
|
||||
int n;
|
||||
scanf("%d",&n);
|
||||
for(int i=1; i<=n; i++)
|
||||
scanf("%lf %lf",&point[i].x,&point[i].w);
|
||||
double low = point[1].x;
|
||||
double high = point[n].x;
|
||||
double sum1 = 10;
|
||||
double sum2 = 0;
|
||||
while(fabs(sum1-sum2)>eps)
|
||||
{
|
||||
double mid1 = low + (high-low)/3;
|
||||
double mid2 = high - (high-low)/3;
|
||||
sum1 = sum2 = 0;
|
||||
for(int i=1; i<=n; i++)
|
||||
{
|
||||
sum1 += pow((fabs(point[i].x - mid1)),3)*point[i].w;
|
||||
sum2 += pow((fabs(point[i].x - mid2)),3)*point[i].w;
|
||||
}
|
||||
if(sum1<sum2)
|
||||
high = mid2;
|
||||
else if(sum1>sum2)
|
||||
low = mid1;
|
||||
else if(sum1==sum2)
|
||||
low = high;
|
||||
}
|
||||
printf("Case #%d: %.0lf\n",cases,sum1);
|
||||
}
|
||||
return 0;
|
||||
}
|
58
HDOJ/4356_autoAC.cpp
Normal file
58
HDOJ/4356_autoAC.cpp
Normal file
|
@ -0,0 +1,58 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <algorithm>
|
||||
#define MOD 1000000007
|
||||
#define N 2010
|
||||
using namespace std;
|
||||
int n,ans;
|
||||
int a[N],w[N];
|
||||
int f[N][N];
|
||||
int fac[N];
|
||||
void init(){
|
||||
fac[0]=1;
|
||||
int i,j;
|
||||
for (i=1;i<=n;i++)
|
||||
fac[i]=(1ll*fac[i-1]*i)%MOD;
|
||||
for (i=0;i<=n;i++) f[1][i]=n-i;
|
||||
for (i=1;i<=n;i++){
|
||||
for (j=0;j<w[i];j++) f[i+1][j]=f[i][j]-1;
|
||||
for (j=w[i];j<=n;j++) f[i+1][j]=f[i][j];
|
||||
}
|
||||
}
|
||||
int dfs(int k){
|
||||
if (k==n) return 0;
|
||||
int tp=(1ll*fac[n-k]*f[k][w[k]])%MOD;
|
||||
int tp1=dfs(k+1);
|
||||
if (w[k]>=a[k]) ans=(1ll*ans+tp1)%MOD;
|
||||
return (1ll*tp1+tp)%MOD;
|
||||
}
|
||||
void work(){
|
||||
int i,j,k;
|
||||
for (i=1;i<=n;i++){
|
||||
if (a[i]>w[i]) ans=(1ll*ans+1ll*f[i][a[i]-1]*fac[n-i])%MOD;
|
||||
else ans=(1ll*ans+1ll*f[i][w[i]]*fac[n-i])%MOD;
|
||||
for (j=i+1;j<=n;j++){
|
||||
k=f[i][w[i]]*f[i][a[j]-1]-min(f[i][w[i]],f[i][a[j]-1]);
|
||||
ans=(1ll*ans+1ll*k*fac[n-i-1])%MOD;
|
||||
}
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
int test;
|
||||
scanf("%d",&test);
|
||||
for (int cas=1;cas<=test;cas++){
|
||||
scanf("%d",&n);
|
||||
for (int i=1;i<=n;i++)
|
||||
scanf("%d",&w[i]);
|
||||
for (int i=1;i<=n;i++)
|
||||
scanf("%d",&a[i]);
|
||||
ans=0;
|
||||
init();
|
||||
work();
|
||||
dfs(1);
|
||||
printf("Case #%d: %d\n",cas,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
27
HDOJ/4357_autoAC.cpp
Normal file
27
HDOJ/4357_autoAC.cpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include<iostream>
|
||||
#include<string>
|
||||
using namespace std;
|
||||
int t;
|
||||
string a,b;
|
||||
int main()
|
||||
{
|
||||
cin>>t;
|
||||
for(int cas=1;cas<=t;cas++){
|
||||
cin>>a>>b;
|
||||
int len=a.length();
|
||||
cout<<"Case #"<<cas<<": ";
|
||||
if(len>2){
|
||||
int n=0,m=0;
|
||||
for(int i=0;i<len;i++){
|
||||
n+=a[i];
|
||||
m+=b[i];
|
||||
}
|
||||
if((n&1)==(m&1)) cout<<"YES"<<endl;
|
||||
else cout<<"NO"<<endl;
|
||||
}
|
||||
else{
|
||||
if(((a[0]-b[0]+26)%26)==((a[1]-b[1]+26)%26)&&(a[0]-b[0])%2==0||((a[0]-b[1]+26)%26)==((a[1]-b[0]+26)%26)&&(a[1]-b[0]+1)%2==0) cout<<"YES"<<endl;
|
||||
else cout<<"NO"<<endl;
|
||||
}
|
||||
}
|
||||
}
|
155
HDOJ/4358_autoAC.cpp
Normal file
155
HDOJ/4358_autoAC.cpp
Normal file
|
@ -0,0 +1,155 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <cstdlib>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
#include <map>
|
||||
#pragma comment(linker, "/STACK:102400000,102400000")
|
||||
using namespace std;
|
||||
#define print(x) cout<<x<<endl
|
||||
#define input(x) cin>>x
|
||||
#define SIZE 100100
|
||||
struct BIT
|
||||
{
|
||||
int baum[SIZE];
|
||||
void init()
|
||||
{
|
||||
memset(baum,0,sizeof(baum));
|
||||
}
|
||||
inline int lowbit(int x)
|
||||
{
|
||||
return x&(-x);
|
||||
}
|
||||
void add(int x,int val)
|
||||
{
|
||||
while(x<SIZE)
|
||||
{
|
||||
baum[x]+=val;
|
||||
x+=lowbit(x);
|
||||
}
|
||||
}
|
||||
int sum(int x)
|
||||
{
|
||||
int res=0;
|
||||
while(x>0)
|
||||
{
|
||||
res+=baum[x];
|
||||
x-=lowbit(x);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
int sum(int l,int r)
|
||||
{
|
||||
return sum(r)-sum(l-1);
|
||||
}
|
||||
};
|
||||
struct query
|
||||
{
|
||||
int l,r,id;
|
||||
query(){}
|
||||
query(int il,int ir,int iid)
|
||||
{
|
||||
l=il;r=ir;id=iid;
|
||||
}
|
||||
friend bool operator < (const query& a,const query& b)
|
||||
{
|
||||
return a.r<b.r;
|
||||
}
|
||||
};
|
||||
int n,k,q;
|
||||
int w[SIZE];
|
||||
vector<int> pl[SIZE];
|
||||
vector<int> g[SIZE];
|
||||
int lson[SIZE],rson[SIZE],val[SIZE];
|
||||
int cnt,ind;
|
||||
void dfs(int now,int father)
|
||||
{
|
||||
lson[now]=rson[now]=++ind;
|
||||
val[now]=w[now];
|
||||
for(int i=0;i<(int)g[now].size();i++)
|
||||
{
|
||||
int next=g[now][i];
|
||||
if(next!=father)
|
||||
{
|
||||
dfs(next,now);
|
||||
rson[now]=rson[next];
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,a,b;
|
||||
BIT bit;
|
||||
query ask[SIZE];
|
||||
int ans[SIZE];
|
||||
map<int,int> mp;
|
||||
input(T);
|
||||
int cas=1;
|
||||
while(T--)
|
||||
{
|
||||
bit.init();
|
||||
cnt=ind=0;
|
||||
mp.clear();
|
||||
memset(ans,0,sizeof(ans));
|
||||
for(int i=0;i<SIZE;i++) g[i].clear();
|
||||
scanf("%d%d",&n,&k);
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&w[i]);
|
||||
if(!mp[w[i]])
|
||||
{
|
||||
mp[w[i]]=++cnt;
|
||||
pl[cnt].clear();
|
||||
}
|
||||
w[i]=mp[w[i]];
|
||||
}
|
||||
for(int i=1;i<n;i++)
|
||||
{
|
||||
scanf("%d%d",&a,&b);
|
||||
g[a].push_back(b);
|
||||
g[b].push_back(a);
|
||||
}
|
||||
dfs(1,-1);
|
||||
scanf("%d",&q);
|
||||
for(int i=0;i<q;i++)
|
||||
{
|
||||
scanf("%d",&a);
|
||||
ask[i]=query(lson[a],rson[a],i);
|
||||
}
|
||||
sort(ask,ask+q);
|
||||
int ptr=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
int v=val[i];
|
||||
pl[v].push_back(i);
|
||||
int sz=pl[v].size();
|
||||
if(sz>=k)
|
||||
{
|
||||
if(sz==k)
|
||||
{
|
||||
bit.add(pl[v][sz-k],1);
|
||||
}
|
||||
if(sz>k)
|
||||
{
|
||||
bit.add(pl[v][sz-k-1],-2);
|
||||
bit.add(pl[v][sz-k],1);
|
||||
}
|
||||
}
|
||||
while(ask[ptr].r==i)
|
||||
{
|
||||
int id=ask[ptr].id;
|
||||
ans[id]=bit.sum(ask[ptr].l,ask[ptr].r);
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
printf("Case #%d:\n",cas++);
|
||||
for(int i=0;i<q;i++)
|
||||
{
|
||||
printf("%d\n",ans[i]);
|
||||
}
|
||||
if(T) puts("");
|
||||
}
|
||||
return 0;
|
||||
}
|
60
HDOJ/4359_autoAC.cpp
Normal file
60
HDOJ/4359_autoAC.cpp
Normal file
|
@ -0,0 +1,60 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<string>
|
||||
#include<algorithm>
|
||||
#include<map>
|
||||
#include<queue>
|
||||
#include<stack>
|
||||
#include<cmath>
|
||||
#include<vector>
|
||||
#define inf 0x3f3f3f3f
|
||||
#define Inf 0x3FFFFFFFFFFFFFFFLL
|
||||
#define eps 1e-9
|
||||
#define pi acos(-1.0)
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const int maxn=365;
|
||||
const int mod=1000000000+7;
|
||||
ll dp[maxn][maxn],C[maxn][maxn];
|
||||
void Init()
|
||||
{
|
||||
memset(C,0,sizeof(C));
|
||||
C[0][0]=1;
|
||||
for(int i=1;i<maxn;++i)
|
||||
{
|
||||
C[i][0]=1;
|
||||
for(int j=1;j<=i;++j)
|
||||
{
|
||||
C[i][j]=C[i-1][j-1]+C[i-1][j];
|
||||
if(C[i][j]>=mod) C[i][j]-=mod;
|
||||
}
|
||||
}
|
||||
}
|
||||
ll f(int n,int d)
|
||||
{
|
||||
if(n==1&&d>=1) return 1;
|
||||
if(n==1||d==0) return 0;
|
||||
if(dp[n][d]!=-1) return dp[n][d];
|
||||
ll &ans=dp[n][d];
|
||||
ans=0;
|
||||
ans=(ans+f(n-1,d-1)*n*2)%mod;
|
||||
for(int k=1;k<=n-2;++k)
|
||||
ans=(ans+(f(k,d-1)*f(n-k-1,d-1)%mod*C[n-2][k]%mod)*n)%mod;
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
Init();
|
||||
memset(dp,0xff,sizeof(dp));
|
||||
int t,tcase=0,n,d;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d",&n,&d);
|
||||
ll ans=f(n,d)-f(n,d-1);
|
||||
ans=(ans+mod)%mod;
|
||||
printf("Case #%d: %I64d\n",++tcase,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
100
HDOJ/4360_autoAC.cpp
Normal file
100
HDOJ/4360_autoAC.cpp
Normal file
|
@ -0,0 +1,100 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
typedef long long lld;
|
||||
const int mn=3333;
|
||||
const int mm=33333;
|
||||
const lld oo=1e15;
|
||||
int reach[mm], ne[mm], flow[mm], ch[mm];
|
||||
lld head[mn], que[mn], dis[mn][4], cnt[mn][4], inque[mn];
|
||||
int n, edge;
|
||||
void addedge(int u, int v, int c1, int c2, char c)
|
||||
{
|
||||
ch[edge]=c, reach[edge]=v, flow[edge]=c1, ne[edge]=head[u], head[u]=edge++;
|
||||
ch[edge]=c, reach[edge]=u, flow[edge]=c2, ne[edge]=head[v], head[v]=edge++;
|
||||
}
|
||||
int find(char c)
|
||||
{
|
||||
if(c=='L') return 0;
|
||||
else if(c=='O') return 1;
|
||||
else if(c=='V') return 2;
|
||||
else return 3;
|
||||
}
|
||||
bool spfa()
|
||||
{
|
||||
int l=0, h=0;
|
||||
memset(inque,0,sizeof(inque));
|
||||
for(int i=1; i<=n; i++)
|
||||
for(int j=0; j<4; j++) dis[i][j]=oo, cnt[i][j]=0;
|
||||
inque[1]=1;
|
||||
dis[1][0]=0;
|
||||
que[l++]=1;
|
||||
while(l!=h)
|
||||
{
|
||||
int u=que[h++];
|
||||
if(h==mn) h=0;
|
||||
inque[u]=0;
|
||||
for(int i=head[u]; i>=0; i=ne[i])
|
||||
{
|
||||
int s=find(ch[i]), v=reach[i], val=flow[i];
|
||||
if(dis[v][(s+1)%4]>=dis[u][s]+val)
|
||||
{
|
||||
if(dis[v][(s+1)%4]==dis[u][s]+val)
|
||||
{
|
||||
if(cnt[u][s]+1>cnt[v][(s+1)%4]) cnt[v][(s+1)%4]=cnt[u][s]+1;
|
||||
else continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
dis[v][(s+1)%4]=dis[u][s]+val;
|
||||
cnt[v][(s+1)%4]=cnt[u][s]+1;
|
||||
}
|
||||
if(!inque[v])
|
||||
{
|
||||
inque[v]=1;
|
||||
que[l++]=v;
|
||||
if(l==mn) l=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(dis[n][0]==oo||!cnt[n][0]) return false;
|
||||
else return true;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int m, T, tcase=0;
|
||||
cin >> T;
|
||||
while(T--)
|
||||
{
|
||||
cin >> n >> m;
|
||||
edge=0;
|
||||
memset(head,-1,sizeof(head));
|
||||
int mp[4]={0,0,0,0}, ct=0;
|
||||
while(m--)
|
||||
{
|
||||
int u, v, val, se;
|
||||
char sh[3];
|
||||
scanf("%d%d%d%s",&u,&v,&val,sh);
|
||||
addedge(u,v,val,val,sh[0]);
|
||||
if(n==1&&u==1&&v==1)
|
||||
{
|
||||
se=find(sh[0]);
|
||||
if(!mp[se]) ct++, mp[se]=val;
|
||||
else mp[se]=min(mp[se],val);
|
||||
}
|
||||
}
|
||||
if(ct==4)
|
||||
{
|
||||
lld sum=mp[0]+mp[1]+mp[2]+mp[3];
|
||||
printf("Case %d: Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %d LOVE strings at last.\n",++tcase,sum,ct/4);
|
||||
continue;
|
||||
}
|
||||
bool ok=spfa();
|
||||
if(!ok) printf("Case %d: Binbin you disappoint Sangsang again, damn it!\n",++tcase);
|
||||
else printf("Case %d: Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %d LOVE strings at last.\n",++tcase,dis[n][0],cnt[n][0]/4);
|
||||
}
|
||||
return 0;
|
||||
}
|
11
HDOJ/4361_autoAC.cpp
Normal file
11
HDOJ/4361_autoAC.cpp
Normal file
|
@ -0,0 +1,11 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
int main()
|
||||
{
|
||||
srand(1121139700);
|
||||
int caseNumber;
|
||||
scanf("%d", &caseNumber);
|
||||
while(caseNumber --)
|
||||
if(rand() & 1) printf("alive!\n");
|
||||
else printf("dead!\n");
|
||||
}
|
111
HDOJ/4362_autoAC.cpp
Normal file
111
HDOJ/4362_autoAC.cpp
Normal file
|
@ -0,0 +1,111 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <queue>
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
using namespace std;
|
||||
const int Ni = 1005;
|
||||
const int inf=1<<27;
|
||||
struct node{
|
||||
int x,w;
|
||||
bool operator < (const node &a) const
|
||||
{
|
||||
return x<a.x;
|
||||
}
|
||||
}arr[52][Ni];
|
||||
struct qnode{
|
||||
int val,x;
|
||||
bool operator < (const qnode &a) const
|
||||
{
|
||||
if(val>a.val) return 1;
|
||||
if(val==a.val&&x>a.x) return 1;
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
int dp[52][Ni];
|
||||
int n,m;
|
||||
inline void cInit()
|
||||
{
|
||||
int i,j;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
scanf("%d",&arr[i][j].x);
|
||||
}
|
||||
}
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
scanf("%d",&arr[i][j].w);
|
||||
}
|
||||
}
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
sort(arr[i],arr[i]+m);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int cs,x,i,j,ans;
|
||||
cin>>cs;
|
||||
while(cs--)
|
||||
{
|
||||
scanf("%d%d%d",&n,&m,&x);
|
||||
cInit();
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
dp[0][j]=x-arr[0][j].x;
|
||||
if(dp[0][j]<0) dp[0][j]=-dp[0][j];
|
||||
dp[0][j]+=arr[0][j].w;
|
||||
}
|
||||
for(i=1;i<n;i++)
|
||||
{
|
||||
priority_queue<qnode> ql,qr;
|
||||
qnode qn;
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
qn.val=dp[i-1][j]+arr[i-1][j].x;
|
||||
qn.x=arr[i-1][j].x;
|
||||
qr.push(qn);
|
||||
}
|
||||
int k=0;
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
dp[i][j]=inf;
|
||||
while(k<m&&arr[i-1][k].x<=arr[i][j].x)
|
||||
{
|
||||
qn.val=dp[i-1][k]-arr[i-1][k].x;
|
||||
qn.x=arr[i-1][k].x;
|
||||
ql.push(qn);
|
||||
k++;
|
||||
}
|
||||
if(!ql.empty())
|
||||
{
|
||||
qn=ql.top();
|
||||
dp[i][j]=min(dp[i][j],qn.val+arr[i][j].x+arr[i][j].w);
|
||||
}
|
||||
if(!qr.empty())
|
||||
{
|
||||
qn=qr.top();
|
||||
while(!qr.empty()&&qn.x<arr[i][j].x)
|
||||
{
|
||||
qr.pop();
|
||||
qn=qr.top();
|
||||
}
|
||||
if(qn.x>=arr[i][j].x)
|
||||
dp[i][j]=min(dp[i][j],qn.val-arr[i][j].x+arr[i][j].w);
|
||||
}
|
||||
}
|
||||
}
|
||||
ans=inf;
|
||||
for(i=0;i<m;i++)
|
||||
{
|
||||
if(ans>dp[n-1][i])
|
||||
ans=dp[n-1][i];
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
70
HDOJ/4363_autoAC.cpp
Normal file
70
HDOJ/4363_autoAC.cpp
Normal file
|
@ -0,0 +1,70 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#define inf 1<<29
|
||||
#define LL long long
|
||||
#define MOD 1000000007
|
||||
using namespace std;
|
||||
int dp[41][41][5][5][5][5][2];
|
||||
int get_dp(int x,int y,int l,int r,int u,int d,int k){
|
||||
if(dp[x][y][l][r][u][d][k]!=-1)
|
||||
return dp[x][y][l][r][u][d][k];
|
||||
dp[x][y][l][r][u][d][k]=0;
|
||||
if((x==1&&k==0)||(y==1&&k)){
|
||||
for(int i=1;i<5;i++)
|
||||
if(i!=l&&i!=r&&i!=u&&i!=d)
|
||||
dp[x][y][l][r][u][d][k]++;
|
||||
return dp[x][y][l][r][u][d][k];
|
||||
}
|
||||
dp[x][y][l][r][u][d][k]=0;
|
||||
if(!k){
|
||||
for(int i=1;i<x;i++)
|
||||
for(int j=1;j<5;j++){
|
||||
if(j!=u&&j!=l&&j!=r)
|
||||
dp[x][y][l][r][u][d][k]=(dp[x][y][l][r][u][d][k]+get_dp(x-i,y,l,r,j,d,1))%MOD;
|
||||
if(j!=d&&j!=l&&j!=r)
|
||||
dp[x][y][l][r][u][d][k]=(dp[x][y][l][r][u][d][k]+get_dp(i,y,l,r,u,j,1))%MOD;
|
||||
}
|
||||
int t=0;
|
||||
for(int i=1;i<=4;i++)
|
||||
if(i!=u&&i!=l&&i!=r)
|
||||
for(int j=1;j<=4;j++)
|
||||
if(j!=d&&j!=l&&j!=r&&j!=i)
|
||||
t++;
|
||||
dp[x][y][l][r][u][d][k]=(dp[x][y][l][r][u][d][k]+MOD-t*(x-1))%MOD;
|
||||
for(int i=1;i<5;i++)
|
||||
if(i!=l&&i!=r&&i!=u&&i!=d)
|
||||
dp[x][y][l][r][u][d][k]++;
|
||||
}
|
||||
else{
|
||||
for(int i=1;i<y;i++)
|
||||
for(int j=1;j<5;j++){
|
||||
if(j!=l&&j!=d&&j!=u)
|
||||
dp[x][y][l][r][u][d][k]=(dp[x][y][l][r][u][d][k]+get_dp(x,y-i,j,r,u,d,0))%MOD;
|
||||
if(j!=r&&j!=d&&j!=u)
|
||||
dp[x][y][l][r][u][d][k]=(dp[x][y][l][r][u][d][k]+get_dp(x,i,l,j,u,d,0))%MOD;
|
||||
}
|
||||
int t=0;
|
||||
for(int i=1;i<=4;i++)
|
||||
if(i!=l&&i!=u&&i!=d)
|
||||
for(int j=1;j<=4;j++)
|
||||
if(j!=r&&j!=u&&j!=d&&j!=i)
|
||||
t++;
|
||||
dp[x][y][l][r][u][d][k]=(dp[x][y][l][r][u][d][k]+MOD-t*(y-1))%MOD;
|
||||
for(int i=1;i<5;i++)
|
||||
if(i!=l&&i!=r&&i!=u&&i!=d)
|
||||
dp[x][y][l][r][u][d][k]++;
|
||||
}
|
||||
return dp[x][y][l][r][u][d][k]%MOD;
|
||||
}
|
||||
int main(){
|
||||
memset(dp,-1,sizeof(dp));
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
int x,y;
|
||||
scanf("%d%d",&x,&y);
|
||||
printf("%d\n",get_dp(x,y,0,0,0,0,0));
|
||||
}
|
||||
return 0;
|
||||
}
|
63
HDOJ/4364_autoAC.cpp
Normal file
63
HDOJ/4364_autoAC.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
int ans[5][5]={{2,3,1,1},{1,2,3,1},{1,1,2,3},{3,1,1,2}};
|
||||
int matrix[5][5];
|
||||
int a[5][5];
|
||||
void multi()
|
||||
{
|
||||
for(int i=0;i<4;i++)
|
||||
{
|
||||
for(int j=0;j<4;j++)
|
||||
{
|
||||
for(int k=0;k<4;k++)
|
||||
{
|
||||
int t=matrix[k][j];
|
||||
t<<=1;
|
||||
if(t>0xFF)//225
|
||||
t=(t^0x1B)%(0xFF+1);
|
||||
if(ans[i][k]==1)
|
||||
{
|
||||
a[i][j]^=matrix[k][j];
|
||||
}
|
||||
else if(ans[i][k]==2)
|
||||
{
|
||||
a[i][j]^=t;
|
||||
}
|
||||
else if(ans[i][k]==3)
|
||||
{
|
||||
t^=matrix[k][j];
|
||||
a[i][j]^=t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int cas;
|
||||
scanf("%d",&cas);
|
||||
while(cas--)
|
||||
{
|
||||
memset(a,0,sizeof(a));
|
||||
for(int i=0;i<4;i++)
|
||||
for(int j=0;j<4;j++)
|
||||
scanf("%X",&matrix[i][j]);
|
||||
multi();
|
||||
for(int i=0;i<4;i++)
|
||||
{
|
||||
for(int j=0;j<4;j++)
|
||||
{
|
||||
if(j!=0)
|
||||
cout<<' ';
|
||||
printf("%02X",a[i][j]);
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
if(cas != 0)
|
||||
puts("");
|
||||
}
|
||||
return 0;
|
||||
}
|
90
HDOJ/4365_autoAC.cpp
Normal file
90
HDOJ/4365_autoAC.cpp
Normal file
|
@ -0,0 +1,90 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstdlib>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
#include<queue>
|
||||
#include<set>
|
||||
#include<map>
|
||||
#include<cstring>
|
||||
#include<vector>
|
||||
#include<string>
|
||||
#define LL long long
|
||||
#define MOD 100000007
|
||||
using namespace std;
|
||||
class Point
|
||||
{
|
||||
public:
|
||||
int x,y;
|
||||
bool operator == (const Point &tmp) const{
|
||||
return (x==tmp.x && y==tmp.y);
|
||||
}
|
||||
}p[2024];
|
||||
int midx,midy;
|
||||
bool cmp(const Point &a,const Point &b){
|
||||
if(a.x != b.x)
|
||||
return a.x < b.x;
|
||||
return a.y < b.y;
|
||||
}
|
||||
void Solve1( int x, int y , int cnt )
|
||||
{
|
||||
if( x > midx)
|
||||
{
|
||||
x = (midx<<1) - x;
|
||||
}
|
||||
if( y > midy ) y = (midy<<1) - y;
|
||||
if( x > y ) swap( x ,y );
|
||||
p[cnt].x = x; p[cnt].y = y;
|
||||
}
|
||||
void Solve2( int x, int y , int cnt )
|
||||
{
|
||||
if( x > midx )
|
||||
{
|
||||
int d = x - midx - 1;
|
||||
x = midx - d;
|
||||
}
|
||||
if( y > midy )
|
||||
{
|
||||
int d = y - midy - 1;
|
||||
y = midy - d;
|
||||
}
|
||||
if( x > y ) swap( x , y );
|
||||
p[cnt].x = x ; p[cnt].y = y;
|
||||
}
|
||||
LL Pow( LL k , LL a )
|
||||
{
|
||||
LL ans = 1;
|
||||
while( k )
|
||||
{
|
||||
if( k &1 ) ans = (ans*a)%MOD;
|
||||
a = (a*a)%MOD;
|
||||
k >>= 1;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main( )
|
||||
{
|
||||
int n,m,k,x,y;
|
||||
while( scanf( "%d %d %d",&n,&m,&k )==3 )
|
||||
{
|
||||
midx = (n+1) /2;midy = midx;
|
||||
for( int i = 0; i < m ; i ++ )
|
||||
{
|
||||
scanf( "%d %d",&x,&y );
|
||||
x += 1 ; y += 1;
|
||||
if( n & 1 ) Solve1( x ,y , i );
|
||||
else Solve2( x , y , i );
|
||||
}
|
||||
LL L = ( n + 1 )/2;
|
||||
LL ans = L*L/2 + (L + 1) /2;
|
||||
sort(p,p+m,cmp);
|
||||
ans -= unique(p,p+m)-p;
|
||||
if( ans > 0 )
|
||||
{
|
||||
ans = Pow( ans , (LL)k );
|
||||
printf( "%I64d\n",ans );
|
||||
}
|
||||
else printf( "0\n" );
|
||||
}
|
||||
return 0;
|
||||
}
|
116
HDOJ/4366_autoAC.cpp
Normal file
116
HDOJ/4366_autoAC.cpp
Normal file
|
@ -0,0 +1,116 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <stack>
|
||||
#include <algorithm>
|
||||
#define lson l, m , rt << 1
|
||||
#define rson m + 1, r, rt << 1 | 1
|
||||
#define maxn 50010
|
||||
using namespace std;
|
||||
struct people{
|
||||
int id,loty,abty;
|
||||
bool operator < (const people& cmp)const {
|
||||
return abty > cmp.abty;
|
||||
}
|
||||
}emp[maxn];
|
||||
int Max[maxn << 2],t,n,m,ans[maxn],L[maxn],R[maxn],head[maxn],tot,ed;
|
||||
map <int, int> mp;
|
||||
struct Edge{
|
||||
int v,next;
|
||||
}edge[maxn];
|
||||
void add(int u,int v){
|
||||
edge[ed].v = v;
|
||||
edge[ed].next = head[u];
|
||||
head[u] = ed ++;
|
||||
}
|
||||
void dfs(int root){
|
||||
bool vis[maxn];
|
||||
memset(vis,0,sizeof(vis));
|
||||
tot = 0; stack <int> ss;
|
||||
while(!ss.empty()){ss.pop();}
|
||||
ss.push(root); vis[root] = true; L[root] = tot ++;
|
||||
while(!ss.empty()){
|
||||
int now = ss.top();
|
||||
bool flag = false;
|
||||
for(int i = head[now]; i != - 1; i = edge[i].next){
|
||||
int x = edge[i].v;
|
||||
if(!vis[x]){
|
||||
flag = true;
|
||||
vis[x] = true;
|
||||
L[x] = tot ++;
|
||||
ss.push(x);
|
||||
head[now] = edge[i].next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(flag) continue;
|
||||
if(vis[now]){
|
||||
R[now] = tot;
|
||||
ss.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
int query(int L, int R, int l, int r, int rt){
|
||||
if(L > R) return -1;
|
||||
if(L <= l && r <= R){
|
||||
return Max[rt];
|
||||
}int m = (l + r) >> 1;
|
||||
int ll = -1, rr = -1;
|
||||
if(L <= m) ll = query(L,R,lson);
|
||||
if(R > m) rr = query(L,R,rson);
|
||||
return max(ll,rr);
|
||||
}
|
||||
void update(int &pos, int &val, int l, int r, int rt){
|
||||
if(l == r){
|
||||
Max[rt] = val; return ;
|
||||
}int m = (l + r) >> 1;
|
||||
if(pos <= m) update(pos,val,lson);
|
||||
else update(pos,val,rson);
|
||||
Max[rt] = max(Max[rt << 1], Max[rt << 1 | 1]);
|
||||
}
|
||||
void pre(){
|
||||
mp.clear(); mp[-1] = -1; tot = ed = 0;
|
||||
memset(L,0,sizeof(L)); memset(R,0,sizeof(R)); memset(ans,-1,sizeof(ans));
|
||||
memset(head,-1,sizeof(head)); memset(Max,-1,sizeof(Max));
|
||||
for(int i = 1,fa; i < n; i ++){
|
||||
scanf("%d%d%d",&fa,&emp[i].loty, &emp[i].abty);
|
||||
add(fa,i);
|
||||
mp[emp[i].loty] = i;
|
||||
emp[i].id = i;
|
||||
}
|
||||
dfs(0);
|
||||
sort(emp + 1,emp + n);
|
||||
}
|
||||
void showans(){
|
||||
int fired;
|
||||
while(m --){
|
||||
scanf("%d",&fired);
|
||||
printf("%d\n",ans[fired]);
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
scanf("%d",&t);
|
||||
while(t --){
|
||||
scanf("%d%d",&n,&m);
|
||||
pre();
|
||||
for(int i = 1, j; i < n; i = j){
|
||||
j = i;
|
||||
while(j < n && emp[j].abty == emp[i].abty){
|
||||
int id = emp[j].id;
|
||||
int lo = query(L[id] + 1,R[id] - 1,0,tot - 1, 1);
|
||||
ans[id] = mp[lo];
|
||||
j ++;
|
||||
}
|
||||
j = i;
|
||||
while(j < n && emp[j].abty == emp[i].abty){
|
||||
int id = emp[j].id;
|
||||
update(L[id],emp[j].loty,0,tot - 1, 1);
|
||||
j ++;
|
||||
}
|
||||
}
|
||||
showans();
|
||||
}
|
||||
return 0;
|
||||
}
|
164
HDOJ/4367_autoAC.cpp
Normal file
164
HDOJ/4367_autoAC.cpp
Normal file
|
@ -0,0 +1,164 @@
|
|||
#include <string.h>
|
||||
#include <algorithm>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const int N=210;
|
||||
const int M=41000;
|
||||
const int MOD=1000000007;
|
||||
const double eps=1e-8;
|
||||
const double PI=acos(-1.0);
|
||||
const double PI2=PI*2;
|
||||
struct Point
|
||||
{
|
||||
double x,y;
|
||||
LL index;
|
||||
double angle;
|
||||
inline void input()
|
||||
{
|
||||
scanf("%lf%lf",&x,&y);
|
||||
}
|
||||
}point[N],temp[N];
|
||||
int n;
|
||||
bool visit[M];
|
||||
LL fib[M];
|
||||
LL fk[M];
|
||||
int num[N][N];
|
||||
int left[N][N];
|
||||
int right[N][N];
|
||||
inline Point operator-(const Point &a, const Point &b)
|
||||
{
|
||||
Point c;
|
||||
c.x=a.x-b.x;
|
||||
c.y=a.y-b.y;
|
||||
return c;
|
||||
}
|
||||
inline double operator*(const Point &a, const Point &b)
|
||||
{
|
||||
return a.x*b.y-a.y*b.x;
|
||||
}
|
||||
inline bool operator==(const Point &a, const Point &b)
|
||||
{
|
||||
return a.x==b.x&&a.y==b.y;
|
||||
}
|
||||
inline int cross(const Point &a, const Point &b, const Point &o)
|
||||
{
|
||||
return (a-o)*(b-o)>0? 1:-1;
|
||||
}
|
||||
inline int cross(const int &a, const int &b, const int &o)
|
||||
{
|
||||
return cross(point[a],point[b],point[o]);
|
||||
}
|
||||
inline double positiveAtan(const Point &a, const Point &o)
|
||||
{
|
||||
double res=atan2(a.y-o.y,a.x-o.x);
|
||||
if(res<0)
|
||||
res+=PI2;
|
||||
return res;
|
||||
}
|
||||
bool operator<(const Point &a, const Point &b)
|
||||
{
|
||||
return a.angle<b.angle;
|
||||
}
|
||||
int abs1(int x)
|
||||
{
|
||||
return x<0? -x:x;
|
||||
}
|
||||
int getAngleNumber(int a,int b,int c)
|
||||
{
|
||||
if(point[c].y<point[b].y&&point[a].y>=point[b].y)
|
||||
return n-abs1(right[b][c]-right[b][a]+2)+3;
|
||||
return abs1(right[b][a]-right[b][c])+2;
|
||||
}
|
||||
int getTriangleNumber(int a, int b, int c)
|
||||
{
|
||||
return n-left[a][b]-left[b][c]-left[c][a]+getAngleNumber(a,b,c)+getAngleNumber(b,c,a)+getAngleNumber(c,a,b)-6;
|
||||
}
|
||||
LL quick_mod(LL a,LL b)
|
||||
{
|
||||
LL ans=1;
|
||||
a%=MOD;
|
||||
while(b)
|
||||
{
|
||||
if(b&1)
|
||||
{
|
||||
ans=ans*a%MOD;
|
||||
b--;
|
||||
}
|
||||
b>>=1;
|
||||
a=a*a%MOD;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
LL solve(int x)
|
||||
{
|
||||
if(visit[x])
|
||||
return fk[x];
|
||||
visit[x]=true;
|
||||
fib[0]=x;
|
||||
fib[1]=x;
|
||||
for(int i=2;i<=x;++i)
|
||||
fib[i]=(fib[i-1]*fib[i-2])%MOD;
|
||||
return fk[x]=fib[x]+1;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d",&n))
|
||||
{
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
point[i].input();
|
||||
temp[i]=point[i];
|
||||
temp[i].index=i;
|
||||
}
|
||||
memset(left,0,sizeof(left));
|
||||
memset(right,0,sizeof(right));
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
for(int j=i+1;j<n;++j)
|
||||
{
|
||||
for(int k=0;k<n;++k)
|
||||
{
|
||||
if(k!=i&&k!=j)
|
||||
{
|
||||
if(cross(k,j,i)<0)
|
||||
++left[i][j];
|
||||
else if(cross(k,i,j)<0)
|
||||
++left[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int j=0;j<n;++j)
|
||||
{
|
||||
if(temp[j].index==i)
|
||||
temp[j].angle=-1e100;
|
||||
else
|
||||
temp[j].angle=positiveAtan(temp[j],point[i]);
|
||||
}
|
||||
sort(temp,temp+n);
|
||||
int cnt=0;
|
||||
for(int j=0;j<n;++j)
|
||||
right[i][temp[j].index]=++cnt;
|
||||
}
|
||||
memset(num,0,sizeof(num));
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
for(int j=i+1;j<n;++j)
|
||||
{
|
||||
for(int k=0;k<n;++k)
|
||||
{
|
||||
if(k==i||k==j) continue;
|
||||
if(cross(point[k], point[j], point[i]) < 0)
|
||||
num[i][j]+=getAngleNumber(j,k,i)-getTriangleNumber(i,j,k);
|
||||
}
|
||||
}
|
||||
}
|
||||
LL ans=1;
|
||||
for(int i=0;i<n;++i)
|
||||
for(int j=i+1;j<n;++j)
|
||||
ans=(ans*solve(num[i][j]))%MOD;
|
||||
printf("%I64d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
63
HDOJ/4368_autoAC.cpp
Normal file
63
HDOJ/4368_autoAC.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
#include<stdio.h>
|
||||
#include<math.h>
|
||||
#define eps 1e-5
|
||||
#define PI 3.1415926535897932384626
|
||||
int n,a[10001];
|
||||
double angle;
|
||||
int i,j,k,maxtop;
|
||||
double dis[10001],t,top,ans,low,h;
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d%lf",&n,&angle))
|
||||
{
|
||||
if(angle<-eps) for(i=n-1;i>=0;i--) scanf("%d",&a[i]);
|
||||
else for(i=0;i<n;i++) scanf("%d",&a[i]);
|
||||
if(angle<-eps) angle=-angle;
|
||||
angle=PI*angle/180.0;
|
||||
t=-1;ans=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
dis[i]=((i+1)*tan(angle)+a[i]*1.0)/sqrt(tan(angle)*tan(angle)+1);
|
||||
if(t<dis[i]){t=dis[i];maxtop=i;}
|
||||
}
|
||||
for(i=0;i<maxtop;i++)
|
||||
{
|
||||
top=a[i];
|
||||
for(j=i+1;j<=maxtop;j++)
|
||||
{
|
||||
if(dis[j]>dis[i]+eps)
|
||||
{
|
||||
if(dis[j]-sin(angle)>dis[i]+eps)
|
||||
{
|
||||
top-=(j-i-1)*1.0*tan(angle);
|
||||
ans+=(j-i-1)*(j-i-1)*0.5*tan(angle);
|
||||
}
|
||||
else
|
||||
{
|
||||
top-=(a[i]-a[j])*1.0;
|
||||
ans+=(a[i]-a[j])*(a[i]-a[j])*0.5/tan(angle);
|
||||
}
|
||||
for(k=i+1;k<j;k++)
|
||||
ans+=(top-a[k])*1.0;
|
||||
i=j-1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i=n-1;i>maxtop;i--)
|
||||
{
|
||||
for(j=i-1;j>=maxtop;j--)
|
||||
{
|
||||
h=i-j;
|
||||
low=h*tan(angle)-(a[j+1]-a[i]);
|
||||
top=(h-1)*tan(angle)-(a[j+1]-a[i]);
|
||||
ans+=(top+low)/2.0;
|
||||
if(dis[j]>dis[i]+eps)
|
||||
break;
|
||||
}
|
||||
i=j+1;
|
||||
}
|
||||
printf("%.2lf\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
71
HDOJ/4370_autoAC.cpp
Normal file
71
HDOJ/4370_autoAC.cpp
Normal file
|
@ -0,0 +1,71 @@
|
|||
#include<stdio.h>
|
||||
#include<iostream>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int INF=0x3f3f3f3f;
|
||||
const int MAXN=330;
|
||||
int cost[MAXN][MAXN];
|
||||
int dist[MAXN];
|
||||
int que[MAXN];
|
||||
bool vis[MAXN];
|
||||
void SPFA(int start,int n)
|
||||
{
|
||||
int front=0,rear=0;
|
||||
for(int v=1;v<=n;v++)
|
||||
{
|
||||
if(v==start)
|
||||
{
|
||||
dist[v]=INF;
|
||||
vis[v]=false;
|
||||
}
|
||||
else if(cost[start][v]!=INF)
|
||||
{
|
||||
dist[v]=cost[start][v];
|
||||
que[rear++]=v;
|
||||
vis[v]=true;
|
||||
}
|
||||
else
|
||||
{
|
||||
dist[v]=INF;
|
||||
vis[v]=false;
|
||||
}
|
||||
}
|
||||
while(front!=rear)
|
||||
{
|
||||
int u=que[front++];
|
||||
for(int v=1;v<=n;v++)
|
||||
{
|
||||
if(dist[v]>dist[u]+cost[u][v])
|
||||
{
|
||||
dist[v]=dist[u]+cost[u][v];
|
||||
if(!vis[v])
|
||||
{
|
||||
vis[v]=true;
|
||||
que[rear++]=v;
|
||||
if(rear>=MAXN) rear=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
vis[u]=false;
|
||||
if(front>=MAXN)front=0;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while(scanf("%d",&n)!=EOF)
|
||||
{
|
||||
for(int i=1;i<=n;i++)
|
||||
for(int j=1;j<=n;j++)
|
||||
scanf("%d",&cost[i][j]);
|
||||
SPFA(1,n);
|
||||
int ans=dist[n];
|
||||
int loop1=dist[1];
|
||||
SPFA(n,n);
|
||||
int loopn=dist[n];
|
||||
ans=min(ans,loop1+loopn);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
23
HDOJ/4371_autoAC.cpp
Normal file
23
HDOJ/4371_autoAC.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
using namespace std;
|
||||
int main()
|
||||
{
|
||||
int test,n,m,tmin,t,i,k;
|
||||
scanf("%d",&test);
|
||||
for(k=1;k<=test;k++)
|
||||
{
|
||||
tmin=1000000;
|
||||
scanf("%d %d",&n,&m);
|
||||
for(i=0;i<m;i++)
|
||||
{
|
||||
scanf("%d",&t);
|
||||
if(tmin>t)
|
||||
tmin=t;
|
||||
}
|
||||
n=n/tmin;
|
||||
if(n&1) printf("Case #%d: Bob\n",k);
|
||||
else printf("Case #%d: Alice\n",k);
|
||||
}
|
||||
return 0;
|
||||
}
|
38
HDOJ/4372_autoAC.cpp
Normal file
38
HDOJ/4372_autoAC.cpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const int N=2005;
|
||||
const LL MOD=1000000007;
|
||||
LL C[N][N];
|
||||
LL S[N][N];
|
||||
void Init()
|
||||
{
|
||||
int i,j;
|
||||
for(i=0;i<N;i++)
|
||||
{
|
||||
C[i][0]=1;
|
||||
C[i][i]=1;
|
||||
S[i][0]=0;
|
||||
S[i][i]=1;
|
||||
for(j=1;j<i;j++)
|
||||
{
|
||||
C[i][j]=(C[i-1][j]%MOD+C[i-1][j-1]%MOD)%MOD;
|
||||
S[i][j]=((i-1)%MOD*S[i-1][j]%MOD+S[i-1][j-1]%MOD);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
LL t,n,f,b,ans;
|
||||
Init();
|
||||
scanf("%I64d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%I64d%I64d%I64d",&n,&f,&b);
|
||||
ans=C[f+b-2][f-1]%MOD*S[n-1][f+b-2]%MOD;
|
||||
printf("%I64d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
159
HDOJ/4373_autoAC.cpp
Normal file
159
HDOJ/4373_autoAC.cpp
Normal file
|
@ -0,0 +1,159 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<cstdio>
|
||||
#include<queue>
|
||||
#include<map>
|
||||
#include<set>
|
||||
#include<cmath>
|
||||
#include<cstring>
|
||||
#include<iomanip>
|
||||
using namespace std;
|
||||
#define i64 __int64
|
||||
#define MM(name,what) memset(name,what,sizeof(name))
|
||||
const int inf = 0x3f3f3f3f;
|
||||
const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;
|
||||
const double oo = 10e9;
|
||||
const double eps = 10e-9;
|
||||
const double pi = acos(-1.0);
|
||||
const int maxn = 100111;
|
||||
const i64 mod = 364875103;
|
||||
const i64 mod1 = 97;
|
||||
const i64 mod2 = 3761599;
|
||||
const int maxc = 111;
|
||||
i64 gcd(i64 _a, i64 _b)
|
||||
{
|
||||
if (!_a || !_b)
|
||||
{
|
||||
return max(_a, _b);
|
||||
}
|
||||
i64 _t;
|
||||
while ((_t = _a % _b))
|
||||
{
|
||||
_a = _b;
|
||||
_b = _t;
|
||||
}
|
||||
return _b;
|
||||
}
|
||||
i64 ext_gcd (i64 _a, i64 _b, i64 &_x, i64 &_y)
|
||||
{
|
||||
if (!_b)
|
||||
{
|
||||
_x = 1;
|
||||
_y = 0;
|
||||
return _a;
|
||||
}
|
||||
i64 _d = ext_gcd (_b, _a % _b, _x, _y);
|
||||
i64 _t = _x;
|
||||
_x = _y;
|
||||
_y = _t - _a / _b * _y;
|
||||
return _d;
|
||||
}
|
||||
i64 invmod (i64 _a, i64 _p)
|
||||
{
|
||||
i64 _ans, _y;
|
||||
ext_gcd (_a, _p, _ans, _y);
|
||||
_ans < 0 ? _ans += _p : 0;
|
||||
return _ans;
|
||||
}
|
||||
i64 dp[maxn];
|
||||
i64 inv[maxn];
|
||||
i64 c[maxc][maxc];
|
||||
i64 n,m;
|
||||
i64 ans;
|
||||
i64 a[21];
|
||||
i64 cx;
|
||||
void init()
|
||||
{
|
||||
for(int i=1;i<maxn;i++)
|
||||
{
|
||||
inv[i]=invmod(i,mod2);
|
||||
}
|
||||
MM(c,0);
|
||||
for(int i=0;i<maxc;i++)
|
||||
{
|
||||
c[i][i]=1;
|
||||
c[i][0]=1;
|
||||
}
|
||||
for(int i=1;i<maxc;i++)
|
||||
{
|
||||
for(int j=1;j<maxc;j++)
|
||||
{
|
||||
c[i][j]=c[i-1][j-1]+c[i-1][j];
|
||||
c[i][j]%=mod1;
|
||||
}
|
||||
}
|
||||
cx = invmod(mod1,mod2);
|
||||
return ;
|
||||
}
|
||||
i64 lucas(i64 x,i64 y,i64 p=mod1)
|
||||
{
|
||||
if(y>x) return 0;
|
||||
i64 re=1;
|
||||
i64 dx = x%p;
|
||||
i64 dy = y%p;
|
||||
re*=c[dx][dy];
|
||||
dx = x/p;
|
||||
dy = y/p;
|
||||
if(dx || dy)
|
||||
{
|
||||
re*=lucas(dx,dy);
|
||||
}
|
||||
re%=p;
|
||||
return re;
|
||||
}
|
||||
i64 find(int x)
|
||||
{
|
||||
i64 t1 = lucas(n+x-1,x);
|
||||
i64 t2 = dp[x];
|
||||
i64 temp = cx;
|
||||
temp *= t2-t1;
|
||||
temp %= mod2;
|
||||
temp = (temp+mod2)%mod2;
|
||||
temp *= mod1;
|
||||
temp += t1;
|
||||
temp %= mod;
|
||||
return temp;
|
||||
}
|
||||
void start()
|
||||
{
|
||||
dp[0]=1;
|
||||
i64 now,temp;
|
||||
for(int i=1;i<=m;i++)
|
||||
{
|
||||
now = n+i-1;
|
||||
dp[i]=dp[i-1]*now;
|
||||
dp[i]%=mod2;
|
||||
dp[i]*=inv[i];
|
||||
dp[i]%=mod2;
|
||||
}
|
||||
return ;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
int k,T;
|
||||
cin>>T;
|
||||
for(int tt=1;tt<=T;tt++)
|
||||
{
|
||||
cin>>n>>m;
|
||||
start();
|
||||
cin>>k;
|
||||
for(int i=1;i<=k;i++)
|
||||
{
|
||||
cin>>a[i];
|
||||
a[i]++;
|
||||
}
|
||||
ans=1;
|
||||
i64 pre = m;
|
||||
i64 now;
|
||||
for(int i=k;i>=1;i--)
|
||||
{
|
||||
now = pre - a[i]+1;
|
||||
ans *= find(now);
|
||||
ans %= mod;
|
||||
pre = a[i]-1;
|
||||
}
|
||||
cout<<"Case #"<<tt<<": "<<ans<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
99
HDOJ/4374_autoAC.cpp
Normal file
99
HDOJ/4374_autoAC.cpp
Normal file
|
@ -0,0 +1,99 @@
|
|||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
#include <queue>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#define eps 1e-5
|
||||
#define MAXN 105
|
||||
#define MAXM 11111
|
||||
#define INF 1000000000
|
||||
#define lch(x) x<<1
|
||||
#define rch(x) x<<1|1
|
||||
#define lson l,m,rt<<1
|
||||
#define rson m+1,r,rt<<1|1
|
||||
using namespace std;
|
||||
int n, m, x, t;
|
||||
int in()
|
||||
{
|
||||
int flag = 1;
|
||||
char ch;
|
||||
int a = 0;
|
||||
while((ch = getchar()) == ' ' || ch == '\n');
|
||||
if(ch == '-') flag = -1;
|
||||
else
|
||||
a += ch - '0';
|
||||
while((ch = getchar()) != ' ' && ch != '\n')
|
||||
{
|
||||
a *= 10;
|
||||
a += ch - '0';
|
||||
}
|
||||
return flag * a;
|
||||
}
|
||||
int dp[MAXN][MAXM];
|
||||
int sum[MAXN][MAXM];
|
||||
int lmx[4 * MAXM];
|
||||
int rmx[4 * MAXM];
|
||||
int a[MAXN][MAXM];
|
||||
int q[MAXM];
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d%d%d", &n, &m, &x, &t) != EOF)
|
||||
{
|
||||
for(int i = 1; i <= n + 2; i++)
|
||||
for(int j = 1; j <= m; j++)
|
||||
sum[i][j] = 0, dp[i][j] = -INF, a[i][j] = 0;
|
||||
for(int i = 1; i <= n; i++)
|
||||
for(int j = 1; j <= m; j++)
|
||||
{
|
||||
a[i][j] = in();
|
||||
sum[i][j] = sum[i][j - 1] + a[i][j];
|
||||
}
|
||||
int tmp = 0;
|
||||
for(int i = x; i <= x + t; i++)
|
||||
{
|
||||
tmp += a[1][i];
|
||||
dp[1][i] = tmp;
|
||||
dp[2][i] = dp[1][i] + a[2][i];
|
||||
}
|
||||
tmp = 0;
|
||||
for(int i = x; i >= x - t; i--)
|
||||
{
|
||||
tmp += a[1][i];
|
||||
dp[1][i] = tmp;
|
||||
dp[2][i] = dp[1][i] + a[2][i];
|
||||
}
|
||||
for(int i = 3; i <= n + 1; i++)
|
||||
{
|
||||
for(int j = 1; j <= m; j++)
|
||||
{
|
||||
lmx[j] = dp[i - 1][j] - sum[i - 1][j];
|
||||
rmx[j] = dp[i - 1][j] + sum[i - 1][j - 1];
|
||||
}
|
||||
int head = 1, rear = 0;
|
||||
for(int j = 1; j <= m; j++)
|
||||
{
|
||||
while(head <= rear && lmx[q[rear]] <= lmx[j]) rear--;
|
||||
q[++rear] = j;
|
||||
while(head <= rear && q[head] < j - t) head++;
|
||||
dp[i][j] = max(lmx[q[head]] + sum[i - 1][j] + a[i][j], dp[i][j]);
|
||||
}
|
||||
head = 1, rear = 0;
|
||||
for(int j = m; j >= 1; j--)
|
||||
{
|
||||
while(head <= rear && rmx[q[rear]] <= rmx[j]) rear--;
|
||||
q[++rear] = j;
|
||||
while(head <= rear && q[head] > j + t) head++;
|
||||
dp[i][j] = max(rmx[q[head]] - sum[i - 1][j - 1] + a[i][j], dp[i][j]);
|
||||
}
|
||||
}
|
||||
int ans = -INF;
|
||||
for(int i = 1; i <= m; i++)
|
||||
if(dp[n + 1][i] > ans) ans = dp[n + 1][i];
|
||||
printf("%d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
114
HDOJ/4375_autoAC.cpp
Normal file
114
HDOJ/4375_autoAC.cpp
Normal file
|
@ -0,0 +1,114 @@
|
|||
#include<iostream>
|
||||
#include<sstream>
|
||||
#include<vector>
|
||||
#include<list>
|
||||
#include<deque>
|
||||
#include<queue>
|
||||
#include<stack>
|
||||
#include<map>
|
||||
#include<set>
|
||||
#include<bitset>
|
||||
#include<algorithm>
|
||||
#include<cstdio>
|
||||
#include<cstdlib>
|
||||
#include<cstring>
|
||||
#include<cctype>
|
||||
#include<cmath>
|
||||
#include<ctime>
|
||||
#include<iomanip>
|
||||
using namespace std;
|
||||
const double eps(1e-8);
|
||||
typedef long long lint;
|
||||
int dx[] = {-1, 0, 1, 0};
|
||||
int dy[] = {0, 1, 0, -1};
|
||||
int H, W, N;
|
||||
#define next nex
|
||||
char lr[1000100];
|
||||
int next[1000100][4];
|
||||
int dir[1000100];
|
||||
const int inf = 1e9 + 7;
|
||||
char maz[1010][1010];
|
||||
int vis[1010][1010][4];
|
||||
int sx, sy, ex, ey;
|
||||
#define mp make_pair
|
||||
int cas;
|
||||
int tot;
|
||||
struct Edge
|
||||
{
|
||||
int x, y, nex;
|
||||
};
|
||||
Edge edge[4000010];
|
||||
int head[1000010];
|
||||
void addEdge(int s, int x, int y)
|
||||
{
|
||||
edge[tot].x = x, edge[tot].y = y;
|
||||
edge[tot].nex = head[s];
|
||||
head[s] = tot++;
|
||||
}
|
||||
bool bfs()
|
||||
{
|
||||
memset(head, -1, sizeof(head));
|
||||
tot = 0;
|
||||
while(sx >= 0 && sx < H && sy >= 0 && sy < W && vis[sx][sy][0] != cas && maz[sx][sy] != '#')
|
||||
{
|
||||
addEdge(0, sx, sy);
|
||||
vis[sx][sy][0] = cas;
|
||||
if(sx == ex && sy == ey) return true;
|
||||
sx += dx[0], sy += dy[0];
|
||||
}
|
||||
for(int i = 0; i <= N; i++)
|
||||
{
|
||||
for(int j = head[i]; j + 1; j = edge[j].nex)
|
||||
{
|
||||
int nx = edge[j].x, ny = edge[j].y;
|
||||
for(int d = 0; d < 4; d++)
|
||||
{
|
||||
if(next[i][d] == inf) continue;
|
||||
int tx = nx + dx[d], ty = ny + dy[d];
|
||||
while(tx >= 0 && tx < H && ty >= 0 && ty < W && vis[tx][ty][d] != cas && maz[tx][ty] != '#')
|
||||
{
|
||||
addEdge(next[i][d], tx, ty);
|
||||
vis[tx][ty][d] = cas;
|
||||
if(tx == ex && ty == ey) return true;
|
||||
tx += dx[d], ty += dy[d];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
void init()
|
||||
{
|
||||
dir[0] = 0;
|
||||
for(int i = 0; i < N; i++)
|
||||
dir[i + 1] = (lr[i] == 'L') ? (dir[i] + 3) % 4 : (dir[i] + 1) % 4;
|
||||
int last[4] = {inf, inf, inf, inf};
|
||||
for(int i = N; i >= 0; i--)
|
||||
{
|
||||
for(int j = 0; j < 4; j++)
|
||||
next[i][j] = last[j];
|
||||
last[dir[i]] = i;
|
||||
}
|
||||
return;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
cas = 0;
|
||||
memset(vis, 0, sizeof(vis));
|
||||
while(~scanf("%d %d %d", &H, &W, &N))
|
||||
{
|
||||
cas++;
|
||||
scanf("%s", lr);
|
||||
init();
|
||||
for(int i = 0; i < H; i++)
|
||||
{
|
||||
scanf("%s", maz[i]);
|
||||
for(int j = 0; j < W; j++)
|
||||
if(maz[i][j] == 'S') sx = i, sy = j;
|
||||
else if(maz[i][j] == 'E') ex = i, ey = j;
|
||||
}
|
||||
if(bfs()) puts("Yes");
|
||||
else puts("No");
|
||||
}
|
||||
return 0;
|
||||
}
|
171
HDOJ/4376_autoAC.cpp
Normal file
171
HDOJ/4376_autoAC.cpp
Normal file
|
@ -0,0 +1,171 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define MAXL 22
|
||||
#define KIND 9
|
||||
#define MAXNODE 42
|
||||
typedef long long LL;
|
||||
vector<int> A, B, RA, RB;
|
||||
char subA[MAXL], subB[MAXL];
|
||||
int N, en[MAXNODE], suffix[MAXNODE], q[MAXNODE], child[MAXNODE][KIND];
|
||||
LL dp[MAXL][3][3][3][3][MAXNODE][1 << 2];
|
||||
int change(char ch) {
|
||||
return ch - '1';
|
||||
}
|
||||
void Trie() {
|
||||
memset(en, 0, sizeof(en));
|
||||
memset(child, 0, sizeof(child));
|
||||
N = 1;
|
||||
for(int i = 0; i < 2; ++i) {
|
||||
char* s = i == 0? subA: subB;
|
||||
int p = 1;
|
||||
for (int j = 0; s[j]; ++j) {
|
||||
int ch = change(s[j]);
|
||||
if (!child[p][ch]) child[p][ch] = ++N;
|
||||
p = child[p][ch];
|
||||
}
|
||||
en[p] |= 1 << i;
|
||||
}
|
||||
}
|
||||
void AC() {
|
||||
int ql = 0, qr = 0;
|
||||
for (int i = 0; i < KIND; ++i)
|
||||
if (child[1][i]) {
|
||||
suffix[child[1][i]] = 1;
|
||||
q[qr++] = child[1][i];
|
||||
}
|
||||
else child[1][i] = 1;
|
||||
while (ql < qr) {
|
||||
int u = q[ql++];
|
||||
for (int i = 0; i < KIND; ++i)
|
||||
if (child[u][i]) {
|
||||
suffix[child[u][i]] = child[suffix[u]][i];
|
||||
q[qr++] = child[u][i];
|
||||
}
|
||||
else child[u][i] = child[suffix[u]][i];
|
||||
}
|
||||
for (int i = 1; i <= N; ++i)
|
||||
for (int j = i; j != 1; j = suffix[j]) en[i] |= en[j];
|
||||
}
|
||||
int cal1(int pos, int val, int pre, vector<int>& vec) {
|
||||
if(pos >= vec.size()) return 2;
|
||||
if(pre != 0) return pre;
|
||||
if(val > vec[pos]) return 2;
|
||||
if(val < vec[pos]) return 1;
|
||||
return 0;
|
||||
}
|
||||
int cal2(int pos, int val, int pre, vector<int>& vec) {
|
||||
if(pos >= vec.size()) return 2;
|
||||
if(val > vec[pos]) return 2;
|
||||
if(val < vec[pos]) return 1;
|
||||
return pre;
|
||||
}
|
||||
int main() {
|
||||
int T;
|
||||
scanf("%d", &T);
|
||||
for(int cas = 1; cas <= T; ++cas) {
|
||||
LL a, b;
|
||||
cin >> a >> b;
|
||||
scanf("%s%s", subA, subB);
|
||||
LL sub = 0, rsub = 0;
|
||||
for(int i = 0; subA[i]; ++i)
|
||||
sub = sub * 10 + subA[i] - '0';
|
||||
for(int i = 0; subB[i]; ++i)
|
||||
rsub = rsub * 10 + subB[i] - '0';
|
||||
reverse(subB, subB + strlen(subB));
|
||||
Trie();
|
||||
AC();
|
||||
A.clear();
|
||||
B.clear();
|
||||
RA.clear();
|
||||
RB.clear();
|
||||
LL ta = a, tb = b;
|
||||
while(ta) {
|
||||
RA.push_back(ta % 10);
|
||||
ta /= 10;
|
||||
}
|
||||
while(tb) {
|
||||
RB.push_back(tb % 10);
|
||||
tb /= 10;
|
||||
}
|
||||
A = RA;
|
||||
B = RB;
|
||||
reverse(A.begin(), A.end());
|
||||
reverse(B.begin(), B.end());
|
||||
int l = B.size();
|
||||
memset(dp, 0, sizeof(dp));
|
||||
for(int j = 1; j < 10; ++j) {
|
||||
int s1 = cal1(0, j, 0, A);
|
||||
int s2 = cal1(0, j, 0, B);
|
||||
int rs1 = cal2(0, j, 0, RA);
|
||||
int rs2 = cal2(0, j, 0, RB);
|
||||
int v = child[1][j - 1];
|
||||
++dp[0][s1][s2][rs1][rs2][v][en[v]];
|
||||
}
|
||||
for(int i = 0; i + 1 < l; ++i) {
|
||||
for(int s1 = 0; s1 < 3; ++s1) for(int s2 = 0; s2 < 3; ++s2) for(int rs1 = 0; rs1 < 3; ++rs1) for(int rs2 = 0; rs2 < 3; ++rs2)
|
||||
for(int u = 1; u <= N; ++u)
|
||||
for(int mask = 0; mask < (1 << 2); ++mask) if(dp[i][s1][s2][rs1][rs2][u][mask]) {
|
||||
for(int val = 1; val < 10; ++val) {
|
||||
int ns1 = cal1(i + 1, val, s1, A);
|
||||
int ns2 = cal1(i + 1, val, s2, B);
|
||||
int nrs1 = cal2(i + 1, val, rs1, RA);
|
||||
int nrs2 = cal2(i + 1, val, rs2, RB);
|
||||
int v = child[u][val - 1];
|
||||
dp[i + 1][ns1][ns2][nrs1][nrs2][v][mask | en[v]] += dp[i][s1][s2][rs1][rs2][u][mask];
|
||||
}
|
||||
}
|
||||
}
|
||||
LL res = 0;
|
||||
int la = A.size(), lb = B.size();
|
||||
for(int len = la; len < lb - 1; ++len) {
|
||||
for(int s1 = 0; s1 < 3; ++s1) for(int s2 = 0; s2 < 3; ++s2) for(int rs1 = 0; rs1 < 3; ++rs1) for(int rs2 = 0; rs2 < 3; ++rs2)
|
||||
for(int u = 1; u <= N; ++u)
|
||||
for(int mask = 1; mask < (1 << 2); ++mask)
|
||||
res += dp[len][s1][s2][rs1][rs2][u][mask];
|
||||
}
|
||||
if(la != lb) {
|
||||
for(int s1 = 0; s1 < 3; ++s1) for(int s2 = 0; s2 < 3; ++s2) for(int rs1 = 0; rs1 < 3; ++rs1) for(int rs2 = 0; rs2 < 3; ++rs2)
|
||||
for(int u = 1; u <= N; ++u)
|
||||
for(int mask = 1; mask < (1 << 2); ++mask) {
|
||||
bool flaga = false;
|
||||
if(mask == 1 || mask == 3) {
|
||||
if(s1 == 0 || s1 == 2) flaga = true;
|
||||
}
|
||||
if(mask == 2 || mask == 3) {
|
||||
if(rs1 == 0 || rs1 == 2) flaga = true;
|
||||
}
|
||||
if(flaga)
|
||||
res += dp[la - 1][s1][s2][rs1][rs2][u][mask];
|
||||
bool flagb = false;
|
||||
if(mask == 1 || mask == 3) {
|
||||
if(s2 == 0 || s2 == 1) flagb = true;
|
||||
}
|
||||
if(mask == 2 || mask == 3) {
|
||||
if(rs2 == 0 || rs2 == 1) flagb = true;
|
||||
}
|
||||
if(flagb)
|
||||
res += dp[lb - 1][s1][s2][rs1][rs2][u][mask];
|
||||
}
|
||||
} else {
|
||||
for(int s1 = 0; s1 < 3; ++s1) for(int s2 = 0; s2 < 3; ++s2) for(int rs1 = 0; rs1 < 3; ++rs1) for(int rs2 = 0; rs2 < 3; ++rs2)
|
||||
for(int u = 1; u <= N; ++u)
|
||||
for(int mask = 1; mask < (1 << 2); ++mask) {
|
||||
bool flag = false;
|
||||
if(mask == 1 || mask == 3) {
|
||||
if((s1 == 0 || s1 == 2) && (s2 == 0 || s2 == 1)) flag = true;
|
||||
}
|
||||
if(mask == 2 || mask == 3) {
|
||||
if((rs1 == 0 || rs1 == 2) && (rs2 == 0 || rs2 == 1)) flag = true;
|
||||
}
|
||||
if(flag) res += dp[la - 1][s1][s2][rs1][rs2][u][mask];
|
||||
}
|
||||
}
|
||||
printf("Case #%d: ", cas);
|
||||
cout << res << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
35
HDOJ/4377_autoAC.cpp
Normal file
35
HDOJ/4377_autoAC.cpp
Normal file
|
@ -0,0 +1,35 @@
|
|||
#include<stdio.h>
|
||||
#include<math.h>
|
||||
int T,n;
|
||||
int i,j,qujian[100001],began,t,res;
|
||||
int main()
|
||||
{
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
t=(int)(sqrt(n)+0.99999);
|
||||
res=t*t-n;
|
||||
for(i=0;i<t;i++) qujian[i]=t;
|
||||
for(i=0;i<t;i++)
|
||||
if(qujian[i]<res+1)
|
||||
{
|
||||
qujian[i]=1;
|
||||
res-=(t-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
qujian[i]-=res;
|
||||
break;
|
||||
}
|
||||
began=0;
|
||||
for(i=0;i<t;i++)
|
||||
{
|
||||
began+=qujian[i];
|
||||
for(j=0;j<qujian[i];j++)
|
||||
if(i==t-1&&j==qujian[i]-1) printf("%d\n",began-j);
|
||||
else printf("%d ",began-j);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
36
HDOJ/4379_autoAC.cpp
Normal file
36
HDOJ/4379_autoAC.cpp
Normal file
|
@ -0,0 +1,36 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
unsigned int a,b,k,n,l,last;
|
||||
unsigned int mod;
|
||||
bool v[21000000];
|
||||
int main()
|
||||
{
|
||||
while(cin>>n>>l>>a>>b>>mod)
|
||||
{
|
||||
for(unsigned int i=1;i<=n;i++)
|
||||
v[i]=false;
|
||||
unsigned int ans=0;unsigned int max=0,t;
|
||||
last=b;
|
||||
for(unsigned int i=1;i<=n;i++)
|
||||
{
|
||||
t=(last+a)%mod;
|
||||
if(t*2<=l)
|
||||
{
|
||||
ans++;v[i]=true;
|
||||
if(t>max)max=t;
|
||||
}
|
||||
last=t;
|
||||
}
|
||||
last=b;
|
||||
for(unsigned int i=1;i<=n;i++)
|
||||
{
|
||||
t=(last+a)%mod;
|
||||
if((!v[i])&&t+max<=l){ans++;break;}
|
||||
last=t;
|
||||
}
|
||||
cout<<ans<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
92
HDOJ/4380_autoAC.cpp
Normal file
92
HDOJ/4380_autoAC.cpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const int N=105;
|
||||
const int M=1005;
|
||||
struct Point
|
||||
{
|
||||
LL x,y;
|
||||
}P1[N],P2[M];
|
||||
int f[N][N][N];
|
||||
int n,m;
|
||||
LL cross(Point a,Point b,Point s)
|
||||
{
|
||||
LL x1=a.x-s.x,y1=a.y-s.y;
|
||||
LL x2=b.x-s.x,y2=b.y-s.y;
|
||||
return x1*y2-x2*y1;
|
||||
}
|
||||
int dis2(Point a,Point b)
|
||||
{
|
||||
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*((a.y-b.y));
|
||||
}
|
||||
int cmp(Point a,Point b)
|
||||
{
|
||||
if(cross(a,b,P1[0])>0)
|
||||
return 1;
|
||||
else return 0;
|
||||
}
|
||||
void init()
|
||||
{
|
||||
int i,t;
|
||||
for(t=0,i=0;i<n;i++){
|
||||
if((P1[i].y-P1[t].y)<0 || (P1[i].y-P1[t].y==0 && P1[i].x-P1[t].x<0))
|
||||
t=i;
|
||||
}
|
||||
swap(P1[0],P1[t]);
|
||||
sort(P1+1,P1+n,cmp);
|
||||
}
|
||||
int cal(int x,int y,int z)
|
||||
{
|
||||
int i;
|
||||
int sum=0;
|
||||
LL a,b,c;
|
||||
for (i=0;i<m;i++)
|
||||
{
|
||||
a=cross(P1[y],P2[i],P1[x]);
|
||||
b=cross(P1[z],P2[i],P1[y]);
|
||||
c=cross(P1[x],P2[i],P1[z]);
|
||||
if ((a>=0 && b>=0 && c>=0) || (a<=0 && b<=0 && c<=0))
|
||||
{
|
||||
sum++;
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,k;
|
||||
int CA=0;
|
||||
int ans=0;
|
||||
while (scanf("%d%d",&n,&m)!=EOF)
|
||||
{
|
||||
ans=0;
|
||||
memset(P1,0,sizeof(P1));
|
||||
memset(P2,0,sizeof(P2));
|
||||
memset(f,0,sizeof(f));
|
||||
for (i=0;i<n;i++)
|
||||
scanf("%I64d%I64d",&P1[i].x,&P1[i].y);
|
||||
for (i=0;i<m;i++)
|
||||
scanf("%I64d%I64d",&P2[i].x,&P2[i].y);
|
||||
init();
|
||||
for (i=2;i<n;i++){
|
||||
for (j=1;j<i;j++){
|
||||
f[0][j][i]=cal(0,j,i);
|
||||
if (f[0][j][i]%2!=0) ans++;
|
||||
}
|
||||
}
|
||||
for (i=2;i<n;i++)
|
||||
for (j=1;j<i;j++)
|
||||
for (k=j+1;k<i;k++){
|
||||
if (cross(P1[k],P1[i],P1[j])>0)
|
||||
f[j][k][i]=f[0][j][k]+f[0][k][i]-f[0][j][i];
|
||||
else
|
||||
f[j][k][i]=f[0][j][i]-(f[0][j][k]+f[0][k][j]);
|
||||
if (f[j][k][i]%2!=0) ans++;
|
||||
}
|
||||
printf("Case %d: ",++CA);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
}
|
74
HDOJ/4381_autoAC.cpp
Normal file
74
HDOJ/4381_autoAC.cpp
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
const int maxn = 2005;
|
||||
struct node{
|
||||
int aa,cor;
|
||||
node(){}
|
||||
node(int _aa,int _cor){
|
||||
aa = _aa; cor = _cor;
|
||||
}
|
||||
}x1[maxn],x2[maxn];
|
||||
int n,m;
|
||||
int dp1[maxn],dp2[maxn];
|
||||
int sumx1,sumx2;
|
||||
bool cmp(const node &p,const node &q){
|
||||
return p.aa < q.aa;
|
||||
}
|
||||
int min(int a,int b)
|
||||
{
|
||||
return a<b?a:b;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int cas,ta=1;
|
||||
scanf("%d",&cas);
|
||||
while(cas--){
|
||||
int i,j;
|
||||
scanf("%d%d",&n,&m);
|
||||
sumx1 = sumx2 = 1;
|
||||
for(i=0; i<m; i++){
|
||||
int key,yy,z;
|
||||
scanf("%d%d%d",&key,&yy,&z);
|
||||
if(key == 1){
|
||||
x1[sumx1++] = node(yy,z);
|
||||
}else{
|
||||
x2[sumx2++] = node(n+1-yy,z);
|
||||
}
|
||||
}
|
||||
sort(x1+1,x1+sumx1,cmp);
|
||||
sort(x2+1,x2+sumx2,cmp);
|
||||
memset(dp1,0x3f,sizeof(dp1));
|
||||
memset(dp2,0x3f,sizeof(dp2));
|
||||
dp1[0] = dp2[0] = 0;
|
||||
for(i=1; i<sumx1; i++){
|
||||
for(j=x1[i].aa; j>=x1[i].cor; j--){
|
||||
dp1[j] = min(dp1[j],dp1[j-x1[i].cor]+1);
|
||||
}
|
||||
}
|
||||
for(i=1; i<sumx2; i++){
|
||||
for(j=x2[i].aa; j>=x2[i].cor; j--){
|
||||
dp2[j] = min(dp2[j],dp2[j-x2[i].cor]+1);
|
||||
}
|
||||
}
|
||||
int ans = 0,anssum = 0,tmp;
|
||||
for(i=1; i<=n; i++){
|
||||
for(j=0; j<=i; j++){
|
||||
tmp = dp1[j] + dp2[i-j];
|
||||
if(tmp <= m){
|
||||
if(ans != i){
|
||||
ans = i; anssum = tmp;
|
||||
}else if(tmp < anssum){
|
||||
anssum = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case %d: %d %d\n",ta++,ans,anssum);
|
||||
}
|
||||
return 0;
|
||||
}
|
2
HDOJ/4382_autoAC.cpp
Normal file
2
HDOJ/4382_autoAC.cpp
Normal file
|
@ -0,0 +1,2 @@
|
|||
SET|ADD C1|C2, C1|C2|IntegerNumber
|
||||
MUL C1|C2, IntegerNumber
|
94
HDOJ/4383_autoAC.cpp
Normal file
94
HDOJ/4383_autoAC.cpp
Normal file
|
@ -0,0 +1,94 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#include<cstdio>
|
||||
#include<deque>
|
||||
#include<map>
|
||||
#include<queue>
|
||||
#define iinf 2000000000
|
||||
#define linf 1000000000000000000LL
|
||||
#define dinf 1e200
|
||||
#define eps 1e-5
|
||||
#define lng long long
|
||||
#define sqr(a) ((a)*(a))
|
||||
#define pi 3.14159265359
|
||||
#define ff(i,xi,n) for(int i=xi;i<=(int)(n);++i)
|
||||
#define ffd(i,xi,n) for(int i=xi;i>=(int)(n);--i)
|
||||
#define ffl(i,r) for(int i=head[r];i!=-1;i=edge[i].next)
|
||||
#define cc(i,j) memset(i,j,sizeof(i))
|
||||
#define two(x) ((lng)1<<(x))
|
||||
#define N 11111
|
||||
#define M 1000000
|
||||
#define lson l , mid , rt << 1
|
||||
#define rson mid + 1 , r , rt << 1 | 1
|
||||
#define Mod n
|
||||
#define Pmod(x) (x%Mod+Mod)%Mod
|
||||
using namespace std;
|
||||
typedef vector<int> vi;
|
||||
typedef vector<string> vs;
|
||||
typedef unsigned int uint;
|
||||
typedef unsigned lng ulng;
|
||||
template<class T> inline void checkmax(T &x,T y){if(x<y) x=y;}
|
||||
template<class T> inline void checkmin(T &x,T y){if(x>y) x=y;}
|
||||
template<class T> inline T Min(T x,T y){return (x>y?y:x);}
|
||||
template<class T> inline T Max(T x,T y){return (x<y?y:x);}
|
||||
template<class T> T gcd(T a,T b){return (a%b)==0?b:gcd(b,a%b);}
|
||||
template<class T> T lcm(T a,T b){return a*b/gcd(a,b);}
|
||||
template<class T> T Abs(T a){return a>0?a:(-a);}
|
||||
template<class T> inline T lowbit(T n){return (n^(n-1))&n;}
|
||||
template<class T> inline int countbit(T n){return (n==0)?0:(1+countbit(n&(n-1)));}
|
||||
template<class T> inline bool isPrimeNumber(T n)
|
||||
{if(n<=1)return false;for (T i=2;i*i<=n;i++) if (n%i==0) return false;return true;}
|
||||
template<class T> inline T Minmin(T a,T b,T c,T d){return Min(Min(a,b),Min(c,d));}
|
||||
int dp[N][2][2],ini[N],head[N],tot,n;
|
||||
struct pp
|
||||
{
|
||||
int v,next;
|
||||
}edge[N*2];
|
||||
inline void add(int u,int v)
|
||||
{
|
||||
edge[tot].v=v;
|
||||
edge[tot].next=head[u];
|
||||
head[u]=tot++;
|
||||
}
|
||||
void dfs(int r,int pre)
|
||||
{
|
||||
int clo=ini[r],rev=1-clo;
|
||||
int sum=0,dps[3]={};
|
||||
dps[1]=dps[2]=iinf;
|
||||
ffl(i,r)
|
||||
{
|
||||
int v=edge[i].v;
|
||||
if(v==pre) continue;
|
||||
dfs(v,r);
|
||||
sum+=dp[v][clo][0];
|
||||
dps[2]=Min(dps[1]+dp[v][rev][1],dps[2]+dp[v][rev][0]);
|
||||
dps[1]=Min(dps[0]+dp[v][rev][1],dps[1]+dp[v][rev][0]);
|
||||
dps[0]+=dp[v][rev][0];
|
||||
}
|
||||
dp[r][clo][0]=Minmin(sum,dps[0]+2,dps[1]+2,dps[2]+2);
|
||||
dp[r][clo][1]=Min(dps[1]+1,dps[0]+1);
|
||||
dp[r][rev][0]=Minmin(sum+1,dps[0]+1,dps[1]+1,dps[2]+1);
|
||||
dp[r][rev][1]=Min(dps[0],dps[1]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int o=0;
|
||||
while(scanf("%d",&n)==1)
|
||||
{
|
||||
cc(head,-1);
|
||||
tot=0;
|
||||
ff(i,2,n)
|
||||
{
|
||||
int u,v;
|
||||
scanf("%d%d",&u,&v);
|
||||
add(u,v);
|
||||
add(v,u);
|
||||
}
|
||||
ff(i,1,n)
|
||||
scanf("%d",ini+i);
|
||||
dfs(1,-1);
|
||||
printf("Case %d: %d\n",++o,Min(dp[1][0][0],dp[1][1][0]));
|
||||
}
|
||||
return 0;
|
||||
}
|
103
HDOJ/4385_autoAC.cpp
Normal file
103
HDOJ/4385_autoAC.cpp
Normal file
|
@ -0,0 +1,103 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define clr(x)memset(x,0,sizeof(x))
|
||||
#define min(a,b)(a)<(b)?(a):(b)
|
||||
#define INF 0x1f1f1f1f
|
||||
#define N 21
|
||||
struct node
|
||||
{
|
||||
int x,y;
|
||||
}p[N],be;
|
||||
int dis(node a,node b)
|
||||
{
|
||||
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
|
||||
}
|
||||
int g[N][N];
|
||||
int dp[1<<N];
|
||||
int pre[1<<N];
|
||||
struct ans
|
||||
{
|
||||
int fi,se,num;
|
||||
}res[N];
|
||||
bool cmp(ans a,ans b)
|
||||
{
|
||||
return a.fi<b.fi;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int ca=1,n,i,j,k,t;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d %d",&be.x,&be.y);
|
||||
scanf("%d",&n);
|
||||
p[n]=be;
|
||||
for(i=0;i<n;i++)
|
||||
scanf("%d%d",&p[i].x,&p[i].y);
|
||||
memset(dp,INF,sizeof(dp));
|
||||
pre[0]=0;
|
||||
int st=1<<n;
|
||||
dp[0]=0;
|
||||
for(i=0;i<=n;i++)
|
||||
for(j=0;j<=n;j++)
|
||||
g[i][j]=dis(p[i],p[j]);
|
||||
printf("Case %d:\n",ca++);
|
||||
int stat,tmp,ss;
|
||||
for(i=0;i<st;i++)
|
||||
{
|
||||
for(j=0;j<n;j++)
|
||||
{
|
||||
if((1<<j)&i)
|
||||
continue;
|
||||
stat=i|(1<<j);
|
||||
tmp=dp[i]+g[n][j]*2;
|
||||
if(tmp<dp[stat])
|
||||
{
|
||||
dp[stat]=tmp;
|
||||
pre[stat]=i;
|
||||
}
|
||||
for(k=j+1;k<n;k++)
|
||||
{
|
||||
if((1<<k)&i)
|
||||
continue;
|
||||
ss=stat|(1<<k);
|
||||
tmp=dp[i]+g[n][j]+g[j][k]+g[n][k];
|
||||
if(tmp<dp[ss])
|
||||
{
|
||||
dp[ss]=tmp;
|
||||
pre[ss]=i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
st-=1;
|
||||
printf("%d\n",dp[st]);
|
||||
int top=0;
|
||||
while(st)
|
||||
{
|
||||
stat=pre[st]^st;
|
||||
st=pre[st];
|
||||
res[top].num=0;
|
||||
for(i=0;i<n;i++)
|
||||
if((1<<i)&stat)
|
||||
{
|
||||
res[top].num++;
|
||||
if(res[top].num==1)
|
||||
res[top].fi=i+1;
|
||||
else res[top].se=i+1;
|
||||
}
|
||||
top++;
|
||||
}
|
||||
sort(res,res+top,cmp);
|
||||
for(i=0;i<top;i++)
|
||||
{
|
||||
if(res[i].num==1)
|
||||
printf("%d%c",res[i].fi,i==top-1?'\n':' ');
|
||||
else
|
||||
printf("%d %d%c",res[i].fi,res[i].se,i==top-1?'\n':' ');
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
27
HDOJ/4386_autoAC.cpp
Normal file
27
HDOJ/4386_autoAC.cpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include<math.h>
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
int a,b,c,d,max,count=0;
|
||||
double p,ans;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d%d%d",&a,&b,&c,&d);
|
||||
if(a>b) max=a;
|
||||
else max=b;
|
||||
if(max<b) max=b;
|
||||
if(max<c) max=c;
|
||||
if(max<d) max=d;
|
||||
if(max-(a+b+c+d-max)>=0)
|
||||
{
|
||||
printf("Case %d: -1\n",++count);
|
||||
continue;
|
||||
}
|
||||
p=(a+b+c+d)*1.0/2;
|
||||
ans=sqrt((p-a)*(p-b)*(p-c)*(p-d));
|
||||
printf("Case %d: %.6lf\n",++count,ans);
|
||||
}
|
||||
}
|
23
HDOJ/4387_autoAC.cpp
Normal file
23
HDOJ/4387_autoAC.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
int n,k;
|
||||
int main(void)
|
||||
{
|
||||
int cas = 1;
|
||||
while(scanf("%d %d",&n,&k)!=EOF){
|
||||
printf("Case %d: ",cas++);
|
||||
int r = n - 2 * k;
|
||||
int ans = 1;
|
||||
bool sig = true;
|
||||
if(r&1){
|
||||
if(k == 1) sig = false;
|
||||
else if(r == 1) ans = k;
|
||||
}
|
||||
if(sig)
|
||||
printf("Alice %d\n",ans);
|
||||
else
|
||||
puts("Bob");
|
||||
}
|
||||
return 0;
|
||||
}
|
45
HDOJ/4388_autoAC.cpp
Normal file
45
HDOJ/4388_autoAC.cpp
Normal file
|
@ -0,0 +1,45 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
int getOneNumber(int x)
|
||||
{
|
||||
int count = 0;
|
||||
for(int i=0;(1<<i)<=x;++i)
|
||||
{
|
||||
if(x & (1 << i))
|
||||
{
|
||||
++ count;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int caseNumber;
|
||||
int n, m, a;
|
||||
scanf("%d", &caseNumber);
|
||||
for(int cas=1;cas<=caseNumber;++cas)
|
||||
{
|
||||
scanf("%d", &n);
|
||||
int a = 0;
|
||||
while(n--)
|
||||
{
|
||||
scanf("%d", &m);
|
||||
if(!(getOneNumber(m) & 1))
|
||||
{
|
||||
++ a;
|
||||
}
|
||||
}
|
||||
printf("Case %d: ", cas);
|
||||
if(a & 1)
|
||||
{
|
||||
printf("Yes\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("No\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
5
HDOJ/4389_autoAC.cpp
Normal file
5
HDOJ/4389_autoAC.cpp
Normal file
|
@ -0,0 +1,5 @@
|
|||
Here is a function f(x):
|
||||
int f ( int x ) {
|
||||
if ( x == 0 ) return 0;
|
||||
return f ( x / 10 ) + x % 10;
|
||||
}
|
103
HDOJ/4390_autoAC.cpp
Normal file
103
HDOJ/4390_autoAC.cpp
Normal file
|
@ -0,0 +1,103 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <set>
|
||||
#include <ctime>
|
||||
#include <queue>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#define CL(arr, val) memset(arr, val, sizeof(arr))
|
||||
#define REP(i, n) for((i) = 0; (i) < (n); ++(i))
|
||||
#define FOR(i, l, h) for((i) = (l); (i) <= (h); ++(i))
|
||||
#define FORD(i, h, l) for((i) = (h); (i) >= (l); --(i))
|
||||
#define L(x) (x) << 1
|
||||
#define R(x) (x) << 1 | 1
|
||||
#define MID(l, r) (l + r) >> 1
|
||||
#define Min(x, y) x < y ? x : y
|
||||
#define Max(x, y) x < y ? y : x
|
||||
#define E(x) (1 << (x))
|
||||
const double eps = 1e-4;
|
||||
typedef long long LL;
|
||||
const int inf = ~0u>>2;
|
||||
using namespace std;
|
||||
const int N = 110;
|
||||
const int M = 1000010;
|
||||
const int MOD = 1e9 + 7;
|
||||
int c[N][N];
|
||||
int k[M], t[M];
|
||||
int num, n;
|
||||
int prime[N*20];
|
||||
bool vis[N*20];
|
||||
int cnt;
|
||||
void get_prime() {
|
||||
CL(vis, true);
|
||||
int i, j;
|
||||
for(i = 2; i < N*20; ++i) {
|
||||
for(j = i*i; j < N*20; j += i) {
|
||||
vis[j] = false;
|
||||
}
|
||||
}
|
||||
cnt = 0;
|
||||
for(i = 2; i < N*20; ++i) {
|
||||
if(vis[i]) prime[cnt++] = i;
|
||||
}
|
||||
}
|
||||
void init() {
|
||||
get_prime();
|
||||
CL(c, 0);
|
||||
int i , j;
|
||||
for(i = 0; i < N; ++i) c[i][0] = c[i][i] = 1;
|
||||
for(i = 2; i < N; ++i) {
|
||||
for(j = 1; j < i; ++j) {
|
||||
c[i][j] = (c[i-1][j] + c[i-1][j-1])%MOD;
|
||||
}
|
||||
}
|
||||
}
|
||||
LL solve(int x) {
|
||||
int m = n, flag = 1, i;
|
||||
for(i = 0; i < n; ++i) {
|
||||
if(((1<<i)&x) == 0) {
|
||||
flag *= -1; m--;
|
||||
}
|
||||
}
|
||||
LL tmp = 1;
|
||||
for(i = 0; i < num; ++i) {
|
||||
tmp = tmp*LL(c[k[i]+m-1][m-1])%MOD;
|
||||
}
|
||||
return tmp*flag;
|
||||
}
|
||||
int main() {
|
||||
init();
|
||||
int x, i, j;
|
||||
LL ans;
|
||||
while(~scanf("%d", &n)) {
|
||||
CL(t, 0);
|
||||
for(i = 0; i < n; ++i) {
|
||||
scanf("%d", &x);
|
||||
for(j = 0; prime[j]*prime[j] <= x; ++j) {
|
||||
if(x%prime[j] == 0) {
|
||||
while(x%prime[j] == 0) {
|
||||
t[prime[j]]++; x /= prime[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
if(x != 1) t[x]++;
|
||||
}
|
||||
num = 0;
|
||||
for(i = 2; i < M; ++i) {
|
||||
if(t[i] != 0) {
|
||||
k[num++] = t[i];
|
||||
}
|
||||
}
|
||||
ans = 0;
|
||||
for(i = (1<<n)-1; i >= 1; --i) {
|
||||
ans = (ans + solve(i))%MOD;
|
||||
}
|
||||
cout << (ans%MOD + MOD)%MOD << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
79
HDOJ/4391_autoAC.cpp
Normal file
79
HDOJ/4391_autoAC.cpp
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
#define for if(0); else for
|
||||
const int N=65537*2;
|
||||
struct SegTree{
|
||||
int a[N<<1],mi[N<<1],mx[N<<1];
|
||||
int Q;
|
||||
void init(int n,int c[]){
|
||||
for(Q=1;Q<=n+2;Q<<=1);
|
||||
memset(a,0,sizeof(a));
|
||||
for(int i=Q+0;i<Q+n;i++) a[i]=mi[i]=mx[i]=c[i-Q];
|
||||
for(int i=Q-1;i>=1;i--) pushup(i);
|
||||
}
|
||||
void pushup(int rt) {
|
||||
a[rt]=a[rt<<1]==a[rt<<1|1]?a[rt<<1]:-1;
|
||||
mi[rt]=min(mi[rt<<1],mi[rt<<1|1]);
|
||||
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
|
||||
}
|
||||
void update_one(int rt,int x) {
|
||||
a[rt]=mi[rt]=mx[rt]=x;
|
||||
}
|
||||
void pushdown(int rt) {
|
||||
if(a[rt]!=-1) {
|
||||
update_one(rt<<1,a[rt]);
|
||||
update_one(rt<<1|1,a[rt]);
|
||||
}
|
||||
}
|
||||
void update(int L,int R,int l,int r,int rt,int c) {
|
||||
if(a[rt]==c) return;
|
||||
if(L<=l && r<=R) {
|
||||
update_one(rt,c);
|
||||
return;
|
||||
}
|
||||
pushdown(rt);
|
||||
if(rt>=Q) return;
|
||||
int m=(l+r)>>1;
|
||||
if(L<=m) update(L,R,l,m,rt<<1,c);
|
||||
if(m<R) update(L,R,m+1,r,rt<<1|1,c);
|
||||
pushup(rt);
|
||||
}
|
||||
int query(int L,int R,int l,int r,int rt,int c) {
|
||||
int ret=0;
|
||||
if(L<=l && r<=R) {
|
||||
if(c>=mi[rt]&&c<=mx[rt]){
|
||||
int m=(l+r)>>1;
|
||||
if(a[rt]!=-1) return (a[rt]==c)?r-l+1:0;
|
||||
else return query(L,R,l,m,rt<<1,c)+query(L,R,m+1,r,rt<<1|1,c);
|
||||
}else return 0;
|
||||
}
|
||||
if(rt>=Q) return ret;
|
||||
pushdown(rt);
|
||||
int m=(l+r)>>1;
|
||||
if(L<=m) ret+=query(L,R,l,m,rt<<1,c);
|
||||
if(m<R) ret+=query(L,R,m+1,r,rt<<1|1,c);
|
||||
return ret;
|
||||
}
|
||||
}st;
|
||||
int a[N];
|
||||
int n,m;
|
||||
int main() {
|
||||
while(scanf("%d%d",&n,&m)!=EOF) {
|
||||
for(int i=0;i<n;i++) scanf("%d",&a[i]);
|
||||
st.init(n,a);
|
||||
for(int i=0;i<m;i++) {
|
||||
int cmd,l,r,c;
|
||||
scanf("%d%d%d%d",&cmd,&l,&r,&c);
|
||||
if(cmd==1){
|
||||
st.update(l,r,0,st.Q-1,1,c);
|
||||
}else {
|
||||
printf("%d\n",st.query(l,r,0,st.Q-1,1,c));
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
126
HDOJ/4392_autoAC.cpp
Normal file
126
HDOJ/4392_autoAC.cpp
Normal file
|
@ -0,0 +1,126 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cstdlib>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
#include<vector>
|
||||
using namespace std;
|
||||
const double eps=1e-8;
|
||||
int pr[1231];
|
||||
struct A{vector<int> a;double s;}e,te;
|
||||
struct P{int p[100],n;double s;}p,da;
|
||||
long long mx;
|
||||
int pt1(A &e,int n){
|
||||
double k=1;
|
||||
for(int i=0;i<n;i++){
|
||||
k*=pow(pr[i]+0.0,e.a[i]+0.0);
|
||||
if(k>p.s*1.00000001)return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
void cf(P &p,int k){
|
||||
p.p[p.n]=0;
|
||||
for(int i=0;i<p.n;i++)
|
||||
p.p[i]*=k;
|
||||
for(int i=0;i<p.n;i++)
|
||||
p.p[i+1]+=p.p[i]/10,p.p[i]%=10;
|
||||
while(p.p[p.n]){
|
||||
p.p[p.n+1]=p.p[p.n]/10;
|
||||
p.p[p.n]%=10;
|
||||
p.n++;
|
||||
}
|
||||
}
|
||||
P qiu(A &a,int n){
|
||||
P p;
|
||||
p.n=1;
|
||||
p.p[0]=1;
|
||||
for(int i=0;i<n;i++)
|
||||
for(int q=0;q<a.a[i];q++)
|
||||
cf(p,pr[i]);
|
||||
return p;
|
||||
}
|
||||
int pt(P a,P b){
|
||||
if(a.n!=b.n){
|
||||
return a.n<b.n;
|
||||
}
|
||||
for(int i=a.n;i--;){
|
||||
if(a.p[i]!=b.p[i])
|
||||
return a.p[i]<b.p[i];
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
int s[123],x[123];
|
||||
int n;
|
||||
long long js(A &e,int n){
|
||||
long long da=1;
|
||||
for(int i=0;i<n;i++)
|
||||
da*=e.a[i]+1;
|
||||
return da;
|
||||
}
|
||||
void dfs(int rt,A& e,long long k){
|
||||
if(rt>n)return ;
|
||||
if(k>=mx){
|
||||
if(!pt1(e,rt))return ;
|
||||
if(k>mx||(k==mx&& pt(qiu(e,rt),da))){
|
||||
if(!pt(qiu(e,rt),p))return ;
|
||||
mx=k;
|
||||
da=qiu(e,rt);
|
||||
}
|
||||
}
|
||||
int ss=s[rt];
|
||||
if(rt)ss=min(ss,e.a[rt-1]);
|
||||
for(int i=ss;i>=x[rt];i--){
|
||||
e.a[rt]=i;
|
||||
dfs(rt+1,e,k*(e.a[rt]+1));
|
||||
}
|
||||
}
|
||||
int gs(int k){ return 2*(log(pr[n]+0.0)/log(k+0.0))-1;}
|
||||
int gx(int k){ return (log(pr[n]+0.0)/log(k+0.0));}
|
||||
void qiu(){
|
||||
for(n=1;;n++){
|
||||
e.a.clear();
|
||||
for(int i=0;i<n;i++)
|
||||
s[i]=gs(pr[i]),x[i]=gx(pr[i]);
|
||||
if(x[0]<3)x[0]=1;
|
||||
for(int i=0;i<n;i++)
|
||||
e.a.push_back(1);
|
||||
if(!pt1(e,n))break;
|
||||
}
|
||||
if(n<15)
|
||||
for(int i=0;i<n;i++)
|
||||
x[i]=1;
|
||||
e.a.clear();
|
||||
for(int i=0;i<n;i++)e.a.push_back(0);
|
||||
dfs(0,e,1);
|
||||
}
|
||||
int main(){
|
||||
int ind=0;
|
||||
for(int i=2;i<1e3;i++){
|
||||
if(pr[i]==0){
|
||||
pr[ind++]=i;
|
||||
for(int q=i*i;q<1e3;q+=i)
|
||||
pr[q]=1;
|
||||
}
|
||||
}
|
||||
string s;
|
||||
while(cin>>s){
|
||||
if(s=="1"){
|
||||
puts("1 1");
|
||||
continue;
|
||||
}
|
||||
mx=-1;
|
||||
reverse(s.begin(),s.end());
|
||||
p.n=s.size();
|
||||
p.s=0;
|
||||
for(int i=0;i<s.size();i++){
|
||||
p.p[i]=s[i]-'0';
|
||||
p.s+=p.p[i]*pow(10.0,i);
|
||||
}
|
||||
qiu();
|
||||
p=da;
|
||||
for(int i=p.n;i--;)
|
||||
cout<<p.p[i];
|
||||
cout<<' '<<mx;cout<<endl;
|
||||
}
|
||||
}
|
91
HDOJ/4393_autoAC.cpp
Normal file
91
HDOJ/4393_autoAC.cpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<set>
|
||||
#include<map>
|
||||
#include<queue>
|
||||
#include<vector>
|
||||
#include<string>
|
||||
#define Min(a,b) a<b?a:b
|
||||
#define Max(a,b) a>b?a:b
|
||||
#define CL(a,num) memset(a,num,sizeof(a));
|
||||
#define maxn 60100
|
||||
#define eps 1e-6
|
||||
#define inf 9999999
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int f;
|
||||
int s;
|
||||
int id;
|
||||
}p[maxn] ;
|
||||
int vis[maxn];
|
||||
int cmp(const node a,const node b)
|
||||
{
|
||||
if( a.s != b.s) return a.s > b.s;
|
||||
else
|
||||
if(a.f != b.f) return a.f > b.f ;
|
||||
else
|
||||
return a.id < b.id;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,i,j,n,k,cnt;
|
||||
int cas = 0 ;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
memset(vis,0,sizeof(vis));
|
||||
int mx = -1;
|
||||
scanf("%d",&n);
|
||||
for(i = 1;i <=n;i++ )
|
||||
{
|
||||
scanf("%d%d",&p[i].f,&p[i].s);
|
||||
p[i].id = i;
|
||||
if(mx < p[i].f)
|
||||
{
|
||||
mx = p[i].f ;
|
||||
k = i;
|
||||
}
|
||||
}
|
||||
printf("Case #%d:\n",++cas);
|
||||
printf("%d",k);
|
||||
vis[k] = 1 ;
|
||||
if(n > 510)cnt = 510;
|
||||
else cnt = n;
|
||||
for(i = 1;i <= cnt - 1;i++)
|
||||
{
|
||||
mx = -1;
|
||||
for(j = 1;j <= n;j++)
|
||||
{
|
||||
if(!vis[j])
|
||||
{
|
||||
p[j].f +=p[j].s;
|
||||
if(mx < p[j].f)
|
||||
{
|
||||
k = j;
|
||||
mx = p[j].f;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf(" %d",k);
|
||||
vis[k] = 1;
|
||||
}
|
||||
if(cnt < n)
|
||||
{
|
||||
sort(p + 1,p+1+n,cmp);
|
||||
for(i = 1; i <= n;i++)
|
||||
{
|
||||
if(!vis[p[i].id])
|
||||
{
|
||||
printf(" %d",p[i].id);
|
||||
vis[p[i].id] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
71
HDOJ/4394_autoAC.cpp
Normal file
71
HDOJ/4394_autoAC.cpp
Normal file
|
@ -0,0 +1,71 @@
|
|||
#include<stdio.h>
|
||||
__int64 T,n,tag;
|
||||
__int64 ans,mod[11]={0,1},dig[11];
|
||||
__int64 i,j,k,t;
|
||||
struct node
|
||||
{
|
||||
__int64 id,val;
|
||||
}que[100000001];
|
||||
__int64 wei(__int64 x)
|
||||
{
|
||||
__int64 z=1;
|
||||
if(!x) return 0;
|
||||
while(x/=10) z++;
|
||||
return z;
|
||||
}
|
||||
__int64 cmp(__int64 a, __int64 b, __int64 k)
|
||||
{
|
||||
while(k--)
|
||||
{
|
||||
if(a%10!=b%10) return 0;
|
||||
a/=10;b/=10;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
__int64 bfs(__int64 x)
|
||||
{
|
||||
__int64 t=0,pop=0,push=1,i,j,bl,ans,sw,k=0;
|
||||
que[0].id=que[0].val=0;ans=sw=0x7fffffff;
|
||||
while(pop<push)
|
||||
{
|
||||
t=que[pop].val;
|
||||
k=que[pop++].id+1;
|
||||
if(cmp(t*t,x,wei(x)))
|
||||
{
|
||||
ans=t<ans?t:ans;
|
||||
sw=wei(ans);
|
||||
}
|
||||
if(wei(t)>=wei(x)) return 0;
|
||||
if(k>sw) continue;
|
||||
for(i=0;i<10;i++)
|
||||
{
|
||||
if(cmp((i*mod[k]+t)*(i*mod[k]+t),x%mod[k+1],k))
|
||||
{
|
||||
if(cmp((i*mod[k]+t)*(i*mod[k]+t),x,wei(x)))
|
||||
{
|
||||
ans=(i*mod[k]+t)<ans?(i*mod[k]+t):ans;
|
||||
sw=wei(ans);
|
||||
continue;
|
||||
}
|
||||
if(k>=sw) continue;
|
||||
que[push].val=i*mod[k]+t;
|
||||
que[push++].id=k;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(ans==0x7fffffff) return 0;
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
scanf("%I64d",&T);
|
||||
for(i=2;i<=10;i++) mod[i]=mod[i-1]*10;
|
||||
while(T--)
|
||||
{
|
||||
scanf("%I64d",&tag);
|
||||
ans=bfs(tag);
|
||||
if(ans) printf("%I64d\n",ans);
|
||||
else printf("None\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
65
HDOJ/4395_autoAC.cpp
Normal file
65
HDOJ/4395_autoAC.cpp
Normal file
|
@ -0,0 +1,65 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int N = 2e5 + 2e4;
|
||||
const int shift = 2e5;
|
||||
bool reach[N];
|
||||
int w[205];
|
||||
inline int read(){
|
||||
double x;
|
||||
scanf("%lf",&x);
|
||||
if(x > 0)
|
||||
return x * 10000 + 1e-8;
|
||||
else
|
||||
return x * 10000 - 1e-8;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,n;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
memset(reach,false,sizeof(reach));
|
||||
int goal = read();
|
||||
scanf("%d",&n);
|
||||
for(int i=0;i<n;i++)
|
||||
w[i] = read();
|
||||
sort(w,w+n);
|
||||
reach[ 0 + shift ] = true;
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
bool f = w[i] > 0;
|
||||
if(f)
|
||||
{
|
||||
for(int j=N-1-w[i];j>=0;j--)
|
||||
if(reach[j])
|
||||
reach[ j + w[i] ] = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int j=-w[i];j<N;j++)
|
||||
if(reach[j])
|
||||
reach[ j + w[i] ] = true;
|
||||
}
|
||||
}
|
||||
int i = goal + shift , j = 0;
|
||||
int ans = -1;
|
||||
while(1)
|
||||
{
|
||||
if(i-j >= 0 && reach[i-j])
|
||||
{
|
||||
ans = i - j;
|
||||
break;
|
||||
}
|
||||
if(i+j < N && reach[i+j])
|
||||
{
|
||||
ans = i + j;
|
||||
break;
|
||||
}
|
||||
++j;
|
||||
}
|
||||
printf("%.4f\n",(ans-shift)/10000.0);
|
||||
}
|
||||
return 0;
|
||||
}
|
86
HDOJ/4396_autoAC.cpp
Normal file
86
HDOJ/4396_autoAC.cpp
Normal file
|
@ -0,0 +1,86 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const int N = 5005;
|
||||
const int M = 200005;
|
||||
const int NN = 505;
|
||||
const int Lum = 10;
|
||||
const int INF = 0x3f3f3f3f;
|
||||
int vis[N][NN], d[N][NN], en;
|
||||
int head[M];
|
||||
int n, m, s, t, k;
|
||||
struct node {
|
||||
int to, dis, next;
|
||||
}edge[M];
|
||||
void addEdge(int u,int v,int x) {
|
||||
edge[en].to = v;
|
||||
edge[en].next = head[u];
|
||||
edge[en].dis = x;
|
||||
head[u] = en++;
|
||||
edge[en].to = u;
|
||||
edge[en].next = head[v];
|
||||
edge[en].dis = x;
|
||||
head[v] = en++;
|
||||
}
|
||||
struct Node{
|
||||
int u, m;
|
||||
};
|
||||
void SPFA() {
|
||||
queue<Node> Q;
|
||||
for(int i = 1; i <= n; i++) {
|
||||
for (int j = 0; j <= NN; j++) {
|
||||
d[i][j] = INF;
|
||||
vis[i][j] = 0;
|
||||
}
|
||||
}
|
||||
d[s][0] = 0;
|
||||
vis[s][0] = 1;
|
||||
Q.push((Node){s, 0});
|
||||
while(!Q.empty()) {
|
||||
int u = Q.front().u;
|
||||
int m = Q.front().m;
|
||||
vis[u][m] = 0;
|
||||
Q.pop();
|
||||
int temp = m + Lum;
|
||||
if (temp >= NN) continue;
|
||||
if (temp > k) temp = k;
|
||||
for(int i = head[u]; i != -1; i = edge[i].next) {
|
||||
int v = edge[i].to;
|
||||
if(d[u][m] + edge[i].dis < d[v][temp]) {
|
||||
d[v][temp] = d[u][m] + edge[i].dis;
|
||||
if(!vis[v][temp]) {
|
||||
Q.push((Node){v, temp});
|
||||
vis[v][temp] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void input() {
|
||||
int u, v, c;
|
||||
for (int i = 0; i < m; i++) {
|
||||
scanf("%d %d %d", &u, &v, &c);
|
||||
addEdge(u, v, c);
|
||||
}
|
||||
scanf("%d %d %d", &s, &t, &k);
|
||||
}
|
||||
int main() {
|
||||
while (scanf("%d %d", &n, &m) == 2) {
|
||||
en = 0;
|
||||
memset(head, -1, sizeof(head));
|
||||
input();
|
||||
if (k % 10) {
|
||||
k = 10 * ((k / 10) + 1);
|
||||
}
|
||||
SPFA();
|
||||
if (d[t][k] == INF) {
|
||||
printf("-1\n");
|
||||
} else printf("%d\n", d[t][k]);
|
||||
}
|
||||
return 0;
|
||||
}
|
159
HDOJ/4397_autoAC.cpp
Normal file
159
HDOJ/4397_autoAC.cpp
Normal file
|
@ -0,0 +1,159 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
struct node{
|
||||
int a[59];
|
||||
void init()
|
||||
{
|
||||
for(int i=0;i<59;i++) a[i]=i;
|
||||
}
|
||||
void chface(int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8)
|
||||
{
|
||||
int tmp= a[a0];
|
||||
a[a0]=a[a6],a[a6]=a[a8],a[a8]=a[a2],a[a2]=tmp;
|
||||
tmp = a[a1];
|
||||
a[a1]=a[a3],a[a3]=a[a7],a[a7]=a[a5],a[a5]=tmp;
|
||||
}
|
||||
void chline(int a0,int a1,int a2,int a3,int a4,int a5,int a6,int a7,int a8,int a9,int a10,int a11)
|
||||
{
|
||||
int tmp = a[a0];
|
||||
a[a0]=a[a9],a[a9]=a[a6],a[a6]=a[a3],a[a3]=tmp;
|
||||
tmp = a[a1];
|
||||
a[a1]=a[a10],a[a10]=a[a7],a[a7]=a[a4],a[a4]=tmp;
|
||||
tmp = a[a2];
|
||||
a[a2]=a[a11],a[a11]=a[a8],a[a8]=a[a5],a[a5]=tmp;
|
||||
}
|
||||
bool check()
|
||||
{
|
||||
for(int i=0;i<59;i++)
|
||||
if(a[i]!=i) return false;
|
||||
return true;
|
||||
}
|
||||
void U()
|
||||
{
|
||||
chface(36,37,38, 39,40,41, 42,43,44);
|
||||
chline(2,1,0, 29,28,27, 20,19,18 ,11,10,9);
|
||||
}
|
||||
void u()
|
||||
{
|
||||
chface(38,37,36, 41,40,39, 44,43,42);
|
||||
chline(9,10,11,18,19,20,27,28,29,0,1,2);
|
||||
}
|
||||
void R()
|
||||
{
|
||||
chface(9,10,11,12,13,14,15,16,17);
|
||||
chline(44,41,38,18,21,24,53,50,47,8,5,2);
|
||||
}
|
||||
void r()
|
||||
{
|
||||
chface(11,10,9, 14,13,12, 17,16,15);
|
||||
chline(2,5,8,47,50,53,24,21,18,38,41,44);
|
||||
}
|
||||
void F()
|
||||
{
|
||||
chface(0,1,2,3,4,5,6,7,8);
|
||||
chline(42,43,44 ,9,12,15, 47,46,45, 35,32,29);
|
||||
}
|
||||
void f()
|
||||
{
|
||||
chface(2,1,0, 5,4,3, 8,7,6);
|
||||
chline(29,32,35,45,46,47,15,12,9,44,43,42);
|
||||
}
|
||||
void D()
|
||||
{
|
||||
chface(45,46,47,48,49,50,51,52,53);
|
||||
chline(6,7,8 ,15,16,17, 24,25,26, 33,34,35);
|
||||
}
|
||||
void d()
|
||||
{
|
||||
chface(47,46,45, 50,49,48, 53,52,51);
|
||||
chline(35,34,33,26,25,24,17,16,15,8,7,6);
|
||||
}
|
||||
void L()
|
||||
{
|
||||
chface(27,28,29,30,31,32,33,34,35);
|
||||
chline(0,3,6, 45,48,51, 26,23,20, 36,39,42);
|
||||
}
|
||||
void l()
|
||||
{
|
||||
chface(29,28,27,32,31,30,35,34,33);
|
||||
chline(42,39,36,20,23,26,51,48,45,6,3,0);
|
||||
}
|
||||
void B()
|
||||
{
|
||||
chface(18,19,20,21,22,23,24,25,26);
|
||||
chline(38,37,36, 27,30,33, 51,52,53, 17,14,11);
|
||||
}
|
||||
void b()
|
||||
{
|
||||
chface(20,19,18, 23,22,21,26,25,24);
|
||||
chline(11,14,17,53,52,51,33,30,27,36,37,38);
|
||||
}
|
||||
void X()
|
||||
{
|
||||
chline(5,4,3, 32,31,30, 23,22,21, 14,13,12);
|
||||
}
|
||||
void x()
|
||||
{
|
||||
chline(12,13,14,21,22,23,30,31,32,3,4,5);
|
||||
}
|
||||
void Y()
|
||||
{
|
||||
chline(7,4,1, 43,40,37, 19,22,25, 52,49,46);
|
||||
}
|
||||
void y()
|
||||
{
|
||||
chline(46,49,52,25,22,19,37,40,43,1,4,7);
|
||||
}
|
||||
void Z()
|
||||
{
|
||||
chline(41,40,39,28,31,34, 48,49,50, 16,13,10);
|
||||
}
|
||||
void z()
|
||||
{
|
||||
chline(10,13,16,50,49,48,34,31,28,39,40,41);
|
||||
}
|
||||
};
|
||||
int main()
|
||||
{
|
||||
char a[2009];
|
||||
node t;
|
||||
bool ou = false;
|
||||
while(~scanf("%s",a))
|
||||
{
|
||||
if(ou) printf("\n");
|
||||
ou = true;
|
||||
t.init();
|
||||
int len = strlen(a);
|
||||
for(int i=0;i<len;i++)
|
||||
{
|
||||
if(a[i]=='U') t.U();
|
||||
else if(a[i]=='R') t.R();
|
||||
else if(a[i]=='F') t.F();
|
||||
else if(a[i]=='D') t.D();
|
||||
else if(a[i]=='L') t.L();
|
||||
else if(a[i]=='B') t.B();
|
||||
else if(a[i]=='X') t.X();
|
||||
else if(a[i]=='Y') t.Y();
|
||||
else if(a[i]=='Z') t.Z();
|
||||
else if(a[i]=='u') t.u();
|
||||
else if(a[i]=='r') t.r();
|
||||
else if(a[i]=='f') t.f();
|
||||
else if(a[i]=='d') t.d();
|
||||
else if(a[i]=='l') t.l();
|
||||
else if(a[i]=='b') t.b();
|
||||
else if(a[i]=='x') t.x();
|
||||
else if(a[i]=='y') t.y();
|
||||
else if(a[i]=='z') t.z();
|
||||
}
|
||||
if(t.check())
|
||||
printf("Yes\n");
|
||||
else
|
||||
printf("No\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
88
HDOJ/4398_autoAC.cpp
Normal file
88
HDOJ/4398_autoAC.cpp
Normal file
|
@ -0,0 +1,88 @@
|
|||
#include<stdio.h>
|
||||
#include<iostream>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
#include<queue>
|
||||
#include<map>
|
||||
#include<set>
|
||||
using namespace std;
|
||||
const int MAXN=100010;
|
||||
int Ti[MAXN];
|
||||
int ne[MAXN];
|
||||
map<int,int>mp;
|
||||
struct Node
|
||||
{
|
||||
int next_id;
|
||||
int ti;
|
||||
};
|
||||
struct classcomp
|
||||
{
|
||||
bool operator()(const Node &a,const Node &b)const
|
||||
{
|
||||
return a.next_id<b.next_id;
|
||||
}
|
||||
};
|
||||
multiset<Node,classcomp>T_info;
|
||||
multiset<Node>::iterator it_n;
|
||||
set<int>Te;
|
||||
set<int>::iterator it;
|
||||
int main()
|
||||
{
|
||||
int n,m;
|
||||
while(scanf("%d%d",&n,&m)==2)
|
||||
{
|
||||
for(int i=1;i<=n;i++)
|
||||
scanf("%d",&Ti[i]);
|
||||
mp.clear();
|
||||
for(int i=n;i>=1;i--)
|
||||
{
|
||||
if(mp[Ti[i]])
|
||||
ne[i]=mp[Ti[i]];
|
||||
else ne[i]=n+1;
|
||||
mp[Ti[i]]=i;
|
||||
}
|
||||
Te.clear();
|
||||
T_info.clear();
|
||||
for(int i=1;i<=m;i++)
|
||||
{
|
||||
if(!mp[i])mp[i]=n+1;
|
||||
Node temp;
|
||||
temp.next_id=mp[i];
|
||||
temp.ti=i;
|
||||
T_info.insert(temp);
|
||||
Te.insert(i);
|
||||
}
|
||||
int ans=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
it=Te.find(Ti[i]);
|
||||
if(it!=Te.end())
|
||||
{
|
||||
Node temp;
|
||||
temp.next_id=i;
|
||||
temp.ti=Ti[i];
|
||||
T_info.erase(temp);
|
||||
temp.next_id=ne[i];
|
||||
T_info.insert(temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
ans++;
|
||||
it_n=T_info.end();
|
||||
it_n--;
|
||||
if(ne[i]<(*it_n).next_id)
|
||||
{
|
||||
Te.erase((*it_n).ti);
|
||||
T_info.erase(it_n);
|
||||
Te.insert(Ti[i]);
|
||||
Node temp;
|
||||
temp.next_id=ne[i];
|
||||
temp.ti=Ti[i];
|
||||
T_info.insert(temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user