Powered By HC TECH : AutoACer Engine

3700-3799
pull/41/head
KiritoTRw 2016-09-04 14:14:07 +08:00 committed by GitHub
parent 3845accd4b
commit ff9985fa25
73 changed files with 6060 additions and 0 deletions

167
HDOJ/3700_autoAC.cpp Normal file
View File

@ -0,0 +1,167 @@
#include<iostream>
#include<stdlib.h>
using namespace std;
#define N 21
int n,sleep,awake;
struct Time
{
int hour;
int minite;
int sec;
void trans()
{ sec=hour*60+minite; }
void retrans()
{ sec+=24*60; }
void minusonesecond()
{
if(minite==0)
hour--,minite=59;
else minite--;
if(hour<0)
hour+=24;
}
void addonesecond()
{
if(minite==59)
hour++,minite=0;
else minite++;
if(hour>23)
hour-=24;
}
bool operator < (const Time a)const
{
if(hour==a.hour)
{
return minite<a.minite;
}
return hour<a.hour;
}
};
struct Arrange
{
Time tb,te;
} affire[N];
int cmp(const void *a,const void *b)
{
struct Arrange *A=(Arrange*)a;
struct Arrange *B=(Arrange*)b;
if(B->tb<A->tb)
return 1;
return -1;
}
Time sle[N][2];
char evn[20];
void solve(bool flag)
{
int i,j,begin,end,temp=0,nowlast=0,segn=0;
Time temp1,temp2;
for(i=2;i<=n;i++)
{
end=affire[i].tb.sec-1;
begin=affire[i-1].te.sec+1;
if(end<begin&&begin-end!=1)
end+=24*60;
if(end-begin+1>=sleep)
{
++segn;
temp1=affire[i-1].te;
temp1.addonesecond();
sle[segn][0]=temp1;
temp1=affire[i].tb;
temp1.minusonesecond();
sle[segn][1]=temp1;
nowlast=0;
}
else if(end-begin+1<sleep)
{
if(nowlast==0)
nowlast+=affire[i-1].te.sec-affire[i-1].tb.sec+1;
nowlast+=affire[i].te.sec-affire[i-1].te.sec+1;
if(nowlast>awake)
{
printf("No\n");
return ;
}
}
}
end=affire[1].tb.sec-1;
begin=affire[n].te.sec+1;
if(end<begin&&begin-end!=1)
end+=24*60;
if(end-begin+1>=sleep)
{
++segn;
temp2=affire[n].te;
temp2.addonesecond();
sle[segn][0]=temp2;
temp1=affire[1].tb;
temp1.minusonesecond();
sle[segn][1]=temp1;
nowlast=0;
}
else if(end-begin+1<sleep)
{
if(nowlast==0)
nowlast+=affire[n].te.sec-affire[n].tb.sec+1;
nowlast+=affire[1].te.sec-affire[n].te.sec+1;
if(nowlast>awake)
{
printf("No\n");
return ;
}
}
if(n==0)
{
segn=1;
printf("Yes\n%d\n",segn);
printf("00:00-23:59\n");
return;
}
else
{
if(segn!=0)
{
printf("Yes\n%d\n",segn);
for(i=1;i<=segn;i++)
{
printf("%02d:%02d-%02d:%02d\n",sle[i][0].hour,sle[i][0].minite,sle[i][1].hour,sle[i][1].minite);
}
}
else
printf("No\n");
}
}
int main()
{
while(scanf("%d%d",&sleep,&awake)!=EOF)
{
sleep*=60,awake*=60;
scanf("%d",&n);
int i,j;
bool flag=false;
bool ss=false;
for(i=1;i<=n;i++)
{
Time T1,T2;
scanf("%d:%d-%d:%d",&T1.hour,&T1.minite,&T2.hour,&T2.minite);
T1.trans(),T2.trans();
if(T2.sec-T1.sec+1>awake)
{
ss=true;
}
if(T2<T1)
{
flag=true;
T2.retrans();
}
affire[i].tb=T1,affire[i].te=T2;
}
if(ss)
{
printf("No\n");
continue;
}
qsort(affire+1,n,sizeof(Time)*2,cmp);
solve(flag);
}
}

28
HDOJ/3706_autoAC.cpp Normal file
View File

@ -0,0 +1,28 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 0x7fffffff
using namespace std;
int main()
{
int n,A,B;
int q[100001],id[100001];
while(scanf("%d%d%d",&n,&A,&B)!=EOF)
{
__int64 Ti=1,s=1;
int head=0,tail=0;
for(int i=1;i<=n;i++)
{
s=(s*A)%B;
while(head<tail && q[tail]>=s) tail--;
q[++tail]=s;
id[tail]=i;
while(id[head+1]<i-A) head++;
Ti=(Ti*q[head+1])%B;
}
printf("%I64d\n",Ti);
}
return 0;
}

54
HDOJ/3709_autoAC.cpp Normal file
View File

@ -0,0 +1,54 @@
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int bit[19];
__int64 dp[19][19][2005];
__int64 dfs(int pos,int o,int l,int work)
{
if(pos == -1)
return l == 0;
if(l<0)
return 0;
if(!work && dp[pos][o][l]!=-1)
return dp[pos][o][l];
__int64 ans = 0;
int end = work?bit[pos]:9;
for(int i=0; i<=end; i++)
{
int next = l;
next += (pos-o)*i;
ans+=dfs(pos-1,o,next,work&&i==end);
}
if(!work)
dp[pos][o][l] = ans;
return ans;
}
__int64 solve(__int64 n)
{
int len = 0;
while(n)
{
bit[len++] = n%10;
n/=10;
}
__int64 ans = 0;
for(int i = 0; i<len; i++)
{
ans+=dfs(len-1,i,0,1);
}
return ans-(len-1);
}
int main()
{
int T;
__int64 l,r;
scanf("%d",&T);
memset(dp,-1,sizeof(dp));
while(T--)
{
scanf("%I64d%I64d",&l,&r);
printf("%I64d\n",solve(r)-solve(l-1));
}
return 0;
}

346
HDOJ/3710_autoAC.cpp Normal file
View File

@ -0,0 +1,346 @@
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
const int N = 20005;
const int M = 100005;
const int QN = M;
const int INF = 0X7FFFFFFF;
typedef int vType;
typedef pair<int, int> pii;
#define mkpii make_pair<int, int>
struct e{
int v;
e* nxt;
}es[N<<1], *fir[N];
struct node{
int ls, rs;
int l, r;
int id;
vType Min;
int mid() { return (l + r) >> 1; }
}nodes[N<<1];
struct se{
pii e;
int len;
}ses[M<<1], lea[M<<1];
int n, en, qn, m;
vector<pii> qlca[N];
vector<se> nes[N];
int par[N], fa[N];
int ln, cnt;
int leaNum;
int sons[N], que[N], dep[N], id[N], st[N], ed[N], root[N], top[N], sNum[N];
int ith[N], pMin[N], seg[N];
vType iw[N];
int tr;
inline void add_e(int u, int v){
es[en].v = v;
es[en].nxt = fir[u];
fir[u] = &es[en++];
}
inline void newNode(int& id, int l, int r){
nodes[cnt].ls = nodes[cnt].rs = -1;
nodes[cnt].l = l;
nodes[cnt].r = r;
nodes[cnt].Min = INF;
id = cnt++;
}
void build(int& id, int l, int r){
newNode(id, l, r);
if(l >= r){
nodes[id].id = seg[l];
return ;
}
int mid = (l+r)>>1;
build(nodes[id].ls, l, mid);
build(nodes[id].rs, mid+1, r);
}
void initTree(){
int l, r, u, v, i;
e* cur;
l = r = 0;
que[r++] = tr;
par[tr] = -1;
dep[tr] = 0;
while(l != r){
u = que[l++];
int g = 1;
for(cur = fir[u]; cur; cur = cur->nxt){
if((v = cur->v) != par[u]){
que[r++] = v;
par[v] = u;
dep[v] = dep[u]+1;
ith[v] = g++;
}
}
}
for(i = 1; i <= n; i++){
sons[i] = 1;
sNum[i] = 0;
id[i] = -1;
}
for(i = r-1; i >= 0; i--){
u = que[i];
if(par[u] >= 0){
sons[par[u]] += sons[u];
sNum[par[u]]++;
}
}
l = r = 0;
que[r++] = tr;
ln = cnt = 0;
while(l != r){
u = que[l++];
st[ln] = dep[u];
top[ln] = u;
while(u >= 0){
id[u] = ln;
ed[ln] = dep[u];
seg[dep[u]] = u;
int best;
for(cur = fir[u], best=-1; cur; cur = cur->nxt){
if(id[v = cur->v] == -1){
if(best == -1 || (best >= 0 && sons[v] > sons[best])){
best = v;
}
}
}
if(best >= 0){
for(cur = fir[u]; cur; cur = cur->nxt){
if(id[v = cur->v] == -1 && best != v){
que[r++] = v;
}
}
}
u = best;
}
root[ln] = -1;
build(root[ln], st[ln], ed[ln]);
ln++;
}
}
int qrylKthFar(int& id, int i, int k){
if(nodes[id].l == nodes[id].r) return nodes[id].id;
int mid = nodes[id].mid();
if(i - mid - 1 >= k) return qrylKthFar(nodes[id].rs, i, k);
else return qrylKthFar(nodes[id].ls, i, k);
}
int qryKthFar(int i, int k){
int u = i, ri;
while(true){
ri = id[u];
if(dep[u] - st[ri] >= k){
return qrylKthFar(root[ri], dep[u], k);
}else{
k -= dep[u] - st[ri] + 1;
u = par[top[ri]];
}
}
}
void inslMin(int& id, int ql, int qr, int mv){
if(id == -1) return ;
if(ql <= nodes[id].l && nodes[id].r <= qr){
if(nodes[id].Min > mv){
nodes[id].Min = mv;
}
return;
}
if(nodes[id].l == nodes[id].r) return;
int mid = nodes[id].mid();
if(ql <= mid){
inslMin(nodes[id].ls, ql, qr, mv);
}
if(qr > mid){
inslMin(nodes[id].rs, ql, qr, mv);
}
}
void insMin(int i, int k, vType mv){
int b, u;
u = i;
while(true){
b = id[u];
if(dep[u]-st[b] >= k){
inslMin(root[b], dep[u]-k, dep[u], mv);
return;
}else{
inslMin(root[b], st[b], dep[u], mv);
k -= dep[u] - st[b] + 1;
u = par[top[b]];
}
}
}
bool input(){
scanf("%d%d", &n, &m);
int i, k, tn;
for(i = tn = 0; i < m; i++){
scanf("%d%d%d%d", &ses[i].e.first, &ses[i].e.second, &ses[i].len, &k);
if(k == 1){
ses[i].len = 0;
}
if(ses[i].e.first != ses[i].e.second){
tn++;
}
}
m = tn;
return true;
}
inline bool cmp(se a, se b){
return a.len < b.len;
}
int findFa(int u){
int k = u;
while(k != fa[k]) k = fa[k];
while(u != k){
int tf = fa[u];
fa[u] = k;
u = tf;
}
return k;
}
void merge(int u, int v){
int fu, fv;
fu = findFa(u);
fv = findFa(v);
fa[fu] = fv;
}
int kruskal(int n, int m, int& leaNum, bool flag){
int i, ans, k, u, v;
for(i = 1; i <= n; i++){
fa[i] = i;
}
if(flag){
for(i = 1; i <= n; i++){
iw[i] = 0;
fir[i] = NULL;
}
en = leaNum = 0;
}
sort(ses, ses + m, cmp);
for(i = ans = 0, k = 1; k < n && i < m; i++){
u = ses[i].e.first;
v = ses[i].e.second;
if(findFa(u) != findFa(v)){
ans += ses[i].len;
k++;
merge(u, v);
if(flag){
add_e(u, v);
add_e(v, u);
iw[u] += ses[i].len;
iw[v] += ses[i].len;
}
}else if(flag){
lea[leaNum++] = ses[i];
}
}
if (flag) {
for (; i < m; i++) {
lea[leaNum++] = ses[i];
}
}
if(k < n) ans = INF;
return ans;
}
void handlelca(int u, int v, int anc, int len){
if(u != anc && v != anc){
int ku, kv;
ku = qryKthFar(u, dep[u] - dep[anc] - 1);
kv = qryKthFar(v, dep[v] - dep[anc] - 1);
se te;
te.e.first = ith[ku];
te.e.second = ith[kv];
te.len = len;
nes[anc].push_back(te);
}
if(dep[anc] + 2 <= dep[u]){
insMin(u, dep[u] - dep[anc] - 2, len);
}
if(dep[anc] + 2 <= dep[v]){
insMin(v, dep[v] - dep[anc] - 2, len);
}
}
int getlca(int u, int v){
while(id[u] != id[v]){
if(id[u] < id[v]) swap(u, v);
u = par[top[id[u]]];
}
if(dep[u] < dep[v]) swap(u, v);
return v;
}
void lca(se* qs, int qn){
int i;
for(i = 1; i <= n; i++){
nes[i].clear();
}
for(i = 0; i < qn; i++){
int u, v, anc;
u = qs[i].e.first;
v = qs[i].e.second;
anc = getlca(u, v);
handlelca(v, u, anc, qs[i].len);
}
}
void getpMin(int& id, int mv){
if(mv > nodes[id].Min){
mv = nodes[id].Min;
}
if(nodes[id].l == nodes[id].r){
pMin[nodes[id].id] = mv;
return;
}
getpMin(nodes[id].ls, mv);
getpMin(nodes[id].rs, mv);
}
void getpMin(){
int i;
for(i = 0; i < ln; i++){
getpMin(root[i], INF);
}
}
void solve(){
tr = 1;
int sum, i, sn, v, num;
e* cur;
sum = kruskal(n, m, leaNum, true);
initTree();
lca(lea, leaNum);
getpMin();
for(i = 1; i <= n; i++){
num = 0;
sn = sNum[i];
if (par[i] >= 1) {
sn++;
for (cur = fir[i]; cur; cur = cur->nxt) {
if ((v = cur->v) != par[i] && pMin[v] < INF) {
ses[num].e.first = sn;
ses[num].e.second = ith[v];
ses[num].len = pMin[v];
num++;
}
}
}
int size = nes[i].size(), j;
for(j = 0; j < size; j++){
ses[num++] = nes[i][j];
}
int ans = kruskal(sn, num, leaNum, false);
if(ans < INF){
ans += sum - iw[i];
printf("%d\n", ans);
}else{
printf("inf\n");
}
}
}
int main() {
int t;
scanf("%d", &t);
while(t--){
input();
solve();
}
return 0;
}

61
HDOJ/3711_autoAC.cpp Normal file
View File

@ -0,0 +1,61 @@
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 101;
const int INF = 0x3f3f3f3f;
int n, m;
int a[maxn];
int cal(int a, int b)
{
int M = a ^ b;
int num = 0;
while(M)
{
M &= (M-1);
num++;
}
return num;
}
int get_ans(int t)
{
int min = INF, num = 0, ans;
for(int i = 0; i < n; i++)
{
num = cal(a[i], t);
if(num < min) { min = num; ans = a[i]; }
}
return ans;
}
void read_case()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, a+n);
}
void solve()
{
read_case();
int t;
while(m--)
{
scanf("%d", &t);
int ans = get_ans(t);
printf("%d\n", ans);
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
solve();
}
return 0;
}

89
HDOJ/3712_autoAC.cpp Normal file
View File

@ -0,0 +1,89 @@
#include<cstdio>
#include<iostream>
#include<complex>
#include<cmath>
using namespace std;
#define Y imag
#define X real
const double eps = 1e-9;
const char *err = "Error";
const double pi = acos(-1.0);
typedef complex<double> pnt;
static double dot(const pnt &a, const pnt& b) {return X(conj(a)*b);}
static double cross(const pnt &a, const pnt &b) {return imag(conj(a)*b);}
void work(const pnt& s, double argu) {
while(argu<0) argu+=2*pi;
while(argu >= 2*pi) argu -=2*pi;
if(argu < pi+eps) {
puts(err);
return ;
}
argu = - argu;
printf("%.3lf\n", X(s) +( abs(argu + 3*pi/2)<eps ? 0 : Y(s)/tan(argu) ));
}
pnt jdg(const pnt& p0, const pnt& p1,const pnt& p3, const pnt& p2){
if(cross(p3-p0,p1-p0) * cross(p2-p0,p1-p0) > -eps) return p0;
double s1 = cross(p2-p1,p0-p1), s2 = cross(p3-p1,p0-p1);
s1 = abs(s1), s2 = abs(s2);
double x = (X(p2) *s2 + X(p3)*s1) / (s1+ s2);
double y = (Y(p2) *s2 + Y(p3)*s1) / (s1+ s2);
pnt p(x,y);
if(cross(p3-p2,p1-p2)*cross(p3-p2,p0-p2)>0 && abs(p-p0) < abs(p-p1)) return p0;
return p;
}
double cal(double arg0, double arg1, double tmp) {
double t1 =arg1+pi/2-(arg0+pi);
double s1 = sin(t1);
double s2 = s1/tmp;
if(s2>=1.0 || s2 <=-1.0) return 1e10;
else return arg1-pi/2-asin(s2);
}
int main(){
int tst;
double tmp;
cin >> tst;
pnt p[3];
while(tst--) {
double x1,y1,x2,y2;
while(cin >> x1 >> y1 >> x2 >> y2){
pnt p1(x1,y1), p2(x2,y2), p0;
int s = -1;
double mx = 1e10;
for(int i=0;i<3;i++){
cin >> x1 >> y1;
p[i] = pnt(x1,y1);
}
cin >> tmp;
for(int i=0;i<3;i++) {
pnt P = jdg(p1,p2,p[i],p[(i+1)%3]);
if(P == p1) continue;
double v = abs(p1-P);
if(v < mx) mx = v, s = i, p0 = P;
}
if(s == -1){
work(p1, arg(p2-p1));
continue;
}
pnt p3;
double t = 0;
if(cross(p2-p1, p[(s+1)%3] - p[s])<0)t = pi;
double arg0 = cal(arg(p2-p1),arg(p[(s+1)%3] - p[s])+t,tmp);
pnt np = pnt(X(p0) + 200*cos(arg0), Y(p0) + 200*sin(arg0));
int k = -1;
for(int i=0;i<3;i++) {
if(i==s) continue;
pnt P = jdg(p0,np,p[i],p[(i+1)%3]);
if(P == p0) continue;
k = i;p3 = P;
}
t = 0;
if(cross(p3-p0, p[(k+1)%3] - p[k])<0)t = pi;
double arg1 = cal(arg(p3 - p0), arg(p[(k+1)%3] - p[k])+t, 1.0/tmp);
if(arg1 == 1e10) {
puts(err);
continue;
}
work(p3,arg1);
}
}
}

110
HDOJ/3713_autoAC.cpp Normal file
View File

@ -0,0 +1,110 @@
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<pair<int, int>, pair<int, int> > Node;
const int MAXN = 8;
int T, mat[2][MAXN][MAXN];
char stepto[MAXN][MAXN][MAXN][MAXN], mo[] = {'D','L','R','U'};
Node s, t, fa[MAXN][MAXN][MAXN][MAXN];
queue<Node> Q;
void ReadMat()
{
for (int i = 1; i <= 6; i++)
for (int j = 1; j <= 6; j++)
{
scanf("%d", &mat[1][i][j]);
if (mat[1][i][j]&(1<<5))
s.second = make_pair(i, j);
if (mat[1][i][j]&(1<<6))
t.second = make_pair(i, j);
}
}
void PrintAns(Node v)
{
if (stepto[v.first.first][v.first.second][v.second.first][v.second.second] == 'X')
return;
PrintAns(fa[v.first.first][v.first.second][v.second.first][v.second.second]);
printf("%c", stepto[v.first.first][v.first.second][v.second.first][v.second.second]);
}
int main()
{
scanf("%d", &T);
ReadMat();
while (--T)
{
memset(stepto, 0, sizeof(stepto));
memcpy(mat[0], mat[1], MAXN*MAXN*sizeof(int));
s.first = s.second;
t.first = t.second;
ReadMat();
while (!Q.empty()) Q.pop();
bool flag = 0;
Q.push(s);
stepto[s.first.first][s.first.second][s.second.first][s.second.second] = 'X';
while (!Q.empty())
{
Node u = Q.front(); Q.pop();
if (u == t)
{
flag = 1;
break;
}
for (int i = 0; i < 4; i++)
{
Node v = u;
if (i == 0)
{
if (!(mat[0][u.first.first][u.first.second]&(1<<1)))
v.first.first++;
if (!(mat[1][u.second.first][u.second.second]&(1<<1)))
v.second.first++;
}
else if (i == 1)
{
if (!(mat[0][u.first.first][u.first.second]&(1<<0)))
v.first.second--;
if (!(mat[1][u.second.first][u.second.second]&(1<<0)))
v.second.second--;
}
else if (i == 2)
{
if (!(mat[0][u.first.first][u.first.second]&(1<<2)))
v.first.second++;
if (!(mat[1][u.second.first][u.second.second]&(1<<2)))
v.second.second++;
}
else
{
if (!(mat[0][u.first.first][u.first.second]&(1<<3)))
v.first.first--;
if (!(mat[1][u.second.first][u.second.second]&(1<<3)))
v.second.first--;
}
if (v.first.first < 1 || v.first.first > 6)
continue;
if (v.first.second < 1 || v.first.second > 6)
continue;
if (v.second.first < 1 || v.second.first > 6)
continue;
if (v.second.second < 1 || v.second.second > 6)
continue;
if (!(mat[0][v.first.first][v.first.second]&(1<<4)) || !(mat[1][v.second.first][v.second.second]&(1<<4)))
continue;
if (!stepto[v.first.first][v.first.second][v.second.first][v.second.second])
{
Q.push(v);
stepto[v.first.first][v.first.second][v.second.first][v.second.second] = mo[i];
fa[v.first.first][v.first.second][v.second.first][v.second.second] = u;
}
}
}
if (flag)
PrintAns(t);
else
printf("-1");
printf("\n");
}
return 0;
}

50
HDOJ/3714_autoAC.cpp Normal file
View File

@ -0,0 +1,50 @@
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"math.h"
#define e 1e-9
int n;
int a[10011],b[10011],c[10011];
double MAX(double q,double p)
{
return q>p?q:p;
}
double cal(double x)
{
int i;
double max=-111111111;
for(i=0;i<n;i++) max=MAX(max,a[i]*x*x+b[i]*x+c[i]);
return max;
}
double solve()
{
double left,right,mid,midmid;
double mid_cal,midmid_cal;
left=0;
right=1000;
while(right-left>e)
{
mid=(left+right)/2;
midmid=(mid+right)/2;
mid_cal=cal(mid);
midmid_cal=cal(midmid);
if(mid_cal>midmid_cal) left=mid;
else right=midmid;
}
return cal(right);
}
int main()
{
int T;
int i;
double ans;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
ans=solve();
printf("%.4lf\n",ans);
}
return 0;
}

147
HDOJ/3715_autoAC.cpp Normal file
View File

@ -0,0 +1,147 @@
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
#define print(x) cout<<x<<endl
#define input(x) cin>>x
#define N 512
#define M 40000
#define SIZE 10240
struct node
{
int val,next;
node(){}
node(int ival,int inext)
{
val=ival;next=inext;
}
};
int n,m;
int a[SIZE],b[SIZE],c[SIZE];
int head[SIZE];
node g[M];
int ind;
char instack[SIZE];
stack<int> st;
int dfn[SIZE],scc[SIZE],num[SIZE],low[SIZE];
int sccnr,nr;
void init()
{
ind=0;
memset(head,-1,sizeof(head));
memset(instack,0,sizeof(instack));
memset(scc,0,sizeof(scc));
memset(num,0,sizeof(num));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
st=stack<int>();
nr=1;sccnr=0;
}
void tarjan(int pos)
{
low[pos]=dfn[pos]=nr++;
st.push(pos);
instack[pos]=1;
for(int i=head[pos];i!=-1;i=g[i].next)
{
int j=g[i].val;
if(!dfn[j])
{
tarjan(j);
low[pos]=min(low[pos],low[j]);
}
else if(instack[j])
{
low[pos]=min(low[pos],dfn[j]);
}
}
if(dfn[pos]==low[pos])
{
sccnr++;
while(1)
{
int t=st.top();
instack[t]=0;
st.pop();
scc[t]=sccnr;
num[sccnr]++;
if(t==pos) break;
}
}
}
bool zSat()
{
for(int i=0;i<n*2;i++)
{
if(!dfn[i]) tarjan(i);
}
for(int i=0;i<n;i++)
{
if(scc[i]==scc[i+n])
{
return false;
}
}
return true;
}
void addEdge(int a,int b)
{
g[ind]=node(b,head[a]);
head[a]=ind++;
}
void makeG(int x)
{
init();
for(int i=0;i<x;i++)
{
int p=a[i],q=b[i];
if(c[i]==0)
{
addEdge(p,q+n);
addEdge(q,p+n);
}
else if(c[i]==1)
{
addEdge(p,q);
addEdge(q,p);
addEdge(p+n,q+n);
addEdge(q+n,p+n);
}
else if(c[i]==2)
{
addEdge(p+n,q);
addEdge(q+n,p);
}
}
}
int slove()
{
int l=0,r=m;
while(l<=r)
{
int mid=(l+r)>>1;
makeG(mid);
if(zSat()) l=mid+1;
else r=mid-1;
}
return r;
}
int main()
{
int T;
input(T);
while(T--)
{
input(n>>m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",a+i,b+i,c+i);
}
print(slove());
}
return 0;
}

68
HDOJ/3716_autoAC.cpp Normal file
View File

@ -0,0 +1,68 @@
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <climits>
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <deque>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxa = 20;
const int maxc = 40;
const int maxn = 60;
double dp[2][maxn][3][maxa][maxc];
double b[2][3], d[2][3];
inline double P(int i, int j, int n)
{
return max(0.0, min(1.0, b[i][j] - n * d[i][j]));
}
double f(int id, int n, int m, int a, int c)
{
double &ret = dp[id][n][m][a][c];
if (ret >= 0) return ret;
if (a == 0 && c == 0) return ret = 0;
int n0 = n, a0 = a;
if (m == 0) n++;
if (m == 2) a++;
m = (m + 1) % 3;
ret = 0;
if (a0 > 0)
{
ret = max(ret, P(id, 0, n0) * (1.0 - f(1-id, n, m, a-1, c)));
ret = max(ret, P(id, 1, n0) * (1.0 - f(1-id, n, m, a-1, c+1)));
}
if (c > 0)
{
ret = max(ret, P(id, 2, n0) * (1.0 - f(1-id, n, m, a, c-1)));
}
return ret;
}
int main()
{
int T, n;
scanf("%d", &T);
while (T--)
{
for (int i=0;i<2;i++)
for (int n=0;n<maxn;n++)
for (int m=0;m<3;m++)
for (int a=0;a<maxa;a++)
for (int c=0;c<maxc;c++)
dp[i][n][m][a][c] = -1;
scanf("%d", &n);
for (int i=0;i<2;i++)
for (int j=0;j<3;j++)
scanf("%lf%lf", &b[i][j], &d[i][j]);
printf("%.4lf\n", f(0, n, 0, n-1, 0));
}
return 0;
}

51
HDOJ/3717_autoAC.cpp Normal file
View File

@ -0,0 +1,51 @@
#include<iostream>
#define maxn 50005
#define ll long long
using namespace std;
ll cnt[maxn];
ll num[maxn];
int n,k,t;
bool check(ll x)
{
ll sum_2=0,sum_1=0,sum=0,ans=0;
int j=n-1;
for(int i=n-1;i>=0;i--)
{
if(j>i)
{
while((j-i)*(j-i)>=x)
{
sum_2-=cnt[j]*(j-i-1)*(j-i-1);
sum_1-=cnt[j]*(j-i-1);
sum-=cnt[j];
j--;
}
}
sum_2+=2*sum_1+sum;
sum_1+=sum;
ll y=num[i]-sum*x+sum_2;
if(y<0)cnt[i]=0;
else cnt[i]=y/x+1;
sum+=cnt[i];
ans+=cnt[i];
}
return ans<=k;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=0;i<n;i++)cin>>num[i];
ll l=1,r=1e12;
while(l<r)
{
ll mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}

138
HDOJ/3718_autoAC.cpp Normal file
View File

@ -0,0 +1,138 @@
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define size 10001
#define _clr(x) memset(x,0xff,sizeof(int)*26)
#define inf 1000000000
using namespace std;
int g[26][26];
bool l[26][size];
int KM(int n);
bool HaveLetter[26];
struct loc
{
int a[size];
int len;
loc(){len = 0;}
void add(int val)
{
a[len++] = val;
}
}locate1[26],locate2[26],rem2,rem1;
void InitGraph(int n)
{
int i,j,A;
memset(HaveLetter,0,sizeof(HaveLetter));
for(i=0;i<26;i++)
locate2[i].len = 0;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
g[i][j] = 0;
}
}
for (i=0;i<rem2.len;i++)
{
A = rem2.a[i];
memset(l[A],0,sizeof(l[A]));
}
}
void GreateGraph()
{
int i,j,k,A,B,locate;
int count[26];
for (i=0;i<rem1.len;i++)
{
A = rem1.a[i];
memset(count,0,sizeof(count));
for (j=0;j<locate1[A].len;j++)
{
locate = locate1[A].a[j];
for (k=0;k<rem2.len;k++)
{
B = rem2.a[k];
if(l[B][locate])
{
count[B]++;
g[i][k] = count[B];
}
}
}
}
}
int main()
{
int T,n,k,m,i,letter;
char ch[2];
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&n,&k,&m);
memset(HaveLetter,0,sizeof(HaveLetter));
rem1.len = 0;
for(i=0;i<26;i++)
locate1[i].len = 0;
for(i=0;i<n;i++)
{
scanf("%s",ch);
letter = ch[0]-'A';
if(!HaveLetter[letter])
rem1.add(letter),HaveLetter[letter] = 1;
locate1[letter].add(i);
}
sort(rem1.a,rem1.a+rem1.len);
while (m--)
{
InitGraph(k);
rem2.len=0;
for (i=0;i<n;i++)
{
scanf("%s",ch);
letter = ch[0]-'A';
if(!HaveLetter[letter])
rem2.add(letter),HaveLetter[letter] = 1;
locate2[letter].add(i);
l[letter][i] = 1;
}
sort(rem2.a,rem2.a+rem2.len);
GreateGraph();
printf("%.4lf\n",KM(k)*1.0/n);
}
}
return 0;
}
int KM(int n)
{
int s[26],t[26],l1[26],l2[26],p,q,ret=0,i,j,k;
int match1[26],match2[26];
for (i=0;i<n;i++)
for (l1[i]=-inf,j=0;j<n;j++)
l1[i]=g[i][j]>l1[i]?g[i][j]:l1[i];
for (i=0;i<n;l2[i++]=0);
for (_clr(match1),_clr(match2),i=0;i<n;i++)
{
for (_clr(t),s[p=q=0]=i;p<=q&&match1[i]<0;p++)
for (k=s[p],j=0;j<n&&match1[i]<0;j++)
if (l1[k]+l2[j]==g[k][j]&&t[j]<0)
{
s[++q]=match2[j],t[j]=k;
if (s[q]<0)
for (p=j;p>=0;j=p)
match2[j]=k=t[j],p=match1[k],match1[k]=j;
}
if (match1[i]<0)
{
for (i--,p=inf,k=0;k<=q;k++)
for (j=0;j<n;j++)
if (t[j]<0&&l1[s[k]]+l2[j]-g[s[k]][j]<p)
p=l1[s[k]]+l2[j]-g[s[k]][j];
for (j=0;j<n;l2[j]+=t[j]<0?0:p,j++);
for (k=0;k<=q;l1[s[k++]]-=p);
}
}
for (i=0;i<n;i++)
ret+=g[i][match1[i]];
return ret;
}

267
HDOJ/3719_autoAC.cpp Normal file
View File

@ -0,0 +1,267 @@
#include <cstdio>
#include <cstring>
struct Snooker{
char name[2][30];
int score[2];
int ball_cnt[10];
int red_cnt;
int turn;
int next;
bool over;
bool foul[5];
int penalty;
int ball_first;
bool replaced[10];
bool first;
bool second;
bool last;
char stroke[2000];
char ball_name[10];
}game;
void init1()
{
int i;
game.score[0] = game.score[1] = 0;
game.ball_cnt[1] = 15;
for(i=2;i<=7;i++)
game.ball_cnt[i] = 1;
game.turn = 0;
game.next = 1;
game.last = false;
game.over = false;
}
void init2()
{
game.red_cnt = 0;
memset(game.foul,false,sizeof(game.foul));
game.penalty = 4;
game.ball_first = -1;
memset(game.replaced,false,sizeof(game.replaced));
game.first = game.second = false;
}
int gao1()
{
char ch[][10] = {"None","Red","Yellow","Green","Brown","Blue","Pink","Black","White"};
for(int i=0;i<9;i++)
if(strcmp(game.ball_name,ch[i])==0)
return i;
return -1;
}
void gao2()
{
int state = gao1();
if(state==0)
game.foul[0] = true;
else
{
if(game.next == 1 && state > 1)
game.foul[1] = true;
else if(game.next > 1 && state == 1)
game.foul[1] = true;
else if(game.next <= 7 && game.next != state)
game.foul[1] = true;
}
game.first = true;
game.ball_first = state;
}
void gao3()
{
if(game.second)
{
int state = gao1();
if(game.ball_first != state)
game.foul[2] = true;
if(state > 7)
game.foul[3] = true;
if(state == 1)
game.red_cnt++;
game.replaced[state] = true;
}
}
void gao4()
{
int i;
if(game.last)
{
if(game.foul[0] || game.foul[1] || game.foul[2] || game.foul[3])
{
printf("Foul!\n");
game.score[game.turn^1] += 7;
}
else if(game.second)
game.score[game.turn] += 7;
game.turn^=1;
printf("%d : %d\n",game.score[0],game.score[1]);
if(game.foul[0] || game.foul[1] || game.foul[2] || game.foul[3] || game.second)
{
if(game.score[0] == game.score[1])
{
printf("Tie\nRespot Black\n");
game.next = 7;
}
else
{
if(game.score[0] > game.score[1])
printf("%s wins\n",game.name[0]);
else
printf("%s wins\n",game.name[1]);
game.over = true;
}
}
else
printf("%s's turn\n",game.name[game.turn]);
return;
}
game.ball_cnt[1] -= game.red_cnt;
if(game.foul[0] || game.foul[1] || game.foul[2] || game.foul[3])
{
printf("Foul!\n");
game.turn^=1;
game.score[game.turn] += game.penalty;
printf("%d : %d\n",game.score[0],game.score[1]);
if(game.replaced[2] || game.replaced[3] || game.replaced[4] || game.replaced[5] || game.replaced[6] || game.replaced[7])
{
char ch[][10] = {"","","Yellow","Green","Brown","Blue","Pink","Black"};
printf("Respot");
for(i=2;i<=7;i++)
{
if(game.replaced[i])
printf(" %s",ch[i]);
}
printf("\n");
}
for(i=1;i<=7;i++)
{
if(game.ball_cnt[i] > 0)
{
game.next = i;
break;
}
}
if(!game.foul[3])
printf("%s's turn\n",game.name[game.turn]);
else
printf("%s's turn, in-hand\n",game.name[game.turn]);
}
else
{
if(game.next == 1)
game.score[game.turn] += game.red_cnt;
else if(game.second)
game.score[game.turn] += game.ball_first;
printf("%d : %d\n",game.score[0],game.score[1]);
if(game.next == 8 && game.second)
{
char ch[][10] = {"","","Yellow","Green","Brown","Blue","Pink","Black"};
printf("Respot");
for(i=2;i<=7;i++)
{
if(game.replaced[i])
printf(" %s",ch[i]);
}
printf("\n");
}
else
{
if(game.next > 1 && game.second)
{
game.ball_cnt[game.next]--;
if(game.ball_cnt[6] == 0)
game.last = true;
}
}
if(game.red_cnt > 0)
game.next = 8;
else
{
for(i=1;i<=7;i++)
{
if(game.ball_cnt[i] > 0)
{
game.next = i;
break;
}
}
}
if(!game.second)
{
game.turn^=1;
printf("%s's turn\n",game.name[game.turn]);
}
}
}
int Max(int a,int b)
{
if(a > b)
return a;
return b;
}
int main()
{
int t,ca,len,i,fi;
scanf("%d",&t);
for(ca=1;ca<=t;ca++)
{
if(ca>1)
printf("\n");
printf("Frame %d\n",ca);
init1();
scanf(" %s %s",game.name[0],game.name[1]);
getchar();
printf("%s's turn, in-hand\n",game.name[game.turn]);
while(!game.over)
{
gets(game.stroke);
if(strcmp(game.stroke,"Play again")==0)
{
game.turn^=1;
if(!game.foul[3])
printf("%s's turn\n",game.name[game.turn]);
else
printf("%s's turn, in-hand\n",game.name[game.turn]);
continue;
}
if(strcmp(game.stroke,game.name[0])==0)
{
game.turn=0;
printf("%s's turn, in-hand\n",game.name[game.turn]);
continue;
}
if(strcmp(game.stroke,game.name[1])==0)
{
game.turn=1;
printf("%s's turn, in-hand\n",game.name[game.turn]);
continue;
}
len = strlen(game.stroke);
init2();
for(i=fi=0;i<len;i++)
{
if(game.stroke[i] == ' ' || i + 1 == len)
{
if(fi == 0)
continue;
if(i + 1 == len)
game.ball_name[fi++] = game.stroke[i];
if(gao1()<8)
game.penalty = Max(game.penalty,gao1());
if(!game.first)
gao2();
else
game.second = true;
gao3();
fi = 0;
memset(game.ball_name,'\0',sizeof(game.ball_name));
}
else
{
game.ball_name[fi++] = game.stroke[i];
}
}
if(game.next<8)
game.penalty = Max(game.penalty,game.next);
gao4();
}
}
return 0;
}

81
HDOJ/3720_autoAC.cpp Normal file
View File

@ -0,0 +1,81 @@
#include<cstdio>
#include<cstring>
#include<map>
#include<string>
using namespace std;
#define inf 100000000
char s[35],ps[35];
map<string,int> mp;
const int limit[5]={0,1,4,4,2};
int v[25],g[25][25],id[25],cnt[5],t[12],ans;
int gao(char x[])
{
if (x[0]=='g') return 1;
if (x[0]=='d') return 2;
if (x[0]=='m') return 3;
return 4;
}
void init()
{
int m,x;
mp.clear();
memset(g,0,sizeof(g));
for (int i=1;i<=23;++i)
{
mp[s]=i;
id[i]=gao(ps);
if (i<23) scanf("%s%d%s",s,&v[i+1],ps);
}
scanf("%d",&m);
for (int i=1;i<=m;++i)
{
scanf("%s%s%d",s,ps,&x);
g[mp[s]][mp[ps]]=x;
g[mp[ps]][mp[s]]=x;
}
}
void updata()
{
int temp=0;
for (int i=1;i<=11;++i)
temp+=v[t[i]];
for (int i=1;i<=11;++i)
for (int j=i+1;j<=11;++j)
temp+=g[t[i]][t[j]];
if (temp>ans) ans=temp;
}
void dfs(int x,int y)
{
if (y==11)
{
updata();
return;
}
if (x>23) return;
for (int i=0;i<=1;++i)
{
cnt[id[x]]+=i;
if (cnt[id[x]]<=limit[id[x]])
{ if (i) t[y+1]=x;
dfs(x+1,y+i);
}
cnt[id[x]]-=i;
}
}
void solve()
{
memset(cnt,0,sizeof(cnt));
ans=-inf;
dfs(1,0);
if (ans==-inf) printf("impossible\n");
else printf("%d\n",ans);
}
int main()
{
while (scanf("%s%d%s",s,&v[1],ps)!=EOF)
{
init();
solve();
}
return 0;
}

100
HDOJ/3721_autoAC.cpp Normal file
View File

@ -0,0 +1,100 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>
#include <sstream>
using namespace std;
const int maxn = 2505;
struct Graph {
int hed[maxn], pnt[maxn*2], val[maxn*2], nxt[maxn*2], cnt;
void init(int n) {
cnt = 0;
memset(hed, -1, 4 * n);
}
void addedge(int x, int y, int v) {
pnt[cnt] = y; val[cnt] = v; nxt[cnt] = hed[x]; hed[x] = cnt++;
pnt[cnt] = x; val[cnt] = v; nxt[cnt] = hed[y]; hed[y] = cnt++;
}
} g;
queue<int> Q;
int n;
int banx, bany;
int par[maxn], dis[maxn];
int xx, yy;
int bfs(int x) {
int ret = x;
dis[x] = 0;
Q.push(x);
while (!Q.empty()) {
int a = Q.front();
Q.pop();
for (int p = g.hed[a]; p != -1; p = g.nxt[p]) {
int b = g.pnt[p];
if (dis[b] != -1) continue;
if (a == banx && b == bany || a == bany && b == banx) continue;
par[b] = a;
dis[b] = dis[a] + g.val[p];
Q.push(b);
if (dis[b] > dis[ret]) ret = b;
}
}
return ret;
}
void FindRoad(int x) {
memset(par, -1, 4 * n);
memset(dis, -1, 4 * n);
yy = bfs(x);
memset(par, -1, 4 * n);
memset(dis, -1, 4 * n);
xx = bfs(yy);
}
int ans;
vector<int> v, d;
void Solve() {
int t, disx, disy, disedge, dxx, dyy;
banx = bany = -1;
FindRoad(0);
v.clear(); d.clear();
t = xx;
while (true) {
v.push_back(t);
t = par[t];
if (t == -1) break;
d.push_back(dis[v.back()] - dis[t]);
}
ans = dis[xx];
for (int i = 1; i < v.size(); i++) {
banx = v[i-1]; bany = v[i];
disedge = d[i-1];
FindRoad(banx);
dxx = disx = dis[xx];
for (t = xx; t != -1; t = par[t])
disx = min(disx, max(dis[xx] - dis[t], dis[t]));
FindRoad(bany);
dyy = disy = dis[xx];
for (t = xx; t != -1; t = par[t])
disy = min(disy, max(dis[xx] - dis[t], dis[t]));
ans = min(ans, max(max(disx + disy + disedge, dxx), dyy));
}
}
int main() {
int t, x, y, v, i, cas = 1;
for (scanf("%d", &t); t--; ) {
scanf("%d", &n);
g.init(n);
for (i = 1; i < n; i++) {
scanf("%d %d %d", &x, &y, &v);
g.addedge(x, y, v);
}
Solve();
printf("Case %d: %d\n", cas++, ans);
}
return 0;
}

110
HDOJ/3722_autoAC.cpp Normal file
View File

@ -0,0 +1,110 @@
#include<iostream>
#include<string.h>
using namespace std;
#define MAX 201
#define MAXN 0xffffff
int map[MAX][MAX],link[MAX],dx[MAX],dy[MAX];
bool visx[MAX],visy[MAX];
int n,lack;
char A[201][10001];
bool DFS(int v)
{
visx[v]=true;
for(int i=1;i<=n;i++)
{
if(visy[i])
continue;
int t=dx[v]+dy[i]-map[v][i];
if(!t)
{
visy[i]=true;
if(link[i]==-1||DFS(link[i]))
{
link[i]=v;
return true;
}
}
else
{
if(t<lack)
lack=t;
}
}
return false;
}
void KM()
{
int i,j;
memset(dx,0,sizeof(dx));
memset(dy,0,sizeof(dy));
memset(link,-1,sizeof(link));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(map[i][j]>dx[i])
dx[i]=map[i][j];
}
for(i=1;i<=n;i++)
{
while(true)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
lack=MAXN;
if(DFS(i))
break;
for(j=1;j<=n;j++)
{
if(visx[j])
dx[j]-=lack;
if(visy[j])
dy[j]+=lack;
}
}
}
int ans=0;
for(i=1;i<=n;i++)
ans+=map[link[i]][i];
cout<<ans<<endl;
}
void Q()
{
int i,j,p,q;
for(i=1;i<=n;i++)
{
int len1=strlen(A[i]);
for(j=1;j<=n;j++)
{
if(i==j)
map[i][j]=0;
else
{
int len2=strlen(A[j]);
q=0;
p=len2-1;
while(q<len1&&p>=0&&A[i][q]==A[j][p])
{
q++;p--;
}
map[i][j]=q;
}
}
}
}
int main()
{
while(cin>>n)
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=0;
}
for(i=1;i<=n;i++)
scanf("%s",A[i]);
Q();
KM();
}
return 0;
}

114
HDOJ/3724_autoAC.cpp Normal file
View File

@ -0,0 +1,114 @@
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct dictree{
int num;
dictree *child[30];
};
dictree *root;
int ans;
struct node
{
double val;
int iid;
}p[8];
void insert(char *s){
int len,i,j;
dictree *current,*newnode;
len=strlen(s);
current=root;
for(i=0;i<len;i++){
if(current->child[s[i]-'a']!=0){
current=current->child[s[i]-'a'];
current->num++;
}
else{
newnode=(struct dictree *)malloc(sizeof(struct dictree));
for(j=0;j<=26;j++){
newnode->child[j]=NULL;
}
newnode->num=1;
current->child[s[i]-'a']=newnode;
current=current->child[s[i]-'a'];
}
}
return;
}
void search(char *s){
dictree *current;
int i,j,len;
current=root;
len=strlen(s);
for(i=0;i<len;i++){
if(current->child[s[i]-'a']!=0){
current=current->child[s[i]-'a'];
}
else{
return;
}
}
ans+=current->num;
}
int cmp(node a,node b)
{
if(a.val==b.val)return a.iid<b.iid;
return a.val<b.val;
}
int pow(int x){
int ans,i;
ans=1;
for(i=1;i<=x;i++)ans*=2;
return ans;
}
int main()
{
double key=105.0/95;
int n,m,i,j,asc;
char s[120],s1[120];
while(scanf("%d%d",&n,&m)!=EOF){
root=(struct dictree *)malloc(sizeof(struct dictree));
for(i=0;i<=26;i++)root->child[i]=0;
root->num=0;
for(i=1;i<=n;i++){
scanf("%s",s);
insert(s);
}
ans=0;
int k,t;
for(i=1;i<=m;i++)
{
scanf("%d",&k);
for(j=0;j<k;j++)
{
int kk=0;
for(t=0;t<8;t++)
{
scanf("%lf",&p[t].val);
p[t].iid=7-t;
}
int pp,qq;node tem;
for(pp=0;pp<7;pp++)
for(qq=pp+1;qq<8;qq++)
if(p[pp].val>p[qq].val){
tem=p[pp];
p[pp]=p[qq];
p[qq]=tem;
}
int tto=1;
while(p[tto].val/p[tto-1].val<=key)tto++;
asc=0;
for(t=tto;t<8;t++){
asc+=pow(p[t].iid);
}
s1[j]=asc;
}
s1[k]='\0';
search(s1);
}
printf("%d\n",ans);
}
return 0;
}

112
HDOJ/3725_autoAC.cpp Normal file
View File

@ -0,0 +1,112 @@
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<string>
using namespace std;
const int N=30000+10;
typedef long long LL;
struct Point{
LL x,y;
Point (LL a=0,LL b=0):x(a),y(b){}
Point operator - (const Point &p)const{
return Point(x - p.x, y - p.y);
}
};
LL sum[N],Ti[N],ti;
int n,M,r,anger[N];
typedef Point Vector;
LL Cross(const Vector &u,const Vector &v){
return u.x*v.y - u.y*v.x;
}
struct dequeue{
Point q[N];
int head,tail;
void init(){
head = 1; tail = 0;
}
void push(const Point &u){
while (head < tail && Cross(q[tail] - q[tail-1],u - q[tail-1]) <= 0)
tail--;
q[++tail] = u;
}
void pop(int k,int i,int w){
while (head <= tail && anger[i] - anger[q[head].x] > w) head++;
while (head < tail && -k*q[head].x + q[head].y >= -k*q[head+1].x + q[head+1].y) head++;
}
}H;
struct vegetable{
int vi,ai;
LL di;
vegetable(int v=0,int a=0,LL d=0):vi(v),ai(a),di(d){}
bool operator < (const vegetable &p)const{
return vi>p.vi;
}
void input(){
scanf("%d%d%I64d",&vi,&ai,&di);
}
void output(){
cout<< vi <<" "<< ai <<" "<< di << endl;
}
}vg[N];
void init(){
sort(vg+1,vg+n+1);
anger[0] = sum[0] = Ti[0] = 0;
for (int i=1;i<=n;i++) {
sum[i]=sum[i-1]+vg[i].di;
Ti[i]=Ti[i-1]+i*vg[i].di;
anger[i] = anger[i-1] + vg[i].ai;
}
}
LL dp[11][N];
int check(int m){
for (int i=0;i<=n;i++){
if (anger[i] <= m) dp[0][i]=Ti[i];
else dp[0][i] = Ti[i]+ti ;
}
for (int j=1;j<=M;j++){
H.init();
H.push(Point(0,(j-1)*r));
for (int i=1;i<=n;i++){
H.pop(sum[i],i,m);
if (H.head<=H.tail)
dp[j][i] = -sum[i]*H.q[H.head].x + H.q[H.head].y + Ti[i] + r;
else dp[j][i] = ti + 100;
if (dp[j-1][i] < ti) H.push(Point(i,sum[i]*i + dp[j-1][i] - Ti[i]));
}
}
LL ret = dp[0][n];
for (int i=1; i<=M;i++){
if(dp[i][n] < ret) ret = dp[i][n];
}
if (ret > ti) return 0;
return 1;
}
void solve(int l,int r){
init();
int ret=-1;
while (r>=l){
int m=(l+r)>>1;
if (check(m)){
ret=m; r=m-1;
}else l=m+1;
}
if (ret == -1) printf("I have no idea\n");
else printf("%d\n",ret);
}
int main(){
int T; scanf("%d",&T);
while (T--){
scanf("%d%d%d%I64d",&n,&M,&r,&ti);
int allai = 0;
for (int i=1;i<=n;i++){
vg[i].input();
allai += vg[i].ai;
}
solve(1,allai);
}
return 0;
}

240
HDOJ/3726_autoAC.cpp Normal file
View File

@ -0,0 +1,240 @@
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define Key_value ch[ch[root][1]][0]
const int MAXN = 20010;
int pre[MAXN],ch[MAXN][2],key[MAXN],size[MAXN];
int root;
void NewNode(int &r,int father,int loc,int k)
{
r = loc;
pre[r] = father;
ch[r][0] = ch[r][1] = 0;
key[r] = k;
size[r] = 1;
}
void push_up(int r)
{
size[r] = size[ch[r][0]] + size[ch[r][1]] + 1;
}
void Init()
{
root = 0;
ch[root][0] = ch[root][1] = key[root] = size[root] = 0;
pre[root] = 0;
}
void Rotate(int x,int kind)
{
int y = pre[x];
ch[y][!kind] = ch[x][kind];
pre[ch[x][kind]] = y;
if(pre[y])
ch[pre[y]][ch[pre[y]][1]==y] = x;
pre[x] = pre[y];
ch[x][kind] = y;
pre[y] = x;
push_up(y);
}
void Splay(int r,int goal)
{
while(pre[r] != goal)
{
if(pre[pre[r]] == goal)
Rotate(r,ch[pre[r]][0] == r);
else
{
int y = pre[r];
int kind = ch[pre[y]][0]==y;
if(ch[y][kind] == r)
{
Rotate(r,!kind);
Rotate(r,kind);
}
else
{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
push_up(r);
if(goal == 0) root = r;
}
int Get_kth(int r,int k)
{
int t = size[ch[r][0]] + 1;
if(t == k)return r;
if(t > k)return Get_kth(ch[r][0],k);
else return Get_kth(ch[r][1],k-t);
}
void Insert(int loc,int k)
{
int r = root;
if(r == 0)
{
NewNode(root,0,loc,k);
return;
}
while(ch[r][key[r]<k])
r = ch[r][key[r]<k];
NewNode(ch[r][key[r]<k],r,loc,k);
Splay(ch[r][key[r]<k],0);
}
struct Edge
{
int u,v;
}edge[60010];
bool used[60010];
int to[400010];
int ne[400010];
int head[20010];
int tot;
void add_value(int x,int v)
{
to[tot] = v;
ne[tot] = head[x];
head[x] = tot++;
}
struct Query
{
char op[5];
int x,y;
}query[400010];
int q_num;
int F[20010];
int find(int x)
{
if(F[x] == -1)return x;
else return F[x] = find(F[x]);
}
void erase(int r)
{
if(!r)return;
erase(ch[r][0]);
erase(ch[r][1]);
Insert(r,to[head[r]]);
}
int Get_Min(int r)
{
while(ch[r][0])
{
r = ch[r][0];
}
return r;
}
void Delete()
{
if(ch[root][0] == 0 || ch[root][1] == 0)
{
root = ch[root][0] + ch[root][1];
pre[root] = 0;
return;
}
int k = Get_Min(ch[root][1]);
Splay(k,root);
Key_value = ch[root][0];
root = ch[root][1];
pre[ch[root][0]] = root;
pre[root] = 0;
push_up(root);
}
void bing(int x,int y)
{
int t1 = find(x),t2 = find(y);
if(t1 == t2)return;
F[t1] = t2;
Splay(t1,0);
Splay(t2,0);
if(size[t1] > size[t2])
swap(t1,t2);
root = t2;
erase(t1);
}
int main()
{
int N,M;
int iCase = 0;
while(scanf("%d%d",&N,&M) == 2 )
{
if(N == 0 && M == 0) break;
iCase++;
memset(head,-1,sizeof(head));
tot = 0;
int v;
for(int i = 1;i <= N;i++)
{
scanf("%d",&v);
add_value(i,v);
}
for(int i = 1;i <= M;i++)
{
scanf("%d%d",&edge[i].u,&edge[i].v);
}
q_num = 0;
memset(used,false,sizeof(used));
while(scanf("%s",&query[q_num].op) == 1)
{
if(query[q_num].op[0] == 'E')break;
if(query[q_num].op[0] == 'D')
{
scanf("%d",&query[q_num].x);
used[query[q_num].x] = true;
}
else if(query[q_num].op[0] == 'Q')
scanf("%d%d",&query[q_num].x,&query[q_num].y);
else if(query[q_num].op[0] == 'C')
{
scanf("%d%d",&query[q_num].x,&query[q_num].y);
add_value(query[q_num].x,query[q_num].y);
}
q_num++;
}
memset(F,-1,sizeof(F));
for(int i = 1;i <= N;i++)
NewNode(root,0,i,to[head[i]]);
for(int i = 1;i <= M;i++)
if(!used[i])
bing(edge[i].u,edge[i].v);
double ans = 0;
int cnt = 0;
for(int i = q_num-1; i>= 0 ;i--)
{
if(query[i].op[0] == 'Q')
{
Splay(query[i].x,0);
if(size[root] < query[i].y || query[i].y <= 0)
{
cnt++;
continue;
}
ans += key[Get_kth(root,size[root] - query[i].y + 1)];
cnt++;
}
else if(query[i].op[0] == 'D')
{
int tmp = query[i].x;
bing(edge[tmp].u,edge[tmp].v);
}
else if(query[i].op[0] == 'C')
{
Splay(query[i].x,0);
Delete();
head[query[i].x] = ne[head[query[i].x]];
Insert(query[i].x,to[head[query[i].x]]);
}
}
if(cnt == 0)cnt = 1;
printf("Case %d: %.6lf\n",iCase,ans/cnt);
}
return 0;
}

124
HDOJ/3727_autoAC.cpp Normal file
View File

@ -0,0 +1,124 @@
# include <cstdio>
# include <cstring>
# include <map>
using namespace std;
# define N 100005
int arr[20][N];
struct node
{
int s,e,layer;
int c;
}st[4*N];
int q[500000][4],c;
int remap[N],position[N];
map<int,int> refer;
void init(int s,int e,int layer,int pos=1)
{
st[pos].s=s;st[pos].e=e;
st[pos].layer=layer;
st[pos].c=st[pos].s;
if(s!=e) init(s,(s+e)/2,layer+1,pos<<1),init((s+e)/2+1,e,layer+1,(pos<<1)+1);
}
void insert(int value,int pos=1)
{
if(st[pos].s==st[pos].e)
arr[st[pos].layer][st[pos].c++]=value;
else
{
if(value<=(st[pos].s+st[pos].e)/2)
{
arr[st[pos].layer][st[pos].c]=(st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1])+1;
st[pos].c++;
insert(value,pos<<1);
}
else
{
arr[st[pos].layer][st[pos].c]=(st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1]);
st[pos].c++;
insert(value,(pos<<1)+1);
}
}
}
int q1(int s,int t,int k,int pos=1)
{
if(st[pos].s==st[pos].e)
return remap[arr[st[pos].layer][st[pos].s]];
else
{
if(arr[st[pos].layer][t]-(s==st[pos].s?0:arr[st[pos].layer][s-1])>=k)//left
return q1(st[pos].s+(s==st[pos].s?0:arr[st[pos].layer][s-1]),st[pos].s+arr[st[pos].layer][t]-1,k,pos<<1);
else//right
{
k-=arr[st[pos].layer][t]-(s==st[pos].s?0:arr[st[pos].layer][s-1]);
return q1((st[pos].s+st[pos].e)/2+1+s-1-st[pos].s+1-(s==st[pos].s?0:arr[st[pos].layer][s-1]),(st[pos].s+st[pos].e)/2+1+t-st[pos].s+1-arr[st[pos].layer][t]-1,k,(pos<<1)+1);
}
}
}
int q2(int s,int pos=1)
{
if(st[pos].s==st[pos].e) return 1;
else if(arr[st[pos].layer][s]-(s==st[pos].s?0:arr[st[pos].layer][s-1]))
return q2(st[pos].s+arr[st[pos].layer][s]-1,pos<<1);
else
return (st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1])+q2((st[pos].s+st[pos].e)/2+1+s-st[pos].s+1-arr[st[pos].layer][s]-1,(pos<<1)+1);
}
int q3(int k,int pos=1)
{
if(st[pos].s==st[pos].e) return remap[arr[st[pos].layer][st[pos].s]];
else if(k<=(st[pos].c==st[pos].s?0:arr[st[pos].layer][st[pos].c-1])) return q3(k,pos<<1);
else return q3(k-(st[pos].s==st[pos].c?0:arr[st[pos].layer][st[pos].c-1]),(pos<<1)+1);
}
int main()
{
int n,test=1;
while(scanf("%d",&n)!=EOF)
{
refer.clear();c=1;
memset(arr,0,sizeof(arr));
for(int i=0;i<n;i++)
{
char tmp[12];
scanf("%s",tmp);
if(*tmp=='I')
q[i][0]=0;
else q[i][0]=tmp[6]-48;
switch(q[i][0])
{
case 0:
scanf("%d",&q[i][1]);
refer[q[i][1]]=0;
break;
case 1:
scanf("%d%d%d",&q[i][1],&q[i][2],&q[i][3]);
break;
default:
scanf("%d",&q[i][1]);
break;
};
}
for(map<int,int>::iterator i=refer.begin();i!=refer.end();i++)
remap[c]=i->first,i->second=c++;
init(1,c-1,0);
long long t[4]={0,0,0,0};
int now=1;
for(int i=0;i<n;i++)
switch(q[i][0])
{
case 0:
insert(refer[q[i][1]]);
position[refer[q[i][1]]]=now++;
break;
case 1:
t[1]+=q1(q[i][1],q[i][2],q[i][3]);
break;
case 2:
t[2]+=q2(position[refer[q[i][1]]]);
break;
case 3:
t[3]+=q3(q[i][1]);
break;
};
printf("Case %d:\n%I64d\n%I64d\n%I64d\n",test++,t[1],t[2],t[3]);
}
return 0;
}

58
HDOJ/3729_autoAC.cpp Normal file
View File

@ -0,0 +1,58 @@
#include<stdio.h>
#include<string.h>
#define N 100005
int mark[N],link[N];
struct node
{
int x,y;
}a[105];
int ss[105];
int n;
int dfs(int t)
{
int i;
for(i=a[t].x;i<=a[t].y;i++)
{
if(mark[i]==-1)
{
mark[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=t;
ss[t]=1;
return 1;
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
memset(link,-1,sizeof(link));
memset(ss,0,sizeof(ss));
int sum;
sum=0;
for(i=n;i>=1;i--)
{
memset(mark,-1,sizeof(mark));
if(dfs(i))
sum++;
}
printf("%d\n",sum);
for(i=1;i<=n-1;i++)
{
if(ss[i]==1)
printf("%d ",i);
}
printf("%d\n",i);
}
return 0;
}

33
HDOJ/3730_autoAC.cpp Normal file
View File

@ -0,0 +1,33 @@
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 1000001
#define ll __int64
struct Node
{
ll a,b;
};
Node no[maxn];
bool cmp(Node x,Node y)
{
return x.a<y.a;
}
int main()
{
ll i,n;
while(scanf("%I64d",&n)!=EOF)
{
for(i=0;i<n;i++)scanf("%I64d",&no[i].a);
for(i=0;i<n;i++)scanf("%I64d",&no[i].b);
sort(no,no+n,cmp);
ll ans=0;
for(i=0;i<n-1;i++)ans+=no[i].a;
if((ans+1)*no[i].b>=no[i].a)ans+=no[i].a;
else ans+=(ans+1)*no[i].b;
printf("%I64d\n",ans);
}
return 0;
}

45
HDOJ/3732_autoAC.cpp Normal file
View File

@ -0,0 +1,45 @@
#include <iostream>
#include <string.h>
using namespace std;
const int maxc = 10005;
int dp[maxc], re[11][11], cost;
void Pack(int v, int c, int k)
{
for (int m = 1; k > 0; m += m)
{
if (m > k)
m = k;
k -= m;
int vv = v * m, cc = c * m;
for (int j = cost; j - cc >= 0; j--)
{
if (dp[j] < dp[j-cc] + vv)
dp[j] = dp[j-cc] + vv;
}
}
}
int main()
{
int n, i, j;
int v, c;
while (scanf("%d %d", &n, &cost) != EOF)
{
memset(dp, 0, (cost + 1) * 4);
memset(re, 0, sizeof(re));
for (i = 0; i < n; i++)
{
scanf("%*c%*s %d %d", &v, &c);
re[v][c]++;
}
for (i = 1; i <= 10; i++)
for (j = 0; j <= 10; j++)
{
if (re[i][j] > 0)
{
Pack(i, j, re[i][j]);
}
}
printf("%d\n", dp[cost]);
}
return 0;
}

53
HDOJ/3734_autoAC.cpp Normal file
View File

@ -0,0 +1,53 @@
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int Mn = 100010;
const int Mod = 1e9 + 7;
int a[Mn], b[Mn], n;
int s[4][Mn];
pair<int, int >c[Mn];
inline int query(int k, int num){
int res(0);
for(;k;k -= k &-k)
res = (res+s[num][k]) %Mod;
return res;
}
inline void update(int k, int val, int num){
for(; k <= n; k += k & -k){
s[num][k] = (s[num][k] + val) % Mod;
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
memset(s, 0, sizeof(s));
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]),b[i] = a[i];
sort(b+1, b+n+1);
for(int i = 1; i <= n; ++i){
a[i] = lower_bound(b+1, b+n+1,a[i]) - b;
c[i] = make_pair(a[i],i);
}
sort(c+1, c+n+1);
long long ans(0);
for(int i= 1; i <= n; ++i){
long long t0 = query(c[i].second, 0);
long long t1 = query(c[i].second, 1);
long long t2 = query(n-c[i].second+1,2);
long long t3 = query(n-c[i].second+1,3);
ans = (ans+(t0-(1+t1) * t1 /2) % Mod *(t2-(1+t3)*t3/2)%Mod) %Mod;
update(c[i].second, c[i].second, 0);
update(c[i].second, 1, 1);
update(n-c[i].second+1, n-c[i].second+1,2);
update(n-c[i].second+1,1,3);
}
printf("%d\n", (int)(ans%Mod+Mod) %Mod);
}
return 0;
}

93
HDOJ/3735_autoAC.cpp Normal file
View File

@ -0,0 +1,93 @@
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#define MOD 1000000003
#define MAXN 2010
using namespace std;
using namespace std;
long long n, m, b[MAXN], e[MAXN] = {0}, zero[MAXN] = {0};
struct poly {
long long a[MAXN];
poly(long long ta[]) {
for (int i = 0; i < 2 * m; i++) a[i] = ta[i];
}
poly operator*(const poly & po) {
poly re(zero);
for (int i = 0; i < m; i++) {
if (po.a[i])
for (int j = 0; j < m; j++) {
re.a[i + j] += a[j] * po.a[i];
re.a[i + j] %= MOD;
}
}
for (int i = 2 * m - 1; i >= m; i--) {
if (re.a[i])
for (int j = 0; j < m; j++) {
re.a[i + j - m] += b[j] * re.a[i];
re.a[i + j - m] %= MOD;
}
a[i] = 0;
}
return re;
}
void left() {
for (int i = m - 1; i >= 0; i--) a[i + 1] = a[i];
a[0] = 0;
for (int j = 0; j < m; j++) {
a[j] += b[j] * a[m];
a[j] %= MOD;
}
a[m] = 0;
}
void square() {
long long ans[MAXN] = {0};
for (int i = 0; i < m; i++) {
if (a[i])
for (int j = 0; j < m; j++) {
ans[i + j] += a[j] * a[i];
ans[i + j] %= MOD;
}
}
for (int i = 2 * m - 1; i >= m; i--) {
if (ans[i])
for (int j = 0; j < m; j++) {
ans[i + j - m] += b[j] * ans[i];
ans[i + j - m] %= MOD;
}
ans[i] = 0;
}
for (int i = 0; i < 2 * m; i++) a[i] = ans[i];
}
poly operator^(long long power) {
poly re(e), tem(e);
if (power <= 0) return re;
tem.left();
while (power) {
if (power & 1) re = re * tem;
power >>= 1;
tem.square();
}
return re;
}
};
long long ai[MAXN];
int main() {
int cc;
cin >> cc;
e[0] = 1;
while (cc--) {
cin >> m >> n;
memset(ai, 0, sizeof (ai));
memset(b, 0, sizeof (b));
for (int i = 0; i < m; i++) scanf(" %I64d", ai + i);
for (int i = 0; i < m; i++) scanf(" %I64d", b + i);
poly tem(b), ta(ai);
tem = tem^n;
long long ans = 0;
for (int i = 0; i < m; i++)
ans = (ans + tem.a[i] * ta.a[i]) % MOD;
cout << ans << endl;
}
}

54
HDOJ/3738_autoAC.cpp Normal file
View File

@ -0,0 +1,54 @@
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define N 100010
int n;
__int64 a[N], x, y, z;
int q[N], ed;
__int64 min(__int64 a,__int64 b )
{
return a<b?a:b;
}
void solve() {
__int64 res = a[0] * x + a[n - 1] * y;
for (int i = 0; i < n; ++i) {
res += a[i] * z;
if(i) {
if (a[i - 1] > a[i])
res += (a[i - 1] - a[i]) * y;
else
res += (a[i] - a[i - 1]) * x;
}
}
ed = 0;
q[ed++] = 0;
for (int i = 1; i < n; ++i) {
if (a[q[ed - 1]] >= a[i]) q[ed++] = i;
else {
while (ed > 1 && a[q[ed - 1]] < a[i]) {
--ed;
__int64 tmp, t = min(a[i], a[q[ed - 1]]) - a[q[ed]];
if ((tmp = (x + y - (i - q[ed - 1] - 1) * z) * t) > 0) {
res -= tmp;
}
}
if (a[q[ed - 1]] <= a[i]) --ed;
q[ed++] = i;
}
}
printf("%I64d\n", res);
}
int main() {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
scanf("%I64d%I64d%I64d", &x, &y, &z);
for (int i = 0; i < n; ++i) {
scanf("%I64d", &a[i]);
}
solve();
}
return 0;
}

110
HDOJ/3739_autoAC.cpp Normal file
View File

@ -0,0 +1,110 @@
#include <stdio.h>
#include <string.h>
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define INF 0x7fffffff
#define MAXN 2010
#define MAXM 600000
int pt[MAXM], head[MAXN], next[MAXM], flow[MAXM], lvl[MAXN], queue[MAXN];
int pos;
int arr[MAXN], stage[MAXN];
int n;
void AddEdge(int a, int b, int c)
{
pt[++pos] = b;
next[pos] = head[a];
head[a] = pos;
flow[pos] = c;
}
void Connect(int a, int b, int c)
{
AddEdge(a, b, c);
AddEdge(b, a, 0);
}
bool bfs(int s, int t)
{
int qs, qe, v, e;
memset (lvl, 0, sizeof lvl);
lvl[s] = 1;
qs = qe = 0;
queue[qe++] = s;
while (qs < qe)
{
v = queue[qs++];
for (e = head[v]; e != -1; e = next[e])
if (flow[e] > 0 && lvl[pt[e]] == 0)
{
lvl[pt[e]] = lvl[v] + 1;
queue[qe++] = pt[e];
}
}
return lvl[t] > 0;
}
int Update(int v, int t, int tmpflow)
{
int tmp, res = 0, e;
if (v == t) return tmpflow;
for (e = head[v]; e != -1; e = next[e])
if (flow[e] > 0 && lvl[pt[e]] == lvl[v] + 1)
{
tmp = Update(pt[e], t, MIN(flow[e], tmpflow));
flow[e] -= tmp; flow[e^1] += tmp;
res += tmp;
tmpflow -= tmp;
if (tmpflow == 0) {break;}
}
lvl[v] = -1;
return res;
}
int dinic(int s, int t)
{
int res = 0;
while (bfs(s, t))
res += Update(s, t, INF);
return res;
}
void GenStage(int n)
{
int i, j, mx = -1;
memset (stage, 0, sizeof stage);
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
if (arr[j] > arr[i])
stage[j] = MAX(stage[j], stage[i] + 1);
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
if (stage[i] + 1 == stage[j] && arr[i] < arr[j])
Connect(2 * i + 1, 2 * j, INF);
for (i = 0; i < n; i++)
{
mx = MAX(mx, stage[i]);
}
for (i = 0; i < n; i++)
{
Connect(2 * i, 2 * i + 1, 1);
if (stage[i] == 0)
Connect(2 * n, 2 * i, INF);
if (stage[i] == mx)
Connect(2 * i + 1, 2 * n + 1, INF);
}
}
void Solve()
{
int i, res;
memset (head, -1, sizeof head);
pos = -1;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", arr + i);
GenStage(n);
res = dinic(2 * n, 2 * n + 1);
printf("%d\n", res);
}
int main()
{
int cas;
scanf("%d", &cas);
while (cas--)
Solve();
return 0;
}

72
HDOJ/3741_autoAC.cpp Normal file
View File

@ -0,0 +1,72 @@
#include "iostream"
using namespace std;
struct node
{
int num,pre;
double weight;
}no[1009];
double rule[1009],dev;
int e,res;
double w[110],up,down;
bool place(int s)
{
int i,j,k = e;
double t;
for (i = 0; i < k;i++)
{
t = no[i].weight + w[s];
if (rule[(int)(t/dev)] == -1 && t <= up)
{
rule[(int)(t/dev)] = t;
no[e].num = s;
no[e].pre = i;
no[e++].weight = t;
if (t >= down)
{
res = e-1;
return true;
}
}
}
return false;
}
int main()
{
int i,j,k,n;
double sum;
no[0].num = -1;
no[0].weight = 0;
rule[0] = 0;
while (scanf("%d",&n) && n)
{
e = 1;
sum = 0;
for (i = 1;i <= n;i++)
{
scanf("%lf",&w[i]);
sum += w[i];
}
down = sum /2.01;
up = sum /1.985;
dev = sum/1000;
for (i = 1;i <= 1000;i++)
{
rule[i] = -1;
}
for (i = 1;i <= n;i++)
{
if(place(i)){
printf("%d",no[res].num);
i = no[res].pre;
while(i > 0)
{
printf(" %d",no[i].num);
i = no[i].pre;
}
printf("\n");
break;
}
}
}
return 0;
}

40
HDOJ/3742_autoAC.cpp Normal file
View File

@ -0,0 +1,40 @@
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 10;
struct Node{
int a, b, val;
}node[maxn];
int parent[maxn];
bool cmp(const Node &a, const Node &b){
return a.val < b.val ;
}
void Init(int num){
for(int i=0; i<num; i++)
parent[i] = i;
}
int main(){
int n, m;
while(cin >>n >>m, n||m){
int ans = 0, i;
for( i=0; i<m; i++){
cin >>node[i].a >>node[i].b >>node[i].val;
}
sort(node, node+m, cmp);
Init(n);
for( i=0; i<m; i++){
if( node[i].a == parent[node[i].a] || node[i].b == parent[node[i].b])
ans = ans > node[i].val ? ans : node[i].val;
parent[ node[i].a ] = -1;
parent[ node[i].b ] = -1;
}
for( i=0; i<n; i++)
if(parent[i] == i)
break;
if(i < n)
cout <<"IMPOSSIBLE" <<endl;
else
cout <<ans <<endl;
}
return 0;
}

56
HDOJ/3743_autoAC.cpp Normal file
View File

@ -0,0 +1,56 @@
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int n;
int C[1000111];
int num[1000111];
struct A
{
int index,num;
}T[1000111];
int cmp(const void *a,const void *b)
{
struct A *c,*d;
c=(struct A *)a;
d=(struct A *)b;
return c->num-d->num;
}
int sum(int k)
{
int t=0;
while(k>0)
{
t+=C[k];
k-=k&(-k);
}
return t;
}
void update(int k,int dir)
{
while(k>0 && k<=n)
{
C[k]+=dir;
k+=k&(-k);
}
}
int main()
{
int i;
__int64 ans;
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++) {scanf("%d",&num[i]);T[i].num=num[i];T[i].index=i;}
T[0].num=-1;
qsort(T,n+1,sizeof(T[0]),cmp);
for(i=1;i<=n;i++) num[T[i].index]=i;
ans=0;
memset(C,0,sizeof(C));
for(i=1;i<=n;i++)
{
update(num[i],1);
ans+=i-sum(num[i]);
}
printf("%I64d\n",ans);
}
return 0;
}

49
HDOJ/3744_autoAC.cpp Normal file
View File

@ -0,0 +1,49 @@
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXN 110
int t , n , m;
int flag;
int x[MAXN] , r[MAXN];
int tmp_x[MAXN] , tmp_r[MAXN];
int search(){
for(int i = 1 ; i < n ; i++){
if(tmp_x[i] > tmp_x[i-1]) return i;
}
return 0;
}
void solve(){
int k;
memset(tmp_ , 0 , sizeof(tmp_x));
memcpy(tmp_ , r , sizeof(r));
sort(tmp_ , tmp_r+n);
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
if(tmp_r[i] == r[j]){
tmp_x[i] = x[j] ; break;
}
}
}
while(k = search()){
for(int i = 0 ; i < k ; i++) tmp_x[i] += 400;
}
if(tmp_x[0] <= m) flag = 1;
}
int main() {
scanf("%d" , &t);
while(t--){
memset(x , 0 , sizeof(x));
memset(r , 0 , sizeof(r));
scanf("%d%d" ,&n , &m);
for(int i = 0 ; i < n ; i++)
scanf("%d%d" , &x[i] , &r[i]);
flag = 0 ; solve();
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}

42
HDOJ/3746_autoAC.cpp Normal file
View File

@ -0,0 +1,42 @@
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100010
char s[N];
int nextval[N];
int len;
void getnext(const char *s)
{
int i = 0, j = -1;
nextval[0] = -1;
while(i != len)
{
if(j == -1 || s[i] == s[j])
nextval[++i] = ++j;
else
j = nextval[j];
}
}
int main()
{
int ncase;
int length, add;
scanf("%d", &ncase);
while(ncase--)
{
scanf("%s", s);
len = strlen(s);
getnext(s);
length = len - nextval[len];
if(len != length && len % length == 0)
printf("0\n");
else
{
add = length - nextval[len] % length;
printf("%d\n",add);
}
}
return 0;
}

33
HDOJ/3747_autoAC.cpp Normal file
View File

@ -0,0 +1,33 @@
#include"stdio.h"
int min(int a,int b)
{
return a>b?b:a;
}
int main()
{
int y1,y2,y3,y4;
int ans;
int i;
int n;
char str1[55],str2[55];
while(scanf("%d",&n)!=-1)
{
scanf("%s%s",str1,str2);
y1=0;
for(i=0;i<n;i++) if(str1[i]!=str2[i]) y1++;
y2=1;
for(i=0;i<n;i++) if(str2[i]=='0') y2++;
y3=1;
for(i=0;i<n;i++)
{
if(str1[i]=='0') str1[i]='1';
else str1[i]='0';
}
for(i=0;i<n;i++) if(str1[i]!=str2[i]) y3++;
y4=2;
for(i=0;i<n;i++) if(str2[i]=='1') y4++;
ans=min(min(min(y1,y2),y3),y4);
printf("%d\n",ans);
}
return 0;
}

114
HDOJ/3748_autoAC.cpp Normal file
View File

@ -0,0 +1,114 @@
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
map<int,int> ha[35];
int vis[35];
int n,v,k;
int flag;
int constraint;
int g[35][35];
struct node
{
int w;
int cons;
}t[35],s[35];
void dfs(int y,int x,int cur)
{
if(y>k) return;
else if(x==constraint) ha[y][cur]=1;
else
{
int tt=0;
if(s[x].cons!=-1)
{
for(int i=0;i<n;i++) if(g[x][i])
{
if(vis[i])
{
tt=1;
break;
}
}
}
if(s[x].cons==-1||!tt)
{
vis[x]=1;
dfs(y+1,x+1,cur+s[x].w);
vis[x]=0;
}
dfs(y,x+1,cur);
}
}
void dfs2(int y,int x,int cur)
{
if(y>k) return;
else if(x==n)
{
if(ha[k-y][v-cur]==1)
{
flag=1;
return;
}
}
else if(!flag)
{
dfs2(y+1,x+1,cur+s[x].w);
dfs2(y,x+1,cur);
}
}
int main()
{
int i,j;
int T;
int m;
int mark[35];
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&n,&m,&k,&v);
for(i=0;i<n;i++)
{
scanf("%d",&t[i].w);
t[i].cons=-1;
s[i].cons=-1;
}
int cnt=0;
memset(mark,-1,sizeof(mark));
memset(g,0,sizeof(g));
for(i=0;i<m;i++)
{
int t1,t2;
int c1,c2;
scanf("%d%d",&t1,&t2);
t1--;
t2--;
if(mark[t1]==-1) mark[t1]=cnt++;
if(mark[t2]==-1) mark[t2]=cnt++;
c1=mark[t1];
c2=mark[t2];
s[c1].cons=c2;
s[c1].w=t[t1].w;
t[t1].cons=t2;
t[t2].cons=t1;
s[c2].cons=c1;
s[c2].w=t[t2].w;
g[c1][c2]=1;
g[c2][c1]=1;
}
if(cnt>n/2) constraint=cnt;
else constraint=n/2+1;
for(i=0;i<n;i++) if(t[i].cons==-1)
{
s[cnt++]=t[i];
}
for(i=0;i<=k;i++)
ha[i].clear();
memset(vis,0,sizeof(vis));
dfs(0,0,0);
flag=0;
dfs2(0,constraint,0);
if(flag) printf("YES\n");
else printf("NO\n");
}
}

163
HDOJ/3749_autoAC.cpp Normal file
View File

@ -0,0 +1,163 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <map>
#include <sstream>
#include <queue>
#include <vector>
#define MAXN 111111
#define MAXM 211111
#define eps 1e-8
#define INF 1000000001
using namespace std;
int e, tmpdfn, top;
int n, m, ind;
int vis[MAXM], head[MAXN], dfn[MAXN], low[MAXN], num[MAXM];
vector<int>g[MAXN];
struct Edge
{
int v, next;
}edge[MAXM];
void add(int u, int v)
{
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
edge[e].v = u;
edge[e].next = head[v];
head[v] = e++;
}
struct Stack
{
int s, e;
Stack(){}
Stack(int a, int b){s = a; e = b;}
}st[MAXM];
void init()
{
e = tmpdfn = ind = 0;
top = -1;
memset(vis, 0, sizeof(vis));
memset(dfn, 0, sizeof(dfn));
memset(head, -1, sizeof(head));
memset(num, 0, sizeof(num));
}
void color(Stack t)
{
ind++;
while(top >= 0)
{
Stack A = st[top--];
g[A.s].push_back(ind);
g[A.e].push_back(ind);
if(A.s == t.s && A.e == t.e) break;
}
}
void dfs(int u, int fa)
{
dfn[u] = low[u] = ++tmpdfn;
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(vis[i] == 0)
{
vis[i] = vis[i ^ 1] = 1;
Stack tmp(u, v);
st[++top] = tmp;
if(!dfn[v])
{
dfs(v, u);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u]) color(tmp);
}
else if(v != fa) low[u] = min(low[u], dfn[v]);
}
}
}
int Q;
int uu[MAXM], vv[MAXM];
int fa[MAXN];
int find(int x)
{
if(fa[x] == x) return x;
int t = find(fa[x]);
fa[x] = t;
return t;
}
void join(int u, int v)
{
int fx = find(u);
int fy = find(v);
if(fx != fy) fa[fx] = fy;
}
int main()
{
int u, v;
int cas = 0;
while(scanf("%d%d%d", &n, &m, &Q) != EOF)
{
if(n == 0 && m == 0 && Q == 0) break;
init();
for(int i = 1; i <= n; i++) fa[i] = i;
for(int i = 0; i < m; i++)
{
scanf("%d%d", &uu[i], &vv[i]);
uu[i]++; vv[i]++;
add(uu[i], vv[i]);
join(uu[i], vv[i]);
}
for(int i = 1; i <= n; i++) g[i].clear();
for(int i = 1; i <= n; i++)
{
if(!dfn[i]) dfs(i, 0);
}
for(int i = 1; i <= n; i++) sort(g[i].begin(), g[i].end());
for(int i = 1; i <= n; i++) unique(g[i].begin(), g[i].end());
for(int i = 0; i < m; i++)
{
int sz1 = g[uu[i]].size();
int sz2 = g[vv[i]].size();
int k1 = 0, k2 = 0;
while(k1 < sz1 && k2 < sz2)
{
if(g[uu[i]][k1] > g[vv[i]][k2]) k2++;
else if(g[uu[i]][k1] < g[vv[i]][k2]) k1++;
else if(g[uu[i]][k1] == g[vv[i]][k2])
{
int tmp = g[uu[i]][k1];
num[tmp]++;
break;
}
}
}
printf("Case %d:\n", ++cas);
for(int i = 0; i < Q; i++)
{
scanf("%d%d", &u, &v);
u++; v++;
int sz1 = g[u].size();
int sz2 = g[v].size();
int k1 = 0, k2 = 0;
int tmp = -1;
while(k1 < sz1 && k2 < sz2)
{
if(g[u][k1] > g[v][k2]) k2++;
else if(g[u][k1] < g[v][k2]) k1++;
else if(g[u][k1] == g[v][k2])
{
tmp = g[u][k1];
break;
}
}
if(find(u) != find(v)) puts("zero");
else if(tmp == -1) puts("one");
else if(num[tmp] == 1) puts("one");
else puts("two or more");
}
}
return 0;
}

23
HDOJ/3750_autoAC.cpp Normal file
View File

@ -0,0 +1,23 @@
#include<iostream>
using namespace std;
#include<cstring>
#include<stdio.h>
double a[100005];
int main()
{
int i,j,k;
int N;
a[0]=0;
a[1]=1;
a[2]=3.0;
for(i=3;i<100001;i++)
{
k=(1+i)/2;
a[i]=a[k-1]+k-1+a[i-k]+i-k+1;
}
while(cin>>N)
{
printf("%.2lf\n",a[N]/N);
}
return 0;
}

17
HDOJ/3752_autoAC.cpp Normal file
View File

@ -0,0 +1,17 @@
#include<iostream>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
while(n--)
{
int a, b;
scanf("%d%d", &a, &b);
if(a % 2 == 1|| b > a / 2)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}

40
HDOJ/3753_autoAC.cpp Normal file
View File

@ -0,0 +1,40 @@
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <cmath>
#include <sstream>
#include <queue>
#include <set>
#include <vector>
using namespace std;
string tmp,str[1111][190];
int len[190],T,num[1111];
int main(){
scanf("%d",&T);
while(T --){
memset(len,0,sizeof(len));
memset(num,0,sizeof(num));
int nNum = 0;
while(getline(cin,tmp) && tmp != "@"){
if(tmp == "") continue;
istringstream strin(tmp);
int j = 0;
nNum ++;
while(strin >> tmp){
str[nNum][++ j] = tmp;
if(tmp.size() > len[j]) len[j]= tmp.size();
}
num[nNum] = j;
}
cout << setiosflags(ios :: left);
for(int i = 1; i <= nNum; i ++){
for(int j = 1; j < num[i]; j ++){
cout << setw(len[j] + 1) << str[i][j];
}
cout << str[i][num[i]] << endl;
}
}
return 0;
}

65
HDOJ/3754_autoAC.cpp Normal file
View File

@ -0,0 +1,65 @@
#include <cstdio>
typedef unsigned long long ullong;
int eval(int f[], int x, ullong k){
bool vst[10];
for(int i = 0;i < 10; ++i) vst[i] = false;
vst[x] = true;
while(k--){
x = f[x];
if(vst[x]){
int len = 1;
for(int y = f[x];y != x;y = f[y]) ++len;
k %= len;
while(k--) x = f[x];
return x;
}
else vst[x] = true;
}
return x;
}
int g[10][10];
ullong min(ullong a, ullong b){
return a < b ? a : b;
}
int main(){
int TT;
scanf("%d", &TT);
for(int cas = 1; cas <= TT; ++cas){
for(int i = 0;i < 10; ++i){
for(int j = 0;j < 10; ++j){
scanf("%d", g[j] + i);
}
}
ullong a, b;
scanf("%I64u %I64u", &a, &b);
ullong ans = 0;
for(ullong t = 1;t <= b;t *= 10){
ullong u = a, v = b;
int d = u / t % 10;
ullong uu = min((u / t + 1) * t - 1, v);
int val = eval(g[d], d, uu - u);
for(++d, u = uu;d < 10 && u < v; ++d, u = uu){
uu = min(u + t, v);
val = eval(g[d], val, uu - u);
}
if((v - u) / t >= 10){
int f[10];
for(int d = 0;d < 10; ++d){
f[d] = d;
for(int j = 0;j < 10; ++j){
f[d] = eval(g[j], f[d], t);
}
}
val = eval(f, val, (v - u) / t / 10);
u += (v - u) / t / 10 * t * 10;
}
for(d = 0; u < v; ++d, u = uu){
uu = min(u + t, v);
val = eval(g[d], val, uu - u);
}
ans += val * t;
}
printf("%I64u\n", ans);
}
return 0;
}

61
HDOJ/3756_autoAC.cpp Normal file
View File

@ -0,0 +1,61 @@
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 1e-6
const double pi = acos(-1.0);
struct Point {
double x, y, z;
double v, h;
void SCANF() {
scanf("%lf %lf %lf", &x, &y, &z);
v = z;
h = sqrt(x*x + y*y);
}
}pt[ 10001 ];
int n;
double MaxH, MaxV;
double Calc(double R) {
int i;
double Max = 0;
int idx = 0;
for(i = 0; i < n; i++) {
double nv = pt[i].v / (R - pt[i].h);
if(nv > Max) {
Max = nv;
idx = i;
}
}
return Max * R;
}
int main() {
int t;
int i;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
MaxH = MaxV = 0;
for(i = 0; i < n; i++) {
pt[i].SCANF();
if(pt[i].h > MaxH)
MaxH = pt[i].h;
if(pt[i].v > MaxV)
MaxV = pt[i].v;
}
double l = MaxH + eps, r = 1e6;
double ml, mr;
while(l + 1e-6 < r) {
ml = (2 * l + r) / 3;
mr = (l + 2 * r) / 3;
double lans = Calc(ml) * ml * ml;
double rans = Calc(mr) * mr * mr;
if( lans > rans ) {
l = ml + 1e-5;
}else
r = mr - 1e-5;
}
double ans = (l + r) / 2;
printf("%.3lf %.3lf\n", Calc(ans), ans);
}
return 0;
}

74
HDOJ/3757_autoAC.cpp Normal file
View File

@ -0,0 +1,74 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const long long inf=(1LL)<<60;
short path[4010][4010];
long long f[4010];
struct node
{
long long d;
int num;
int sh;
}x[4010],y[4010];
int n,m;
bool cmpd(node a,node b)
{
return a.d<b.d;
}
bool cmpnum(node a,node b)
{
return a.num<b.num;
}
void solve(int i,int j)
{
if(i!=1) solve(i-1,path[i][j]);
x[i].sh=y[j].num;
}
int main()
{
int sec;
scanf("%d",&sec);
for(int z=1;z<=sec;z++)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%I64d",&x[i].d);
x[i].num=i;
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%I64d",&y[i].d);
y[i].num=i;
}
sort(x+1,x+1+n,cmpd);
sort(y+1,y+1+m,cmpd);
for(int i=0;i<=max(n,m);i++)
f[i]=inf;
f[1]=abs(x[1].d-y[1].d);
for(int i=2;i<=n;i++)
for(int j=min(i,m);j>=1;j--)
{
if(f[j]<f[j-1])
{
f[j]=f[j]+abs(x[i].d-y[j].d);
path[i][j]=j;
}
else
{
f[j]=f[j-1]+abs(x[i].d-y[j].d);
path[i][j]=j-1;
}
}
printf("%I64d\n",f[m]);
solve(n,m);
sort(x+1,x+1+n,cmpnum);
for(int i=1;i<=n-1;i++)
printf("%d ",x[i].sh);
printf("%d\n",x[n].sh);
}
return 0;
}

133
HDOJ/3758_autoAC.cpp Normal file
View File

@ -0,0 +1,133 @@
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define MAXN 100005
#define MAXM 400005
#define INF 1000000011
#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
#define eps 1e-7
using namespace std;
bool tag[10001];
int p[10001];
int cnt;
void get_prime()
{
cnt = 0;
tag[1] = 1;
for (int i = 2; i < 10000; i++)
{
if (!tag[i])
p[cnt++] = i;
for (int j = 0; j < cnt && p[j] * i < 10000; j++)
{
tag[i*p[j]] = 1;
if (i % p[j] == 0)
break;
}
}
}
int n, m;
int a[11005], b[11005];
int numa[10005], numb[10005];
int ans[1000005];
int num[1001111];
void get(int *x, int n, int *num)
{
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < cnt; j++)
{
int tn = x[i];
if(tn < p[j]) break;
while(tn){num[j] += tn / p[j]; tn /= p[j];}
}
}
}
bool ok()
{
for(int i = 0; i < cnt; i++)
if(numb[i] > numa[i]) return 0;
return 1;
}
int main()
{
int T;
get_prime();
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
memset(numa, 0, sizeof(numa));
memset(numb, 0, sizeof(numb));
get(a, n, numa);
get(b, m, numb);
if(!ok())
{
printf("-1\n");
continue;
}
for(int i = 0; i < cnt; i++) numa[i] -= numb[i];
int tp = 0;
memset(num, 0, sizeof(num));
while(1)
{
int low = 2, high = 10006;
int can = 0;
while(low <= high)
{
int mid = (low + high) >> 1;
int fg = 1;
for(int j = 0; j < cnt; j++)
{
int tn = mid;
if(tn < p[j]) break;
int sum = 0;
while(tn){sum += tn / p[j]; tn /= p[j];}
if(sum > numa[j])
{
fg = 0;
break;
}
}
if(fg) {low = mid + 1; can = max(can, mid);}
else high = mid - 1;
}
int x = can;
if(x == 0) break;
ans[tp] = x;
int ot = INF;
for(int j = 0; j < cnt; j++)
{
int tn = x;
if(tn < p[j]) break;
int sum = 0;
while(tn){sum += tn / p[j]; tn /= p[j];}
if(sum > 0) ot = min(ot, numa[j] / sum);
}
num[tp] += ot;
tp++;
for(int j = 0; j < cnt; j++)
{
int tn = x;
if(tn < p[j]) break;
int sum = 0;
while(tn){sum += tn / p[j]; tn /= p[j];}
numa[j] -= ot * sum;
}
}
printf("%d\n", tp);
for(int i =0; i < tp; i++) printf("%d %d\n", ans[i], num[i]);
}
return 0;
}

242
HDOJ/3759_autoAC.cpp Normal file
View File

@ -0,0 +1,242 @@
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std ;
int num[15] ;
int b[10] ;
int temp[10] , cnt = 0;
int p[10] ;
int N ;
int s[10] ;
int st[10] , ed[10] ;
char str[10][3] ;
struct card{
int a[5] , R;
void insert(int list[]){
for (int i = 0 ; i < 5 ; i++)
b[i] = list[i] ;
memset(num,0,sizeof(num));
for (int i = 0 ; i < 5 ; i++)
num[b[i]]++ ;
bool flag = 0 ;
for (int i = 0 ; i < 5 ; i++){
if (num[b[i]]>1){
flag=1;
break ;
}
}
if (flag==0){
sort(b,b+5) ;
for (int i = 0 ; i < 5 ; i++) a[i] = b[i] ;
if (b[0]==2&&b[1]==3)
if (b[2]==4&&b[3]==5)
if (b[4]==14){
b[4] = 1 ;
sort(b,b+5);
for (int i = 0 ; i < 5 ; i++)
a[i] = b[i] ;
R = 5;
return ;
}
if (b[0]==b[2]-2 && b[1]==b[2]-1)
if (b[3]==b[2]+1 && b[4]==b[2]+2)
{
R = 5 ;
return ;
}
R = 1 ;
return ;
}
int sum2 = 0 , sum3 = 0 , sum4 = 0 ;
for (int i = 2 ; i < 15 ; i++){
if (num[i]==2) sum2++ ;
if (num[i]==3) sum3++ ;
if (num[i]==4) sum4++ ;
}
if (sum4==1){
int pos ;
for (int i = 0 ; i < 5 ; i++)
if (num[b[i]] != 4)
pos = i ;
a[0] = b[pos] ;
R = 7 ;
if (pos != 0){
for (int i = 1 ; i < 5 ; i++)
a[i] = b[0] ;
return ;
}
if (pos != 1){
for (int i = 1 ; i < 5 ; i++)
a[i] = b[1];
return ;
}
}
if (sum2 == 1 && sum3 == 1){
R = 6 ;
for (int i = 0 ; i < 5 ; i++){
if (num[b[i]] == 3){
for (int j = 2 ; j < 5 ; j++)
a[j] = b[i] ;
}else
{
for (int j = 0 ; j < 2 ; j++)
a[j] = b[i] ;
}
}
return ;
}
if (sum3 == 1){
cnt = 0 ; int pos = -1 ;
for (int i = 0 ; i < 5; i++)
if (num[b[i]] != 3)
temp[cnt++] = b[i] ;
else
pos = i ;
for (int i = 2 ; i < 5; i++)
a[i] = b[pos] ;
sort(temp,temp+2);
for (int i = 0 ; i < 2 ; i++)
a[i] = temp[i] ;
R = 4 ;
return ;
}
if (sum2 == 1){
cnt = 0 ; int pos = -1 ;
for (int i = 0 ; i < 5; i++)
if (num[b[i]] != 2)
temp[cnt++] = b[i] ;
else
pos = i ;
for (int i = 3 ; i < 5; i++)
a[i] = b[pos] ;
sort(temp,temp+3);
for (int i = 0 ; i < 3 ; i++)
a[i] = temp[i] ;
R = 2 ;
return ;
}
R = 3 ;
cnt = 0 ; int pos = -1 ;
for (int i = 0 ; i < 5 ; i++)
if (num[b[i]] != 1)
temp[cnt++] = b[i] ;
else
pos = i ;
a[0] = b[pos] ;
sort(temp,temp+4);
for (int i = 1 ; i < 5 ; i++)
a[i] = temp[i-1];
}
}state[15*15*15*15*15] ;
void check(){
if (p[0]==p[1] && p[0]==p[2])
if (p[0]==p[3] && p[0]==p[4])
return ;
state[++N].insert(p) ;
}
void dfs(int i){
if (i > 4){
check() ;
return ;
}
for (int j = 2 ; j < 15 ; j++)
{
p[i] = j ;
dfs(i+1) ;
}
}
int get(char c){
if (c>='0' && c<='9') return c - '0' ;
if (c=='T') return 10 ;
if (c=='J') return 11 ;
if (c=='Q') return 12 ;
if (c=='K') return 13 ;
if (c=='A') return 14 ;
}
int Cmp(card &A , card &B){
if (A.R < B.R) return -1 ;
if (A.R > B.R) return 1 ;
for (int i = 4 ; i >= 0 ; i--){
if (A.a[i] < B.a[i])
return -1 ;
if (A.a[i] > B.a[i])
return 1 ;
}
return 0 ;
}
bool cmp(const card &A , const card &B){
if (A.R != B.R) return A.R < B.R ;
for (int i = 4 ; i > 0 ; i--)
if (A.a[i] != B.a[i])
return A.a[i] < B.a[i];
return A.a[0] < B.a[0] ;
}
int search(int L,int R,card A){
int ret ;
while (L<=R){
int mid = (L+R)>>1 ;
if (Cmp(state[mid],A)>=0){
R = mid - 1 ;
ret = mid ;
}else
L = mid + 1 ;
}
return ret ;
}
int main(){
N = 0 ;
dfs(0) ;
sort(state+1,state+N+1,cmp);
int cnt = 1 ;
for (int i = 2 ; i <= N ; i++){
if (Cmp(state[i],state[i-1])==0) continue ;
state[++cnt] = state[i] ;
}
N = cnt ; memset(s,0,sizeof(s));
memset(st,0,sizeof(st));
for (int i = 1 ; i <= N ; i++){
s[state[i].R]++ ;
if (st[state[i].R]==0) st[state[i].R]=i ;
ed[state[i].R] = i ;
}
int Q ;
scanf("%d",&Q) ;
int sum[10];
sum[0] = 0 ;
for (int i = 1 ; i <= 5 ; i++)
sum[i] = sum[i-1] + s[i] ;
while (Q--){
for (int j = 0 ; j < 5 ; j++)
scanf("%s",str[j]);
card now ;
for (int j = 0 ; j < 5 ; j++)
b[j] = get(str[j][0]);
now.insert(b);
bool samesuit = true ;
for (int j = 1 ; j < 5 ; j++)
if (str[j][1] != str[0][1]) samesuit = false ;
int rank = now.R ;
int pos = search(st[rank],ed[rank],now) - st[rank] + 1;
int Tonghua = s[1] ;
if (!samesuit){
if (rank <= 5){
printf("%d\n",sum[rank-1] + pos) ;
}
else{
if (rank == 6)
printf("%d\n",sum[5] + Tonghua + pos);
else
printf("%d\n",sum[5] + Tonghua + s[6] + pos) ;
}
}else
{
if (rank == 5){
printf("%d\n",sum[5] + Tonghua + s[6] + s[7] + pos) ;
}
else
printf("%d\n",sum[5] + pos);
}
}
return 0;
}

120
HDOJ/3760_autoAC.cpp Normal file
View File

@ -0,0 +1,120 @@
#include <iostream>
using namespace std;
const int maxn = 100005;
const int maxm = 400005;
const int inf = 1000000005;
int head[maxn], vert[maxm], colo[maxm], noxt[maxm], cunt;
int sdis[maxn], edis[maxn], path[maxn], leng;
int queue[maxn], qhead, qtail;
bool vis[maxn], rit[maxn];
void init(int n)
{
cunt = 0;
for (int i = 0; i <= n; i++)
{
head[i] = -1;
sdis[i] = -1;
edis[i] = -1;
vis[i] = 0;
rit[i] = 0;
path[i] = inf;
}
}
void addedge(int x, int y, int c)
{
vert[cunt] = y;
colo[cunt] = c;
noxt[cunt] = head[x];
head[x] = cunt++;
}
void BFS(int start, int *dis)
{
dis[start] = 0;
qhead = qtail = 0;
queue[qtail++] = start;
while (qhead < qtail)
{
int x = queue[qhead++];
for (int p = head[x]; p != -1; p = noxt[p])
{
int y = vert[p];
if (-1 == dis[y])
{
dis[y] = dis[x] + 1;
queue[qtail++] = y;
}
}
}
}
void IdeadPath()
{
qhead = qtail = 0;
queue[qtail++] = 1;
int step = 0;
while (qhead < qtail)
{
int ttail = qtail;
while (qhead < ttail)
{
int x = queue[qhead++];
for (int p = head[x]; p != -1; p = noxt[p])
{
int y = vert[p];
int c = colo[p];
if (rit[y] && sdis[y] == step + 1)
{
if (c < path[step])
{
path[step] = c;
for (int i = ttail; i < qtail; i++)
vis[queue[i]] = 0;
qtail = ttail;
vis[y] = 1;
queue[qtail++] = y;
}
else if (c == path[step] && !vis[y])
{
vis[y] = 1;
queue[qtail++] = y;
}
}
}
}
step++;
}
}
int main()
{
int test, cas;
int n, m, a, b, c;
scanf("%d", &test);
for (cas = 1; cas <= test; cas++)
{
scanf("%d %d", &n, &m);
init(n);
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &a, &b, &c);
if (a == b) continue;
addedge(a, b, c);
addedge(b, a, c);
}
BFS(1, sdis);
BFS(n, edis);
leng = sdis[n];
for (int i = 1; i <= n; i++)
{
if (sdis[i] + edis[i] == leng)
rit[i] = 1;
}
IdeadPath();
printf("%d\n", leng);
for (int i = 0; i < leng; i++)
{
if (i) printf(" ");
printf("%d", path[i]);
}
printf("\n");
}
return 0;
}

88
HDOJ/3761_autoAC.cpp Normal file
View File

@ -0,0 +1,88 @@
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define eps 1e-10
#define N 50005
#define zero(a) (fabs(a)<eps)
using namespace std;
struct Point {
double x,y;
Point(){}
Point(double tx,double ty){x=tx;y=ty;}
}p[N],q[N];
int n,m;
struct Segment{
Point s,e;
double angle;
void get_angle(){angle=atan2(e.y-s.y,e.x-s.x);}
}seg[N];
double xmul(Point p0,Point p1,Point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double Get_Area(Point pt[],int n){
double area=0;
for(int i=1;i<n-1;i++)
area+=xmul(pt[0],pt[i],pt[i+1]);
return fabs(area)/2;
}
Point Get_Intersect(Segment s1,Segment s2){
double u=xmul(s1.s,s1.e,s2.s),v=xmul(s1.e,s1.s,s2.e);
Point t;
t.x=(s2.s.x*v+s2.e.x*u)/(u+v);t.y=(s2.s.y*v+s2.e.y*u)/(u+v);
return t;
}
void HalfPlaneIntersect(Segment seg[],int n){
int idx;
for(int i=0;i<n;i++)
if(seg[i].angle+eps<seg[(i+1)%n].angle&&seg[i].angle+eps<seg[(i-1+n)%n].angle){
idx=i;
break;
}
Segment deq[N];
deq[0]=seg[idx];deq[1]=seg[(idx+1)%n];
int head=0,tail=1;
idx=(idx+2)%n;
for(int i=2;i<n;i++,idx=(idx+1)%n){
while(head<tail&&xmul(seg[idx].s,seg[idx].e,Get_Intersect(deq[tail],deq[tail-1]))<-eps) tail--;
while(head<tail&&xmul(seg[idx].s,seg[idx].e,Get_Intersect(deq[head],deq[head+1]))<-eps) head++;
deq[++tail]=seg[idx];
}
while(head<tail&&xmul(deq[head].s,deq[head].e,Get_Intersect(deq[tail],deq[tail-1]))<-eps) tail--;
while(head<tail&&xmul(deq[tail].s,deq[tail].e,Get_Intersect(deq[head],deq[head+1]))<-eps) head++;
m=0;
if(tail==head) return;
for(int i=head;i<tail;i++){
q[m++]=Get_Intersect(deq[i],deq[i+1]);
}
if(tail>head+1)
q[m++]=Get_Intersect(deq[head],deq[tail]);
}
int slove(int mid){
if(n-mid<=2) return 1;
for(int i=0;i<n;i++){
seg[i].s=p[i];
seg[i].e=p[(i+mid+1)%n];
seg[i].get_angle();
}
HalfPlaneIntersect(seg,n);
return zero(Get_Area(q,m));
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=1;i<=n/2;i++) swap(p[i],p[n-i]);
int ans,low=0,high=n,mid;
while(low<=high){
mid=(low+high)/2;
if(slove(mid)){ans=mid;high=mid-1;}
else low=mid+1;
}
printf("%d\n",ans);
}
return 0;
}

40
HDOJ/3763_autoAC.cpp Normal file
View File

@ -0,0 +1,40 @@
#include <string.h>
#include <stdio.h>
int s[1000005];
int bin(int x,int n)
{
int l,h,m;
l = 0;
h = n-1;
m = (l+h/2);
while(l<=h)
{
m = (l+h)/2;
if(x<s[m])
h = m-1;
else if(x>s[m])
l = m+1;
else
return 1;
}
return 0;
}
int main()
{
int n,m,i,j,a;
while(~scanf("%d%d",&n,&m),n+m)
{
for(i = 0;i<n;i++)
{
scanf("%d",&s[i]);
}
int cnt = 0;
for(i = 0;i<m;i++)
{
scanf("%d",&a);
cnt+=bin(a,n);
}
printf("%d\n",cnt);
}
return 0;
}

31
HDOJ/3764_autoAC.cpp Normal file
View File

@ -0,0 +1,31 @@
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 1500
int a[MAX], n;
int main(void)
{
while(scanf("%d", &n) && n)
{
int i, j;
a[0] = 0;
for(i = 1; i <= n; i++)
scanf("%d", &a[i]);
a[n+1] = 1422;
n = n + 2;
sort(a, a + n);
int flag = 0;
for(i = 0; i + 1 < n; i++)
{
if(a[i+1] - a[i] > 200)
flag = 1;
}
if(a[n - 1] - a[n-2] > 100) flag = 1;
if(flag == 1)
puts("IMPOSSIBLE");
else puts("POSSIBLE");
}
return 0;
}

43
HDOJ/3765_autoAC.cpp Normal file
View File

@ -0,0 +1,43 @@
#include <stdio.h>
#include <math.h>
int a[200];
int n;
int ans;
int sum[200];
void Divide(int p,int differ,int hav)
{
int i,j,n;
if (differ==0)
{
if (hav>ans) ans=hav;
}
if (p<0) return;
if (abs(differ)>sum[p]) return;
if (sum[p]+hav<ans) return;
Divide(p-1,differ+a[p],hav+a[p]);
Divide(p-1,differ-a[p],hav+a[p]);
Divide(p-1,differ,hav);
}
int Solve()
{
ans=0;
Divide(n-1,0,0);
return sum[n-1]-ans;
}
int main()
{
int i,j;
while(1)
{
scanf("%d",&n);
if (n==0) break;
for (i=0;i<n;i++)
{
scanf("%d",&a[i]);
if (i==0) sum[i]=a[i];
else sum[i]=sum[i-1]+a[i];
}
printf("%d\n",Solve());
}
return 0;
}

45
HDOJ/3766_autoAC.cpp Normal file
View File

@ -0,0 +1,45 @@
#include<stdio.h>
#include<string.h>
int main()
{
char c[20];
while(scanf("%s",c),c[0]!='E')
{
int x=0,y,flag=1;
int k;
for(int i=0;c[i];i++)
{
if(c[i]=='-'&&i==0)
flag=-1;
else
x=x*10+c[i]-48;
}
x=x*flag;
scanf("%d",&y);
if(x<0)
x=-x;
if(y<0)
y=-y;
if(y<x) {k=x;x=y;y=k;}
if(y<=2*x)
{
if(x==1&&y==1)
printf("2\n");
else if(x==2&&y==2)
printf("4\n");
else
printf("%d\n",(x+y)/3+(x+y)%3);
}
else
{
int ans=x;
int c=(y-2*x)%4;
ans+=c;
ans+=(y-2*x-c)/2;
if(y==1&&x==0)
ans=3;
printf("%d\n",ans);
}
}
return 0;
}

38
HDOJ/3767_autoAC.cpp Normal file
View File

@ -0,0 +1,38 @@
#include <iostream>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <math.h>
using namespace std;
struct dot{
double x, y, r;
}all[1024];
int n, vis[1024], ok;
double in, out;
void DFS(int u)
{
if(!ok) return;
vis[u] = 1;
if(all[u].y - all[u].r <= 0) {ok = 0; return;}
for(int v = 0; v < n; ++v)
if(!vis[v] && hypot(all[u].x - all[v].x, all[u].y - all[v].y) < all[u].r + all[v].r)
DFS(v);
if(all[u].x - all[u].r <= 0)
in = min(in, all[u].y - sqrt(all[u].r * all[u].r - all[u].x * all[u].x));
if(all[u].x + all[u].r >= 1000)
out = min(out, all[u].y - sqrt(all[u].r * all[u].r - (1000-all[u].x) * (1000-all[u].x)));
}
int main()
{
ios::sync_with_stdio(false);
while(memset(vis, 0, sizeof(vis)), ok = 1, in = out = 1000, cin >> n){
for(int i = 0; i < n; ++i)
cin >> all[i].x >> all[i].y >> all[i].r;
for(int i = 0; i < n; ++i)
if(!vis[i] && all[i].y + all[i].r >= 1000)
DFS(i);
if(!ok) puts("IMPOSSIBLE");
else printf("%.2f %.2f %.2f %.2f\n", 0.0, in, 1000.0, out);
}
return 0;
}

92
HDOJ/3768_autoAC.cpp Normal file
View File

@ -0,0 +1,92 @@
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std ;
const int maxn = 100010 ;
const int inf = 0x3f3f3f3f ;
struct Edge
{
int v ;int w ;
int next ;
}edge[maxn*10] ;
int head[maxn] ;
int dis[20][maxn] ;
int vis[maxn] ;
int nedge ;int a[maxn] ,num;
int n , m ;
void addedge(int u , int v , int w)
{
edge[nedge].v = v ;
edge[nedge].w = w ;
edge[nedge].next = head[u] ;
head[u] = nedge++ ;
}
void spfa(int st)
{
queue<int> que ;
memset(vis , 0 ,sizeof(vis)) ;
for(int i = 0;i < n;i++)
dis[st][i] = i == a[st] ? 0 : inf ;
que.push(a[st]) ;
vis[a[st]] = 1;
while(que.size())
{
int u = que.front() ;
que.pop() ;
vis[u] = 0 ;
for(int i = head[u] ; i != -1 ;i = edge[i].next)
{
int v = edge[i].v ;
if(dis[st][v] > dis[st][u] + edge[i].w)
{
dis[st][v] = dis[st][u] + edge[i].w ;
if(!vis[v])
vis[v] = 1 , que.push(v) ;
}
}
}
}
int ans = inf ;
void dfs(int pos , int sum , int step)
{
if(step == num)
{
ans = min(ans , sum + dis[pos][0]) ;
return ;
}
for(int i = 1;i <= num;i++)
if(vis[a[i]])continue ;
else
{
vis[a[i]] = 1;
dfs(i , sum + dis[pos][a[i]] , step + 1) ;
vis[a[i]] = 0 ;
}
}
int main()
{
int t ;
scanf("%d" ,&t) ;
while(t--)
{
scanf("%d%d" , &n , &m) ;
memset(head , -1 , sizeof(head)) ;
nedge = 0 ;
while(m--)
{
int u , v , w ;
scanf("%d%d%d" , &u , &v ,&w) ;
addedge(u , v , w) ;
addedge(v , u , w) ;
}
scanf("%d" , &num) ;
spfa(0) ;
for(int i = 1;i <= num ; i++)
scanf("%d" , &a[i]) , spfa(i) ;
ans = inf ;
memset(vis , 0 ,sizeof(vis)) ;
dfs(0 , 0 , 0) ;
cout<<ans<<endl;
}
}

100
HDOJ/3772_autoAC.cpp Normal file
View File

@ -0,0 +1,100 @@
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
const double eps=1e-10;
const double PI=acos(-1);
int dcmp(double x)
{
return (x>eps)-(x<-eps);
}
struct Point3
{
double x,y,z;
Point3(double x=0,double y=0,double z=0):x(x),y(y),z(z) {}
};
typedef Point3 Vector3;
Vector3 operator+(Point3 A,Point3 B)
{
return Point3(A.x+B.x,A.y+B.y,A.z+B.z);
}
Vector3 operator-(Point3 A,Point3 B)
{
return Point3(A.x-B.x,A.y-B.y,A.z-B.z);
}
Vector3 operator*(Point3 A,double p)
{
return Point3(A.x*p,A.y*p,A.z*p);
}
Vector3 operator/(Point3 A,double p)
{
return Point3(A.x/p,A.y/p,A.z/p);
}
bool operator<(Point3 &A,Point3 &B)
{
return A.x<B.x||(A.x==B.x&&A.y<B.y)||(A.x==B.x&&A.y==B.y&&A.z<B.z);
}
bool operator==(Point3 &A,Point3 &B)
{
return dcmp(A.x-B.x)==0&&dcmp(A.y-B.y)==0&&dcmp(A.z-B.z)==0;
}
ostream & operator<<(ostream & out,Vector3 A)
{
out<<A.x<<' '<<A.y<<' '<<A.z<<endl;
return out;
}
double Dot(Vector3 A,Vector3 B)
{
return A.x*B.x+A.y*B.y+A.z*B.z;
}
double Length(Vector3 A)
{
return sqrt(Dot(A,A));
}
double Angle(Vector3 A,Vector3 B)
{
return acos(Dot(A,B)/Length(A)/Length(B));
}
Vector3 Cross(Vector3 A,Vector3 B)
{
return Vector3(A.y*B.z-A.z*B.y,A.x*B.z-A.z*B.x,A.x*B.y-A.y*B.x);
}
double Area2(Point3 A,Point3 B,Point3 C)
{
return Length(Cross(B-A,C-A));
}
int nearest(double p)
{
int a=floor(p);
int b=ceil(p);
if(b-p>=p-a) return b;
else return a;
}
int main()
{
int T;
cin>>T;
double a1,b1,a2,b2;
double R=6371009;
double x1,y1,z1,x2,y2,z2;
while(T--)
{
cin>>b1>>a1>>b2>>a2;
b1=b1/180.0*PI;
a1=a1/180.0*PI;
b2=b2/180.0*PI;
a2=a2/180.0*PI;
x1=R*cos(b1)*cos(a1);
y1=R*cos(b1)*sin(a1);
z1=R*sin(b1);
x2=R*cos(b2)*cos(a2);
y2=R*cos(b2)*sin(a2);
z2=R*sin(b2);
Point3 A=Point3(x1,y1,z1);
Point3 B=Point3(x2,y2,z2);
double real_dist=Length(A-B);
Point3 P;
double arc_dist=Angle(A-P, B-P)*R;
printf("%.0lf\n",arc_dist-real_dist);
}
}

27
HDOJ/3774_autoAC.cpp Normal file
View File

@ -0,0 +1,27 @@
#include"stdio.h"
int judge(int x,int sum,int max)
{
if(sum*2>x) return 0;
return x/max+1;
}
int main()
{
int n;
int p[111],max,sum;
int i;
while(scanf("%d",&n),n)
{
max=0;
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&p[i]);
sum+=p[i];
if(p[i]>max) max=p[i];
}
printf("%d ",judge(50,sum,max));
printf("%d ",judge(60,sum,max));
printf("%d\n",judge(70,sum,max));
}
return 0;
}

27
HDOJ/3775_autoAC.cpp Normal file
View File

@ -0,0 +1,27 @@
#include <stdio.h>
#include <string.h>
char str[1000005];
int drow[8]={0,-1,-1,-1,0,1,1,1};
int dcol[8]={1,1,0,-1,-1,-1,0,1};
int main()
{
__int64 r1,c1,val,r,c,i,j,n;
__int64 s,ans;
while(scanf("%s",str)!=EOF)
{
n=strlen(str);
r=c=s=0;
for (i=0;i<n;i++)
{
val=str[i]-'0';
r1=r+drow[val];
c1=c+dcol[val];
s=s+r*c1-c*r1;
r=r1;
c=c1;
}
if (s<0) s=-s;
printf("%I64d\n",(n+s)/2+1);
}
return 0;
}

91
HDOJ/3776_autoAC.cpp Normal file
View File

@ -0,0 +1,91 @@
#include <iostream>
#include<cctype>
#include<string>
#include<cstdio>
#include<sstream>
using namespace std;
#define MAXN 110000
#define INF 10000000
int d[MAXN], u[MAXN], v[MAXN], w[MAXN], num[10];
int n, m, e, ve, vMax, vMin;
string input, s;
int ballman_ford()
{
for(int i = 0; i <= n; d[i++] = INF);
d[0] = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < ve; j++)
if(d[v[j]] > d[u[j]] + w[j])
d[v[j]] = d[u[j]] + w[j];
}
for(int j = 0; j <= ve; j++)
if(d[v[j]] > d[u[j]] + w[j])
return 0;
for(int j = 1; j <= n; j++){
if(vMin > d[j]) vMin = d[j];
}
return 1;
}
int main()
{
int i, j, k, l, flag;
while(cin>>n){
if(!n) break;
cin>>m;
getchar();
e = 0;
for(i = 0; i < m; i++){
getline(cin, input);
istringstream in(input);
num[0] = num[1] =num[2] = 0;
for(j = 0, l = 0; in>>s; j++){
if(isdigit(s[0])){
for(k = 0; k < s.size(); k++)
num[l] = num[l] * 10 + s[k] - '0';
l++;
}
if(j == 3){
if(s == "at") flag = 1;
else flag = 0;
}
}
if(flag){
u[e] = num[0]; v[e] = num[2]; w[e++] = -num[1];
}else {
u[e] = num[0]; v[e] = num[2]; w[e++] = 0;
u[e] = num[2]; v[e] = num[0]; w[e++] = num[1];
}
}
for(i = 1, ve = e; i <= n; i++, ve++){
u[ve] = 0; v[ve] = i; w[ve] = 0;
}
vMin = 1 << 30;
if(ballman_ford()){
int minv = 1 << 30;
for (int i = 1; i <= n; i++) {
if (minv > d[i] - vMin)
minv = d[i] - vMin;
}
if (minv == 0) {
for (int i = 1; i <= n; i++) {
printf("%d", d[i] - vMin + 1);
if (i != n) {
printf(
" ");
}
}
printf("\n");
} else {
for (int i = 1; i <= n; i++) {
printf("%d", d[i] - vMin);
if (i != n) {
printf(
" ");
}
}
printf("\n");
}
}else printf("Impossible.\n");
}
return 0;
}

77
HDOJ/3777_autoAC.cpp Normal file
View File

@ -0,0 +1,77 @@
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct Page
{
int l,r;
};
bool cmp(Page a,Page b)
{
if(a.l == b.l)return a.r < b.r;
return a.l < b.l;
}
int main()
{
int n;
while(scanf("%d", &n), n)
{
char str[1005]= {0},word[1005]= {0};
Page p[1005];
getchar();
gets(str);
int L=strlen(str);
int pos=0,nn=0;
for(int i=0; i<L; ++i)
{
if(str[i]==','||i==L-1)
{
if(i==L-1) word[pos++]=str[i];
int l=strlen(word);
int a=0,b=0;
bool pp=false;
for(int j=0; j<l; ++j)
{
if(!pp&&word[j]!='-')
a=a*10+word[j]-'0';
if(word[j]=='-')
pp=true;
else if(pp==true)
b=b*10+word[j]-'0';
}
if(b==0) b=a;
if(b>n) b=n;
if(a<=b)
{
p[nn].l=a;
p[nn].r=b;
nn++;
}
memset(word,0,sizeof(word));
pos=0;
}
else
word[pos++]=str[i];
}
sort(p,p+nn,cmp);
int mx=p[0].r,ans=0;
if(nn) ans+=p[0].r-p[0].l+1;
for(int i=1;i<nn;++i)
{
if(p[i].r<=mx) continue;
if(p[i].l>mx)
{
ans+=p[i].r-p[i].l+1;
mx=p[i].r;
}
else if(p[i].r>mx)
{
ans+=p[i].r-mx;
mx=p[i].r;
}
}
printf("%d\n",ans);
}
return 0;
}

146
HDOJ/3778_autoAC.cpp Normal file
View File

@ -0,0 +1,146 @@
#include <algorithm>
#include <cstring>
#include <cstdio>
using std::sort;
struct dat
{
int socer;
int top;
int low;
int number;
bool operator<(const dat p)const
{
return p.socer<socer;
}
} a[33],b[33];
char name[33][33];
struct odat
{
int as;
int bs;
} vs[20];
int n,m;
int aa,bb,q;
int fins(char *s)
{
for(int i=0; i<n; i++)
if(!strcmp(name[i],s))
return i;
return 0;
}
bool cmp(dat p, dat q)
{
return p.socer>q.socer;
}
int ans[33];
void dfs(int x)
{
if(x==q)
{
for(int i=0; i<n; i++)
b[i]=a[i];
for(int i=0; i<q; i++)
{
int nx=vs[i].as;
int ny=vs[i].bs;
if(ans[i]==-1)
{
b[nx].socer+=3;
}
else if(ans[i]==0)
{
b[nx].socer++;
b[ny].socer++;
}
else
{
b[ny].socer+=3;
}
}
sort(b, b+n);
int pp=1,dd=0;
for(int i=0; i<n; i++)
{
dd++;
if(b[i-1].socer!=b[i].socer && i)
pp=dd;
if(b[i].top>pp)
b[i].top=pp;
if(b[i].low<pp)
b[i].low=pp;
}
for(int i=0; i<n; i++)
{
int nx=b[i].number;
a[nx].low=b[i].low;
a[nx].top=b[i].top;
}
}
else
for(int i=-1; i<2; i++)
ans[x]=i,dfs(x+1);
}
int main()
{
int count=0;
while(scanf("%d %d",&n,&m)==2 && (n+m))
{
if(count)puts("");
count=1;
for(int i=0; i<n; i++)
{
scanf("%s",name[i]);
a[i].socer=0;
a[i].number=i;
a[i].top=n+1;
a[i].low=0;
}
char s[33],s2[33];
q=0;
for(int i=0; i<m; i++)
{
scanf("%s vs %s%d %d",s,s2,&aa,&bb);
s2[strlen(s2)-1]='\0';
int x=fins(s);
int y=fins(s2);
if(aa==-1 && bb==-1)
{
vs[q].as=x;
vs[q++].bs=y;
}
else
{
if(aa>bb)
a[x].socer+=3;
else if(bb>aa)
a[y].socer+=3;
else if(aa==bb)
a[y].socer++,a[x].socer++;
}
}
dfs(0);
for(int i=0; i<n; i++)
{
printf("Team %s can finish as high as ",name[i]);
if(a[i].top==1)
printf("1st");
else if(a[i].top==2)
printf("2nd");
else if(a[i].top==3)
printf("3rd");
else
printf("%dth",a[i].top);
printf(" place and as low as ");
if(a[i].low==1)
printf("1st");
else if(a[i].low==2)
printf("2nd");
else if(a[i].low==3)
printf("3rd");
else
printf("%dth",a[i].low);
printf(" place.\n");
}
}
return 0;
}

37
HDOJ/3779_autoAC.cpp Normal file
View File

@ -0,0 +1,37 @@
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 1005
bool ans[N][N];
int str1[N],str2[N],str3[N*2];
int n,m,t;
void solve(int n1,int n2)
{
if(n1>n||n2>m) return ;
if(n1==n&&n2==m)
{
ans[n1][n2]=1; return ;
}
if(ans[n1][n2]) return ;
ans[n1][n2]=1;
if(str3[n1+n2+1]==str1[n1+1]&&!ans[n][n])
solve(n1+1,n2);
if(str3[n1+n2+1]==str2[n2+1]&&!ans[n][n])
solve(n1,n2+1);
}
int main()
{
int i,j,k;
while(scanf("%d%d",&n,&m),n&&m)
{
for(i=1;i<=n;i++) scanf("%d",&str1[i]);
for(i=1;i<=m;i++) scanf("%d",&str2[i]);
for(i=1;i<=n+m;i++) scanf("%d",&str3[i]);
memset(ans,0,sizeof(ans));
solve(0,0);
if(ans[n][m]) puts("possible");
else puts("not possible");
}
return 0;
}

52
HDOJ/3780_autoAC.cpp Normal file
View File

@ -0,0 +1,52 @@
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const double E = 1e-12;
inline
int dblcmp(double x)
{
if (x > - E && x < E)
return 0;
return x > 0 ? 1 : -1;
}
int main()
{
double num[5];
while (true) {
int cc = 0;
for (int i = 0; i < 3; i++) {
scanf("%lf", &num[i]);
if (dblcmp(num[i]) == 0)
cc++;
}
if (cc == 3) {
break;
}
sort(num, num + 3);
double t = num[0];
long long h = floor(num[1] + 0.5), l = floor(num[2] + 0.5);
bool ok = false;
if (dblcmp(t - 0.25) >= 0 && h >= 90 && l >= 125) {
if (dblcmp(7 - t) >= 0 && h <= 155 && l <= 290) {
printf("letter\n");
ok = true;
} else {
if (dblcmp(50 - t) >= 0 && h <= 300 && l <= 380) {
printf("packet\n");
ok = true;
} else {
double ans = t * 2 + (double)h * 2 + (double)l;
if (dblcmp(ans - 2100) <= 0) {
printf("parcel\n");
ok = true;
}
}
}
}
if (!ok) {
printf("not mailable\n");
}
}
return 0;
}

110
HDOJ/3781_autoAC.cpp Normal file
View File

@ -0,0 +1,110 @@
#include <stdio.h>
#include <string>
#include <string.h>
#include <queue>
using namespace std;
string num[1001] = {"", "first", "second", "third", "fourth", "fifth", "sixth", "seventh",
"eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth",
"fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth"
};
string t[1001] = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen",
"twenty"
};
string retNum(int val) {
string res;
if(val >= 100) {
res += t[val / 100] + t[100];
val %= 100;
}
if(val >= 20) {
res += t[val / 10 * 10];
if(val % 10 != 0) res += t[val % 10];
return res;
}
return res + t[val];
}
string getNum(int val) {
string res;
if(val >= 1000) {
res += retNum(val / 1000);
if(val % 1000 == 0) return res + num[1000];
res += t[1000];
val %= 1000;
}
if(val >= 100) {
res += retNum(val / 100);
if(val % 100 == 0) return res + num[100];
res += t[100];
val %= 100;
}
if(val >= 20) {
if(val % 10 == 0) return res += num[val];
res += retNum(val / 10 * 10);
return res + num[val % 10];
}
else {
return res + num[val];
}
}
void init()
{
num[30] = "thirtieth";t[30] = "thirty";
num[40] = "fortieth";t[40] = "forty";
num[50] = "fiftieth";t[50] = "fifty";
num[60] = "sixtieth";t[60] = "sixty";
num[70] = "seventieth";t[70] = "seventy";
num[80] = "eightieth";t[80] = "eighty";
num[90] = "ninetieth";t[90] = "ninety";
num[100] = "hundredth";t[100] = "hundred";
num[1000] = "thousandth";t[1000] = "thousand";
}
int judge(string s)
{
int i,m=0,len=s.length();
for(i=0;i<len;i++)
if(s[i]=='t')
m++;
return m;
}
int numm[110000];
void bfs()
{
int sum=5,m=11,cnt=3;
numm[1]=1;
numm[2]=4;
numm[3]=11;
queue <string> que;
que.push(getNum(4));
que.push(getNum(11));
while(!que.empty())
{
int i,len;
string str=que.front();
que.pop();
len=str.length();
for(i=0;i<len;i++)
{
if(str[i]=='t')
{
numm[++cnt]=m+i+1;
string tem=getNum(m+i+1);
sum+=judge(tem);
if(sum<=100100)
{
que.push(tem);
}
}
}
m+=str.length();
}
}
int main (void)
{
int n;
init();
bfs();
while (scanf("%d",&n),n)
printf("%d\n",numm[n]);
return 0;
}

20
HDOJ/3782_autoAC.cpp Normal file
View File

@ -0,0 +1,20 @@
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n && n)
{
int cnt = 0;
while(n!=1)
{
if(n%2)
n = (3*n+1)/2;
else
n = n/2;
cnt++;
}
cout << cnt << endl;
}
return 0;
}

46
HDOJ/3783_autoAC.cpp Normal file
View File

@ -0,0 +1,46 @@
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char str[1000];
int z,o,j;
while(gets(str))
{
if(!strcmp(str,"E"))
break;
z = o = j = 0;
int len = strlen(str);
int i;
for(i = 0;i<len;i++)
{
if(str[i] == 'Z')
z++;
else if(str[i] == 'O')
o++;
else if(str[i] == 'J')
j++;
}
while(z || o || j)
{
if(z)
{
cout << "Z";
z--;
}
if(o)
{
cout << "O";
o--;
}
if(j)
{
cout << "J";
j--;
}
}
cout << endl;
}
return 0;
}

54
HDOJ/3784_autoAC.cpp Normal file
View File

@ -0,0 +1,54 @@
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
int main()
{
int n;
int a[1005],i,flag[1005];
while(cin >> n && n)
{
memset(flag,0,sizeof(flag));
for(i = 0; i<n; i++)
{
cin >> a[i];
flag[a[i]] = 1;
}
for(i = 0; i<n; i++)
{
int t;
t = a[i];
if(!flag[t])
continue;
while(t>1)
{
if(t%2)
t = (t*3+1)/2;
else
t = t/2;
if(t<=1000)
{
flag[t] = 0;
}
}
}
int k = 1;
for(i = n-1; i>=0; i--)
{
if(flag[a[i]])
{
if(k)
{
cout << a[i];
k = 0;
}
else
{
cout << " " << a[i];
}
}
}
cout << endl;
}
return 0;
}

70
HDOJ/3785_autoAC.cpp Normal file
View File

@ -0,0 +1,70 @@
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int a[100010];
int aux[100010];
void swap(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
}
int partition(int a[],int l,int h){
int i=l;
int j=h+1;
int v=a[l];
while(1){
while(a[++i]>v)if(i==h)break;
while(a[--j]<v)if(j==l)break;
if(i>=j)break;
swap(&a[i],&a[j]);
}
swap(&a[l],&a[j]);
return j;
}
void q_sort(int a[], int l,int h){
if(l>=h)return;
int j=partition(a,l,h);
q_sort(a,l,j-1);
q_sort(a,j+1,h);
}
void merge(int a[],int l,int mid,int h){
int i=l;
int j=mid+1;
for(int k=l;k<=h;++k)
aux[k]=a[k];
for(int k=l;k<=h;++k){
if(i>mid)a[k]=aux[j++];
else if(j>h)a[k]=aux[i++];
else if(aux[i]>aux[j])a[k]=aux[i++];
else a[k]=aux[j++];
}
}
void m_sort(int a[],int l,int h){
if(h<=l)return ;
int mid=l+(h-l)/2;
m_sort(a , l , mid);
m_sort(a,mid+1,h);
merge(a,l,mid,h);
}
int main(int argc, char *argv[])
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
memset(a,0,sizeof(a));
if(n==0&&m==0)return 0;
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
q_sort(a,0,n-1);
for(int i=0;;++i)
{
if(m)printf("%d",a[i]);
m--;
if(m)printf(" ");
if(m==0)break;
}
printf("\n");
}
return 0;
}

94
HDOJ/3786_autoAC.cpp Normal file
View File

@ -0,0 +1,94 @@
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int p[26];
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
memset(p,-1,sizeof(p));
char c;
char p1;
char p2;
string s;
for(int i=0;i<n;i++)
{
cin>>s;
c=s[0];
p1=s[1];
p2=s[2];
if(p1!='-') p[p1-'A']=c-'A';
if(p2!='-') p[p2-'A']=c-'A';
}
char c1,c2;
for(int i=0;i<m;i++)
{
cin>>s;
c1=s[0];
c2=s[1];
int count1=0,count2=0;
int target1=c1-'A';
int target2=c2-'A';
int cur=target1;
while(cur!=target2)
{
cur=p[cur];
if(cur==-1)
{
count1=0;
break;
}
else count1++;
}
if(count1==0)
{
cur=target2;
while(cur!=target1)
{
cur=p[cur];
if(cur==-1)
{
count2=0;
break;
}
else count2++;
}
}
if(count1==0&&count2==0)
{
cout<<'-'<<endl;
}
else if(count1!=0)
{
if(count1==1) cout<<"parent"<<endl;
else if(count1==2) cout<<"grandparent"<<endl;
else
{
while(count1>=3)
{
cout<<"great-";
count1--;
}
cout<<"grandparent"<<endl;
}
}
else if(count2!=0)
{
if(count2==1) cout<<"child"<<endl;
else if(count2==2) cout<<"grandchild"<<endl;
else
{
while(count2>=3)
{
cout<<"great-";
count2--;
}
cout<<"grandchild"<<endl;
}
}
}
}
}

33
HDOJ/3787_autoAC.cpp Normal file
View File

@ -0,0 +1,33 @@
#include <stdio.h>
#include <string.h>
__int64 a,b;
char s1[20],s2[20];
int len1,len2;
int main()
{
int i;
while(~scanf("%s%s",s1,s2))
{
len1 = strlen(s1);
len2 = strlen(s2);
a = b = 0;
for(i = 0; i<len1;i++)
{
if(s1[i]>='0' && s1[i]<='9')
{
a = a*10+s1[i]-'0';
}
}
if(s1[0] == '-')
a = -a;
for(i=0;i<len2;i++)
{
if(s2[i]>='0' && s2[i]<='9')
b = b*10+s2[i]-'0';
}
if(s2[0] == '-')
b = -b;
printf("%I64d\n",a+b);
}
return 0;
}

38
HDOJ/3788_autoAC.cpp Normal file
View File

@ -0,0 +1,38 @@
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 999999999
using namespace std;
int main(){
string s;
while(cin>>s){
int a=0,b=0,c=0,z=0,i=0;
bool flag=true;
for(;s[i] != 'z' && s[i] != '\0';++i){
if(s[i] != 'o'){cout<<"Wrong Answer"<<endl;flag=false;break;}
else ++a;
}
++i;
for(;s[i] != 'j' && s[i] != '\0' && flag;++i){
if(s[i] != 'o'){cout<<"Wrong Answer"<<endl;flag=false;break;}
else ++b;
}
++i;
for(;s[i] != '\0' && flag;++i){
if(s[i] != 'o'){cout<<"Wrong Answer"<<endl;flag=false;break;}
else ++c;
}
if((!b || (a == 0 && c !=0) || (a !=0 && c == 0)) && flag){cout<<"Wrong Answer"<<endl;flag=false;}
if(flag){
if(a ==0 && c == 0 || (c%a == 0 && c/a == b))cout<<"Accepted"<<endl;
else cout<<"Wrong Answer"<<endl;
}
}
return 0;
}

121
HDOJ/3789_autoAC.cpp Normal file
View File

@ -0,0 +1,121 @@
#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
struct nation
{
long double gold;
long double all;
long double area;
int id;
int rate1;
int rate2;
int rate3;
int rate4;
int bestrate;
int sortway;
};
int cmpway;
bool cmp(nation a,nation b)
{
if(cmpway==0) return a.id<b.id;
else if(cmpway==1)return a.gold>b.gold;
else if(cmpway==2) return a.all>b.all;
else if(cmpway==3) return a.gold/a.area>b.gold/b.area;
else if(cmpway==4) return a.all/a.area>b.all/b.area;
}
int main()
{
int n,m;
bool flag=0;
while(cin>>n>>m)
{
nation p[n];
vector<nation> vn;
double gold,all,area;
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf",&gold,&all,&area);
p[i].gold=gold;
p[i].all=all;
p[i].area=area;
p[i].id=i;
}
int temp;
for(int i=0;i<m;i++)
{
scanf("%d",&temp);
vn.push_back(p[temp]);
vn[i].id=i;
}
if(m>0)
{
cmpway=1;
sort(vn.begin(),vn.end(),cmp);
for(int i=0;i<m;i++)
{
vn[i].rate1=i;
}
for(int i=1;i<m;i++)
{
if(vn[i].gold==vn[i-1].gold) vn[i].rate1=vn[i-1].rate1;
}
cmpway=2;
sort(vn.begin(),vn.end(),cmp);
for(int i=0;i<m;i++)
{
vn[i].rate2=i;
}
for(int i=1;i<m;i++)
{
if(vn[i].all==vn[i-1].all) vn[i].rate2=vn[i-1].rate2;
}
cmpway=3;
sort(vn.begin(),vn.end(),cmp);
for(int i=0;i<m;i++)
{
vn[i].rate3=i;
}
for(int i=1;i<m;i++)
{
if(vn[i].gold/vn[i].area==vn[i-1].gold/vn[i-1].area) vn[i].rate3=vn[i-1].rate3;
}
cmpway=4;
sort(vn.begin(),vn.end(),cmp);
for(int i=0;i<m;i++)
{
vn[i].rate4=i;
}
for(int i=1;i<m;i++)
{
if(vn[i].all/vn[i].area==vn[i-1].all/vn[i-1].area) vn[i].rate4=vn[i-1].rate4;
}
cmpway=0;
sort(vn.begin(),vn.end(),cmp);
for(int i=0;i<m;i++)
{
vn[i].bestrate=vn[i].rate1;
vn[i].sortway=1;
if(vn[i].rate2<vn[i].bestrate)
{
vn[i].bestrate=vn[i].rate2;
vn[i].sortway=2;
}
if(vn[i].rate3<vn[i].bestrate)
{
vn[i].bestrate=vn[i].rate3;
vn[i].sortway=3;
}
if(vn[i].rate4<vn[i].bestrate)
{
vn[i].bestrate=vn[i].rate4;
vn[i].sortway=4;
}
}
for(int i=0;i<m;i++)
printf("%d:%d\n",vn[i].bestrate+1,vn[i].sortway);
}
cout<<endl;
}
}

80
HDOJ/3790_autoAC.cpp Normal file
View File

@ -0,0 +1,80 @@
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define INF 0x7fffffff
int n,m;
int map[1005][1005];
int cost[1005][1005];
void dijkstra(int st,int ed)
{
int i,j,v,Min;
int visit[1005],dis[1005],value[1005];
for(i=1;i<=n;i++)
{
dis[i]=map[st][i];
value[i]=cost[st][i];
}
memset(visit,0,sizeof(visit));
visit[st]=1;
for(i=1;i<n;i++)
{
Min=INF;
for(j=1;j<=n;j++)
if(!visit[j]&&dis[j]<Min)
{
v=j;
Min=dis[j];
}
visit[v]=1;
for(j=1;j<=n;j++)
{
if(!visit[j]&&map[v][j]<INF)
{
if(dis[j]>dis[v]+map[v][j])
{
dis[j]=dis[v]+map[v][j];
value[j]=value[v]+cost[v][j];
}
else if(dis[j]==dis[v]+map[v][j])
{
if(value[j]>value[v]+cost[v][j])
value[j]=value[v]+cost[v][j];
}
}
}
}
printf("%d %d\n",dis[ed],value[ed]);
}
int main()
{
int i,j,st,ed;
int a,b,c,d;
while(scanf("%d%d",&n,&m),n||m)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
map[i][j]=INF;
cost[i][j]=INF;
}
while(m--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if(map[a][b]>c)
{
map[a][b]=map[b][a]=c;
cost[a][b]=cost[b][a]=d;
}
else if(map[a][b]==c)
{
if(cost[a][b]>d)
cost[a][b]=cost[b][a]=d;
}
}
scanf("%d%d",&st,&ed);
dijkstra(st,ed);
}
return 0;
}

88
HDOJ/3791_autoAC.cpp Normal file
View File

@ -0,0 +1,88 @@
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *lc,*rc;
}node,*Link;
int n,f,c,cnt;
char f1[11],la1[11],f2[11],la2[11];
void insert( Link *L,int x )
{
if( *L )
{
if( x < ( *L ) -> data )
insert( &( *L ) -> lc , x );
else
insert( &( *L ) -> rc , x );
}
else
{
*L = new node;
( *L ) -> data = x;
( *L ) -> lc = ( *L ) -> rc = NULL;
}
}
void print1(Link L,char f[] )
{
if( L )
{
f[cnt++] = L ->data + '0';
print1( L -> lc ,f);
print1( L -> rc ,f);
}
}
void print2( Link L, char la[] )
{
if( L )
{
print2( L -> lc, la );
print2( L -> rc, la );
la[cnt++] = L -> data + '0' ;
}
}
int main( )
{
while( scanf( "%d",&n ),n )
{
f = 1;
Link L = NULL;
Link L1 = NULL;
char str[11];
scanf( "%s",str );
c = strlen( str );
for( int i = 0; i < c; ++i )
insert( &L , str[i] - '0' );
cnt = 0;
print1( L ,f1);
f1[cnt] = 0;
cnt = 0;
print2( L,la1 );
la1[cnt] = 0;
for( int i = 0; i < n; ++i )
{
f = 1;
memset( f2,0,sizeof( f2 ) );
memset( la2,0,sizeof( la2 ) );
scanf( "%s",str );
c = strlen( str );
for( int i = 0; i < c; ++i )
insert( &L1, str[i] - '0' );
cnt = 0;
print1( L1,f2 );
f2[cnt] = 0;
cnt = 0;
print2( L1,la2 );
la2[cnt] = 0;
if( strcmp( f1,f2 ) != 0 || strcmp( la1,la2 ) != 0 )
f = 0;
free( L1 );
L1 = NULL;
puts( f ? "YES" : "NO" );
}
free( L );
L = NULL;
}
return 0;
}

43
HDOJ/3792_autoAC.cpp Normal file
View File

@ -0,0 +1,43 @@
#include<stdio.h>
#include<math.h>
#include<string.h>
int vis[100000+100];
int prime[80000],c;
int a[100000+10];
void get_prime()
{
int i,j,n,m;
c=0;
n=100000;
m=(int)sqrt(n+0.5);
memset(vis,0,sizeof(vis));
for(i=2;i<=m;i++) if(!vis[i])
{
for(j=i*i;j<=n;j+=i) vis[j]=1;
}
}
int main()
{
int i,j,n,max;
get_prime();
n=0;
a[1]=0;a[0]=0;a[2]=0;a[3]=0;a[4]=0;
for(i=4;i<=100000;i++)
{
if(!vis[i]&&!vis[i-2])
{
n++;
}
a[i]=n;
}
while(i<=100000)
{
a[i++]=n;
}
while(scanf("%d",&n)!=EOF)
{
if(n<0) break;
printf("%d\n",a[n]);
}
return 0;
}

48
HDOJ/3793_autoAC.cpp Normal file
View File

@ -0,0 +1,48 @@
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "vector"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string.h"
using namespace std;
#define N 105
char str[N];
int Div(int s,int t)
{
int center=-2;
if(s==t)
center=-1;
bool flag=(t-s+1)%2;
while(t>s&&str[s]==str[t])
s++,t--;
if(s>t&&!flag)//even
center=-1;
else if(s==t&&flag)//odd
center=s;
return center;
}
int main()
{
int center1,center2,center;
while(cin>>str&&strcmp(str,"#")!=0)
{
int len=strlen(str);
bool flag=false;
for(int i=0;i<len;i++)
{
center1=Div(0,i);
center2=Div(i+1,len-1);
if(center1!=-2&&center2!=-2)
{
center=center1==-1?center2:center1;
cout<<"YES "<<center<<endl;
flag=true;
break;
}
}
if(!flag)
printf("NO\n");
}
}

34
HDOJ/3794_autoAC.cpp Normal file
View File

@ -0,0 +1,34 @@
#include "iostream"
#include "stdio.h"
#include "math.h"
#include "vector"
#include "queue"
#include "memory.h"
#include "algorithm"
#include "string.h"
using namespace std;
#define N 1000005
__int64 a1[N];
__int64 a2[N];
int main()
{
int n1,n2,i,j;
while(scanf("%d",&n1)!=EOF&&n1>=0)
{
for(i=0;i<n1;i++)
scanf("%I64d",&a1[i]);
scanf("%d",&n2);
for(i=0;i<n2;i++)
scanf("%I64d",&a2[i]);
sort(a1,a1+n1);
sort(a2,a2+n2);
i=0;
__int64 sum=0;
while(a1[i]<0&&a2[i]<0&&i<n1&&i<n2)
sum+=a1[i]*a2[i++];
i=n1-1,j=n2-1;
while(a1[i]>0&&a2[j]>0&&i>=0&&j>=0)
sum+=a1[i--]*a2[j--];
printf("%I64d\n",sum);
}
}