mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Powered By HC TECH : AutoACer Engine
3200-3299
This commit is contained in:
parent
da5da8ec9f
commit
5ed1cf19d0
33
HDOJ/3200_autoAC.cpp
Normal file
33
HDOJ/3200_autoAC.cpp
Normal file
|
@ -0,0 +1,33 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int MAX_N = 8, MAX_S = 1 << MAX_N;
|
||||
int n, m, t, dp[MAX_S][MAX_S];
|
||||
char g[MAX_N][MAX_N + 1];
|
||||
int main() {
|
||||
while (scanf("%d", &n) != EOF) {
|
||||
if (!n) break;
|
||||
for (int i = 0; i < n; i ++) {
|
||||
scanf("%s", g[i]);
|
||||
for (int j = 0; j < n; j ++) g[i][j] -= '0';
|
||||
}
|
||||
int upper = 1 << n, ans = 0;
|
||||
for (int i = 0; i < n; i ++) {
|
||||
memset(dp, 0, sizeof(dp));
|
||||
dp[1 << i][1 << i] = 1;
|
||||
for (int mask = 0; mask < upper; mask ++)
|
||||
for (int s = mask; s; s = (s - 1) & mask)
|
||||
for (int u = 0; u < n; u ++) if (mask & (1 << u))
|
||||
for (int v = 0; v < n; v ++) if ((mask & (1 << v)) == 0 && g[u][v]) {
|
||||
int m1 = mask | (1 << v);
|
||||
int m2 = (s | (1 << v)) & (~(1 << u));
|
||||
if (((1 << (v + 1)) - 1) >= m2) dp[m1][m2] += dp[mask][s];
|
||||
}
|
||||
for (int s = 0; s < upper; s ++) ans += dp[upper - 1][s];
|
||||
}
|
||||
printf("%d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
14
HDOJ/3201_autoAC.cpp
Normal file
14
HDOJ/3201_autoAC.cpp
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#define PI 3.1415926
|
||||
int main()
|
||||
{
|
||||
int L;
|
||||
while((scanf("%d",&L)!=EOF)&&(L!=0))
|
||||
{
|
||||
printf("%.2lf\n",((L*L)/PI)/2.0);
|
||||
}
|
||||
return (0);
|
||||
}
|
34
HDOJ/3203_autoAC.cpp
Normal file
34
HDOJ/3203_autoAC.cpp
Normal file
|
@ -0,0 +1,34 @@
|
|||
#include <stdio.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <queue>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
const int MAXN = 100005;
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
double a, p, b;
|
||||
double f0, f1, p0, p1;
|
||||
while (scanf("%d%lf%lf%lf", &n, &p, &a, &b))
|
||||
{
|
||||
if (n==0 && a==0 && p==0 && b==0) break;
|
||||
p /= 100.0;
|
||||
f0 = min(a, b);
|
||||
f1 = 0.0;
|
||||
for (int i = 1; i< n; ++i)
|
||||
{
|
||||
p0 = min(f0+b, a+p*f0+(1.0-p)*f1);
|
||||
p1 = p*f0+(1.0-p)*f1;
|
||||
f0 = p0;
|
||||
f1 = p1;
|
||||
}
|
||||
printf("%.4lf\n", f1);
|
||||
}
|
||||
return 0;
|
||||
}
|
105
HDOJ/3205_autoAC.cpp
Normal file
105
HDOJ/3205_autoAC.cpp
Normal file
|
@ -0,0 +1,105 @@
|
|||
#include<cstdio>
|
||||
#include<cstdlib>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<vector>
|
||||
#include<map>
|
||||
#include<set>
|
||||
#include<utility>
|
||||
using namespace std;
|
||||
map<int,int> tmp;
|
||||
set<map<int,int> > ans[1010];
|
||||
int a[1010],b[1010],c[1010];
|
||||
bool cmp(vector<pair<int,int> > A,vector<pair<int,int> > B)
|
||||
{
|
||||
vector<pair<int,int> >::reverse_iterator pA=A.rbegin(),pB=B.rbegin();
|
||||
while (1)
|
||||
{
|
||||
if (pA->first<pB->first) return true;
|
||||
if (pA->first>pB->first) return false;
|
||||
if (abs(pA->second)<abs(pB->second)) return true;
|
||||
if (abs(pA->second)>abs(pB->second)) return false;
|
||||
if (pA->second<pB->second) return true;
|
||||
if (pA->second>pB->second) return false;
|
||||
++pA;++pB;
|
||||
}
|
||||
}
|
||||
void init()
|
||||
{
|
||||
tmp[1]=1;
|
||||
tmp[0]=-1;
|
||||
ans[1].insert(tmp);
|
||||
for (int i=2;i<=1001;++i)
|
||||
{
|
||||
for (int j=1;j<i;++j)
|
||||
if (i%j==0)
|
||||
for (set<map<int,int> >::iterator p=ans[j].begin();p!=ans[j].end();++p)
|
||||
ans[i].insert(*p);
|
||||
for (int j=0;j<=i;++j) a[j]=0;
|
||||
a[i]=1;
|
||||
a[0]=-1;
|
||||
for (set<map<int,int> >::iterator p=ans[i].begin();p!=ans[i].end();++p)
|
||||
{
|
||||
for (int j=0;j<=i;++j) b[j]=c[j]=0;
|
||||
for (std::_Rb_tree_const_iterator<std::pair<const int, int> > it=p->begin();it!=p->end();++it)
|
||||
b[it->first]=it->second;
|
||||
int get=0;
|
||||
for (int j=0;j<=i;++j) if (b[j]) get=j;
|
||||
for (int j=i;j>=0;--j)
|
||||
if (a[j])
|
||||
{
|
||||
c[j-get]=a[j];
|
||||
for (int k=get;k>=0;--k)
|
||||
a[j-get+k]-=c[j-get]*b[k];
|
||||
}
|
||||
for (int j=i;j>=0;--j) a[j]=c[j];
|
||||
}
|
||||
tmp.clear();
|
||||
for (int j=i;j>=0;--j)
|
||||
if (a[j]) tmp[j]=a[j];
|
||||
ans[i].insert(tmp);
|
||||
}
|
||||
}
|
||||
void work()
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
int n;
|
||||
scanf("%d",&n);
|
||||
if (!n) return;
|
||||
vector<vector<pair<int,int> > > v;
|
||||
v.clear();
|
||||
vector<pair<int,int> > w;
|
||||
for (set<map<int,int> >::iterator p=ans[n].begin();p!=ans[n].end();++p)
|
||||
{
|
||||
w.clear();
|
||||
for (std::_Rb_tree_const_iterator<std::pair<const int, int> > it=p->begin();it!=p->end();++it)
|
||||
w.push_back(make_pair(it->first,it->second));
|
||||
v.push_back(w);
|
||||
}
|
||||
sort(v.begin(),v.end(),cmp);
|
||||
for (vector<vector<pair<int,int> > >::iterator p=v.begin();p!=v.end();++p)
|
||||
{
|
||||
w=*p;
|
||||
putchar('(');
|
||||
int flag=0;
|
||||
for (vector<pair<int,int> >::reverse_iterator it=w.rbegin();it!=w.rend();++it)
|
||||
{
|
||||
if (flag) putchar((it->second>0)?'+':'-');
|
||||
it->second=abs(it->second);
|
||||
if (it->first==0) printf("%d",it->second);
|
||||
else if (it->first==1) (it->second==1)?putchar('x'):printf("%dx",it->second);
|
||||
else (it->second==1)?printf("x^%d",it->first):printf("%dx^%d",it->second,it->first);
|
||||
flag=1;
|
||||
}
|
||||
putchar(')');
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
work();
|
||||
return 0;
|
||||
}
|
8
HDOJ/3206_autoAC.cpp
Normal file
8
HDOJ/3206_autoAC.cpp
Normal file
|
@ -0,0 +1,8 @@
|
|||
........
|
||||
........
|
||||
........
|
||||
........
|
||||
........
|
||||
..43366.
|
||||
..121556
|
||||
44212335
|
182
HDOJ/3207_autoAC.cpp
Normal file
182
HDOJ/3207_autoAC.cpp
Normal file
|
@ -0,0 +1,182 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cstdlib>
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
#define lson l, m, rt << 1
|
||||
#define rson m + 1, r, rt << 1 | 1
|
||||
const int maxn = 100001;
|
||||
const int segCnt = 400;
|
||||
const int inf = 0x7f7f7f7f;
|
||||
int INIT, segLen = segCnt;
|
||||
struct Segment {
|
||||
int e[segCnt];
|
||||
int Min;
|
||||
int add;
|
||||
int addTo;
|
||||
int lowest;
|
||||
void init() {
|
||||
Min = INIT;
|
||||
for (int i = 0; i < segLen; i++) {
|
||||
e[i] = INIT;
|
||||
}
|
||||
add = addTo = lowest = 0;
|
||||
}
|
||||
void update() {
|
||||
Min = inf;
|
||||
for (int i = 0; i < segLen; i++) {
|
||||
if (e[i] <= abs(lowest)) e[i] = 0;
|
||||
if (e[i]) {
|
||||
e[i] += add;
|
||||
e[i] = max(e[i], addTo);
|
||||
}
|
||||
Min = min(Min, e[i]);
|
||||
}
|
||||
add = addTo = lowest = 0;
|
||||
}
|
||||
void Add(int l, int r, int d) {
|
||||
for (int i = l; i <= r; i++) {
|
||||
if (e[i]) {
|
||||
e[i] = max(e[i] + d, 0);
|
||||
}
|
||||
}
|
||||
Min = inf;
|
||||
for (int i = 0; i < segLen; i++) {
|
||||
Min = min(Min, e[i]);
|
||||
}
|
||||
}
|
||||
void AddTo(int l, int r, int d) {
|
||||
for (int i = l; i <= r; i++) {
|
||||
if (e[i]) {
|
||||
e[i] = max(e[i], d);
|
||||
}
|
||||
}
|
||||
Min = inf;
|
||||
for (int i = 0; i < segLen; i++) {
|
||||
Min = min(Min, e[i]);
|
||||
}
|
||||
}
|
||||
void show() {
|
||||
puts("Elements: ");
|
||||
for (int i = 0; i < segLen; i++) {
|
||||
printf(" %d", e[i]);
|
||||
}
|
||||
puts("");
|
||||
printf("min %d add %d addto %d lowest %d\n", Min, add, addTo, lowest);
|
||||
puts("~~~");
|
||||
}
|
||||
} seg[segCnt];
|
||||
bool noBreak(int _l, int _r) {
|
||||
int segL = _l / segLen, segR = _r / segLen;
|
||||
int restL = _l % segLen, restR = _r % segLen;
|
||||
if (segL != segR) {
|
||||
seg[segL].update();
|
||||
seg[segR].update();
|
||||
for (int i = restL; i < segLen; i++) {
|
||||
if (!seg[segL].e[i]) return false;
|
||||
}
|
||||
for (int i = 0; i <= restR; i++) {
|
||||
if (!seg[segR].e[i]) return false;
|
||||
}
|
||||
for (int i = segL + 1; i < segR; i++) {
|
||||
if (!seg[i].Min) return false;
|
||||
}
|
||||
} else {
|
||||
seg[segL].update();
|
||||
for (int i = restL; i <= restR; i++) {
|
||||
if (!seg[segL].e[i]) return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
void Add(int _l, int _r, int _d) {
|
||||
int segL = _l / segLen, segR = _r / segLen;
|
||||
int restL = _l % segLen, restR = _r % segLen;
|
||||
if (segL != segR) {
|
||||
seg[segL].update();
|
||||
seg[segR].update();
|
||||
seg[segL].Add(restL, segLen - 1, _d);
|
||||
seg[segR].Add(0, restR, _d);
|
||||
for (int i = segL + 1; i < segR; i++) {
|
||||
seg[i].add += _d;
|
||||
if (seg[i].Min) seg[i].Min += _d;
|
||||
if (seg[i].addTo) seg[i].addTo += _d;
|
||||
}
|
||||
} else {
|
||||
seg[segL].update();
|
||||
seg[segL].Add(restL, restR, _d);
|
||||
}
|
||||
}
|
||||
bool Sub(int _l, int _r, int _d) {
|
||||
if (noBreak(_l, _r)) {
|
||||
int segL = _l / segLen, segR = _r / segLen;
|
||||
int restL = _l % segLen, restR = _r % segLen;
|
||||
if (segL != segR) {
|
||||
seg[segL].update();
|
||||
seg[segR].update();
|
||||
seg[segL].Add(restL, segLen - 1, -_d);
|
||||
seg[segR].Add(0, restR, -_d);
|
||||
for (int i = segL + 1; i < segR; i++) {
|
||||
seg[i].add -= _d;
|
||||
seg[i].addTo = max(seg[i].addTo - _d, 0);
|
||||
seg[i].Min = max(seg[i].Min - _d, 0);
|
||||
if (!seg[i].addTo) seg[i].lowest = min(seg[i].lowest, seg[i].add);
|
||||
}
|
||||
} else {
|
||||
seg[segL].update();
|
||||
seg[segL].Add(restL, restR, -_d);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
void AddTo(int _l, int _r, int _d) {
|
||||
int segL = _l / segLen, segR = _r / segLen;
|
||||
int restL = _l % segLen, restR = _r % segLen;
|
||||
if (segL != segR) {
|
||||
seg[segL].update();
|
||||
seg[segR].update();
|
||||
seg[segL].AddTo(restL, segLen - 1, _d);
|
||||
seg[segR].AddTo(0, restR, _d);
|
||||
for (int i = segL + 1; i < segR; i++) {
|
||||
if (seg[i].Min < _d && seg[i].addTo < _d) {
|
||||
seg[i].addTo = _d;
|
||||
if (seg[i].Min) seg[i].Min = _d;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
seg[segL].update();
|
||||
seg[segL].AddTo(restL, restR, _d);
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
int N, M;
|
||||
while (~scanf("%d%d%d", &N, &M, &INIT) && (N + M + INIT)) {
|
||||
segLen = (int)sqrt((double) N) + 1;
|
||||
int op, a, b, c;
|
||||
int cnt = 0;
|
||||
for (int i = 0; i < segLen; i++) {
|
||||
seg[i].init();
|
||||
}
|
||||
for (int i = 1; i <= M; i++) {
|
||||
scanf("%d%d%d%d", &op, &a, &b, &c);
|
||||
switch (op) {
|
||||
case 1 :
|
||||
if (Sub(a, b, c)) {
|
||||
cnt++;
|
||||
}
|
||||
break;
|
||||
case 2 :
|
||||
Add(a, b, c);
|
||||
break;
|
||||
case 3 :
|
||||
AddTo(a, b, c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
printf("%d\n", cnt);
|
||||
}
|
||||
return 0;
|
||||
}
|
75
HDOJ/3208_autoAC.cpp
Normal file
75
HDOJ/3208_autoAC.cpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<math.h>
|
||||
#include<iostream>
|
||||
#define ll __int64
|
||||
#define inf (ll) 1e18+300
|
||||
#define eps 1e-9
|
||||
using namespace std;
|
||||
ll why=(ll)1<<31;
|
||||
ll num[100];
|
||||
ll quickpow(ll m,int n)
|
||||
{
|
||||
ll b=1;int k=n;
|
||||
while (n>0)
|
||||
{
|
||||
if (n&1)
|
||||
{
|
||||
double judge=1.0*(inf)/b;
|
||||
if (judge<m) return -1;
|
||||
b*=m;
|
||||
}
|
||||
n=n>>1;
|
||||
if (m>why&&n>0) return -1;
|
||||
m=m*m;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
ll find(ll x,int k)
|
||||
{
|
||||
ll l=1,r=(ll)pow(x,1.0/k);
|
||||
ll tt,pp,qq;
|
||||
pp=quickpow(r,k);
|
||||
if (pp==x) return r;
|
||||
if (pp>x||pp==-1) --r;
|
||||
else
|
||||
{
|
||||
tt=quickpow(r+1,k);
|
||||
if (tt!=-1&&tt<=x) ++r;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
ll f(ll x)
|
||||
{
|
||||
int i,j,k;
|
||||
ll ans=0;
|
||||
if (x<=3) return x;
|
||||
memset(num,0,sizeof(num));
|
||||
num[1]=x;
|
||||
for (i=2;i<63;++i)
|
||||
{
|
||||
num[i]=find(x,i)-1;
|
||||
if (!num[i]) break;
|
||||
}
|
||||
k=i;
|
||||
for (i=k-1;i>0;--i)
|
||||
{
|
||||
for (j=1;j<i;++j)
|
||||
if (i%j==0) num[j]-=num[i];
|
||||
}
|
||||
ans=num[1];
|
||||
for (i=2;i<k;++i)
|
||||
{
|
||||
ans+=(i*num[i]);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main ()
|
||||
{
|
||||
ll a,b;
|
||||
while (scanf("%I64d%I64d",&a,&b)&&(a+b))
|
||||
{
|
||||
printf("%I64d\n",f(b)-f(a-1));
|
||||
}
|
||||
return 0;
|
||||
}
|
48
HDOJ/3209_autoAC.cpp
Normal file
48
HDOJ/3209_autoAC.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const double PI = acos(-1.0);
|
||||
int l1, l2, l3, m1, m2, m3;
|
||||
int hh, mm, ss;
|
||||
int st, ed;
|
||||
struct point_t {
|
||||
double x, y;
|
||||
point_t() {}
|
||||
point_t(double _x, double _y) { x = _x, y = _y; }
|
||||
};
|
||||
double dist(const point_t &a, const point_t &b) {
|
||||
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
|
||||
}
|
||||
point_t calc(int t) {
|
||||
double a = 2.0 * PI * t / 43200.0;
|
||||
double b = 2.0 * PI * t / 3600.0;
|
||||
double c = 2.0 * PI * t / 60.0;
|
||||
double ra = m1 * 1.0 / (m1 + m2 + m3);
|
||||
double rb = m2 * 1.0 / (m1 + m2 + m3);
|
||||
double rc = m3 * 1.0 / (m1 + m2 + m3);
|
||||
point_ A(l1 * ra * cos(a), l1 * ra * sin(a));
|
||||
point_ B(l2 * rb * cos(b), l2 * rb * sin(b));
|
||||
point_ C(l3 * rc * cos(c), l3 * rc * sin(c));
|
||||
return point_t(A.x + B.x + C.x, A.y + B.y + C.y);
|
||||
}
|
||||
int main() {
|
||||
while (scanf("%d", &l1) != EOF && l1 != -1) {
|
||||
scanf("%d%d%d%d%d", &l2, &l3, &m1, &m2, &m3);
|
||||
scanf("%d:%d:%d", &hh, &mm, &ss);
|
||||
st = hh * 3600 + mm * 60 + ss;
|
||||
scanf("%d:%d:%d", &hh, &mm, &ss);
|
||||
ed = hh * 3600 + mm * 60 + ss;
|
||||
double ans = 0.0;
|
||||
point_t pre = calc(st);
|
||||
for (int t = st + 1; t <= ed; t ++) {
|
||||
point_t now = calc(t);
|
||||
ans += dist(pre, now);
|
||||
pre = now;
|
||||
}
|
||||
printf("%.2lf\n", ans * 0.5);
|
||||
}
|
||||
return 0;
|
||||
}
|
112
HDOJ/3212_autoAC.cpp
Normal file
112
HDOJ/3212_autoAC.cpp
Normal file
|
@ -0,0 +1,112 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
#define maxn 105
|
||||
#define type int
|
||||
const int inf = ~0u >> 1;
|
||||
struct edge
|
||||
{
|
||||
int u,v;
|
||||
type cost;
|
||||
edge(){}
|
||||
edge(int _u,int _v,type _c):u(_u),v(_v),cost(_c){}
|
||||
}e[maxn * maxn];
|
||||
int pre[maxn],id[maxn],vis[maxn];
|
||||
type in[maxn];
|
||||
type dirmst(int root,int nv,int ne)
|
||||
{
|
||||
type ret = 0;
|
||||
while(1)
|
||||
{
|
||||
fill(in,in + nv,inf);
|
||||
for(int i = 0;i < ne;i++)
|
||||
{
|
||||
int u = e[i].u;
|
||||
int v = e[i].v;
|
||||
if(e[i].cost < in[v] && u != v)
|
||||
{
|
||||
pre[v] = u;
|
||||
in[v] = e[i].cost;
|
||||
}
|
||||
}
|
||||
for(int i = 0;i < nv;i++)
|
||||
{
|
||||
if(i == root)
|
||||
continue;
|
||||
if(in[i] == inf)
|
||||
return -1;
|
||||
}
|
||||
int cntnode = 0;
|
||||
fill(id,id + nv,-1);
|
||||
fill(vis,vis + nv,-1);
|
||||
in[root] = 0;
|
||||
for(int i = 0;i < nv;i++)
|
||||
{
|
||||
ret += in[i];
|
||||
int v = i;
|
||||
while(vis[v] != i && id[v] == -1 && v != root)
|
||||
{
|
||||
vis[v] = i;
|
||||
v = pre[v];
|
||||
}
|
||||
if(v != root && id[v] == -1)
|
||||
{
|
||||
for(int u = pre[v]; u != v;u = pre[u])
|
||||
id[u] = cntnode;
|
||||
id[v] = cntnode++;
|
||||
}
|
||||
}
|
||||
if(cntnode == 0)
|
||||
break;
|
||||
for(int i = 0;i < nv;i++)
|
||||
if(id[i] == -1)
|
||||
id[i] = cntnode++;
|
||||
for(int i = 0;i < ne;i++)
|
||||
{
|
||||
int v = e[i].v;
|
||||
e[i].u = id[e[i].u];
|
||||
e[i].v = id[e[i].v];
|
||||
if(e[i].u != e[i].v)
|
||||
e[i].cost -= in[v];
|
||||
}
|
||||
nv = cntnode;
|
||||
root = id[root];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while(scanf("%d",&n) == 1 && n)
|
||||
{
|
||||
map <string,int> M;
|
||||
M["THE_WINDY"] = 2;
|
||||
int cnt = 3;
|
||||
string a,b;
|
||||
int w1,w2;
|
||||
int m = 0;
|
||||
int tot = 0;
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
cin >> a >> w1 >> b >> w2;
|
||||
if(M[a] == 0)
|
||||
M[a] = cnt++;
|
||||
if(M[b] == 0)
|
||||
M[b] = cnt++;
|
||||
e[m++] = edge(1,M[a],w1);
|
||||
tot += w1;
|
||||
if(M[a] != M[b])
|
||||
{
|
||||
e[m++] = edge(M[b],M[a],w2);
|
||||
tot += w2;
|
||||
}
|
||||
}
|
||||
e[m++] = edge(0,1,tot + 1);
|
||||
e[m++] = edge(0,2,tot + 1);
|
||||
int ans = dirmst(0,cnt,m);
|
||||
printf("%d\n",ans - (tot + 1) * 2);
|
||||
}
|
||||
}
|
55
HDOJ/3213_autoAC.cpp
Normal file
55
HDOJ/3213_autoAC.cpp
Normal file
|
@ -0,0 +1,55 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int N=1000;
|
||||
int a1[N],p1[N],a2[N],p2[N],res[N],a[N],b[N];
|
||||
int m;
|
||||
void dp(int k)
|
||||
{
|
||||
int i,j;
|
||||
memset(res,-1,sizeof(res));
|
||||
res[0]=0;
|
||||
while (k>0)
|
||||
{
|
||||
if (k&1)
|
||||
{
|
||||
for (i=0; i<=m; i++) b[i]=res[i];
|
||||
memset(res,-1,sizeof(res));
|
||||
for (i=0; i<=m; i++)
|
||||
for (j=0; j<=i; j++)
|
||||
if (b[j]>-1 && a[i-j]>-1)
|
||||
res[i]=max(res[i],b[j]+a[i-j]);
|
||||
}
|
||||
for (i=0; i<=m; i++) b[i]=a[i];
|
||||
memset(a,-1,sizeof(a));
|
||||
for (i=0; i<=m; i++)
|
||||
for (j=0; j<=i/2; j++)
|
||||
if (b[j]>-1 && b[i-j]>-1)
|
||||
a[i]=max(a[i],b[j]+b[i-j]);
|
||||
k>>=1;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,n1,n2,i,j,ans;
|
||||
while (scanf("%d%d",&n,&m)==2)
|
||||
{
|
||||
if (n==0 && m==0) break;
|
||||
scanf("%d",&n1);
|
||||
for (i=1; i<=n1; i++) scanf("%d%d",&a1[i],&p1[i]);
|
||||
scanf("%d",&n2);
|
||||
for (i=1; i<=n2; i++) scanf("%d%d",&a2[i],&p2[i]);
|
||||
memset(a,-1,sizeof(a));
|
||||
for (i=1; i<=n1; i++)
|
||||
for (j=1; j<=n2; j++)
|
||||
if (a1[i]+a2[j]<=m)
|
||||
a[a1[i]+a2[j]]=max(a[a1[i]+a2[j]],p1[i]+p2[j]);
|
||||
dp(n);
|
||||
ans=0;
|
||||
for (i=0; i<=m; i++) ans=max(ans,res[i]);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
}
|
140
HDOJ/3215_autoAC.cpp
Normal file
140
HDOJ/3215_autoAC.cpp
Normal file
|
@ -0,0 +1,140 @@
|
|||
#include<stdio.h>
|
||||
#include<math.h>
|
||||
#include<string.h>
|
||||
#define eps 1e-12
|
||||
int ans[10005][10];
|
||||
void init()
|
||||
{
|
||||
double t,x,a;
|
||||
int i,k;
|
||||
ans[0][1]=1;
|
||||
for(i=1;i<=10000;i++)
|
||||
{
|
||||
x=(double)i;
|
||||
t=x*log10(2.0)-floor(x*log10(2.0));
|
||||
a=pow(10.0,t);
|
||||
k=(int)(a+eps);
|
||||
if(k==1)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1]+1;
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==2)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2]+1;
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==3)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3]+1;
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==4)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4]+1;
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==5)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5]+1;
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==6)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6]+1;
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==7)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7]+1;
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==8)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8]+1;
|
||||
ans[i][9]=ans[i-1][9];
|
||||
}
|
||||
if(k==9)
|
||||
{
|
||||
ans[i][1]=ans[i-1][1];
|
||||
ans[i][2]=ans[i-1][2];
|
||||
ans[i][3]=ans[i-1][3];
|
||||
ans[i][4]=ans[i-1][4];
|
||||
ans[i][5]=ans[i-1][5];
|
||||
ans[i][6]=ans[i-1][6];
|
||||
ans[i][7]=ans[i-1][7];
|
||||
ans[i][8]=ans[i-1][8];
|
||||
ans[i][9]=ans[i-1][9]+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
int n,i;
|
||||
while(scanf("%d",&n)!=EOF)
|
||||
{
|
||||
if(n==-1)
|
||||
break;
|
||||
for(i=1;i<9;i++)
|
||||
printf("%d ",ans[n][i]);
|
||||
printf("%d\n",ans[n][9]);
|
||||
}
|
||||
return 0;
|
||||
}
|
30
HDOJ/3217_autoAC.cpp
Normal file
30
HDOJ/3217_autoAC.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
#define maxn 18
|
||||
int dp[maxn][1<<18];
|
||||
int N, M, s, v;
|
||||
int main(){
|
||||
while(scanf("%d", &N) && N){
|
||||
scanf("%d", &M);
|
||||
memset(dp, 0, sizeof(dp));
|
||||
for(int i = 1; i <= M; i++){
|
||||
scanf("%d%d", &s, &v);
|
||||
dp[0][s] = v;
|
||||
}
|
||||
for(int i = 1; i <= N; i++){
|
||||
for(int sta = 0; sta < (1<<N); sta++ ){
|
||||
if(sta & 1<<(i-1)) dp[i][sta] = dp[i-1][sta] + dp[i-1][sta-(1<<(i-1))];
|
||||
else dp[i][sta] = dp[i-1][sta];
|
||||
}
|
||||
}
|
||||
int max = -9999;
|
||||
for(int sta = 0; sta < (1<<N); sta++){
|
||||
if(dp[N][sta] > max) max = dp[N][sta];
|
||||
}
|
||||
printf("%d\n", max);
|
||||
}
|
||||
return 0;
|
||||
}
|
54
HDOJ/3219_autoAC.cpp
Normal file
54
HDOJ/3219_autoAC.cpp
Normal file
|
@ -0,0 +1,54 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
using namespace std;
|
||||
int zhengc[101],yanchi[101];
|
||||
int times[101],timee[101];
|
||||
int ts,te;
|
||||
int main(){
|
||||
int n;
|
||||
while(scanf("%d",&n)&&n){
|
||||
int a,b,c,d,i;
|
||||
for(i=1;i<=n;i++){
|
||||
scanf("%d%d",&zhengc[i],&yanchi[i]);
|
||||
yanchi[i]+=zhengc[i];
|
||||
scanf("%d:%d %d:%d",&a,&b,&c,&d);
|
||||
times[i]=a*60+b;
|
||||
timee[i]=c*60+d;
|
||||
}
|
||||
scanf("%d:%d %d:%d",&a,&b,&c,&d);
|
||||
ts=a*60+b;
|
||||
te=c*60+d;
|
||||
bool mark=true;
|
||||
int tt;
|
||||
for(i=1;i<=n;i++){
|
||||
tt=ts+zhengc[i];
|
||||
if(tt>=1440){
|
||||
mark=false;
|
||||
break;
|
||||
}
|
||||
if(tt<=times[i] || ts>=timee[i]){
|
||||
ts+=zhengc[i];
|
||||
if(ts>=te || ts>=1440){
|
||||
mark=false;
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
ts+=yanchi[i];
|
||||
if(ts>=te || ts>=1440){
|
||||
mark=false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(mark){
|
||||
if(ts<te){
|
||||
printf("Lucky YY!\n");
|
||||
}else{
|
||||
printf("Poor YY!\n");
|
||||
}
|
||||
}else{
|
||||
printf("Poor YY!\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
82
HDOJ/3220_autoAC.cpp
Normal file
82
HDOJ/3220_autoAC.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
const int MAX=1<<17;
|
||||
const int x[32]={0,1,3,11,10,8,10,2,8,9,9,0,0,1,3,11,10,8,9,2,12,13,13,4,14,6,12,4,5,7,15,14};
|
||||
const int y[32]={1,3,11,10,8,0,2,3,9,1,11,2,4,5,7,15,14,12,13,6,13,5,15,6,6,7,4,5,7,15,14,12};
|
||||
const int aim=((1<<8)-1);
|
||||
int dist[MAX];
|
||||
struct Node
|
||||
{
|
||||
int st;
|
||||
int depth;
|
||||
};
|
||||
int has(const int& st,const int& op)
|
||||
{
|
||||
return st^((1<<(15-x[op]))|(1<<(15-y[op])));
|
||||
}
|
||||
void bfs()
|
||||
{
|
||||
Node node,next;
|
||||
queue<Node> q;
|
||||
node.st=aim;
|
||||
node.depth=0;
|
||||
dist[aim]=0;
|
||||
q.push(node);
|
||||
while(!q.empty())
|
||||
{
|
||||
node=q.front();
|
||||
q.pop();
|
||||
if(node.depth>3)
|
||||
break;
|
||||
next.depth=node.depth+1;
|
||||
for(int i=0;i<32;i++)
|
||||
{
|
||||
if((node.st&(1<<(15-x[i])))!=(node.st&(1<<(15-y[i]))))
|
||||
{
|
||||
next.st=has(node.st,i);
|
||||
if(dist[next.st]==1000)
|
||||
{
|
||||
dist[next.st]=next.depth;
|
||||
q.push(next);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,cnt=0;
|
||||
int a;
|
||||
int st;
|
||||
for(int i=0;i<MAX;i++)
|
||||
{
|
||||
dist[i]=1000;
|
||||
}
|
||||
bfs();
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
cnt++;
|
||||
st=0;
|
||||
for(int i=0;i<16;i++)
|
||||
{
|
||||
scanf("%d",&a);
|
||||
if(a==1)
|
||||
st|=(1<<(15-i));
|
||||
}
|
||||
a=dist[st];
|
||||
if(a>3)
|
||||
{
|
||||
printf("Case #%d: more\n",cnt);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Case #%d: %d\n",cnt,a);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
117
HDOJ/3221_autoAC.cpp
Normal file
117
HDOJ/3221_autoAC.cpp
Normal file
|
@ -0,0 +1,117 @@
|
|||
# include<stdio.h>
|
||||
# include<string.h>
|
||||
# include<stdlib.h>
|
||||
# define N 1000005
|
||||
int visit[N],prime[N],K;
|
||||
__int64 P,Phi;
|
||||
struct matrix{
|
||||
__int64 A[2][2];
|
||||
};
|
||||
void intt()
|
||||
{
|
||||
int i,j;
|
||||
memset(visit,0,sizeof(visit));
|
||||
for(i=2;i<=1000;i++)
|
||||
{
|
||||
if(visit[i]==0)
|
||||
{
|
||||
for(j=i+i;j<=1000000;j+=i)
|
||||
{
|
||||
visit[j]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
K=0;
|
||||
for(j=2;j<=1000000;j++)
|
||||
if(visit[j]==0) prime[++K]=j;
|
||||
}
|
||||
matrix power(matrix ans1,matrix ans2)
|
||||
{
|
||||
int i,j,k;
|
||||
matrix ans;
|
||||
for(i=0;i<=1;i++)
|
||||
{
|
||||
for(j=0;j<=1;j++)
|
||||
{
|
||||
ans.A[i][j]=0;
|
||||
for(k=0;k<=1;k++)
|
||||
{
|
||||
ans.A[i][j]+=ans1.A[i][k]*ans2.A[k][j];
|
||||
if(ans.A[i][j]>Phi)
|
||||
{
|
||||
ans.A[i][j]=ans.A[i][j]%Phi+Phi;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
matrix mod(matrix un,__int64 k)
|
||||
{
|
||||
matrix ans;
|
||||
ans.A[0][0]=1;
|
||||
ans.A[0][1]=0;
|
||||
ans.A[1][0]=0;
|
||||
ans.A[1][1]=1;
|
||||
while(k)
|
||||
{
|
||||
if(k%2) ans=power(ans,un);
|
||||
un=power(un,un);
|
||||
k/=2;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
__int64 mod1(__int64 a,__int64 k)
|
||||
{
|
||||
__int64 ans;
|
||||
ans=1;
|
||||
while(k)
|
||||
{
|
||||
if(k%2)
|
||||
{
|
||||
ans=ans*a;
|
||||
ans%=P;
|
||||
}
|
||||
a=a*a;
|
||||
a%=P;
|
||||
k/=2;
|
||||
}
|
||||
return ans%P;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,ncase,t;
|
||||
__int64 a,b,aa,bb,n,num,num1,num2;
|
||||
matrix init,ans;
|
||||
intt();
|
||||
scanf("%d",&ncase);
|
||||
for(t=1;t<=ncase;t++)
|
||||
{
|
||||
scanf("%I64d%I64d%I64d%I64d",&a,&b,&P,&n);
|
||||
printf("Case #%d: ",t);
|
||||
if(n==1) {printf("%I64d\n",a%P);continue;}
|
||||
else if(n==2) {printf("%I64d\n",b%P); continue;}
|
||||
else if(n==3) {printf("%I64d\n",a*b%P);continue;}
|
||||
if(P==1) {printf("0\n");continue;}
|
||||
init.A[0][0]=0;
|
||||
init.A[0][1]=1;
|
||||
init.A[1][0]=1;
|
||||
init.A[1][1]=1;
|
||||
Phi=1;
|
||||
num=P;
|
||||
for(i=1;i<=K;i++)
|
||||
{
|
||||
if(prime[i]>P) break;
|
||||
if(P%prime[i]==0) {Phi*=(prime[i]-1);num/=prime[i];}
|
||||
}
|
||||
Phi*=num;
|
||||
ans=mod(init,n-3);
|
||||
num1=ans.A[1][1];
|
||||
num2=ans.A[0][1]+ans.A[1][1];
|
||||
if(num2>Phi) num2=num2%Phi+Phi;
|
||||
aa=mod1(a,num1);
|
||||
bb=mod1(b,num2);
|
||||
printf("%I64d\n",aa*bb%P);
|
||||
}
|
||||
return 0;
|
||||
}
|
128
HDOJ/3223_autoAC.cpp
Normal file
128
HDOJ/3223_autoAC.cpp
Normal file
|
@ -0,0 +1,128 @@
|
|||
#include<cstdio>
|
||||
#include<vector>
|
||||
#include<cmath>
|
||||
#include<map>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
ll pow(ll a,ll b,ll mod){
|
||||
ll as=1;
|
||||
while(b){
|
||||
if(b&1)as=as*a%mod;
|
||||
b>>=1; a=a*a%mod;
|
||||
}
|
||||
return as;
|
||||
}
|
||||
vector<ll>as,f;
|
||||
ll gcd(ll a,ll b,ll& x,ll& y){
|
||||
if(b==0){
|
||||
x=1;y=0;
|
||||
return a;
|
||||
}
|
||||
else{
|
||||
ll r=gcd(b,a%b,y,x);
|
||||
y-=a/b*x;
|
||||
return r;
|
||||
}
|
||||
}
|
||||
void moxianxing(ll a,ll b,ll n){
|
||||
ll x,y;
|
||||
ll d=gcd(a,n,x,y);
|
||||
as.clear();
|
||||
if(b%d==0){
|
||||
x%=n;x+=n;x%=n;
|
||||
as.push_back(x*(b/d)%(n/d));
|
||||
for(ll i=1;i<d;i++)
|
||||
as.push_back((as[0]+i*n/d)%n);
|
||||
}
|
||||
}
|
||||
bool gtest(ll g,ll p){
|
||||
for(int i=0;i<f.size();i++)
|
||||
if(pow(g,(p-1)/f[i],p)==1)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
ll gen(ll p){
|
||||
ll tmp=p-1;
|
||||
f.clear();
|
||||
for(ll i=2;i<=tmp/i;i++)
|
||||
if(tmp%i==0){
|
||||
f.push_back(i);
|
||||
while(tmp%i==0)
|
||||
tmp/=i;
|
||||
}
|
||||
if(tmp!=1)f.push_back(tmp);
|
||||
ll g=0;
|
||||
while(++g)if(gtest(g,p))return g;
|
||||
}
|
||||
map<ll,int>rec;
|
||||
ll lisanshu(ll x,ll n,ll m){
|
||||
ll s=(ll)(sqrt((double)m)+0.5);
|
||||
ll cur=1;rec.clear();
|
||||
for(int i=0;i<s;i++){
|
||||
rec[cur]=i;
|
||||
cur=cur*x%m;
|
||||
}
|
||||
ll mul=cur;cur=1;
|
||||
for(int i=0;i<s;i++){
|
||||
ll more=n*pow(cur,m-2,m)%m;
|
||||
if(rec.count(more))return i*s+rec[more];
|
||||
cur=cur*mul%m;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int dd[33],hh[30],mi[80];
|
||||
int mm[20]={0,31,28,31,30,31,30,31,31,30,31,30,31};
|
||||
void solve(ll x){
|
||||
int y,mo,d,h,min,s,i;
|
||||
for(y=2000;1;y++){
|
||||
s=365*24*60*60;
|
||||
if(y%4==0&&y%100||y%400==0)s+=24*60*60;
|
||||
if(y%10==5||y%10==8)s++;
|
||||
if(x-s<0)break;
|
||||
x-=s;
|
||||
}
|
||||
if(y%4==0&&y%100||y%400==0)
|
||||
for(i=2;i<13;i++)
|
||||
mm[i]+=24*60*60;
|
||||
if(y%10==5||y%10==8){
|
||||
mm[12]++;dd[31]++;hh[24]++;mi[60]++;
|
||||
}
|
||||
for(i=1;i<13;i++)if(x-mm[i]<0)break;x-=mm[i-1];mo=i;
|
||||
for(i=1;i<33;i++)if(x-dd[i]<0)break;x-=dd[i-1];d=i;
|
||||
for(i=1;i<25;i++)if(x-hh[i]<0)break;x-=hh[i-1];h=i-1;
|
||||
for(i=1;i<61;i++)if(x-mi[i]<0)break;x-=mi[i-1];min=i-1;
|
||||
if(y%4==0&&y%100||y%400==0)
|
||||
for(i=2;i<13;i++)
|
||||
mm[i]-=24*60*60;
|
||||
if(y%10==5||y%10==8){
|
||||
mm[12]--;dd[31]--;hh[24]--;mi[60]--;
|
||||
}
|
||||
printf("%d.%02d.%02d %02d:%02d:%02lld\n",y,mo,d,h,min,x);
|
||||
}
|
||||
int main(){
|
||||
ll a,p,q,g,u,v;
|
||||
int cs,csi;
|
||||
for(int i=1;i<15;i++)mm[i]=mm[i]*24*60*60+mm[i-1];
|
||||
for(int i=1;i<33;i++)dd[i]=i*24*60*60;
|
||||
for(int i=1;i<30;i++)hh[i]=i*60*60;
|
||||
for(int i=1;i<80;i++)mi[i]=i*60;
|
||||
scanf("%d",&cs);
|
||||
for(csi=1;csi<=cs;csi++){
|
||||
scanf("%lld%lld%lld",&p,&q,&a);
|
||||
printf("Case #%d:\n",csi);
|
||||
if(a==0){puts("2000.01.01 00:00:00");continue;}
|
||||
as.clear();
|
||||
g=gen(p);
|
||||
v=lisanshu(g,a,p);
|
||||
if(v==-1){puts("Transmission error");continue;}
|
||||
moxianxing(q,v,p-1);
|
||||
if((int)as.size()==0){puts("Transmission error");continue;}
|
||||
for(int i=0;i<as.size();i++)as[i]=pow(g,as[i],p);
|
||||
sort(as.begin(),as.end());
|
||||
for(int i=0;i<as.size();i++)
|
||||
solve(as[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
97
HDOJ/3225_autoAC.cpp
Normal file
97
HDOJ/3225_autoAC.cpp
Normal file
|
@ -0,0 +1,97 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<cstdio>
|
||||
#include<vector>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define N 300
|
||||
int t, n, m, k, ans[N], match[N], num, match2[N];
|
||||
bool vst[N][N], re[N], tmp[N];
|
||||
vector<int> jeo[N];
|
||||
bool find(int id, int limit)
|
||||
{
|
||||
if (id <= limit) return false;
|
||||
for(int i = 0; i < jeo[id].size(); i++)
|
||||
if (!tmp[jeo[id][i]])
|
||||
{
|
||||
tmp[jeo[id][i]] = 1;
|
||||
if (match[jeo[id][i]] == -1 || find(match[jeo[id][i]], limit))
|
||||
{
|
||||
match[jeo[id][i]] = id;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool solve()
|
||||
{
|
||||
memset(match, -1, sizeof(int) * (n + 1));
|
||||
for(int i = 1; i <= n; i++)
|
||||
{
|
||||
memset(tmp, 0, sizeof(bool) * (n + 1));
|
||||
if (!find(i, 0)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool check(int id, int tar)
|
||||
{
|
||||
if(match[tar] == id) return true;
|
||||
int key = 0;
|
||||
for(int i = 1; i <= n; i++)
|
||||
if ((match2[i] = match[i]) == id) key = i;
|
||||
int t = match[tar]; match[tar] = id; match[key] = -1;
|
||||
memset(tmp, 0, sizeof(bool) * (n + 1));
|
||||
if (find(t, id)) return true;
|
||||
else for(int i = 1; i <= n; i++)
|
||||
match[i] = match2[i];
|
||||
return false;
|
||||
}
|
||||
bool dfs(int deep)
|
||||
{
|
||||
if (deep == n + 1)
|
||||
{
|
||||
num++; if (num == k)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
for(int i = 0; i < jeo[deep].size(); i++)
|
||||
if (!re[jeo[deep][i]] && check(deep, jeo[deep][i]))
|
||||
{
|
||||
ans[deep] = jeo[deep][i];
|
||||
re[jeo[deep][i]] = 1;
|
||||
if (dfs(deep + 1)) return true;
|
||||
re[jeo[deep][i]] = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
scanf("%d", &t);
|
||||
for(int ca = 1; ca <= t; ca++)
|
||||
{
|
||||
scanf("%d%d%d", &n, &m, &k);
|
||||
for(int i = 1; i <= n; i++)
|
||||
for(int j =1; j <= n; j++) vst[i][j] = 0;
|
||||
for(int i = 0; i < m; i++)
|
||||
for(int j = 1; j <= n; j++)
|
||||
{
|
||||
int x;scanf("%d", &x);vst[j][x] = 1;
|
||||
}
|
||||
for(int i = 1; i <= n; i++)
|
||||
{
|
||||
jeo[i].clear();
|
||||
for(int j = 1; j <= n; j++)
|
||||
if (!vst[i][j]) jeo[i].push_back(j);
|
||||
sort(jeo[i].begin(), jeo[i].end());
|
||||
}
|
||||
memset(re, 0, sizeof(bool) * (n + 1)); num = 0;
|
||||
printf("Case #%d:", ca);
|
||||
if (solve() && dfs(1))
|
||||
{
|
||||
for(int i = 1; i <= n; i++) printf(" %d", ans[i]);
|
||||
putchar('\n');
|
||||
}
|
||||
else printf(" -1\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
240
HDOJ/3228_autoAC.cpp
Normal file
240
HDOJ/3228_autoAC.cpp
Normal file
|
@ -0,0 +1,240 @@
|
|||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<cmath>
|
||||
#include<algorithm>
|
||||
#define eps 1e-6
|
||||
#define N 10010
|
||||
using namespace std;
|
||||
struct Point
|
||||
{
|
||||
double x,y;
|
||||
Point(){}
|
||||
Point(double a,double b):x(a),y(b){}
|
||||
};
|
||||
struct Line
|
||||
{
|
||||
Point a,b;
|
||||
Line(){}
|
||||
Line(Point u,Point v):a(u),b(v){}
|
||||
};
|
||||
struct Info
|
||||
{
|
||||
int n;
|
||||
Point p[N];
|
||||
Line l;
|
||||
Point fa;
|
||||
};
|
||||
Info a,b;
|
||||
struct Node
|
||||
{
|
||||
int u,v;
|
||||
double len;
|
||||
Node(){}
|
||||
Node(int u0,int v0,double len0):u(u0),v(v0),len(len0){}
|
||||
}nod[8*N];
|
||||
bool cccc(Node a,Node b)
|
||||
{
|
||||
return a.len < b.len;
|
||||
}
|
||||
int nod_n;
|
||||
int Sig(double a)
|
||||
{
|
||||
return a<-eps?-1:a>eps;
|
||||
}
|
||||
Point Intersection(Line u,Line v)
|
||||
{
|
||||
Point ret=u.a;
|
||||
double t=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/
|
||||
((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));
|
||||
ret.x+=(u.b.x-u.a.x)*t;
|
||||
ret.y+=(u.b.y-u.a.y)*t;
|
||||
return ret;
|
||||
}
|
||||
int cmp(Point a,Point b)
|
||||
{
|
||||
if(a.x==b.x)
|
||||
return a.y<b.y;
|
||||
return a.x<b.x;
|
||||
}
|
||||
double Dis(Point a,Point b)
|
||||
{
|
||||
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
|
||||
}
|
||||
int Find(double num,Point p[],int n,int ind)
|
||||
{
|
||||
int left=0,right=n;
|
||||
if(ind==1)
|
||||
{
|
||||
while(left+1<right)
|
||||
{
|
||||
int mid=(left+right)>>1;
|
||||
if(Sig(num-p[mid].y)>=0)
|
||||
left=mid;
|
||||
else
|
||||
right=mid;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while(left+1<right)
|
||||
{
|
||||
int mid=(left+right)>>1;
|
||||
if(Sig(num-p[mid].x)>=0)
|
||||
left=mid;
|
||||
else
|
||||
right=mid;
|
||||
}
|
||||
}
|
||||
return left;
|
||||
}
|
||||
Point operator +(Point a,Point b)
|
||||
{
|
||||
Point tmp;
|
||||
tmp.x=a.x+b.x;
|
||||
tmp.y=a.y+b.y;
|
||||
return tmp;
|
||||
}
|
||||
void Init()
|
||||
{
|
||||
double t;
|
||||
double ax,ay,bx,by,cx,cy,dx,dy;
|
||||
scanf("%d%d",&a.n,&b.n);
|
||||
scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);
|
||||
scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy);
|
||||
for(int i=0;i<a.n;i++)
|
||||
{
|
||||
scanf("%lf",&t);
|
||||
a.p[i].x=ax*t+bx*(1-t);
|
||||
a.p[i].y=ay*t+by*(1-t);
|
||||
}
|
||||
for(int i=0;i<b.n;i++)
|
||||
{
|
||||
scanf("%lf",&t);
|
||||
b.p[i].x=cx*t+dx*(1-t);
|
||||
b.p[i].y=cy*t+dy*(1-t);
|
||||
}
|
||||
sort(a.p, a.p+a.n, cmp);
|
||||
sort(b.p, b.p+b.n, cmp);
|
||||
a.l=Line(Point(ax,ay),Point(bx,by));
|
||||
a.fa=Point(by-ay,ax-bx);
|
||||
b.l=Line(Point(cx,cy),Point(dx,dy));
|
||||
b.fa=Point(dy-cy,cx-dx);
|
||||
nod_n=0;
|
||||
for(int i=0;i<a.n;i++)
|
||||
{
|
||||
Point tp=Intersection(b.l,Line(a.p[i],b.fa+a.p[i]));
|
||||
if(cx==dx)
|
||||
{
|
||||
double y=tp.y;
|
||||
if(Sig(y-b.p[0].y)<=0)
|
||||
nod[nod_n++]=Node(i,a.n,Dis(a.p[i],b.p[0]));
|
||||
else if(Sig(y-b.p[b.n-1].y)>=0)
|
||||
nod[nod_n++]=Node(i,a.n+b.n-1,Dis(a.p[i],b.p[b.n-1]));
|
||||
else
|
||||
{
|
||||
int pos=Find(y,b.p,b.n-1,1);
|
||||
double d1=Dis(a.p[i],b.p[pos]);
|
||||
double d2=Dis(a.p[i],b.p[pos+1]);
|
||||
nod[nod_n++]=Node(i,a.n+pos,d1);
|
||||
nod[nod_n++]=Node(i,a.n+pos+1,d2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
double x=tp.x;
|
||||
if(Sig(x-b.p[0].x)<=0)
|
||||
nod[nod_n++]=Node(i,a.n,Dis(a.p[i],b.p[0]));
|
||||
else if(Sig(x-b.p[b.n-1].x)>=0)
|
||||
nod[nod_n++]=Node(i,a.n+b.n-1,Dis(a.p[i],b.p[b.n-1]));
|
||||
else
|
||||
{
|
||||
int pos=Find(x,b.p,b.n-1,2);
|
||||
double d1=Dis(a.p[i],b.p[pos]);
|
||||
double d2=Dis(a.p[i],b.p[pos+1]);
|
||||
nod[nod_n++]=Node(i,a.n+pos,d1);
|
||||
nod[nod_n++]=Node(i,a.n+pos+1,d2);
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int i=0;i<b.n;i++)
|
||||
{
|
||||
Point tp=Intersection(a.l,Line(b.p[i],a.fa+b.p[i]));
|
||||
if(ax==bx)
|
||||
{
|
||||
double y=tp.y;
|
||||
if(Sig(y-a.p[0].y)<=0)
|
||||
nod[nod_n++]=Node(i+a.n,0,Dis(b.p[i],a.p[0]));
|
||||
else if(Sig(y-a.p[a.n-1].y)>=0)
|
||||
nod[nod_n++]=Node(i+a.n,a.n-1,Dis(b.p[i],a.p[a.n-1]));
|
||||
else
|
||||
{
|
||||
int pos=Find(y,a.p,a.n-1,1);
|
||||
double d1=Dis(b.p[i],a.p[pos]);
|
||||
double d2=Dis(b.p[i],a.p[pos+1]);
|
||||
nod[nod_n++]=Node(i+a.n,pos,d1);
|
||||
nod[nod_n++]=Node(i+a.n,pos+1,d2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
double x=tp.x;
|
||||
if(Sig(x-a.p[0].x)<=0)
|
||||
nod[nod_n++]=Node(i+a.n,0,Dis(b.p[i],a.p[0]));
|
||||
else if(Sig(x-a.p[a.n-1].x)>=0)
|
||||
nod[nod_n++]=Node(i+a.n,a.n-1,Dis(b.p[i],a.p[a.n-1]));
|
||||
else
|
||||
{
|
||||
int pos=Find(x,a.p,a.n-1,2);
|
||||
double d1=Dis(b.p[i],a.p[pos]);
|
||||
double d2=Dis(b.p[i],a.p[pos+1]);
|
||||
nod[nod_n++]=Node(i+a.n,pos,d1);
|
||||
nod[nod_n++]=Node(i+a.n,pos+1,d2);
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int i=0;i<a.n-1;i++)
|
||||
nod[nod_n++]=Node(i,i+1,Dis(a.p[i],a.p[i+1]));
|
||||
for(int i=0;i<b.n-1;i++)
|
||||
nod[nod_n++]=Node(i+a.n,i+a.n+1,Dis(b.p[i],b.p[i+1]));
|
||||
}
|
||||
int parent[20010];
|
||||
int find(int x)
|
||||
{
|
||||
if(parent[x] != x)
|
||||
parent[x]=find(parent[x]);
|
||||
return parent[x];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int cas;
|
||||
scanf("%d",&cas);
|
||||
for(int cc=1;cc<=cas;cc++)
|
||||
{
|
||||
Init();
|
||||
sort(nod,nod+nod_n,cccc);
|
||||
int n=a.n+b.n;
|
||||
for(int i=0;i<n;i++)
|
||||
parent[i]=i;
|
||||
int tmp=n-1;
|
||||
double total=0;
|
||||
int x,y;
|
||||
int px,py;
|
||||
for(int i=0;i<nod_n && tmp;i++)
|
||||
{
|
||||
x=nod[i].u;
|
||||
y=nod[i].v;
|
||||
px=find(x);
|
||||
py=find(y);
|
||||
if(px == py)
|
||||
continue;
|
||||
total+=nod[i].len;
|
||||
tmp--;
|
||||
if(rand()&1)
|
||||
parent[px]=py;
|
||||
else
|
||||
parent[py]=px;
|
||||
}
|
||||
printf("Case #%d: %.3f\n",cc,total);
|
||||
}
|
||||
return 0;
|
||||
}
|
110
HDOJ/3229_autoAC.cpp
Normal file
110
HDOJ/3229_autoAC.cpp
Normal file
|
@ -0,0 +1,110 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <algorithm>
|
||||
#include <string.h>
|
||||
const int MAXN = 1000 + 10;
|
||||
const int INF = 1<<29;
|
||||
int N, Track[7][MAXN],conflict[128];
|
||||
int total[MAXN];
|
||||
int max(int x, int y){
|
||||
if (x>y) return x;
|
||||
else return y;
|
||||
}
|
||||
void Build_Confliction(){
|
||||
int K;
|
||||
memset(conflict,0,sizeof(int)*128);
|
||||
scanf("%d",&K);
|
||||
while (K--){
|
||||
int t,i,conf = 0;
|
||||
scanf("%d",&t);
|
||||
for (i=1; i<=64; i*=2){
|
||||
conf += (t%10)*i;
|
||||
t = t/10;
|
||||
}
|
||||
for (i=0; i<=127; i++){
|
||||
conflict[conf|i] = 1;
|
||||
}
|
||||
}
|
||||
return ;
|
||||
}
|
||||
void Build_Cut(){
|
||||
int t,k;
|
||||
memset(total, 0, sizeof(int)*MAXN);
|
||||
for (t=1; t<=N; t++){
|
||||
for (k=0; k<=6; k++)
|
||||
if (Track[k][t]>0)
|
||||
total[t] |= (1<<(6-k));
|
||||
}
|
||||
}
|
||||
void init(){
|
||||
scanf("%d", &N);
|
||||
memset(Track, 0, sizeof(int)*7*MAXN);
|
||||
for (int i=0; i<=6; i++){
|
||||
int C;
|
||||
scanf("%d", &C);
|
||||
while (C--){
|
||||
int t1,t2;
|
||||
char t3;
|
||||
scanf("%d%c", &t1, &t3);
|
||||
if (t3=='-'){
|
||||
scanf("%d", &t2);
|
||||
Track[i][t1] = 3; Track[i][t2] = 4;
|
||||
for (int j=t1+1; j<t2; j++)
|
||||
Track[i][j] = 2;
|
||||
}
|
||||
else
|
||||
Track[i][t1] = 1;
|
||||
}
|
||||
}
|
||||
Build_Confliction();
|
||||
Build_Cut();
|
||||
return ;
|
||||
}
|
||||
int solve()
|
||||
{
|
||||
int f[MAXN][128],j,k,t,ans = 0;;
|
||||
for (t=0; t<=N; t++)
|
||||
for (j=0; j<=127; j++)
|
||||
f[t][j] = -INF;
|
||||
f[0][0] = 0;
|
||||
for (t=1; t<=N; t++){
|
||||
for (j=0; j<=127; j++)
|
||||
if ((j&total[t])==j){
|
||||
int i, add_t = 0, pre = 0, now = 0, j_temp = j;
|
||||
for (i=0; i<=6; i++){
|
||||
if (Track[i][t] == 1 && ((1<<(6-i))&j) != 0)
|
||||
add_t++;
|
||||
if (Track[i][t] == 3 && ((1<<(6-i))&j) != 0){
|
||||
++add_t;
|
||||
now += (1<<(6-i));
|
||||
}
|
||||
if (Track[i][t] == 2 && ((1<<(6-i))&j) != 0){
|
||||
now += (1<<(6-i));
|
||||
pre += (1<<(6-i));
|
||||
}
|
||||
if (Track[i][t] == 4 && ((1<<(6-i))&j) != 0){
|
||||
++add_t;
|
||||
pre += (1<<(6-i));
|
||||
j_temp -= (1<<(6-i));
|
||||
}
|
||||
}
|
||||
if (!conflict[j_temp]){
|
||||
for (k=0; k<=127; k++)
|
||||
if (!conflict[k] && ((pre&k)==pre) && f[t-1][k] != -INF)
|
||||
f[t][now] = max(add_t + f[t-1][k], f[t][now]);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (j=0; j<=127; j++)
|
||||
if (f[N][j]>ans) ans = f[N][j];
|
||||
return ans;
|
||||
}
|
||||
int main(){
|
||||
int T,Cases;
|
||||
scanf("%d", &T);
|
||||
for (Cases = 1; Cases <= T; Cases++){
|
||||
init();
|
||||
printf("Case #%d: %d\n", Cases, solve());
|
||||
}
|
||||
return 0;
|
||||
}
|
85
HDOJ/3231_autoAC.cpp
Normal file
85
HDOJ/3231_autoAC.cpp
Normal file
|
@ -0,0 +1,85 @@
|
|||
#include <queue>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
using namespace std;
|
||||
#define N 2005
|
||||
struct T
|
||||
{
|
||||
int v,next;
|
||||
}E[3][N*100];
|
||||
struct TT
|
||||
{
|
||||
int head,rd,dep;
|
||||
}V[3][N];
|
||||
int top[3],ans,n,m;
|
||||
void Add_Edge(int k,int u,int v)
|
||||
{
|
||||
E[k][top[k]].v = v;
|
||||
E[k][top[k]].next = V[k][u].head;
|
||||
V[k][u].head = top[k]++;
|
||||
++V[k][v].rd;
|
||||
}
|
||||
bool Top_Sort(int k)
|
||||
{
|
||||
queue<int> Q;
|
||||
for(int i=1;i<=n;i++)
|
||||
if(V[k][i].rd == 0)
|
||||
Q.push(i);
|
||||
int cnt = 0;
|
||||
while(!Q.empty())
|
||||
{
|
||||
++cnt;
|
||||
int p = Q.front();
|
||||
for(int i=V[k][p].head;i!=NULL;i=E[k][i].next)
|
||||
{
|
||||
int q = E[k][i].v;
|
||||
--V[k][q].rd;
|
||||
if(V[k][q].rd == 0)
|
||||
{
|
||||
Q.push(q);
|
||||
V[k][q].dep = V[k][p].dep + 1;
|
||||
}
|
||||
}
|
||||
Q.pop();
|
||||
}
|
||||
return cnt == n;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int u,v,nn,ncase=0;
|
||||
char cmd;
|
||||
while(~scanf("%d%d%*c",&nn,&m),nn)
|
||||
{
|
||||
memset(V,0,sizeof(V));
|
||||
top[0] = top[1] = top[2] = 1;
|
||||
n = 2*nn;
|
||||
for(int k=0;k<3;k++)
|
||||
for(int i=1;i<=nn;i++)
|
||||
Add_Edge(k,i,i+nn);
|
||||
while(m--)
|
||||
{
|
||||
scanf("%c%d%d%*c",&cmd,&u,&v);
|
||||
if(cmd == 'I')
|
||||
{
|
||||
for(int k=0;k<3;k++)
|
||||
{
|
||||
Add_Edge(k,u,v+nn);
|
||||
Add_Edge(k,v,u+nn);
|
||||
}
|
||||
}
|
||||
else
|
||||
Add_Edge(cmd-'X',u+nn,v);
|
||||
}
|
||||
printf("Case %d: ",++ncase);
|
||||
if(!Top_Sort(0) || !Top_Sort(1) || !Top_Sort(2))
|
||||
puts("IMPOSSIBLE\n");
|
||||
else
|
||||
{
|
||||
puts("POSSIBLE");
|
||||
for(int i=1;i<=nn;i++)
|
||||
printf("%d %d %d %d %d %d\n",V[0][i].dep,V[1][i].dep,V[2][i].dep,V[0][i+nn].dep,V[1][i+nn].dep,V[2][i+nn].dep);
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
17
HDOJ/3232_autoAC.cpp
Normal file
17
HDOJ/3232_autoAC.cpp
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
int n, i, cas = 0, d, p, l, v;
|
||||
while(~scanf("%d%d",&n,&d), n+d)
|
||||
{
|
||||
double ans = d*1.0;
|
||||
for(i = 0; i < n; i++)
|
||||
{
|
||||
scanf("%d%d%d",&p, &l, &v);
|
||||
ans -= l;
|
||||
ans += 2.0*l / v;
|
||||
}
|
||||
printf("Case %d: %.3lf\n\n",++cas, ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
70
HDOJ/3233_autoAC.cpp
Normal file
70
HDOJ/3233_autoAC.cpp
Normal file
|
@ -0,0 +1,70 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const double eps = 1e-7;
|
||||
struct node{
|
||||
node(){}
|
||||
node(double _size,double _rem):size(_size),rem(_rem){}
|
||||
double size,rem;
|
||||
};
|
||||
node Q[1005],data[20005];
|
||||
bool cmp(node a,node b)
|
||||
{
|
||||
if(fabs(a.size-b.size) < eps) return a.rem > b.rem;
|
||||
return a.size < b.size;
|
||||
}
|
||||
double solve(int n,int m,double b)
|
||||
{
|
||||
int len = 0;
|
||||
double ans = 0;
|
||||
for(int i = 0;i < n;++i)
|
||||
{
|
||||
if(len < m)
|
||||
{
|
||||
double Size = data[i].size*(1-data[i].rem*0.01);
|
||||
if(fabs(Size) < eps) continue;
|
||||
Q[len++] = node(Size,0.0);
|
||||
for(int j = len-1;j > 0;--j)
|
||||
{
|
||||
if(Q[j].size < Q[j-1].size)
|
||||
swap(Q[j],Q[j-1]);
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(len == m)
|
||||
{
|
||||
double t = Q[0].size / (b / m),s = Q[0].size;
|
||||
ans += t;
|
||||
for(int j = 1;j < len;++j)
|
||||
{
|
||||
Q[j].size -= s;
|
||||
Q[j-1] = Q[j];
|
||||
}
|
||||
len--;
|
||||
}
|
||||
}
|
||||
for(int i = 0;i < len;++i)
|
||||
{
|
||||
double t = Q[i].size / (b / (len-i)),s = Q[i].size;
|
||||
ans += t;
|
||||
for(int j = i;j < len;++j)
|
||||
Q[j].size -= s;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,m,b,casenum = 1;
|
||||
while(scanf("%d%d%d",&n,&m,&b) && n+m+b)
|
||||
{
|
||||
for(int i = 0;i < n;++i)
|
||||
scanf("%lf%lf",&data[i].size,&data[i].rem);
|
||||
sort(data,data+n,cmp);
|
||||
printf("Case %d: %.2lf\n\n",casenum++,solve(n,m,(double)b));
|
||||
}
|
||||
return 0;
|
||||
}
|
111
HDOJ/3234_autoAC.cpp
Normal file
111
HDOJ/3234_autoAC.cpp
Normal file
|
@ -0,0 +1,111 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<string.h>
|
||||
using namespace std;
|
||||
int f[20010],r[20010],n;
|
||||
int map[20010];
|
||||
int xp[20],ans;
|
||||
void init()
|
||||
{
|
||||
for(int i=0;i<=n;i++)
|
||||
{
|
||||
f[i]=i;
|
||||
r[i]=0;
|
||||
}
|
||||
}
|
||||
int find(int x)
|
||||
{
|
||||
if(x==f[x])
|
||||
return x;
|
||||
int t=find(f[x]);
|
||||
r[x]^=r[f[x]];//规x涓惰圭崇郴姹x涓硅圭崇郴
|
||||
f[x]=t;
|
||||
return f[x];
|
||||
}
|
||||
bool Union(int x,int y,int k)
|
||||
{
|
||||
int a=find(x);
|
||||
int b=find(y);
|
||||
if(a==b)
|
||||
{
|
||||
if((r[x]^r[y])==k)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
if(a==n)
|
||||
swap(a,b);
|
||||
f[a]=b;
|
||||
r[a]=r[x]^r[y]^k;
|
||||
return true;
|
||||
}
|
||||
bool query(int m)
|
||||
{
|
||||
memset(map,0,sizeof(map));
|
||||
for(int i=0;i<m;i++)
|
||||
{
|
||||
map[find(xp[i])]++;
|
||||
ans^=r[xp[i]];
|
||||
}
|
||||
int flag=0;
|
||||
for(int i=0;i<m;i++)
|
||||
{
|
||||
int t=find(xp[i]);
|
||||
if(map[t]%2!=0 && t!=n)
|
||||
{flag=1;break;}
|
||||
}
|
||||
if(flag)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
char s[2],c;
|
||||
int a,b,v,Q,cas=0;
|
||||
while(scanf("%d %d",&n,&Q)==2 &&(n||Q))
|
||||
{
|
||||
init();
|
||||
printf("Case %d:\n",++cas);
|
||||
int fact=0,flag=0;
|
||||
while(Q--)
|
||||
{
|
||||
scanf("%s%d%d",s,&a,&b);
|
||||
if(s[0]=='I')
|
||||
{
|
||||
fact++;
|
||||
c=getchar();
|
||||
if(c==' ')
|
||||
{
|
||||
scanf("%d",&v);
|
||||
if(flag)continue;
|
||||
if(!Union(a,b,v))
|
||||
{
|
||||
printf("The first %d facts are conflicting.\n",fact);
|
||||
flag=1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(flag)continue;
|
||||
if(!Union(a,n,b))
|
||||
{
|
||||
printf("The first %d facts are conflicting.\n",fact);
|
||||
flag=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
xp[0]=b;
|
||||
for(int i=1;i<a;i++)
|
||||
scanf("%d",&xp[i]);
|
||||
if(flag)continue;
|
||||
ans=0;
|
||||
if(query(a))
|
||||
printf("%d\n",ans);
|
||||
else printf("I don't know.\n");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
95
HDOJ/3236_autoAC.cpp
Normal file
95
HDOJ/3236_autoAC.cpp
Normal file
|
@ -0,0 +1,95 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using std::sort;
|
||||
#define inf -2100000000
|
||||
#define MAXV1 501
|
||||
#define MAXV2 51
|
||||
#define MAXN 301
|
||||
struct T
|
||||
{
|
||||
int p,v,f;
|
||||
bool operator < (const T a) const
|
||||
{
|
||||
return f>a.f;
|
||||
}
|
||||
} gift[MAXN];
|
||||
int res[MAXV1][MAXV2][2];
|
||||
inline int max (int a,int b,int c=0,int d=0)
|
||||
{
|
||||
return (a>b?a:b)>(c>d?c:d)?(a>b?a:b):(c>d?c:d);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int v1,v2,n,i,j,k,m,ts;
|
||||
int cas=1;
|
||||
while (scanf("%d%d%d",&v1,&v2,&n))
|
||||
{
|
||||
if (v1==0&&v2==0&&n==0) break;
|
||||
memset(res,0,sizeof(res));
|
||||
ts=0;
|
||||
for (i=1; i<=n; ++i)
|
||||
{
|
||||
scanf("%d%d%d",&gift[i].p,&gift[i].v,&gift[i].f);
|
||||
if (gift[i].f==1) ts+=gift[i].v;
|
||||
}
|
||||
sort(gift+1,gift+n+1);
|
||||
for (k=1; k<=n; ++k)
|
||||
{
|
||||
if (gift[k].f==0) break;
|
||||
for (i=v1; i>=0; --i)
|
||||
{
|
||||
for (j=v2; j>=0; --j)
|
||||
{
|
||||
if (i>=gift[k].p&&j>=gift[k].p)
|
||||
{
|
||||
res[i][j][1]=max(res[i][j][0]+gift[k].v,res[i][j-gift[k].p][1]+gift[k].v,res[i-gift[k].p][j][1]+gift[k].v);
|
||||
res[i][j][0]=max(res[i][j-gift[k].p][0]+gift[k].v,res[i-gift[k].p][j][0]+gift[k].v);
|
||||
}
|
||||
else if (i>=gift[k].p)
|
||||
{
|
||||
res[i][j][1]=max(res[i][j][0]+gift[k].v,res[i-gift[k].p][j][1]+gift[k].v);
|
||||
res[i][j][0]=res[i-gift[k].p][j][0]+gift[k].v;
|
||||
}
|
||||
else if (j>=gift[k].p)
|
||||
{
|
||||
res[i][j][1]=max(res[i][j][0]+gift[k].v,res[i][j-gift[k].p][1]+gift[k].v);
|
||||
res[i][j][0]=res[i][j-gift[k].p][0]+gift[k].v;
|
||||
}
|
||||
else
|
||||
{
|
||||
res[i][j][1]=res[i][j][0]+gift[k].v;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
m=0;
|
||||
if (res[v1][v2][1]<ts&&res[v1][v2][0]<ts) m=-1;
|
||||
if (m==0)
|
||||
{
|
||||
for (; k<=n; ++k)
|
||||
{
|
||||
for (i=v1; i>=0; --i)
|
||||
{
|
||||
for (j=v2; j>=0; --j)
|
||||
{
|
||||
if (res[i][j][0]>=ts) res[i][j][1]=max(res[i][j][1],res[i][j][0]+gift[k].v);
|
||||
if (j>=gift[k].p&&res[i][j-gift[k].p][0]>=ts) res[i][j][0]=max(res[i][j-gift[k].p][0]+gift[k].v,res[i][j][0]);
|
||||
if (i>=gift[k].p&&res[i-gift[k].p][j][0]>=ts) res[i][j][0]=max(res[i-gift[k].p][j][0]+gift[k].v,res[i][j][0]);
|
||||
if (j>=gift[k].p&&res[i][j-gift[k].p][1]>=ts) res[i][j][1]=max(res[i][j-gift[k].p][1]+gift[k].v,res[i][j][1]);
|
||||
if (i>=gift[k].p&&res[i-gift[k].p][j][1]>=ts) res[i][j][1]=max(res[i-gift[k].p][j][1]+gift[k].v,res[i][j][1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i=1; i<=v1; ++i)
|
||||
{
|
||||
for (j=1; j<=v2; ++j)
|
||||
{
|
||||
m=max(m,res[i][j][0],res[i][j][1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case %d: %d\n\n",cas++,m);
|
||||
}
|
||||
return 0;
|
||||
}
|
93
HDOJ/3240_autoAC.cpp
Normal file
93
HDOJ/3240_autoAC.cpp
Normal file
|
@ -0,0 +1,93 @@
|
|||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <deque>
|
||||
#include <queue>
|
||||
#include <iterator>
|
||||
#include <stack>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
const int N=10001;
|
||||
typedef long long LL;
|
||||
int su[N],num[N];
|
||||
int n,m,sui;
|
||||
void mul(LL &res,int k)
|
||||
{
|
||||
for(int i=0;i<sui;i++)
|
||||
{
|
||||
while(k%su[i]==0)
|
||||
{
|
||||
k/=su[i];
|
||||
num[i]++;
|
||||
}
|
||||
}
|
||||
res=(res*k)%m;
|
||||
}
|
||||
int ext_gcd(int a,int b,int &x,int &y)
|
||||
{
|
||||
int t,ret;
|
||||
if(!b)
|
||||
{
|
||||
x=1;y=0;return a;
|
||||
}
|
||||
ret=ext_gcd(b,a%b,y,x);
|
||||
y-=x*(a/b);
|
||||
return ret;
|
||||
}
|
||||
void chu(LL &res,int k)
|
||||
{
|
||||
for(int i=0;i<sui;i++)
|
||||
{
|
||||
while(k%su[i]==0&&num[i]>0)
|
||||
{
|
||||
k/=su[i];
|
||||
num[i]--;
|
||||
}
|
||||
}
|
||||
if(k!=1)
|
||||
{
|
||||
int x,y,temp;
|
||||
temp=ext_gcd(k,m,x,y);
|
||||
x=(x%m+m)%m;
|
||||
res=(res*x)%m;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,k,t;
|
||||
while(scanf("%d%d",&n,&m)&&(n+m))
|
||||
{
|
||||
sui=0,t=m;
|
||||
for(i=2;i*i<=t;i++)
|
||||
if(t%i==0)
|
||||
{
|
||||
su[sui++]=i;
|
||||
while(t%i==0)
|
||||
t/=i;
|
||||
}
|
||||
if(t>1)
|
||||
su[sui++]=t;
|
||||
memset(num,0,sizeof(num));
|
||||
LL res=1,sum=1,l;
|
||||
for(i=2;i<=n;i++)
|
||||
{
|
||||
mul(res,4*i-2);
|
||||
chu(res,i+1);
|
||||
l=res;
|
||||
for(j=0;j<sui;j++)
|
||||
for(k=0;k<num[j];k++)
|
||||
l=l*su[j]%m;
|
||||
sum=(sum+l)%m;
|
||||
}
|
||||
printf("%lld\n",sum);
|
||||
}
|
||||
return 0;
|
||||
}
|
92
HDOJ/3242_autoAC.cpp
Normal file
92
HDOJ/3242_autoAC.cpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#include <iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#include<cstdlib>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int N = 10005;
|
||||
char str[N];
|
||||
struct node
|
||||
{
|
||||
char s[81];
|
||||
int len;
|
||||
int flag;
|
||||
}list1[N],list2[N];
|
||||
int n1,n2;
|
||||
int op;
|
||||
void solve()
|
||||
{
|
||||
int len = strlen(str);
|
||||
memset(list1,0,sizeof(list1));
|
||||
memset(list2,0,sizeof(list2));
|
||||
n1 = n2 = 0;
|
||||
int i,j;
|
||||
for(i = 1;i < len;)
|
||||
{
|
||||
while(str[i] != ',' && str[i] != ']')
|
||||
list1[n1].s[list1[n1].len ++] = str[i ++];
|
||||
list1[n1].s[list1[n1].len] = '\0';
|
||||
n1 ++;
|
||||
if(str[i] == ']')
|
||||
break;
|
||||
i ++;
|
||||
}
|
||||
i +=2;
|
||||
if(str[i] == '+')
|
||||
op = 1;
|
||||
else
|
||||
op = 0;
|
||||
i += 4;
|
||||
for(;i < len - 1;)
|
||||
{
|
||||
while(str[i] != ',' && str[i] != ']')
|
||||
list2[n2].s[list2[n2].len ++] = str[i ++];
|
||||
list2[n2].s[list2[n2].len] = '\0';
|
||||
n2 ++;
|
||||
i ++;
|
||||
}
|
||||
if(op == 1)
|
||||
{
|
||||
printf("[%s",list1[0].s);
|
||||
for(i = 1;i < n1;i ++)
|
||||
printf(",%s",list1[i].s);
|
||||
for(i = 0;i < n2;i ++)
|
||||
printf(",%s",list2[i].s);
|
||||
printf("]\n");
|
||||
return;
|
||||
}
|
||||
for(i = 0;i < n2;i ++)
|
||||
{
|
||||
for(j = 0;j < n1;j ++)
|
||||
{
|
||||
if(list1[j].flag)
|
||||
continue;
|
||||
if(strcmp(list1[j].s,list2[i].s) == 0)
|
||||
{
|
||||
list1[j].flag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("[");
|
||||
for(j = n1 - 1;j >= 0;j --)
|
||||
if(list1[j].flag == 0)
|
||||
break;
|
||||
for(i = 0;i < j;i ++)
|
||||
{
|
||||
if(list1[i].flag == 0)
|
||||
printf("%s,",list1[i].s);
|
||||
}
|
||||
printf("%s]\n",list1[j].s);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(gets(str))
|
||||
{
|
||||
if(str[0] == '.')
|
||||
break;
|
||||
solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
95
HDOJ/3244_autoAC.cpp
Normal file
95
HDOJ/3244_autoAC.cpp
Normal file
|
@ -0,0 +1,95 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
using namespace std;
|
||||
int n,m;
|
||||
const int maxn = 110;
|
||||
const int inf = 0x3f3f3f3f;
|
||||
struct node
|
||||
{
|
||||
int s1,s2;
|
||||
int p1,p2;
|
||||
int x,y;
|
||||
}t[maxn];
|
||||
int cal_r()
|
||||
{
|
||||
int ret=inf;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
if(t[i].s1*1.0/t[i].p1 >= t[i].s2*1.0/t[i].p2)
|
||||
{
|
||||
int tmp = (m/t[i].p1*t[i].s1)+t[i].y;
|
||||
int p = tmp/t[i].x;
|
||||
ret=min(ret,p);
|
||||
}
|
||||
else
|
||||
{
|
||||
int tmp = (m/t[i].p2*t[i].s2)+t[i].y;
|
||||
int p = tmp/t[i].x;
|
||||
ret=min(ret,p);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int dp[6000000+20];
|
||||
int cal_need(int i,int need)
|
||||
{
|
||||
int w[2],c[2];
|
||||
c[0]=t[i].p1;
|
||||
w[0]=t[i].s1;
|
||||
c[1]=t[i].p2;
|
||||
w[1]=t[i].s2;
|
||||
int V=need+t[i].s2;
|
||||
for(int i=1;i<=V;i++)
|
||||
dp[i]=inf;
|
||||
dp[0]=0;
|
||||
for(int i=0;i<2;i++)
|
||||
{
|
||||
for(int v=w[i];v<=V;v++)
|
||||
dp[v]=min(dp[v],dp[v-w[i]]+c[i]);
|
||||
}
|
||||
int ret = inf;
|
||||
for(int i=need;i<=V;i++)
|
||||
ret = min(ret,dp[i]);
|
||||
return ret;
|
||||
}
|
||||
bool judge(int k)
|
||||
{
|
||||
int s=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
int need = t[i].x*k-t[i].y;
|
||||
if(need<=0)
|
||||
continue;
|
||||
int tmp = cal_need(i,need);
|
||||
s+=tmp;
|
||||
if(s>m)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d%d",&n,&m) && n+m)
|
||||
{
|
||||
for(int i=1;i<=n;i++)
|
||||
scanf("%d%d%d%d%d%d",&t[i].x,&t[i].y,&t[i].s1,&t[i].p1,&t[i].s2,&t[i].p2);
|
||||
int r=cal_r();
|
||||
int l=0;
|
||||
int ans = 0;
|
||||
while(l<=r)
|
||||
{
|
||||
int mid=(l+r)>>1;
|
||||
if(judge(mid))
|
||||
{
|
||||
ans=mid;
|
||||
l=mid+1;
|
||||
}
|
||||
else
|
||||
r=mid-1;
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
93
HDOJ/3245_autoAC.cpp
Normal file
93
HDOJ/3245_autoAC.cpp
Normal file
|
@ -0,0 +1,93 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define min(a,b) a>b?b:a
|
||||
#pragma comment(linker,"/STACK:1000000000,1000000000")
|
||||
const int maxn = 10010;
|
||||
const int INF = 1000000000;
|
||||
int dp[maxn][110];
|
||||
int sum[maxn],sumd[maxn];
|
||||
int head[maxn];
|
||||
struct Edge{
|
||||
int v,next;
|
||||
}edge[2*maxn];int N,L,E;
|
||||
void add_edge(int a,int b)
|
||||
{
|
||||
edge[E].v=b;
|
||||
edge[E].next=head[a];
|
||||
head[a]=E++;
|
||||
}
|
||||
void dfs(int u,int fa)
|
||||
{
|
||||
int i,j,k,v;
|
||||
sum[u]=1;sumd[u]=0;
|
||||
fill(dp[u],dp[u]+L+1,INF);
|
||||
for(i=head[u];i!=-1;i=edge[i].next)
|
||||
{
|
||||
v=edge[i].v;
|
||||
if(v==fa) continue;
|
||||
dfs(v,u);
|
||||
sumd[u]+=sumd[v]+sum[v];
|
||||
sum[u]+=sum[v];
|
||||
}
|
||||
dp[u][0]=sumd[u];
|
||||
for(i=head[u];i!=-1;i=edge[i].next)
|
||||
{
|
||||
v=edge[i].v;
|
||||
if(v==fa) continue;
|
||||
for(j=1;j<=L;j++)
|
||||
dp[u][j]=min(dp[u][j],dp[v][j-1]+sumd[u]-sumd[v]-sum[v]);
|
||||
}
|
||||
}
|
||||
int ans[maxn];
|
||||
void solve(int u,int fa)
|
||||
{
|
||||
int i,a,v;
|
||||
if(u==0) ans[u]=sumd[0];
|
||||
else ans[u]=N-sum[u]+sumd[fa]-sum[u];
|
||||
int tmp[110];
|
||||
fill(tmp,tmp+L+1,INF);
|
||||
int mi=INF;
|
||||
for( i=head[u];i!=-1;i=edge[i].next)
|
||||
{
|
||||
v=edge[i].v;
|
||||
if(v==fa) continue;
|
||||
for( a=0;a<=L-2;a++)
|
||||
mi=min(mi,tmp[L-2-a]+dp[v][a]-sumd[v]-sum[v]);
|
||||
for( a=0;a<=L-1;a++)
|
||||
{
|
||||
tmp[a]=min(tmp[a],dp[v][a]-sumd[v]-sum[v]);
|
||||
if(a) tmp[a]=min(tmp[a],tmp[a-1]);
|
||||
}
|
||||
}
|
||||
mi=min(mi,tmp[L-1]);
|
||||
sumd[u]=ans[u];
|
||||
ans[u]+=mi;
|
||||
for(i=head[u];i!=-1;i=edge[i].next)
|
||||
{
|
||||
v=edge[i].v;
|
||||
if(v==fa) continue;
|
||||
solve(v,u);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,k,a,b;
|
||||
while(scanf("%d%d",&N,&L),(N||L))
|
||||
{
|
||||
if(N==1) {puts("0");continue;}
|
||||
E=0;
|
||||
memset(head,-1,sizeof(head));
|
||||
for(i=0;i<N-1;i++)
|
||||
{
|
||||
scanf("%d%d",&a,&b);
|
||||
add_edge(a,b);
|
||||
add_edge(b,a);
|
||||
}
|
||||
dfs(0,0);
|
||||
solve(0,0);
|
||||
printf("%d\n",*min_element(ans,ans+N));
|
||||
}
|
||||
return 0;
|
||||
}
|
112
HDOJ/3247_autoAC.cpp
Normal file
112
HDOJ/3247_autoAC.cpp
Normal file
|
@ -0,0 +1,112 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#define eps 1e-10
|
||||
#define N 100005
|
||||
#define inf 1<<20
|
||||
#define zero(a) (fabs(a)<eps)
|
||||
#define lson (step<<1)
|
||||
#define rson (step<<1|1)
|
||||
using namespace std;
|
||||
struct Trie{
|
||||
int next[2],fail;
|
||||
int virus,source;
|
||||
void Init(){next[0]=next[1]=0;fail=source=virus=0;}
|
||||
}tree[N];
|
||||
int n,m;
|
||||
int tot,cnt;
|
||||
int path[205][205];
|
||||
int pos[205];
|
||||
int dp[1<<10][205];
|
||||
char str[50005];
|
||||
void Insert(char *s,int len,int kind){
|
||||
int p=0;
|
||||
for(int i=0;i<len;i++){
|
||||
if(tree[p].next[s[i]-'0']==0){
|
||||
tree[++tot].Init();
|
||||
tree[p].next[s[i]-'0']=tot;
|
||||
}
|
||||
p=tree[p].next[s[i]-'0'];
|
||||
}
|
||||
if(kind>=0) tree[p].source=1<<kind;
|
||||
else tree[p].virus=1;
|
||||
}
|
||||
void Bulid_fail(){
|
||||
int que[N];
|
||||
int head=0,tail=0;
|
||||
que[tail++]=0;
|
||||
while(head<tail){
|
||||
int p=que[head++];
|
||||
for(int i=0;i<2;i++){
|
||||
if(tree[p].next[i]==0) tree[p].next[i]=tree[tree[p].fail].next[i];
|
||||
else{
|
||||
int q=tree[p].next[i];
|
||||
if(p) tree[q].fail=tree[tree[p].fail].next[i];
|
||||
tree[q].source|=tree[tree[q].fail].source;
|
||||
tree[q].virus|=tree[tree[q].fail].virus;
|
||||
que[tail++]=q;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void Bfs(int u){
|
||||
int que[N];
|
||||
int head=0,tail=0;
|
||||
int dist[N];
|
||||
memset(dist,-1,sizeof(dist));
|
||||
que[tail++]=pos[u];
|
||||
dist[pos[u]]=0;
|
||||
while(head<tail){
|
||||
int p=que[head++];
|
||||
for(int i=0;i<2;i++){
|
||||
int q=tree[p].next[i];
|
||||
if(dist[q]<0&&!tree[q].virus){
|
||||
dist[q]=dist[p]+1;
|
||||
que[tail++]=q;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int i=0;i<cnt;i++)
|
||||
path[u][i]=dist[pos[i]];
|
||||
}
|
||||
int DP(){
|
||||
memset(dp,-1,sizeof(dp));
|
||||
dp[0][0]=0;
|
||||
for(int i=0;i<(1<<n);i++){
|
||||
for(int j=0;j<cnt;j++){
|
||||
if(dp[i][j]<0) continue;
|
||||
for(int k=0;k<cnt;k++){
|
||||
if(path[j][k]<0) continue;
|
||||
if(dp[i|tree[pos[k]].source][k]==-1) dp[i|tree[pos[k]].source][k]=dp[i][j]+path[j][k];
|
||||
else dp[i|tree[pos[k]].source][k]=min(dp[i|tree[pos[k]].source][k],dp[i][j]+path[j][k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
int ans=inf;
|
||||
for(int i=0;i<cnt;i++)
|
||||
if(dp[(1<<n)-1][i]!=-1) ans=min(ans,dp[(1<<n)-1][i]);
|
||||
return ans==inf?-1:ans;
|
||||
}
|
||||
int main(){
|
||||
while(scanf("%d%d",&n,&m)!=EOF&&n+m){
|
||||
tree[0].Init();cnt=1;tot=0;
|
||||
for(int i=0;i<n;i++){
|
||||
scanf("%s",str);
|
||||
Insert(str,strlen(str),i);
|
||||
}
|
||||
for(int i=0;i<m;i++){
|
||||
scanf("%s",str);
|
||||
Insert(str,strlen(str),-1);
|
||||
}
|
||||
Bulid_fail();
|
||||
for(int i=1;i<=tot;i++)
|
||||
if(tree[i].source)
|
||||
pos[cnt++]=i;
|
||||
for(int i=0;i<cnt;i++)
|
||||
Bfs(i);
|
||||
printf("%d\n",DP());
|
||||
}
|
||||
return 0;
|
||||
}
|
24
HDOJ/3248_autoAC.cpp
Normal file
24
HDOJ/3248_autoAC.cpp
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include<stdio.h>
|
||||
int main()
|
||||
{
|
||||
int n,m,n1;
|
||||
while(scanf("%d",&n)!=EOF&&n!=-1)
|
||||
{
|
||||
m=n;
|
||||
n/=30;
|
||||
n=15-n;
|
||||
if(n>=12)
|
||||
n-=12;
|
||||
if(m%30==0)
|
||||
printf("Exactly %d o'clock\n",n);
|
||||
else
|
||||
{
|
||||
if(n==0)
|
||||
n1=11;
|
||||
else
|
||||
n1=n-1;
|
||||
printf("Between %d o'clock and %d o'clock\n",n1,n);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
46
HDOJ/3249_autoAC.cpp
Normal file
46
HDOJ/3249_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define inf 0x3f3f3f3f
|
||||
struct node
|
||||
{
|
||||
int l;
|
||||
int p;
|
||||
}a[10005];
|
||||
bool cmp(node b,node c)
|
||||
{
|
||||
return b.p<c.p;
|
||||
}
|
||||
int dp[10005];
|
||||
int search(int k)
|
||||
{
|
||||
for(int i=1;i<=k;i++)
|
||||
{
|
||||
if(a[k].p<dp[i])
|
||||
return i-1;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while(scanf("%d",&n)&&n)
|
||||
{
|
||||
for(int i=1;i<=n;i++)
|
||||
scanf("%d%d",&a[i].l,&a[i].p);
|
||||
sort(a+1,a+1+n,cmp);
|
||||
memset(dp+1,0x3f,sizeof(int)*(n+1));
|
||||
dp[0]=-inf;
|
||||
int top=0;
|
||||
int ans=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
top=search(i);
|
||||
dp[top+1]=min(dp[top+1],a[i].p>=dp[top]+a[i].l?a[i].p:dp[top]+a[i].l);
|
||||
if(top+1>ans)
|
||||
ans=top+1;
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
181
HDOJ/3250_autoAC.cpp
Normal file
181
HDOJ/3250_autoAC.cpp
Normal file
|
@ -0,0 +1,181 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
const int MAXN=10;
|
||||
int hei[10];
|
||||
int mp[300];
|
||||
int a[30][5];
|
||||
int p[100][30];
|
||||
char s[100];
|
||||
int first,anss;
|
||||
int Cnt[10]={2,4,4,1,2,4,2};
|
||||
int Dx[7][4]=
|
||||
{
|
||||
0,0,0,0,
|
||||
0,-1,-1,-1,
|
||||
0,-1,-1,-1,
|
||||
0,0,-1,-1,
|
||||
0,0,-1,-1,
|
||||
0,-1,-1,-1,
|
||||
0,0,-1,-1
|
||||
};
|
||||
int Dy[7][4]=
|
||||
{
|
||||
0,1,2,3,
|
||||
0,0,1,2,
|
||||
0,-2,-1,0,
|
||||
0,1,0,1,
|
||||
0,1,-1,0,
|
||||
0,-1,0,1,
|
||||
0,1,1,2
|
||||
};
|
||||
int rotx(int x,int y,int rot)
|
||||
{
|
||||
if (rot==0) return x;
|
||||
if (rot==1) return y;
|
||||
if (rot==2) return -x;
|
||||
if (rot==3) return -y;
|
||||
}
|
||||
int roty(int x,int y,int rot)
|
||||
{
|
||||
if (rot==0) return y;
|
||||
if (rot==1) return -x;
|
||||
if (rot==2) return -y;
|
||||
if (rot==3) return x;
|
||||
}
|
||||
bool set(int now,int id,int pos,int rot)
|
||||
{
|
||||
for (int i=0; i<4; i++)
|
||||
{
|
||||
int dx1=Dx[id][i];
|
||||
int dy1=Dy[id][i];
|
||||
int dx=rotx(dx1,dy1,rot);
|
||||
int dy=roty(dx1,dy1,rot);
|
||||
if (pos+dy<0||pos+dy>=5) return false;
|
||||
}
|
||||
int target=0;
|
||||
for (int ii=MAXN; ii>=0; ii--)
|
||||
{
|
||||
for (int i=0; i<4; i++)
|
||||
{
|
||||
int dx1=Dx[id][i];
|
||||
int dy1=Dy[id][i];
|
||||
int dx=rotx(dx1,dy1,rot);
|
||||
int dy=roty(dx1,dy1,rot);
|
||||
if (ii+dx<0)
|
||||
{
|
||||
target=ii+1;
|
||||
break;
|
||||
}
|
||||
if (a[ii+dx][pos+dy]==1)
|
||||
{
|
||||
target=ii+1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (target!=0) break;
|
||||
}
|
||||
for (int i=0; i<4; i++)
|
||||
{
|
||||
int dx1=Dx[id][i];
|
||||
int dy1=Dy[id][i];
|
||||
int dx=rotx(dx1,dy1,rot);
|
||||
int dy=roty(dx1,dy1,rot);
|
||||
//printf("%d %d\n",pos+dx,target+dy);
|
||||
a[target+dx][pos+dy]=1;
|
||||
}
|
||||
p[now][0]=target;
|
||||
p[now][1]=0;
|
||||
for (int i=MAXN; i>=0; i--)
|
||||
{
|
||||
bool find=true;
|
||||
for (int j=0; j<5; j++)
|
||||
if (a[i][j]!=1) find=false;
|
||||
if (find)
|
||||
{
|
||||
p[now][p[now][1]+2]=i;
|
||||
for (int j=i; j<MAXN; j++)
|
||||
for (int k=0; k<5; k++)
|
||||
a[j][k]=a[j+1][k];
|
||||
for (int k=0; k<5; k++)
|
||||
a[MAXN][k]=0;
|
||||
p[now][1]++;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
void remove(int now,int id,int pos,int rot)
|
||||
{
|
||||
for (int ii=p[now][1]-1; ii>=0; ii--)
|
||||
{
|
||||
int line=p[now][ii+2];
|
||||
for (int i=MAXN; i>line; i--)
|
||||
for (int j=0; j<5; j++)
|
||||
a[i][j]=a[i-1][j];
|
||||
for (int j=0; j<5; j++)
|
||||
a[line][j]=1;
|
||||
}
|
||||
int target=p[now][0];
|
||||
for (int i=0; i<4; i++)
|
||||
{
|
||||
int dx1=Dx[id][i];
|
||||
int dy1=Dy[id][i];
|
||||
int dx=rotx(dx1,dy1,rot);
|
||||
int dy=roty(dx1,dy1,rot);
|
||||
a[target+dx][pos+dy]=0;
|
||||
}
|
||||
}
|
||||
void dfs(int now,int end)
|
||||
{
|
||||
if (now==end)
|
||||
{
|
||||
int ans=0;
|
||||
for (int i=0; i<5; i++)
|
||||
{
|
||||
int max=0;
|
||||
for (int j=MAXN; j>=0; j--)
|
||||
if (a[j][i]==1)
|
||||
{
|
||||
max=(j+1);
|
||||
break;
|
||||
}
|
||||
ans+=max*max;
|
||||
}
|
||||
if (first||ans<anss)
|
||||
anss=ans;
|
||||
first=0;
|
||||
return;
|
||||
}
|
||||
for (int i=0; i<5*Cnt[mp[s[now]]]; i++)
|
||||
{
|
||||
int x=i/Cnt[mp[s[now]]];
|
||||
int rot=i%Cnt[mp[s[now]]];
|
||||
if (set(now,mp[s[now]],x,rot))
|
||||
{
|
||||
dfs(now+1,end);
|
||||
remove(now,mp[s[now]],x,rot);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
mp['I']=0;
|
||||
mp['J']=1;
|
||||
mp['L']=2;
|
||||
mp['O']=3;
|
||||
mp['S']=4;
|
||||
mp['T']=5;
|
||||
mp['Z']=6;
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
for (int ii=1; ii<=t; ii++)
|
||||
{
|
||||
scanf("%s",s);
|
||||
memset(a,0,sizeof(a));
|
||||
first=1;
|
||||
int len=strlen(s);
|
||||
dfs(0,len);
|
||||
printf("Case %d: %d\n",ii,anss);
|
||||
}
|
||||
return 0;
|
||||
}
|
101
HDOJ/3251_autoAC.cpp
Normal file
101
HDOJ/3251_autoAC.cpp
Normal file
|
@ -0,0 +1,101 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
#define MAXD 1010
|
||||
#define MAXM 202010
|
||||
#define INF 0x3f3f3f3f
|
||||
int N, M, F, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM], id[MAXM], MAX;
|
||||
int S, T, d[MAXD], q[MAXD], work[MAXD], Q;
|
||||
void add(int x, int y, int z, int i)
|
||||
{
|
||||
v[e] = y, flow[e] = z, id[e] = i;
|
||||
next[e] = first[x], first[x] = e ++;
|
||||
}
|
||||
void init()
|
||||
{
|
||||
int i, x, y, z;
|
||||
scanf("%d%d%d", &N, &M, &F);
|
||||
S = 1, T = N + 1;
|
||||
memset(first, -1, sizeof(first[0]) * (T + 1)), e = 0;
|
||||
for(i = 1; i <= M; i ++)
|
||||
{
|
||||
scanf("%d%d%d", &x, &y, &z);
|
||||
add(x, y, z, i), add(y, x, 0, i);
|
||||
}
|
||||
MAX = 0;
|
||||
for(i = 0; i < F; i ++)
|
||||
{
|
||||
scanf("%d%d", &x, &y), MAX += y;
|
||||
add(x, T, y, 0), add(T, x, 0, 0);
|
||||
}
|
||||
}
|
||||
int bfs()
|
||||
{
|
||||
int i, j, rear = 0;
|
||||
memset(d, -1, sizeof(d[0]) * (T + 1));
|
||||
d[S] = 0, q[rear ++] = S;
|
||||
for(i = 0; i < rear; i ++)
|
||||
for(j = first[q[i]]; j != -1; j = next[j])
|
||||
if(flow[j] && d[v[j]] == -1)
|
||||
{
|
||||
d[v[j]] = d[q[i]] + 1, q[rear ++] = v[j];
|
||||
if(v[j] == T) return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int dfs(int cur, int a)
|
||||
{
|
||||
if(cur == T) return a;
|
||||
for(int &i = work[cur]; i != -1; i = next[i])
|
||||
if(flow[i] && d[v[i]] == d[cur] + 1)
|
||||
if(int t = dfs(v[i], std::min(a, flow[i])))
|
||||
{
|
||||
flow[i] -= t, flow[i ^ 1] += t;
|
||||
return t;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int dinic()
|
||||
{
|
||||
int ans = 0, t;
|
||||
while(bfs())
|
||||
{
|
||||
memcpy(work, first, sizeof(first[0]) * (T + 1));
|
||||
while(t = dfs(S, INF)) ans += t;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
void DFS(int cur)
|
||||
{
|
||||
int i;
|
||||
d[cur] = 1;
|
||||
for(i = first[cur]; i != -1; i = next[i])
|
||||
if(flow[i] && !d[v[i]])
|
||||
DFS(v[i]);
|
||||
}
|
||||
void solve()
|
||||
{
|
||||
int i, ans = dinic(), n = 0;
|
||||
printf("%d\n", MAX - ans);
|
||||
memset(d, 0, sizeof(d[0]) * (T + 1));
|
||||
DFS(S);
|
||||
for(i = 0; i < M; i ++)
|
||||
if(d[v[i << 1 | 1]] && !d[v[i << 1]])
|
||||
q[n ++] = id[i << 1];
|
||||
std::sort(q, q + n);
|
||||
printf("%d", n);
|
||||
for(i = 0; i < n; i ++) printf(" %d", q[i]);
|
||||
printf("\n");
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t, tt;
|
||||
scanf("%d", &t);
|
||||
for(tt = 1; tt <= t; tt ++)
|
||||
{
|
||||
init();
|
||||
printf("Case %d: ", tt);
|
||||
solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
196
HDOJ/3252_autoAC.cpp
Normal file
196
HDOJ/3252_autoAC.cpp
Normal file
|
@ -0,0 +1,196 @@
|
|||
#include <iostream>
|
||||
#include <queue>
|
||||
#include <stack>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <cstring>
|
||||
#include <set>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int MAX=1005,INF=1<<30;
|
||||
const string END="#CODE-END";
|
||||
int len;
|
||||
map<string,int> mymap;
|
||||
map<string,int>::iterator ite;
|
||||
vector<string> A,B;
|
||||
int cnt;
|
||||
int f[MAX][MAX];
|
||||
int ma[MAX],mb[MAX];
|
||||
vector<int> a,b;
|
||||
int Test;
|
||||
void read(vector<string> &t,vector<int> &arr){
|
||||
string s;
|
||||
while(getline(cin,s)){
|
||||
if(s==END)
|
||||
break;
|
||||
ite=mymap.find(s);
|
||||
if(ite==mymap.end())
|
||||
mymap[s]=len++;
|
||||
t.push_back(s);
|
||||
arr.push_back(mymap[s]);
|
||||
}
|
||||
return ;
|
||||
}
|
||||
void createM(){
|
||||
int n1=(int)a.size()-1,n2=(int)b.size()-1;
|
||||
memset(f,0,sizeof(f));
|
||||
for(int i=n1;i>=1;i--){
|
||||
for(int j=n2;j>=1;j--){
|
||||
if(a[i]==b[j])
|
||||
f[i][j]=f[i+1][j+1]+1;
|
||||
else
|
||||
f[i][j]=max(f[i+1][j],f[i][j+1]);
|
||||
}
|
||||
}
|
||||
int L=f[1][1];
|
||||
cnt=f[1][1];
|
||||
int x = -1,c=0;
|
||||
for(int i = 1; i<=n1; i++)
|
||||
{
|
||||
for(int j = 1; j<= n2; j++)
|
||||
{
|
||||
if(a[i] == b[j] && f[i][j] == L && j > x)
|
||||
{
|
||||
x = j;
|
||||
L--;
|
||||
ma[c]=i-1;
|
||||
mb[c]=j-1;
|
||||
x = j;
|
||||
c++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ;
|
||||
}
|
||||
struct DD{
|
||||
bool isM;
|
||||
int b,e;
|
||||
};
|
||||
DD DA[MAX*3],DB[MAX*3];
|
||||
void cut(){
|
||||
int front=0,rear=0;
|
||||
int len=0;
|
||||
for(int i=0;i<2*cnt;i++,len++){
|
||||
rear=ma[len];
|
||||
if(front<rear){
|
||||
DA[i].isM=0;
|
||||
DA[i].b=front;
|
||||
DA[i].e=rear-1;
|
||||
}
|
||||
else {
|
||||
DA[i].isM=0;
|
||||
DA[i].b=-1;
|
||||
DA[i].e=-1;
|
||||
}
|
||||
++i;
|
||||
DA[i].isM=1;
|
||||
DA[i].b=ma[len];
|
||||
DA[i].e=ma[len];
|
||||
front=ma[len]+1;
|
||||
}
|
||||
rear=(int)A.size();
|
||||
if(front<rear){
|
||||
DA[cnt*2].isM=0;
|
||||
DA[cnt*2].b=front;
|
||||
DA[cnt*2].e=rear-1;
|
||||
}
|
||||
else {
|
||||
DA[cnt*2].isM=0;
|
||||
DA[cnt*2].b=-1;
|
||||
DA[cnt*2].e=-1;
|
||||
}
|
||||
front=rear=0;
|
||||
len=0;
|
||||
for(int i=0;i<2*cnt;i++,len++){
|
||||
rear=mb[len];
|
||||
if(front<rear){
|
||||
DB[i].isM=0;
|
||||
DB[i].b=front;
|
||||
DB[i].e=rear-1;
|
||||
}
|
||||
else {
|
||||
DB[i].isM=0;
|
||||
DB[i].b=-1;
|
||||
DB[i].e=-1;
|
||||
}
|
||||
++i;
|
||||
DB[i].isM=1;
|
||||
DB[i].b=mb[len];
|
||||
DB[i].e=mb[len];
|
||||
front=mb[len]+1;
|
||||
}
|
||||
rear=(int)B.size();
|
||||
if(front<rear){
|
||||
DB[cnt*2].isM=0;
|
||||
DB[cnt*2].b=front;
|
||||
DB[cnt*2].e=rear-1;
|
||||
}
|
||||
else {
|
||||
DB[cnt*2].isM=0;
|
||||
DB[cnt*2].b=-1;
|
||||
DB[cnt*2].e=-1;
|
||||
}
|
||||
return ;
|
||||
}
|
||||
void output(){
|
||||
for(int i=0;i<2*cnt+1;i++){
|
||||
if(DA[i].isM)
|
||||
cout<<A[DA[i].b]<<endl;
|
||||
else if(DA[i].b==-1&&DA[i].e==-1){
|
||||
if(DB[i].b==-1&&DB[i].e==-1)
|
||||
continue;
|
||||
else{
|
||||
for(int j=DB[i].b;j<=DB[i].e;j++){
|
||||
cout<<B[j]<<endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(DB[i].b==-1&&DB[i].e==-1){
|
||||
if(DA[i].b==-1&&DA[i].e==-1)
|
||||
continue;
|
||||
else{
|
||||
for(int j=DA[i].b;j<=DA[i].e;j++){
|
||||
cout<<A[j]<<endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
cout<<"//**** CONFLICT STARTS ****//"<<endl
|
||||
<<"//code in A:"<<endl;
|
||||
for(int j=DA[i].b;j<=DA[i].e;j++){
|
||||
cout<<A[j]<<endl;
|
||||
}
|
||||
cout<<"//code in B:"<<endl;
|
||||
for(int j=DB[i].b;j<=DB[i].e;j++){
|
||||
cout<<B[j]<<endl;
|
||||
}
|
||||
cout<<"//***** CONFLICT ENDS *****//"<<endl;
|
||||
}
|
||||
}
|
||||
return ;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int test=1;
|
||||
cin>>Test;
|
||||
cin.ignore();
|
||||
while(Test--){
|
||||
cout<<"Case "<<test++<<":"<<endl;
|
||||
len=0;
|
||||
mymap.clear();
|
||||
A.clear();B.clear();
|
||||
a.clear();b.clear();
|
||||
a.push_back(-1);b.push_back(-1);
|
||||
read(A,a);
|
||||
read(B,b);
|
||||
createM();
|
||||
cut();
|
||||
output();
|
||||
cout<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
110
HDOJ/3253_autoAC.cpp
Normal file
110
HDOJ/3253_autoAC.cpp
Normal file
|
@ -0,0 +1,110 @@
|
|||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
int n,x[210],y[210],d[210],rx[210],ry[210];
|
||||
struct heap
|
||||
{
|
||||
int t1,t2;
|
||||
bool cmp(const int &u,const int &v)
|
||||
{ return t1*x[u]+t2*y[u]>t1*x[v]+t2*y[v]; }
|
||||
int n,h[210],e[210];
|
||||
void del(int i)
|
||||
{
|
||||
e[h[i]]=0;
|
||||
if (i==n)
|
||||
{ n--; return; }
|
||||
h[i]=h[n--]; e[h[i]]=i;
|
||||
down(i); up(i);
|
||||
}
|
||||
void build(void)
|
||||
{
|
||||
for(int i=(n>>1);i>=1;i--)
|
||||
down(i);
|
||||
}
|
||||
void up(int i)
|
||||
{
|
||||
int t,j;
|
||||
while(i>1)
|
||||
{
|
||||
j=(i>>1);
|
||||
if (cmp(h[i],h[j]))
|
||||
{
|
||||
t=h[i]; h[i]=h[j]; h[j]=t;
|
||||
e[h[i]]=i; e[h[j]]=j;
|
||||
}
|
||||
else break;
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
void down(int i)
|
||||
{
|
||||
int t,j;
|
||||
while((j=(i<<1))<=n)
|
||||
{
|
||||
if (j<n&&cmp(h[j+1],h[j])) j++;
|
||||
if (cmp(h[j],h[i]))
|
||||
{
|
||||
t=h[i]; h[i]=h[j]; h[j]=t;
|
||||
e[h[i]]=i; e[h[j]]=j;
|
||||
}
|
||||
else break;
|
||||
i=j;
|
||||
}
|
||||
}
|
||||
}h1,h2,h3,h4;
|
||||
int main(void)
|
||||
{
|
||||
int u,c,i,l1,r1,l2,r2;
|
||||
scanf("%d",&c);
|
||||
for(u=1;u<=c;u++)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
h1.n=h2.n=h3.n=h4.n=n;
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d%d%d",x+i,y+i,d+i);
|
||||
h1.h[i]=h1.e[i]=i;
|
||||
h2.h[i]=h2.e[i]=i;
|
||||
h3.h[i]=h3.e[i]=i;
|
||||
h4.h[i]=h4.e[i]=i;
|
||||
}
|
||||
h1.t1=1; h1.t2=1;
|
||||
h2.t1=-1; h2.t2=1;
|
||||
h3.t1=-1; h3.t2=-1;
|
||||
h4.t1=1; h4.t2=-1;
|
||||
h1.build();
|
||||
h2.build();
|
||||
h3.build();
|
||||
h4.build();
|
||||
for(i=n;i>=1;i--)
|
||||
{
|
||||
l1=x[h1.h[1]]+y[h1.h[1]]-d[i];
|
||||
r1=x[h3.h[1]]+y[h3.h[1]]+d[i];
|
||||
l2=-x[h2.h[1]]+y[h2.h[1]]-d[i];
|
||||
r2=-x[h4.h[1]]+y[h4.h[1]]+d[i];
|
||||
if (i<n)
|
||||
{
|
||||
r1=min(r1,rx[i+1]+ry[i+1]+d[i+1]-d[i]);
|
||||
l1=max(l1,rx[i+1]+ry[i+1]-d[i+1]+d[i]);
|
||||
r2=min(r2,-rx[i+1]+ry[i+1]+d[i+1]-d[i]);
|
||||
l2=max(l2,-rx[i+1]+ry[i+1]-d[i+1]+d[i]);
|
||||
}
|
||||
if ((l1+l2)%2!=0)
|
||||
if (l1<r1)
|
||||
l1++;
|
||||
else l2++;
|
||||
rx[i]=(l1-l2)/2;
|
||||
ry[i]=(l1+l2)/2;
|
||||
h1.del(h1.e[i]);
|
||||
h2.del(h2.e[i]);
|
||||
h3.del(h3.e[i]);
|
||||
h4.del(h4.e[i]);
|
||||
}
|
||||
printf("Case %d:\n",u);
|
||||
for(i=1;i<=n;i++)
|
||||
printf("%d %d\n",rx[i],ry[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
143
HDOJ/3255_autoAC.cpp
Normal file
143
HDOJ/3255_autoAC.cpp
Normal file
|
@ -0,0 +1,143 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define MAX 150105
|
||||
#define lch(i) ((i)<<1)
|
||||
#define rch(i) ((i)<<1|1)
|
||||
struct rec{
|
||||
__int64 x1,y1,x2,y2,v;
|
||||
};
|
||||
struct segment{
|
||||
__int64 l,r,h,val;
|
||||
};
|
||||
struct tree{
|
||||
int l,r,cnt,sum;
|
||||
int mid()
|
||||
{ return (l+r)>>1; }
|
||||
};
|
||||
typedef struct rec rec;
|
||||
typedef struct segment segment;
|
||||
typedef struct tree tree;
|
||||
rec rr[MAX];
|
||||
segment ss[MAX];
|
||||
tree tt[MAX];
|
||||
__int64 pos[MAX];
|
||||
__int64 v[MAX];
|
||||
int N,M;
|
||||
int cmp_rec(rec a ,rec b)
|
||||
{ return a.v < b.v; }
|
||||
int cmp_segment(segment a , segment b)
|
||||
{ return a.h < b.h; }
|
||||
void input()
|
||||
{
|
||||
scanf("%d%d",&N,&M);
|
||||
for(int i=1; i<=M; i++) scanf("%I64d",&v[i]);
|
||||
for(int i=0; i<N; i++)
|
||||
{
|
||||
int k;
|
||||
scanf("%I64d%I64d%I64d%I64d%d",&rr[i].x1, &rr[i].y1, &rr[i].x2, &rr[i].y2, &k);
|
||||
rr[i].v=v[k];
|
||||
}
|
||||
}
|
||||
void build(int l ,int r ,int rt)
|
||||
{
|
||||
tt[rt].l=l; tt[rt].r=r;
|
||||
tt[rt].cnt=0; tt[rt].sum=0;
|
||||
if(l==r) return ;
|
||||
int mid=tt[rt].mid();
|
||||
build(l, mid, lch(rt));
|
||||
build(mid+1, r, rch(rt));
|
||||
}
|
||||
int binary(int key ,int low, int high)
|
||||
{
|
||||
int mid;
|
||||
while(low<=high)
|
||||
{
|
||||
mid=(low+high)>>1;
|
||||
if(pos[mid]==key) return mid;
|
||||
else if(key < pos[mid]) high=mid-1;
|
||||
else low=mid+1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
void cal(int rt)
|
||||
{
|
||||
if(tt[rt].cnt)
|
||||
tt[rt].sum=pos[tt[rt].r+1]-pos[tt[rt].l];
|
||||
else if(tt[rt].l==tt[rt].r)
|
||||
tt[rt].sum=0;
|
||||
else
|
||||
tt[rt].sum=tt[lch(rt)].sum + tt[rch(rt)].sum;
|
||||
}
|
||||
void updata(int l , int r , int val ,int rt)
|
||||
{
|
||||
if(tt[rt].l==l && tt[rt].r==r)
|
||||
{
|
||||
tt[rt].cnt += val ;
|
||||
cal(rt);
|
||||
return ;
|
||||
}
|
||||
int mid=tt[rt].mid();
|
||||
if(r<=mid)
|
||||
updata(l,r,val,lch(rt));
|
||||
else if(l>mid)
|
||||
updata(l,r,val,rch(rt));
|
||||
else
|
||||
{
|
||||
updata(l,mid,val,lch(rt));
|
||||
updata(mid+1,r,val,rch(rt));
|
||||
}
|
||||
cal(rt);
|
||||
}
|
||||
__int64 solve(int nn)
|
||||
{
|
||||
int m=0;
|
||||
for(int i=nn; i<N; i++)
|
||||
{
|
||||
ss[m].l=rr[i].x1; ss[m].r=rr[i].x2; ss[m].h=rr[i].y1; ss[m].val=1;
|
||||
ss[m+1].l=rr[i].x1; ss[m+1].r=rr[i].x2; ss[m+1].h=rr[i].y2; ss[m+1].val=-1;
|
||||
pos[m]=rr[i].x1; pos[m+1]=rr[i].x2;
|
||||
m+=2;
|
||||
}
|
||||
sort(pos,pos+m);
|
||||
sort(ss,ss+m,cmp_segment);
|
||||
int mm=1;
|
||||
for(int i=1; i<m; i++)
|
||||
if(pos[i]!=pos[i-1])
|
||||
pos[mm++]=pos[i];
|
||||
build(0,mm-1,1);
|
||||
__int64 ans=0,res=0;
|
||||
for(int i=0; i<m-1; i++)
|
||||
{
|
||||
int l=binary(ss[i].l,0,mm-1);
|
||||
int r=binary(ss[i].r,0,mm-1)-1;
|
||||
if(l<=r) updata(l,r,ss[i].val,1);
|
||||
res += tt[1].sum * (ss[i+1].h-ss[i].h);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
for(int t=1; t<=T; t++)
|
||||
{
|
||||
input();
|
||||
sort(rr,rr+N,cmp_rec);
|
||||
int s[MAX],kk;
|
||||
s[1]=0; kk=1;
|
||||
for(int i=1; i<N; i++)
|
||||
if(rr[i].v!=rr[i-1].v)
|
||||
s[++kk]=i;
|
||||
__int64 ans=0,res;
|
||||
for(int k=1; k<=kk; k++)
|
||||
{
|
||||
res=solve(s[k]);
|
||||
if(k==1) ans += res * rr[s[k]].v;
|
||||
else ans += res * ( rr[s[k]].v - rr[s[k-1]].v );
|
||||
}
|
||||
printf("Case %d: %I64d\n",t,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
130
HDOJ/3256_autoAC.cpp
Normal file
130
HDOJ/3256_autoAC.cpp
Normal file
|
@ -0,0 +1,130 @@
|
|||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
const int M=10010;
|
||||
const int N=510;
|
||||
char s[110];
|
||||
struct Line
|
||||
{
|
||||
__int64 x1, y1, x2, y2;
|
||||
} ll[N], pos;
|
||||
int n, flag[M*2], ans;
|
||||
void input(__int64 &a)
|
||||
{
|
||||
scanf("%s", &s);
|
||||
int i, j, len=strlen(s);
|
||||
a = 0;
|
||||
i = 0;
|
||||
if(s[0]=='-')
|
||||
i++;
|
||||
for(; i<len && s[i]!='.'; i++)
|
||||
{
|
||||
a *= 10;
|
||||
a += s[i]-'0';
|
||||
}
|
||||
for(i++, j=0; i<len; i++, j++)
|
||||
{
|
||||
a *= 10;
|
||||
a += s[i]-'0';
|
||||
}
|
||||
while(j<4)
|
||||
{
|
||||
a *= 10;
|
||||
j++;
|
||||
}
|
||||
if(s[0]=='-')
|
||||
a = -a;
|
||||
}
|
||||
void cal(int i, Line li)
|
||||
{
|
||||
if(li.x1==li.x2)
|
||||
{
|
||||
if(li.x1==i*10000)
|
||||
{
|
||||
if(li.y1>li.y2)
|
||||
swap(li.y1, li.y2);
|
||||
if(li.y1<=0)
|
||||
li.y1 = li.y1/10000;
|
||||
else
|
||||
li.y1 = li.y1/10000+1;
|
||||
if(li.y2>=0) //...
|
||||
li.y2 /= 10000;
|
||||
else
|
||||
li.y2 = li.y2/10000-1;
|
||||
for(int j=li.y1; j<=li.y2; j++)
|
||||
{
|
||||
if(flag[j+M]!=i)
|
||||
{
|
||||
flag[j+M] = i;
|
||||
ans++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(!(li.x1<=i*10000 && i*10000<=li.x2) )
|
||||
return;
|
||||
if((i*10000-li.x1)*(li.y2-li.y1)%(li.x2-li.x1)==0)
|
||||
{
|
||||
int j = (i*10000-li.x1)*(li.y2-li.y1)/(li.x2-li.x1)+li.y1;
|
||||
if(j%10000==0)
|
||||
{
|
||||
j /= 10000;
|
||||
if(flag[j+M]!=i)
|
||||
{
|
||||
flag[j+M] = i;
|
||||
ans++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i, j, cas, cas1;
|
||||
scanf("%d", &cas);
|
||||
for(cas1=1; cas1<=cas; cas1++)
|
||||
{
|
||||
scanf("%d", &n);
|
||||
pos.x1 = M*M*10;
|
||||
pos.x2 = -M*M*10;
|
||||
for(i=0; i<n; i++)
|
||||
{
|
||||
input(ll[i].x1);
|
||||
input(ll[i].y1);
|
||||
input(ll[i].x2);
|
||||
input(ll[i].y2);
|
||||
if(ll[i].x1 > ll[i].x2)
|
||||
{
|
||||
swap(ll[i].x1, ll[i].x2);
|
||||
swap(ll[i].y1, ll[i].y2);
|
||||
}
|
||||
if(ll[i].x1<pos.x1)
|
||||
pos.x1 = ll[i].x1;
|
||||
if(ll[i].x2<pos.x1)
|
||||
pos.x1 = ll[i].x2;
|
||||
if(ll[i].x1>pos.x2)
|
||||
pos.x2 = ll[i].x1;
|
||||
if(ll[i].x2>pos.x2)
|
||||
pos.x2 = ll[i].x2;
|
||||
}
|
||||
for(i=0; i<M*2; i++)
|
||||
flag[i] = -1000000;
|
||||
ans = 0;
|
||||
pos.x1 /= 10000;
|
||||
pos.x1--;
|
||||
pos.x2 /= 10000;
|
||||
pos.x2++;
|
||||
for(i=pos.x1; i<=pos.x2; i++)
|
||||
{
|
||||
for(j=0; j<n; j++)
|
||||
{
|
||||
cal(i, ll[j]);
|
||||
}
|
||||
}
|
||||
printf("Case %d: %d\n", cas1, ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
77
HDOJ/3257_autoAC.cpp
Normal file
77
HDOJ/3257_autoAC.cpp
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
string str[17]={"0000","0001","0010","0011","0100","0101","0110","0111",
|
||||
"1000","1001","1010","1011","1100","1101","1110","1111"};
|
||||
char map[8][500];
|
||||
string trans(string ch)
|
||||
{
|
||||
string s="";
|
||||
for(int i=0;i<2;i++)
|
||||
{
|
||||
if(ch[i]>='A'&&ch[i]<='F')
|
||||
s+=str[ch[i]-'A'+10];
|
||||
else
|
||||
s+=str[ch[i]-'0'];
|
||||
}
|
||||
return s;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
string ch,str;
|
||||
int t,n,i,j,k,p;
|
||||
scanf("%d",&t);
|
||||
for(int Case=1;Case<=t;Case++)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
int minx=10,maxn=-1;
|
||||
p=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
for(k=0;k<5;k++)
|
||||
{
|
||||
str="";
|
||||
ch="";
|
||||
cin>>ch;
|
||||
ch=trans(ch);
|
||||
for(j=0;j<=7;j++)
|
||||
{
|
||||
if(ch[j]=='1')
|
||||
map[j][p]='#';
|
||||
else map[j][p]=' ';
|
||||
}
|
||||
p++;
|
||||
}
|
||||
if(i!=n-1)
|
||||
{
|
||||
for(j=0;j<=7;j++)
|
||||
map[j][p]=' ';
|
||||
p++;
|
||||
}
|
||||
}
|
||||
printf("Case %d:\n\n",Case);
|
||||
bool flag=0,tag=0;
|
||||
for(i=7;i>=0;i--)
|
||||
{
|
||||
for(j=0;j<p;j++)
|
||||
if(map[i][j]=='#') {flag=1;break;}
|
||||
if(flag) break;
|
||||
}
|
||||
for(k=0;k<=7;k++)
|
||||
{
|
||||
for(j=0;j<p;j++)
|
||||
if(map[k][j]=='#') {tag=1;break;}
|
||||
if(tag) break;
|
||||
}
|
||||
for(;i>=k;i--)
|
||||
{
|
||||
for(j=0;j<p;j++)
|
||||
printf("%c",map[i][j]);
|
||||
printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
70
HDOJ/3259_autoAC.cpp
Normal file
70
HDOJ/3259_autoAC.cpp
Normal file
|
@ -0,0 +1,70 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int MaxN = 3005;
|
||||
char s1[MaxN],s2[MaxN];
|
||||
typedef long long LL;
|
||||
LL dp[2][MaxN];
|
||||
int main()
|
||||
{
|
||||
int T,cas=0;scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%s%s",s1,s2+1);
|
||||
int n = strlen(s2+1), m = strlen(s1);
|
||||
bool ok = 1;
|
||||
for(int i = 1; i <= n; i++)if(s2[i]!='*')ok=0;
|
||||
if(ok)
|
||||
{
|
||||
printf("Case %d: %d\n",++cas,m*(m+1)/2);
|
||||
continue;
|
||||
}
|
||||
memset(dp, 0, sizeof(dp));
|
||||
for(int i = 0; i <= m; i++)dp[0][i]= 1;
|
||||
ok = 1;
|
||||
bool first = 1;
|
||||
for(int i = 1; i <= n; i++)
|
||||
{
|
||||
int p = i&1;
|
||||
int q = 1-p;
|
||||
if(s2[i]=='*')
|
||||
{
|
||||
dp[p][0] = dp[q][0];
|
||||
if(first)
|
||||
for(int j = 1; j <= m; j++)
|
||||
dp[p][j] = dp[p][j-1]+dp[q][j];
|
||||
else
|
||||
{
|
||||
LL mx = dp[q][0];
|
||||
for(int j = 1; j <= m; j++)
|
||||
{
|
||||
mx = max(mx, dp[q][j]);
|
||||
dp[p][j] = mx;
|
||||
}
|
||||
}
|
||||
first = 0;
|
||||
}
|
||||
else if(s2[i]=='?')
|
||||
{
|
||||
dp[p][0] = 0;
|
||||
for(int j = 1; j <= m; j++)
|
||||
dp[p][j] = dp[q][j-1];
|
||||
}
|
||||
else
|
||||
{
|
||||
dp[p][0] = 0;
|
||||
for(int j = 1; j <= m; j++)
|
||||
{
|
||||
if(s1[j-1]==s2[i])dp[p][j] = dp[q][j-1];
|
||||
else dp[p][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
LL ans = 0;
|
||||
for(int i = 1; i <= m; i++)
|
||||
ans += dp[n&1][i];
|
||||
printf("Case %d: %I64d\n",++cas,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
57
HDOJ/3260_autoAC.cpp
Normal file
57
HDOJ/3260_autoAC.cpp
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
#define inf (-((1<<30)-1))
|
||||
#define max(a,b) ((a)>(b)?(a):(b))
|
||||
char opt[105][1005];
|
||||
int value[105][1005];
|
||||
int dp[1005];
|
||||
int n,m,k;
|
||||
void dfs(int x,int y,int v,int ki,int money,int pre)
|
||||
{
|
||||
if(x==1&&y!=pre)
|
||||
{
|
||||
dp[y]=max(dp[y],dp[pre]+money);
|
||||
return;
|
||||
}
|
||||
if(ki>=k) return;
|
||||
if(y>=m) return;
|
||||
money+=(opt[x][y]=='$'?value[x][y]:0);
|
||||
int vi=(x!=1?(opt[x][y]!='$'?value[x][y]:0):0);
|
||||
for(int i=-1;i<=1;++i)
|
||||
{
|
||||
int pos=x+v+vi+i;
|
||||
if(pos<=1)
|
||||
dfs(1,y+1,0,0,money,pre);
|
||||
else
|
||||
{
|
||||
if(pos>n) pos=n;
|
||||
dfs(pos,y+1,v+vi+i,ki+1,money,pre);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
char c;
|
||||
for(; ~scanf("%d%d%d",&n,&m,&k);)
|
||||
{
|
||||
if(n+m+k==0) break;
|
||||
for(int i=1; i<=n; ++i)
|
||||
{
|
||||
for(int j=1; j<=m; ++j)
|
||||
{
|
||||
for(;c=getchar();)
|
||||
if(c=='v'||c=='$') break;
|
||||
opt[i][j]=c;
|
||||
scanf("%d",&value[i][j]);
|
||||
}
|
||||
}
|
||||
dp[1]=0;
|
||||
for(int i=2;i<=m;++i) dp[i]=inf;
|
||||
for(int i=1;i<m;++i)
|
||||
if(dp[i]!=inf)
|
||||
dfs(1,i,0,0,0,i);
|
||||
printf("%d\n",dp[m]+(opt[1][m]=='$'?value[1][m]:0));
|
||||
}
|
||||
return 0;
|
||||
}
|
89
HDOJ/3262_autoAC.cpp
Normal file
89
HDOJ/3262_autoAC.cpp
Normal file
|
@ -0,0 +1,89 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstdlib>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int MAXN=33;
|
||||
struct rec
|
||||
{
|
||||
int x,y,d;
|
||||
}ans[MAXN*2];
|
||||
struct node
|
||||
{
|
||||
int h,m,dat,num;
|
||||
}a[MAXN*2];
|
||||
int n,m,k;
|
||||
int map[MAXN][MAXN];
|
||||
bool b[MAXN][MAXN];
|
||||
bool cmp(node a,node b)
|
||||
{
|
||||
if (a.h<b.h || (a.h==b.h && a.m<b.m)) return 1; else return 0;
|
||||
}
|
||||
bool Init()
|
||||
{
|
||||
scanf("%d%d%d",&n,&m,&k);
|
||||
if (!n && !m && !k) return 0;
|
||||
for (int i=1;i<=n;++i)
|
||||
for (int j=1;j<=m;++j)
|
||||
scanf("%d",&map[i][j]);
|
||||
for (int i=1;i<=k;++i)
|
||||
scanf("%d:%d %d",&a[i].h,&a[i].m,&a[i].dat),a[i].num=i;
|
||||
sort(a+1,a+k+1,cmp);
|
||||
return 1;
|
||||
}
|
||||
bool Cleck(int x,int y,int z)
|
||||
{
|
||||
for (int i=y;i<=y+z-1;++i)
|
||||
if (b[x][i]) return 0;
|
||||
return 1;
|
||||
}
|
||||
bool GF(int h)
|
||||
{
|
||||
rec Max;
|
||||
Max.x=Max.y=Max.d=0;
|
||||
for (int i=1;i<=n;++i)
|
||||
for (int j=1;j<=m-a[h].dat+1;++j)
|
||||
if (Cleck(i,j,a[h].dat))
|
||||
if (map[i][j]>Max.d)
|
||||
Max.x=i,Max.y=j,Max.d=map[i][j];
|
||||
if (Max.x && Max.y)
|
||||
{
|
||||
ans[a[h].num]=Max;
|
||||
for (int i=Max.y;i<=Max.y+a[h].dat-1;++i) b[Max.x][i]=1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
bool GM(int h)
|
||||
{
|
||||
rec Max;
|
||||
Max.x=Max.y=Max.d=0;
|
||||
for (int i=1;i<=n;++i)
|
||||
for (int j=1;j<=m;++j)
|
||||
if (!b[i][j] && Max.d<map[i][j]) Max.x=i,Max.y=j,Max.d=map[i][j];
|
||||
if (Max.x && Max.y)
|
||||
{
|
||||
ans[a[h].num]=Max,b[Max.x][Max.y]=1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
void Solve()
|
||||
{
|
||||
memset(ans,0,sizeof(ans));
|
||||
memset(b,0,sizeof(b));
|
||||
for (int i=1;i<=k;++i)
|
||||
{
|
||||
if (GF(i)) continue;
|
||||
if (GM(i)) continue;
|
||||
ans[a[i].num].d=-1;
|
||||
}
|
||||
for (int i=1;i<=k;++i)
|
||||
if (ans[i].d!=-1) printf("%d %d\n",ans[i].x,ans[i].y); else printf("-1\n");
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while (Init()) Solve();
|
||||
return 0;
|
||||
}
|
173
HDOJ/3263_autoAC.cpp
Normal file
173
HDOJ/3263_autoAC.cpp
Normal file
|
@ -0,0 +1,173 @@
|
|||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
typedef struct pnode
|
||||
{
|
||||
double x,y,d;
|
||||
pnode( double a, double b ) {x = a;y = b;}
|
||||
pnode(){};
|
||||
}point;
|
||||
point H[ 21 ];
|
||||
point C[ 21 ];
|
||||
point P0,Pn;
|
||||
typedef struct lnode
|
||||
{
|
||||
double x,y,dx,dy,d;
|
||||
int id,hit,sign;
|
||||
lnode( point a, point b ) {x = a.x;y = a.y;dx = b.x-a.x;dy = b.y-a.y;}
|
||||
lnode(){};
|
||||
}line;
|
||||
double dist( point a, point b )
|
||||
{
|
||||
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
|
||||
}
|
||||
double dist( point a, line l )
|
||||
{
|
||||
return fabs(l.dx*(a.y-l.y)-l.dy*(a.x-l.x))/sqrt(l.dx*l.dx+l.dy*l.dy);
|
||||
}
|
||||
double crossproduct( point a, point b, point c )
|
||||
{
|
||||
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
|
||||
}
|
||||
bool cmp1( point a, point b )
|
||||
{
|
||||
if ( a.x == b.x ) return a.y < b.y;
|
||||
else return a.x < b.x;
|
||||
}
|
||||
bool cmp2( point a, point b )
|
||||
{
|
||||
double cp = crossproduct( P0, a, b );
|
||||
if ( cp == 0 ) return a.d < b.d;
|
||||
else return cp > 0;
|
||||
}
|
||||
double Graham( int N )
|
||||
{
|
||||
sort( C+0, C+N, cmp1 );
|
||||
P0 = C[0];
|
||||
for ( int i = 1 ; i < N ; ++ i )
|
||||
C[i].d = dist( P0, C[i] );
|
||||
sort( C+1, C+N, cmp2 );
|
||||
int top = 2;
|
||||
for ( int i = 3 ; i < N ; ++ i ) {
|
||||
while ( top > 0 && crossproduct( C[top-1], C[top], C[i] ) <= 0 ) -- top;
|
||||
C[++ top] = C[i];
|
||||
}
|
||||
C[++ top] = C[0];
|
||||
int L = 0,R = 1;
|
||||
double D = 500.000;
|
||||
do{
|
||||
while ( crossproduct( C[R], C[L], C[(L+1)%top] ) <= crossproduct( C[(R+1)%top], C[L], C[(L+1)%top] ) )
|
||||
R = (R+1)%top;
|
||||
D = min( D, dist( C[R], line( C[L], C[(L+1)%top] ) ) );
|
||||
L = (L+1)%top;
|
||||
}while ( L );
|
||||
return D;
|
||||
}
|
||||
bool l_cross_s( line b, line a )
|
||||
{
|
||||
double t1 = b.dx*(a.y-b.y)-b.dy*(a.x-b.x);
|
||||
double t2 = b.dx*(a.y+a.dy-b.y)-b.dy*(a.x+a.dx-b.x);
|
||||
return t1*t2 < 0;
|
||||
}
|
||||
bool s_cross_s( line a, line b )
|
||||
{
|
||||
double t1 = 0.0+a.dx*(b.y-a.y)-a.dy*(b.x-a.x);
|
||||
double t2 = 0.0+a.dx*(b.y+b.dy-a.y)-a.dy*(b.x+b.dx-a.x);
|
||||
double t3 = 0.0+b.dx*(a.y-b.y)-b.dy*(a.x-b.x);
|
||||
double t4 = 0.0+b.dx*(a.y+a.dy-b.y)-b.dy*(a.x+a.dx-b.x);
|
||||
return (t1*t2 < 0)&&(t3*t4 < 0);
|
||||
}
|
||||
bool on( point p, line l )
|
||||
{
|
||||
if ( l.dx*(p.y-l.y)-l.dy*(p.x-l.x) == 0 )
|
||||
if ( (p.x-l.x)*(p.x-l.x-l.dx) <= 0 )
|
||||
if ( (p.y-l.y)*(p.y-l.y-l.dy) <= 0 )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
bool in( point p, point* P, int n )
|
||||
{
|
||||
double d[4][2] = {-101,-103,-103,101,101,-103,101,103};
|
||||
for ( int t = 0 ; t < 4 ; ++ t ) {
|
||||
line s1 = line( p, point( d[t][0], d[t][1] ) );
|
||||
int count = 0;
|
||||
for ( int i = 0 ; i < n ; ++ i ) {
|
||||
line s2 = line( P[i], P[i+1] );
|
||||
if ( on( p, s2 ) ) return true;
|
||||
if ( s_cross_s( s1, s2 ) ) count ++;
|
||||
if ( on( P[i], s1 ) && l_cross_s( s1, line( P[i+1], P[(i-1+n)%n] ) ) ) count ++;
|
||||
}
|
||||
if ( count%2 == 0 ) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
point crosspoint( line l, line m )
|
||||
{
|
||||
point a = point( m.x, m.y );
|
||||
point b = point( m.x+m.dx, m.y+m.dy );
|
||||
if ( m.dx*l.dy == m.dy*l.dx ) {
|
||||
if ( dist( point( l.x, l.y ), a ) < dist( point( l.x, l.y ), b ) )
|
||||
return a;
|
||||
else return b;
|
||||
}else {
|
||||
double a1 = -l.dy,b1 = l.dx,c1 = l.dx*l.y-l.dy*l.x;
|
||||
double a2 = -m.dy,b2 = m.dx,c2 = m.dx*m.y-m.dy*m.x;
|
||||
double x = (c1*b2-c2*b1)/(a1*b2-a2*b1);
|
||||
double y = (c1*a2-c2*a1)/(b1*a2-b2*a1);
|
||||
return point( x, y );
|
||||
}
|
||||
}
|
||||
double Calcul( int N )
|
||||
{
|
||||
H[N] = H[0];
|
||||
point X[ 21 ];
|
||||
double D = 0.0;
|
||||
for ( int i = 0 ; i < N ; ++ i )
|
||||
for ( int j = i+1 ; j < N ; ++ j ) {
|
||||
line l = line( H[i], H[j] );
|
||||
int S = 0;
|
||||
for ( int k = 0 ; k < N ; ++ k ) {
|
||||
line m = line( H[k], H[k+1] );
|
||||
if ( l_cross_s( l, m ) )
|
||||
X[S ++] = crosspoint( l, m );
|
||||
}
|
||||
X[S ++] = H[i];
|
||||
X[S ++] = H[j];
|
||||
P0 = point( -101, -103 );
|
||||
for ( int k = 0 ; k < S ; ++ k )
|
||||
X[k].d = dist( P0, X[k] );
|
||||
sort( X, X+S, cmp2 );
|
||||
double sum = 0.0;
|
||||
int fla = 0;
|
||||
for ( int i = 1 ; i < S ; ++ i ) {
|
||||
if ( in( point( (X[i-1].x+X[i].x)/2, (X[i-1].y+X[i].y)/2 ), H, N ) ) {
|
||||
if ( fla ) sum += dist( X[i-1], X[i] );
|
||||
else sum = dist( X[i-1], X[i] );
|
||||
D = max( D, sum );
|
||||
fla = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return D;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,N,M;
|
||||
while ( scanf("%d",&T) != EOF )
|
||||
while ( T -- ) {
|
||||
scanf("%d",&N);
|
||||
for ( int i = 0 ; i < N ; ++ i )
|
||||
scanf("%lf%lf",&H[i].x,&H[i].y);
|
||||
scanf("%d",&M);
|
||||
for ( int i = 0 ; i < M ; ++ i )
|
||||
scanf("%lf%lf",&C[i].x,&C[i].y);
|
||||
double d = Graham( M );
|
||||
double D = Calcul( N );
|
||||
if ( d <= D ) printf("legal\n");
|
||||
else printf("illegal\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
73
HDOJ/3264_autoAC.cpp
Normal file
73
HDOJ/3264_autoAC.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define repf(i,a,b) for(int i=(a);i<=(b);i++)
|
||||
typedef long long ll;
|
||||
const int N = 21;
|
||||
const double PI = acos(-1.0);
|
||||
const double EPS = 1e-8;
|
||||
int t, n;
|
||||
struct Round {
|
||||
double x, y;
|
||||
double r;
|
||||
} r[N], ori;
|
||||
double dis(const Round &a, const Round &b) {
|
||||
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
|
||||
}
|
||||
double insection_of_rounds(Round &a, Round &b) {
|
||||
double d = dis(a, b);
|
||||
if (d >= a.r + b.r)
|
||||
return 0;
|
||||
if (d <= fabs(a.r - b.r)) {
|
||||
double r = a.r < b.r ? a.r : b.r;
|
||||
return PI * r * r;
|
||||
}
|
||||
double ang1 = acos((a.r * a.r + d * d - b.r * b.r) / 2. / a.r / d);
|
||||
double ang2 = acos((b.r * b.r + d * d - a.r * a.r) / 2. / b.r / d);
|
||||
double ret = ang1 * a.r * a.r + ang2 * b.r * b.r - d * a.r * sin(ang1);
|
||||
return ret;
|
||||
}
|
||||
bool check(Round& ori) {
|
||||
repf (i, 0, n - 1) {
|
||||
if (insection_of_rounds(ori, r[i]) * 2 < PI * r[i].r * r[i].r)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
double bin(double l, double r, Round& ori) {
|
||||
double mid;
|
||||
while (fabs(l - r) >= EPS) {
|
||||
mid = (l + r) / 2;
|
||||
ori.r = mid;
|
||||
if (check(ori)) {
|
||||
r = mid;
|
||||
} else {
|
||||
l = mid + EPS;
|
||||
}
|
||||
}
|
||||
return mid;
|
||||
}
|
||||
int main() {
|
||||
scanf("%d", &t);
|
||||
while (t--) {
|
||||
scanf("%d", &n);
|
||||
repf (i, 0, n - 1) {
|
||||
scanf("%lf%lf%lf", &r[i].x, &r[i].y, &r[i].r);
|
||||
}
|
||||
double ans = 1e10;
|
||||
repf (i, 0, n - 1) {
|
||||
ori.x = r[i].x;
|
||||
ori.y = r[i].y;
|
||||
double right = 0;
|
||||
repf (j, 0, n - 1) {
|
||||
right = max(right, dis(ori, r[j]) + r[j].r);
|
||||
}
|
||||
ans = min(ans, bin(0, right, ori));
|
||||
}
|
||||
printf("%.4f\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
81
HDOJ/3265_autoAC.cpp
Normal file
81
HDOJ/3265_autoAC.cpp
Normal file
|
@ -0,0 +1,81 @@
|
|||
#include<iostream>
|
||||
#include<vector>
|
||||
#include<string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int maxx=55555;
|
||||
struct node
|
||||
{
|
||||
__int64 sum,color;
|
||||
}tree[maxx<<3];
|
||||
struct seg
|
||||
{
|
||||
int x1,x2,y,color;
|
||||
seg(int a,int b,int c,int d):x1(a),x2(b),y(c),color(d){}
|
||||
bool operator < (const seg &t)const{
|
||||
return y < t.y;
|
||||
}
|
||||
};
|
||||
void pushUp(int no,int l,int r)
|
||||
{
|
||||
if(tree[no].color) tree[no].sum=r-l+1;
|
||||
else if(l==r) tree[no].sum=0;
|
||||
else tree[no].sum=tree[no<<1].sum+tree[no<<1|1].sum;
|
||||
}
|
||||
void update(int x1,int x2,int color,int l,int r,int no)
|
||||
{
|
||||
if(x1<=l&&r<=x2)
|
||||
{
|
||||
tree[no].color+=color;
|
||||
pushUp(no,l,r);
|
||||
return;
|
||||
}
|
||||
int m=(l+r)>>1;
|
||||
if(x1<=m) update(x1,x2,color,l,m,no<<1);
|
||||
if(x2>m) update(x1,x2,color,m+1,r,no<<1|1);
|
||||
pushUp(no,l,r);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,x1,x2,x3,x4,y1,y2,y3,y4,i;
|
||||
while(cin>>n,n)
|
||||
{
|
||||
vector<seg> v;
|
||||
for(i=1;i<=n;++i)
|
||||
{
|
||||
cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
|
||||
if(x1<x3)
|
||||
{
|
||||
v.push_back(seg(x1,x3,y1,1));
|
||||
v.push_back(seg(x1,x3,y2,-1));
|
||||
}
|
||||
if(x4<x2)
|
||||
{
|
||||
v.push_back(seg(x4,x2,y1,1));
|
||||
v.push_back(seg(x4,x2,y2,-1));
|
||||
}
|
||||
if(y1<y3)
|
||||
{
|
||||
v.push_back(seg(x3,x4,y1,1));
|
||||
v.push_back(seg(x3,x4,y3,-1));
|
||||
}
|
||||
if(y4<y2)
|
||||
{
|
||||
v.push_back(seg(x3,x4,y4,1));
|
||||
v.push_back(seg(x3,x4,y2,-1));
|
||||
}
|
||||
}
|
||||
sort(v.begin(),v.end());
|
||||
memset(tree,0,sizeof(tree));
|
||||
__int64 ret=0;
|
||||
int end=v.size();
|
||||
for(i=0;i<end-1;++i)
|
||||
{
|
||||
if(v[i].x2>v[i].x1)
|
||||
update(v[i].x1,v[i].x2-1,v[i].color,0,maxx,1);
|
||||
ret+=tree[1].sum*(v[i+1].y-v[i].y);
|
||||
}
|
||||
printf("%I64d\n",ret);
|
||||
}
|
||||
return 0;
|
||||
}
|
117
HDOJ/3266_autoAC.cpp
Normal file
117
HDOJ/3266_autoAC.cpp
Normal file
|
@ -0,0 +1,117 @@
|
|||
#include<cstdio>
|
||||
#include<vector>
|
||||
#include<string.h>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int mn=100100,M=379177,base=213;
|
||||
int n,m;
|
||||
#define hf(a) ((a)&0x7fffffff)%M
|
||||
struct node {
|
||||
node *nxt;
|
||||
int k,len;
|
||||
} *ha[M],pool[M];
|
||||
int pp;
|
||||
node* find(int k1,int len) {
|
||||
for(node *p=ha[hf(k1)];p;p=p->nxt)
|
||||
if(k1==p->k && len==p->len)return p;
|
||||
return 0;
|
||||
}
|
||||
void insert(int k,int len) {
|
||||
int h=hf(k);
|
||||
pool[pp].k=k;
|
||||
pool[pp].len=len;
|
||||
pool[pp].nxt = ha[h];
|
||||
ha[h]=&pool[pp++];
|
||||
}
|
||||
char ts[mn];
|
||||
string a,b;
|
||||
vector<int> a1,b1,a2,b2;
|
||||
int pw[mn];
|
||||
void getbit(string &str1,string &str2,vector<int> &bit)
|
||||
{
|
||||
int len1,len2;
|
||||
len1=str1.size();
|
||||
len2=str2.size();
|
||||
bit.clear();
|
||||
int key=0;
|
||||
memset(ha,0,sizeof(ha));
|
||||
pp=0;
|
||||
for(int i=0;i<len1;i++)
|
||||
{
|
||||
key+=str1[len1-i-1]*pw[i];
|
||||
insert(key,i+1);
|
||||
}
|
||||
key=0;
|
||||
for(int i=0;i<len2 && i<len1;i++)
|
||||
{
|
||||
key*=base;
|
||||
key+=str2[i];
|
||||
node *p=find(key,i+1);
|
||||
if(p)bit.push_back(1);
|
||||
else bit.push_back(0);
|
||||
}
|
||||
reverse(bit.begin(),bit.end());
|
||||
}
|
||||
void mu(vector<int> &a,vector<int> &b)
|
||||
{
|
||||
int i,j,c=0,tmp;
|
||||
i=a.size()-1; j=b.size()-1;
|
||||
while(1)
|
||||
{
|
||||
if(i<0 && j<0)break;
|
||||
if(i>=0)c+=a[i];
|
||||
if(j>=0)c-=b[j];
|
||||
if(c<0) { a[i]=2+c; c=-1; }
|
||||
else { a[i]=c; c=0; }
|
||||
i-=1;
|
||||
j-=1;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
pw[0]=1;
|
||||
for(int i=1;i<mn;i++)pw[i]=pw[i-1]*base;
|
||||
while(1)
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
if(n==0 && m==0)break;
|
||||
scanf("%s",ts);
|
||||
a=ts;
|
||||
scanf("%s",ts);
|
||||
b=ts;
|
||||
getbit(b,b,b1);
|
||||
getbit(b,a,b2);
|
||||
getbit(a,a,a1);
|
||||
getbit(a,b,a2);
|
||||
mu(b1,b2);
|
||||
mu(a1,a2);
|
||||
int al=0,bl=0;
|
||||
for(bl=0;bl<b1.size();bl++)if(b1[bl]!=0)break;
|
||||
for(al=0;al<a1.size();al++)if(a1[al]!=0)break;
|
||||
if(b1.size()-bl!=a1.size()-al)
|
||||
{
|
||||
if(b1.size()-bl>a1.size()-al)printf("Hamlet\n");
|
||||
else printf("Laertes\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
bool f=1;
|
||||
while(1)
|
||||
{
|
||||
if(bl>=b1.size())break;
|
||||
if(b1[bl]!=a1[al])
|
||||
{
|
||||
if(b1[bl]>a1[al])printf("Hamlet\n");
|
||||
else printf("Laertes\n");
|
||||
f=0;
|
||||
break;
|
||||
}
|
||||
bl++;
|
||||
al++;
|
||||
}
|
||||
if(f)printf("Equal\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
86
HDOJ/3267_autoAC.cpp
Normal file
86
HDOJ/3267_autoAC.cpp
Normal file
|
@ -0,0 +1,86 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define LL long long
|
||||
int n, m;
|
||||
int l[32], r[32];
|
||||
bool red[32], blue[32];
|
||||
int find(int idx[10], int x){
|
||||
if(idx[x]==-1) return x;
|
||||
return idx[x]=find(idx, idx[x]);
|
||||
}
|
||||
void merge(int gra[10][10],int idx[10], int x, int y){
|
||||
int rx = find(idx, x);
|
||||
int ry = find(idx, y);
|
||||
if(rx==ry) return;
|
||||
idx[rx] = ry;
|
||||
for(int k=0;k<n;k++){
|
||||
if(~idx[k]) continue;
|
||||
if(k==ry) continue;
|
||||
gra[ry][k] += gra[rx][k];
|
||||
gra[k][ry] = gra[ry][k];
|
||||
}
|
||||
}
|
||||
int condense(int gra[10][10],int idx[10]){
|
||||
bool flag=true;
|
||||
while(flag){
|
||||
flag = false;
|
||||
for(int i=0;i<n;i++){
|
||||
if(~idx[i]) continue;
|
||||
for(int j=i+1;j<n;j++){
|
||||
if(~idx[j]) continue;
|
||||
if(gra[i][j]>=2){
|
||||
merge(gra, idx, i, j);
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int cnt=0;
|
||||
for(int i=0;i<n;i++){
|
||||
if(~idx[i]) continue;
|
||||
cnt++;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
int minmax(int deg, int red, int gra[10][10], int idx[10]){
|
||||
bool end = true;
|
||||
for(int i=0;i<m;i++){
|
||||
if(red&(1<<i)) continue;
|
||||
int rl = find(idx, l[i]);
|
||||
int rr = find(idx, r[i]);
|
||||
if(rl==rr) continue;
|
||||
end = false;
|
||||
int tidx[10], tgra[10][10];
|
||||
memcpy(tidx, idx, sizeof(tidx));
|
||||
memcpy(tgra, gra, sizeof(tgra));
|
||||
if(deg&1){
|
||||
merge(tgra, tidx, rl, rr);
|
||||
if(condense(tgra, tidx)==1) return 1;
|
||||
if(minmax(deg+1, red, tgra, tidx)==1) return 1;
|
||||
} else {
|
||||
tgra[rl][rr] = tgra[rr][rl] = 0;
|
||||
if(minmax(deg+1, red|(1<<i), tgra, tidx)==-1) return -1;
|
||||
}
|
||||
}
|
||||
if(end) return -1;
|
||||
if(0==(deg&1)) return 1;
|
||||
if(1==(deg&1)) return -1;
|
||||
}
|
||||
int gra[10][10], idx[10];
|
||||
int main(){
|
||||
while(scanf("%d%d", &n,&m), ~n){
|
||||
memset(gra, 0, sizeof(gra));
|
||||
memset(idx, -1, sizeof(idx));
|
||||
for(int i=0;i<m;i++){
|
||||
scanf("%d%d", &l[i], &r[i]);
|
||||
if(l[i]^r[i]){
|
||||
gra[l[i]][r[i]] ++;
|
||||
gra[r[i]][l[i]] ++;
|
||||
}
|
||||
}
|
||||
if(condense(gra, idx)==1||minmax(0, 0, gra, idx)==1) puts("YES");
|
||||
else puts("NO");
|
||||
}
|
||||
}
|
88
HDOJ/3268_autoAC.cpp
Normal file
88
HDOJ/3268_autoAC.cpp
Normal file
|
@ -0,0 +1,88 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
const int maxn = 30;
|
||||
const int maxm = 900;
|
||||
const int INF = 1000000;
|
||||
vector<vector<pair<int,int> > > edge;
|
||||
int dist[maxn+10];
|
||||
bool inQue[maxn+10];
|
||||
int n;
|
||||
int num[maxn];
|
||||
void spfa(int src){
|
||||
memset(dist,63,sizeof(dist));
|
||||
memset(inQue,0,sizeof(inQue));
|
||||
dist[src] = 0;
|
||||
queue<int> que;
|
||||
que.push(src);
|
||||
inQue[src] = 1;
|
||||
while(!que.empty()) {
|
||||
int u = que.front();
|
||||
que.pop();
|
||||
for(int i = 0; i < edge[u].size(); i++)
|
||||
if(dist[u]+edge[u][i].second<dist[edge[u][i].first]) {
|
||||
dist[edge[u][i].first] = dist[u]+edge[u][i].second;
|
||||
if(!inQue[edge[u][i].first]){
|
||||
inQue[edge[u][i].first] = 1;
|
||||
que.push(edge[u][i].first);
|
||||
}
|
||||
}
|
||||
inQue[u] = 0;
|
||||
}
|
||||
}
|
||||
void init(){
|
||||
edge.clear();
|
||||
edge.resize(n+1);
|
||||
}
|
||||
int main(){
|
||||
int ncase;
|
||||
cin >> ncase;
|
||||
while(ncase--){
|
||||
scanf("%d",&n);
|
||||
init();
|
||||
for(int i = 1; i <= n; i++){
|
||||
int a,b;
|
||||
scanf("%d%d",&a,&b);
|
||||
num[a] = b;
|
||||
edge[0].push_back(make_pair(a,b-1));
|
||||
}
|
||||
for(int i = 1; i <= n; i++){
|
||||
for(int j = i+1; j <= n; j++){
|
||||
if(num[i]==num[j]){
|
||||
edge[i].push_back(make_pair(j,0));
|
||||
edge[j].push_back(make_pair(i,0));
|
||||
}
|
||||
}
|
||||
}
|
||||
int m;
|
||||
scanf("%d",&m);
|
||||
while(m--){
|
||||
int a,b,c;
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
edge[a].push_back(make_pair(b,c));
|
||||
}
|
||||
spfa(0);
|
||||
int cnt = 0;
|
||||
for(int i=1;i<=n;i++){
|
||||
bool flag=0;
|
||||
for(int j=1;j<=n;j++){
|
||||
if(i==j) continue;
|
||||
for(int k=1;k<=n;k++){
|
||||
if(k!=i&&k!=j&&dist[i]==dist[j]+dist[k]){
|
||||
cnt++;
|
||||
flag=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(flag) break;
|
||||
}
|
||||
}
|
||||
for(int i = 1; i <= n; i++){
|
||||
cout<<i<<" "<<dist[i]<<endl;
|
||||
}
|
||||
cout<<cnt<<endl;
|
||||
}
|
||||
}
|
95
HDOJ/3269_autoAC.cpp
Normal file
95
HDOJ/3269_autoAC.cpp
Normal file
|
@ -0,0 +1,95 @@
|
|||
#include <stdio.h>
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define N 32
|
||||
#define cls(a) memset(a, 0, sizeof(a))
|
||||
#define cls1(a,i,j) memset(a+i, 1, (j-i+1)*sizeof(bool))
|
||||
#define cls0(a, i) memset(a, 0, i*sizeof(bool))
|
||||
struct computer{
|
||||
bool able[1005];
|
||||
int pcent;
|
||||
}cpt[N];
|
||||
bool isSver[N];
|
||||
int Sver[N];
|
||||
int Clnt[N];
|
||||
int rate[N][N];
|
||||
int main()
|
||||
{
|
||||
int d, n, t, k, s, i, j, l, st, ed, m, c;
|
||||
scanf("%d", &d);
|
||||
while(d--)
|
||||
{
|
||||
cls(isSver);
|
||||
cls(Clnt);
|
||||
cls(Sver);
|
||||
cls(cpt);
|
||||
cls(rate);
|
||||
scanf("%d%d", &n, &t);
|
||||
scanf("%d%d", &s, &k);
|
||||
for(i=0; i<s; i++)
|
||||
{
|
||||
scanf("%d", Sver+i);
|
||||
isSver[Sver[i]] = 1;
|
||||
cpt[Sver[i]].pcent = k;
|
||||
}
|
||||
for(c=0, i=1; i<=n; i++)
|
||||
{
|
||||
if(!isSver[i]) Clnt[c++] = i;
|
||||
}
|
||||
for(i=1; i<=n; i++)
|
||||
{
|
||||
for(j=1; j<=n; j++)
|
||||
{
|
||||
scanf("%d", rate[i]+j);
|
||||
}
|
||||
}
|
||||
for(i=1; i<=n; i++)
|
||||
{
|
||||
scanf("%d", &m);
|
||||
for(j=0; j<m; j++)
|
||||
{
|
||||
scanf("%d%d", &st, &ed);
|
||||
if(st > t) continue;
|
||||
if(ed > t) ed = t;
|
||||
for(l=st; l<ed; l++) cpt[i].able[l] = 1;
|
||||
}
|
||||
}
|
||||
scanf("%d", &m);
|
||||
for(i=0; i<m; i++)
|
||||
{
|
||||
scanf("%d%d", &ed, &st);
|
||||
cls0(cpt[st].able, ed);
|
||||
}
|
||||
for(i=0; i<=t; i++)
|
||||
{
|
||||
for(j=0; j<c; j++)
|
||||
{
|
||||
if(cpt[Clnt[j]].able[i])
|
||||
{
|
||||
for(l=0; l<s; l++)
|
||||
{
|
||||
if(cpt[Sver[l]].able[i])
|
||||
{
|
||||
cpt[Clnt[j]].pcent += rate[Clnt[j]][Sver[l]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(j=0; j<c; j++)
|
||||
if(cpt[Clnt[j]].pcent >= k)
|
||||
{
|
||||
isSver[Clnt[j]] = 1;
|
||||
Sver[s++] = Clnt[j];
|
||||
for(c--, l=j; l<c; l++)
|
||||
Clnt[l] = Clnt[l+1];
|
||||
}
|
||||
}
|
||||
for(i=1; i<=n; i++)
|
||||
{
|
||||
printf("%d%%\n", cpt[i].pcent>=k ? 100 : (cpt[i].pcent*100/k));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
79
HDOJ/3270_autoAC.cpp
Normal file
79
HDOJ/3270_autoAC.cpp
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
char str[100];
|
||||
long long gcd(long long x,long long y)
|
||||
{
|
||||
return y==0?x:gcd(y,x%y);
|
||||
}
|
||||
long long Ex_Euclid(long long a,long long b,long long &x,long long &y)
|
||||
{
|
||||
long long ans,t;
|
||||
if (b==0)
|
||||
{
|
||||
x=1;
|
||||
y=0;
|
||||
ans=0;
|
||||
return ans;
|
||||
}
|
||||
ans=Ex_Euclid(b,a%b,x,y);
|
||||
t=x;
|
||||
x=y;
|
||||
y=t-(a/b)*y;
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,n;
|
||||
long long A,B,C,D,x,y,k,t;
|
||||
while(scanf("%s",str)!=EOF)
|
||||
{
|
||||
A=0;
|
||||
for (i=0;i<strlen(str)-1;i++)
|
||||
{
|
||||
A=A*10+str[i]-'0';
|
||||
}
|
||||
scanf("%s",str);
|
||||
scanf("%s",str);
|
||||
B=0;
|
||||
for (i=0;i<strlen(str)-1;i++)
|
||||
{
|
||||
B=B*10+str[i]-'0';
|
||||
}
|
||||
scanf("%s",str);
|
||||
scanf("%s",str);
|
||||
C=0;
|
||||
for (i=0;i<strlen(str);i++)
|
||||
{
|
||||
C=C*10+str[i]-'0';
|
||||
}
|
||||
if (A==0) A=1;
|
||||
if (B==0) B=1;
|
||||
D=gcd(A,B);
|
||||
if (C%D!=0)
|
||||
{
|
||||
printf("No.\n\n");
|
||||
continue;
|
||||
}
|
||||
n=Ex_Euclid(A,B,x,y);
|
||||
x=x*C/D;
|
||||
t=B/D;
|
||||
x=(x%t+t)%t;
|
||||
k=(C-A*x)/B;
|
||||
if (k>=0)
|
||||
{
|
||||
printf("Yes.\n\n");
|
||||
continue;
|
||||
}
|
||||
y=y*C/D;
|
||||
t=A/D;
|
||||
y=(y%t+t)%t;
|
||||
k=(C-B*y)/A;
|
||||
if (k>=0)
|
||||
{
|
||||
printf("Yes.\n\n");
|
||||
continue;
|
||||
}
|
||||
printf("No.\n\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
65
HDOJ/3271_autoAC.cpp
Normal file
65
HDOJ/3271_autoAC.cpp
Normal file
|
@ -0,0 +1,65 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<queue>
|
||||
#include<cstdio>
|
||||
#include<cmath>
|
||||
#include<algorithm>
|
||||
#define N 30
|
||||
#define inf 1<<29
|
||||
#define MOD 2007
|
||||
#define LL long long
|
||||
using namespace std;
|
||||
int dp[32][305];
|
||||
void Init(int b,int m){
|
||||
memset(dp,0,sizeof(dp));
|
||||
dp[0][0]=1;
|
||||
for(int i=1;i<32;i++)
|
||||
for(int j=0;j<=m;j++)
|
||||
for(int k=0;k<b&&k+j<=m;k++)
|
||||
dp[i][j+k]+=dp[i-1][j];
|
||||
}
|
||||
int clac(int n,int b,int m){
|
||||
int bit[35],len=0,t=n;
|
||||
while(t){
|
||||
bit[++len]=t%b;
|
||||
t/=b;
|
||||
}
|
||||
int sum=0,tot=0;
|
||||
for(int i=len;i;i--){
|
||||
for(int j=0;j<bit[i]&&m-tot-j>=0;j++)
|
||||
sum+=dp[i-1][m-tot-j];
|
||||
tot+=bit[i];
|
||||
if(tot>m) break;
|
||||
}
|
||||
if(tot==m) sum++;
|
||||
return sum;
|
||||
}
|
||||
int main(){
|
||||
int cas=0,kind,x,y,b,m,k;
|
||||
while(scanf("%d%d%d%d%d",&kind,&x,&y,&b,&m)!=EOF){
|
||||
Init(b,m);
|
||||
if(x>y) swap(x,y);
|
||||
printf("Case %d:\n",++cas);
|
||||
int cnt=clac(y,b,m)-clac(x-1,b,m);
|
||||
if(kind==1){
|
||||
printf("%d\n",cnt);
|
||||
continue;
|
||||
}
|
||||
scanf("%d",&k);
|
||||
if(k>cnt){
|
||||
puts("Could not find the Number!");
|
||||
continue;
|
||||
}
|
||||
int low=x,high=y,mid;
|
||||
while(low<high){
|
||||
mid=(int)((((LL)low+(LL)high))/2);
|
||||
int now=clac(mid,b,m)-clac(x-1,b,m);
|
||||
if(now<k)
|
||||
low=mid+1;
|
||||
else
|
||||
high=mid;
|
||||
}
|
||||
printf("%d\n",low);
|
||||
}
|
||||
return 0;
|
||||
}
|
106
HDOJ/3272_autoAC.cpp
Normal file
106
HDOJ/3272_autoAC.cpp
Normal file
|
@ -0,0 +1,106 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
#define repf(i,a,b) for(int i=(a);i<=(b);i++)
|
||||
typedef long long ll;
|
||||
const int N = 0;
|
||||
struct Point {
|
||||
double x;
|
||||
double y;
|
||||
} h, o, p[3];
|
||||
double dis(const Point& a, const Point& b) {
|
||||
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
|
||||
}
|
||||
double calc(int a, int b) {
|
||||
double ret = dis(h, p[a]) + dis(p[a], p[b]) + dis(p[b], h);
|
||||
double ha, ab, bh;
|
||||
bool cx = 0, cy = 0;
|
||||
if (h.x * p[a].x <= 0 || p[a].x * p[b].x <= 0 || p[b].x * h.x <= 0)
|
||||
cx = 1;
|
||||
if (h.y * p[a].y <= 0 || p[a].y * p[b].y <= 0 || p[b].y * h.y <= 0)
|
||||
cy = 1;
|
||||
if (cx == 0 && cy == 0) {
|
||||
Point t1, t2;
|
||||
t1.x = h.x;
|
||||
t1.y = -h.y;
|
||||
t2.x = -p[a].x;
|
||||
t2.y = p[a].y;
|
||||
ha = ret - dis(h, p[a]) + dis(t1, t2);
|
||||
t1.x = p[b].x;
|
||||
t1.y = -p[b].y;
|
||||
t2.x = -p[a].x;
|
||||
t2.y = p[a].y;
|
||||
ab = ret - dis(p[a], p[b]) + dis(t1, t2);
|
||||
t1.x = p[b].x;
|
||||
t1.y = -p[b].y;
|
||||
t2.x = -h.x;
|
||||
t2.y = h.y;
|
||||
bh = ret - dis(h, p[b]) + dis(t1, t2);
|
||||
double ans = min(ha, min(ab, bh));
|
||||
t1.x = p[a].x;
|
||||
t1.y = -p[a].y;
|
||||
t2.x = -p[a].x;
|
||||
t2.y = p[a].y;
|
||||
ans = min(ans, ret - dis(p[a], h) + dis(t1, h) - dis(p[a], p[b]) + dis(t2, p[b]));
|
||||
t1.x = h.x;
|
||||
t1.y = -h.y;
|
||||
t2.x = -h.x;
|
||||
t2.y = h.y;
|
||||
ans = min(ans, ret - dis(p[a], h) + dis(p[a], t1) - dis(h, p[b]) + dis(t2, p[b]));
|
||||
t1.x = p[a].x;
|
||||
t1.y = -p[a].y;
|
||||
t2.x = -p[a].x;
|
||||
t2.y = p[a].y;
|
||||
ans = min(ans, ret - dis(p[a], p[b]) + dis(t1, p[b]) - dis(p[a], h) + dis(t2, h));
|
||||
t1.x = p[b].x;
|
||||
t1.y = -p[b].y;
|
||||
t2.x = -p[b].x;
|
||||
t2.y = p[b].y;
|
||||
ans = min(ans, ret - dis(p[a], p[b]) + dis(t1, p[a]) - dis(p[b], h) + dis(t2, h));
|
||||
t1.x = h.x;
|
||||
t1.y = -h.y;
|
||||
t2.x = -h.x;
|
||||
t2.y = h.y;
|
||||
ans = min(ans, ret - dis(p[b], h) + dis(p[b], t1) - dis(h, p[a]) + dis(t2, p[a]));
|
||||
t1.x = p[b].x;
|
||||
t1.y = -p[b].y;
|
||||
t2.x = -p[b].x;
|
||||
t2.y = p[b].y;
|
||||
ans = min(ans, ret - dis(h, p[b]) + dis(t1, h) - dis(p[b], p[a]) + dis(t2, p[a]));
|
||||
ret = ans;
|
||||
} else if (cx == 1 && cy == 0) {
|
||||
Point tmp;
|
||||
tmp.x = p[a].x;
|
||||
tmp.y = -p[a].y;
|
||||
ha = ret - dis(h, p[a]) + dis(h, tmp);
|
||||
ab = ret - dis(p[a], p[b]) + dis(tmp, p[b]);
|
||||
tmp.x = p[b].x;
|
||||
tmp.y = -p[b].y;
|
||||
bh = ret - dis(h, p[b]) + dis(h, tmp);
|
||||
ret = min(ha, min(ab, bh));
|
||||
} else if (cx == 0 && cy == 1) {
|
||||
Point tmp;
|
||||
tmp.x = -p[a].x;
|
||||
tmp.y = p[a].y;
|
||||
ha = ret - dis(h, p[a]) + dis(h, tmp);
|
||||
ab = ret - dis(p[a], p[b]) + dis(tmp, p[b]);
|
||||
tmp.x = -p[b].x;
|
||||
tmp.y = p[b].y;
|
||||
bh = ret - dis(h, p[b]) + dis(h, tmp);
|
||||
ret = min(ha, min(ab, bh));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main() {
|
||||
o.x = 0;
|
||||
o.y = 0;
|
||||
int t;
|
||||
cin >> t;
|
||||
while (cin >> p[0].x >> p[0].y >> p[1].x >> p[1].y >> h.x >> h.y) {
|
||||
printf("%.2f\n", calc(0, 1));
|
||||
}
|
||||
return 0;
|
||||
}
|
58
HDOJ/3274_autoAC.cpp
Normal file
58
HDOJ/3274_autoAC.cpp
Normal file
|
@ -0,0 +1,58 @@
|
|||
#include<iostream>
|
||||
#include<cstdlib>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
#include<vector>
|
||||
#include<cstdio>
|
||||
using namespace std;
|
||||
const int maxn=2001;
|
||||
int n,m,root,sum,NE=0,vis[maxn],head[maxn];
|
||||
struct node
|
||||
{
|
||||
int u,v,w,next;
|
||||
} Edge[maxn];
|
||||
void addEdge(int u,int v,int w)
|
||||
{
|
||||
Edge[NE].u=u,Edge[NE].v=v,Edge[NE].w=w,Edge[NE].next=head[u];
|
||||
head[u]=NE++;
|
||||
}
|
||||
void dfs(int u,int fa)
|
||||
{
|
||||
int i,j;
|
||||
for(i=head[u];i!=-1;i=Edge[i].next)
|
||||
{
|
||||
int v=Edge[i].v;
|
||||
if(v==fa)continue;
|
||||
dfs(v,u);
|
||||
if(vis[v])
|
||||
{
|
||||
sum+=Edge[i].w;
|
||||
vis[u]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&m)!=EOF)
|
||||
{
|
||||
int i,j,a,b,c;
|
||||
sum=NE=0;
|
||||
memset(vis,0,sizeof(vis));
|
||||
memset(head,-1,sizeof(head));
|
||||
for(i=1; i<=m; i++)
|
||||
{
|
||||
scanf("%d",&root);
|
||||
vis[root]=1;
|
||||
}
|
||||
for(i=1; i<n; i++)
|
||||
{
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
addEdge(a,b,c);
|
||||
addEdge(b,a,c);
|
||||
}
|
||||
dfs(root,-1);
|
||||
cout<<sum<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
128
HDOJ/3275_autoAC.cpp
Normal file
128
HDOJ/3275_autoAC.cpp
Normal file
|
@ -0,0 +1,128 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
struct node{
|
||||
int num;
|
||||
int flag;
|
||||
int l;
|
||||
int r;
|
||||
int len;
|
||||
}p[100005*6];
|
||||
int n,k,nima,cao;
|
||||
char a[100005];
|
||||
void build(int l,int r,int n)
|
||||
{
|
||||
p[n].l=l;
|
||||
p[n].r=r;
|
||||
p[n].len=r-l+1;
|
||||
p[n].flag=0;
|
||||
if(l==r)
|
||||
{
|
||||
if(a[l]=='1')
|
||||
p[n].num=0;
|
||||
else
|
||||
p[n].num=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int mid=(l+r)/2;
|
||||
build(l,mid,n*2);
|
||||
build(mid+1,r,n*2+1);
|
||||
p[n].num=p[n*2].num+p[n*2+1].num;
|
||||
}
|
||||
}
|
||||
void pushdown(int n)
|
||||
{
|
||||
p[n].flag=0;
|
||||
p[n*2].flag^=1;
|
||||
p[n*2+1].flag^=1;
|
||||
p[n*2].num=p[n*2].len-p[n*2].num;
|
||||
p[n*2+1].num=p[n*2+1].len-p[n*2+1].num;
|
||||
}
|
||||
void update(int x,int y,int n)
|
||||
{
|
||||
if(x==p[n].l&&y==p[n].r)
|
||||
{
|
||||
p[n].flag^=1;
|
||||
p[n].num=p[n].len-p[n].num;
|
||||
}
|
||||
else
|
||||
{
|
||||
int mid=(p[n].l+p[n].r)/2;
|
||||
if(x>mid)
|
||||
update(x,y,n*2+1);
|
||||
else if(y<=mid)
|
||||
update(x,y,n*2);
|
||||
else
|
||||
{
|
||||
update(x,mid,n*2);
|
||||
update(mid+1,y,n*2+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
void insert(int x,int n)
|
||||
{
|
||||
if(nima)
|
||||
return ;
|
||||
if(p[n].flag==1)
|
||||
pushdown(n);
|
||||
if(p[n].l==p[n].r)
|
||||
{
|
||||
if(p[n].num==1)
|
||||
{
|
||||
nima=p[n].l;
|
||||
if(p[n].l+k-1<=cao)
|
||||
update(p[n].l,p[n].l+k-1,1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int mid=(p[n].l+p[n].r)/2;
|
||||
if(x>mid)
|
||||
insert(x,n*2+1);
|
||||
else
|
||||
{
|
||||
insert(x,n*2);
|
||||
insert(mid+1,n*2+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int temp,t;
|
||||
while(scanf("%d%d",&n,&k)!=EOF&&(n!=0||k!=0))
|
||||
{
|
||||
cao=n;
|
||||
temp=0;
|
||||
t=0;
|
||||
getchar();
|
||||
scanf("%s",a+1);
|
||||
build(1,n,1);
|
||||
if(p[1].num==0)
|
||||
{
|
||||
printf("0\n");
|
||||
continue;
|
||||
}
|
||||
if(k==0)
|
||||
{
|
||||
printf("-1\n");
|
||||
continue;
|
||||
}
|
||||
while(1)
|
||||
{
|
||||
nima=0;
|
||||
insert(temp+1,1);
|
||||
temp=nima;
|
||||
if(nima==0)
|
||||
break;
|
||||
if(n-temp+1<k)
|
||||
break;
|
||||
t++;
|
||||
}
|
||||
if(nima==0)
|
||||
printf("%d\n",t);
|
||||
else
|
||||
printf("-1\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
62
HDOJ/3276_autoAC.cpp
Normal file
62
HDOJ/3276_autoAC.cpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#include<iostream>
|
||||
using namespace std;
|
||||
#define N 50005
|
||||
#define esp 1e-5
|
||||
#define inf -10000000001
|
||||
double a[N],sum[N];
|
||||
double L[N],R[N];
|
||||
int q[N];
|
||||
int n,x,y;
|
||||
int head,tail;
|
||||
bool find(double ave){
|
||||
sum[0]=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
sum[i]=sum[i-1]+a[i]-ave;
|
||||
head=tail=0;
|
||||
L[x-1]=inf;
|
||||
for(int i=x;i<=n;i++){
|
||||
int p=i-x;
|
||||
while(head<tail&&sum[p]<sum[q[tail-1]])
|
||||
tail--;
|
||||
q[tail++]=p;
|
||||
while(head<tail&&i-y>q[head])
|
||||
head++;
|
||||
L[i]=max(L[i-1],sum[i]-sum[q[head]]);
|
||||
}
|
||||
sum[n+1]=0;
|
||||
for(int i=n;i>0;i--)
|
||||
sum[i]=sum[i+1]+a[i]-ave;
|
||||
head=tail=0;
|
||||
R[n-x+2]=inf;
|
||||
for(int i=n-x+1;i>0;i--){
|
||||
int p=i+x;
|
||||
while(head<tail&&sum[p]<sum[q[tail-1]])
|
||||
tail--;
|
||||
q[tail++]=p;
|
||||
while(head<tail&&i+y<q[head])
|
||||
head++;
|
||||
R[i]=max(R[i+1],sum[i]-sum[q[head]]);
|
||||
}
|
||||
for(int i=x+1;i<=n-x;i++)
|
||||
if(L[i-1]+R[i+1]>=0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
int main(){
|
||||
int k=1;
|
||||
while(~scanf("%d%d%d",&n,&x,&y)){
|
||||
for(int i=1;i<=n;i++)
|
||||
scanf("%lf",&a[i]);
|
||||
double f=1.0,l=200000.0,ret;
|
||||
while(l-f>=esp){
|
||||
double mid=(f+l)/2;
|
||||
if(find(mid)){
|
||||
f=mid;
|
||||
ret=mid;
|
||||
}
|
||||
else
|
||||
l=mid;
|
||||
}
|
||||
printf("Case %d: %.3lf\n",k++,ret);
|
||||
}
|
||||
}
|
230
HDOJ/3277_autoAC.cpp
Normal file
230
HDOJ/3277_autoAC.cpp
Normal file
|
@ -0,0 +1,230 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdlib.h>
|
||||
#include<climits>
|
||||
#define clr(x)memset(x,0,sizeof(x))
|
||||
#define min(a,b)(a)<(b)?(a):(b)
|
||||
const int INF=INT_MAX;
|
||||
const int maxn=800;
|
||||
const int maxm=1000000;
|
||||
struct node
|
||||
{
|
||||
int from,to,next,c;
|
||||
}e[maxm];
|
||||
int tot;
|
||||
int head[maxn];
|
||||
void add(int s,int u,int f1,int f2)
|
||||
{
|
||||
e[tot].from=s;
|
||||
e[tot].to=u;
|
||||
e[tot].c=f1;
|
||||
e[tot].next=head[s];
|
||||
head[s]=tot++;
|
||||
e[tot].from=u;
|
||||
e[tot].to=s;
|
||||
e[tot].c=f2;
|
||||
e[tot].next=head[u];
|
||||
head[u]=tot++;
|
||||
}
|
||||
int q[maxn];
|
||||
int cnt[maxn];
|
||||
int d[maxn];
|
||||
int low[maxn];
|
||||
int cur[maxn];
|
||||
int maxflow(int s,int t,int n)
|
||||
{
|
||||
int *front=q,*rear=q;
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
d[i]=n;
|
||||
cnt[i]=0;
|
||||
}
|
||||
cnt[n]=n-1;
|
||||
cnt[0]++;
|
||||
d[t]=0;
|
||||
*rear++=t;
|
||||
while(front<rear)
|
||||
{
|
||||
int v=*front++;
|
||||
for(int i=head[v];i!=-1;i=e[i].next)
|
||||
{
|
||||
if(d[e[i].to]==n&&e[i^1].c>0)
|
||||
{
|
||||
d[e[i].to]=d[v]+1;
|
||||
cnt[n]--;
|
||||
cnt[d[e[i].to]]++;
|
||||
*rear++=e[i].to;
|
||||
}
|
||||
}
|
||||
}
|
||||
int flow=0, u=s, top=0;
|
||||
low[0]=INF;
|
||||
for(int i=0;i<n;i++)
|
||||
cur[i]=head[i];
|
||||
while(d[s]<n)
|
||||
{
|
||||
int &i=cur[u];
|
||||
for(;i!=-1;i=e[i].next)
|
||||
{
|
||||
if(e[i].c>0&&d[u]==d[e[i].to]+1)
|
||||
{
|
||||
low[top+1]=min(low[top],e[i].c);
|
||||
q[++top]=i;
|
||||
u=e[i].to;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(i!=-1)
|
||||
{
|
||||
if(u==t)
|
||||
{
|
||||
int minf=low[top];
|
||||
for(int p=1,i;p<=top;++p)
|
||||
{
|
||||
i=q[p];
|
||||
e[i].c-=minf;
|
||||
e[i^1].c+=minf;
|
||||
}
|
||||
flow+=minf;
|
||||
u=s;
|
||||
low[0]=INF;
|
||||
top=0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int old_du=d[u];
|
||||
cnt[old_du]--;
|
||||
d[u]=n-1;
|
||||
for(int i=head[u];i!=-1;i=e[i].next)
|
||||
if(e[i].c>0&&d[u]>d[e[i].to])
|
||||
d[u]=d[e[i].to];
|
||||
cnt[++d[u]]++;
|
||||
if(d[u]<n)
|
||||
cur[u]=head[u];
|
||||
if(u!=s)
|
||||
{
|
||||
u=e[q[top]].from;
|
||||
--top;
|
||||
}
|
||||
if(cnt[old_du]==0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return flow;
|
||||
}
|
||||
int f[maxn];
|
||||
int search(int x)
|
||||
{
|
||||
return f[x] == x?x:(f[x] = search(f[x]));
|
||||
}
|
||||
void join(int x,int y)
|
||||
{
|
||||
int fx = search(x);
|
||||
int fy = search(y);
|
||||
if(fx != fy){
|
||||
if(fx < fy)
|
||||
f[fy] = fx;
|
||||
else f[fx] = fy;
|
||||
}
|
||||
}
|
||||
struct noq
|
||||
{
|
||||
int girl,boy;
|
||||
}re[maxn*maxn];
|
||||
int g[maxn][maxn];
|
||||
int K;
|
||||
struct Edge
|
||||
{
|
||||
int xu,flow;
|
||||
}edge[1000000];
|
||||
int top;
|
||||
int ok(int ti,int s,int t,int n)
|
||||
{
|
||||
int i, j, k;
|
||||
for(i = 0; i < 2*n; i++)
|
||||
{
|
||||
e[edge[i].xu].c = ti;
|
||||
e[edge[i].xu^1].c = 0;
|
||||
}
|
||||
for(i = 2*n; i < top; i++)
|
||||
{
|
||||
e[edge[i].xu].c = edge[i].flow;
|
||||
e[edge[i].xu^1].c = 0;
|
||||
}
|
||||
int res = maxflow(s,t,t+1);
|
||||
if(res == n*ti)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T, n, m;
|
||||
int i, j, k, F;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d %d %d %d",&n, &m, &K, &F);
|
||||
for(i = 1; i <= n; i++)
|
||||
f[i] = i;
|
||||
for(i = 1; i <= m; i++)
|
||||
scanf("%d %d",&re[i].girl,&re[i].boy);
|
||||
int a, b;
|
||||
while(F--){
|
||||
scanf("%d %d",&a, &b);
|
||||
join(a,b);
|
||||
}
|
||||
clr(g);
|
||||
for(i = 1; i <= m; i++)
|
||||
g[search(re[i].girl)][re[i].boy] = 1;
|
||||
for(i = 1; i <= n; i++)
|
||||
for(j = 1;j <= n; j++)
|
||||
if(g[search(i)][j] == 1)
|
||||
g[i][j] = 1;
|
||||
int s = 0;
|
||||
int t = n*3+1;
|
||||
tot = 0;
|
||||
memset(head,-1,sizeof(head));
|
||||
top = 0;
|
||||
for(i = 1; i <= n; i++){
|
||||
edge[top++].xu = tot;
|
||||
add(s,i,1,0);
|
||||
}
|
||||
for(i = n*2+1; i <= n*3; i++)
|
||||
{
|
||||
edge[top++].xu = tot;
|
||||
add(i,t,1,0);
|
||||
}
|
||||
for(i = 1; i <= n; i++){
|
||||
edge[top].xu = tot;
|
||||
edge[top++].flow = K;
|
||||
add(i,i+n,K,0);
|
||||
}
|
||||
for(i = 1; i <= n; i++)
|
||||
for(j = 1; j <= n; j++)
|
||||
{
|
||||
if(g[i][j]){
|
||||
edge[top].xu = tot;
|
||||
edge[top++].flow = 1;
|
||||
add(i,j+2*n,1,0);
|
||||
}
|
||||
else{
|
||||
edge[top].xu = tot;
|
||||
edge[top++].flow = 1;
|
||||
add(i+n,j+2*n,1,0);
|
||||
}
|
||||
}
|
||||
int l = 0, r = n, mid;
|
||||
int res=0;
|
||||
while(l <= r){
|
||||
mid = (l+r)>>1;
|
||||
if(ok(mid,s,t,n)){
|
||||
res = mid;
|
||||
l = mid+1;
|
||||
}
|
||||
else r = mid-1;
|
||||
}
|
||||
printf("%d\n",res);
|
||||
}
|
||||
return 0;
|
||||
}
|
118
HDOJ/3278_autoAC.cpp
Normal file
118
HDOJ/3278_autoAC.cpp
Normal file
|
@ -0,0 +1,118 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#define N 10
|
||||
using namespace std;
|
||||
char s[5][7],str[25];
|
||||
char v[1<<24];
|
||||
queue<int> que;
|
||||
int inline row_op(int r,int n,int op)
|
||||
{
|
||||
int tmp[6];
|
||||
for(int i=0;i<6;i++){
|
||||
tmp[i]=n&(1<<(r*6+i));
|
||||
n-=tmp[i];
|
||||
}
|
||||
if(op){
|
||||
tmp[0]<<=5;
|
||||
for(int i=1;i<6;i++){
|
||||
tmp[i]>>=1;
|
||||
}
|
||||
}else{
|
||||
for(int i=0;i<5;i++){
|
||||
tmp[i]<<=1;
|
||||
}
|
||||
tmp[5]>>=5;
|
||||
}
|
||||
n+=tmp[0]+tmp[1]+tmp[2]+tmp[3]+tmp[4]+tmp[5];
|
||||
return n;
|
||||
}
|
||||
int inline col_op(int c,int n,int op)
|
||||
{
|
||||
int tmp[4];
|
||||
for(int i=0;i<4;i++){
|
||||
tmp[i]=n&(1<<(i*6+c));
|
||||
n-=tmp[i];
|
||||
}
|
||||
if(op){
|
||||
tmp[0]<<=18;
|
||||
tmp[1]>>=6;
|
||||
tmp[2]>>=6;
|
||||
tmp[3]>>=6;
|
||||
}else{
|
||||
tmp[0]<<=6;
|
||||
tmp[1]<<=6;
|
||||
tmp[2]<<=6;
|
||||
tmp[3]>>=18;
|
||||
}
|
||||
n+=tmp[0]+tmp[1]+tmp[2]+tmp[3];
|
||||
return n;
|
||||
}
|
||||
void countMoves()
|
||||
{
|
||||
int cnt=0;
|
||||
while(!que.empty()) que.pop();
|
||||
memset(v,-1,sizeof(v));
|
||||
que.push(124800);
|
||||
v[124800]=0;
|
||||
while(!que.empty()){
|
||||
int t=que.front();
|
||||
que.pop();
|
||||
for(int i=0;i<4;i++){
|
||||
int tmp=row_op(i,t,1);
|
||||
if(v[tmp]==-1){
|
||||
que.push(tmp);
|
||||
v[tmp]=v[t]+1;
|
||||
}
|
||||
tmp=row_op(i,t,0);
|
||||
if(v[tmp]==-1){
|
||||
que.push(tmp);
|
||||
v[tmp]=v[t]+1;
|
||||
}
|
||||
}
|
||||
for(int j=0;j<6;j++){
|
||||
int tmp=col_op(j,t,1);
|
||||
if(v[tmp]==-1){
|
||||
que.push(tmp);
|
||||
v[tmp]=v[t]+1;
|
||||
}
|
||||
tmp=col_op(j,t,0);
|
||||
if(v[tmp]==-1){
|
||||
que.push(tmp);
|
||||
v[tmp]=v[t]+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,cas=1;
|
||||
int b,w,g;
|
||||
cin >> T;
|
||||
countMoves();
|
||||
while(T--){
|
||||
b=w=g=0;
|
||||
for(int i=0;i<4;i++){
|
||||
scanf("%s",s[i]);
|
||||
for(int j=0;j<6;j++){
|
||||
if(s[i][j]=='B'){
|
||||
b+=(1<<(i*6+j));
|
||||
}else if(s[i][j]=='W'){
|
||||
w+=(1<<(i*6+j));
|
||||
}else{
|
||||
g+=(1<<(i*6+j));
|
||||
}
|
||||
}
|
||||
}
|
||||
int cnt = min(v[b],min(v[w],v[g]));
|
||||
cout << "Case " << cas << ": " << cnt << endl;
|
||||
cas++;
|
||||
}
|
||||
return 0;
|
||||
}
|
21
HDOJ/3279_autoAC.cpp
Normal file
21
HDOJ/3279_autoAC.cpp
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
int main()
|
||||
{
|
||||
int i,j,n,t,b;
|
||||
int a[11];
|
||||
while(scanf("%d",&t)!=EOF)
|
||||
{
|
||||
int k=1;
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d",&b);
|
||||
for(i=0;i<10;i++)
|
||||
scanf("%d",&a[i]);
|
||||
sort(a,a+10);
|
||||
printf("%d %d\n",k++,a[7]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
43
HDOJ/3280_autoAC.cpp
Normal file
43
HDOJ/3280_autoAC.cpp
Normal file
|
@ -0,0 +1,43 @@
|
|||
#include <stdio.h>
|
||||
int main()
|
||||
{
|
||||
int i,j,n,t,b;
|
||||
int a[10005];
|
||||
while(scanf("%d",&t)!=EOF)
|
||||
{
|
||||
int k=1;
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d %d",&b,&n);
|
||||
for(i=0;i<n;i++)
|
||||
scanf("%d",&a[i]);
|
||||
int sum=0,temp,flag;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
sum+=a[i];
|
||||
temp=0;
|
||||
flag=0;
|
||||
for(j=i+1;j<n;j++)
|
||||
{
|
||||
temp+=a[j];
|
||||
if(temp==sum)
|
||||
temp=0;
|
||||
else if(temp>sum)
|
||||
{
|
||||
flag=1;
|
||||
break;
|
||||
}
|
||||
else if(j==n-1)
|
||||
{
|
||||
flag=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(flag==0)
|
||||
break;
|
||||
}
|
||||
printf("%d %d\n",k++,sum);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
29
HDOJ/3281_autoAC.cpp
Normal file
29
HDOJ/3281_autoAC.cpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
int f[55][1005];
|
||||
void init(){
|
||||
for(int i = 1; i < 1001; i ++)
|
||||
f[1][i] = i;
|
||||
for(int i = 2; i < 51; i ++){
|
||||
f[i][1] = 1;
|
||||
for(int j = 2; j < 1001; j ++){
|
||||
f[i][j] = f[i][j - 1] + 1;;
|
||||
for(int k = 2; k < j; k ++){
|
||||
f[i][j] = min(f[i][j], max(f[i - 1][k - 1], f[i][j - k]) + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
int t, T, n, m;
|
||||
init();
|
||||
scanf("%d", &T);
|
||||
while(T --){
|
||||
scanf("%d%d%d", &t, &n, &m);
|
||||
cout<<t<<" "<<f[n][m]<<endl;
|
||||
}
|
||||
}
|
67
HDOJ/3282_autoAC.cpp
Normal file
67
HDOJ/3282_autoAC.cpp
Normal file
|
@ -0,0 +1,67 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<string>
|
||||
#include<cmath>
|
||||
using namespace std;
|
||||
void run()
|
||||
{
|
||||
int n,m;
|
||||
scanf("%d%d",&n,&m);
|
||||
int i,num[10001];
|
||||
int ans[10001]={0};
|
||||
int u=2;
|
||||
printf("%d %d\n",n,(m+1)/2);
|
||||
scanf("%d",&num[1]);
|
||||
ans[1]=num[1];
|
||||
for(i=2;i<=m;i++)
|
||||
{
|
||||
int tmp,j,k;
|
||||
scanf("%d",&tmp);
|
||||
if(tmp<=num[1])
|
||||
{
|
||||
for(k=i-1;k>=1;k--)
|
||||
{
|
||||
num[k+1]=num[k];
|
||||
}
|
||||
num[1]=tmp;
|
||||
}
|
||||
else if(tmp>=num[i-1])
|
||||
{num[i]=tmp;}
|
||||
else
|
||||
{
|
||||
bool f=false;
|
||||
for(j=i-1;j>=1;j--)
|
||||
{
|
||||
if(tmp>=num[j-1] && tmp<=num[j])
|
||||
{
|
||||
f=true;
|
||||
int k;
|
||||
{
|
||||
for(k=i-1;k>=j;k--)
|
||||
{
|
||||
num[k+1]=num[k];
|
||||
}
|
||||
num[j]=tmp;
|
||||
}
|
||||
}
|
||||
if(f==true) break;
|
||||
}
|
||||
}
|
||||
if(i%2==1)
|
||||
{
|
||||
ans[u++]=num[(i+1)/2];
|
||||
}
|
||||
}
|
||||
for(i=1;i<u;i++)
|
||||
{
|
||||
if(i%10==0 || i==u-1) printf("%d\n",ans[i]);
|
||||
else printf("%d ",ans[i]);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int total;
|
||||
cin>>total;
|
||||
for(int now=1;now<=total;now++) run();
|
||||
return 0;
|
||||
}
|
20
HDOJ/3283_autoAC.cpp
Normal file
20
HDOJ/3283_autoAC.cpp
Normal file
|
@ -0,0 +1,20 @@
|
|||
#include<iostream>
|
||||
#include<stdio.h>
|
||||
#include<algorithm>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
char a[100];
|
||||
int main()
|
||||
{
|
||||
int t,i,len,n;
|
||||
scanf("%d",&t);
|
||||
for(i=1;i<=t;i++)
|
||||
{
|
||||
scanf("%d %s",&n,a);
|
||||
len=strlen(a);
|
||||
if (next_permutation(a,a+len)) printf("%d %s\n",i,a);
|
||||
else
|
||||
printf("%d BIGGEST\n",i);
|
||||
}
|
||||
return 0;
|
||||
}
|
24
HDOJ/3284_autoAC.cpp
Normal file
24
HDOJ/3284_autoAC.cpp
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include <stdio.h>
|
||||
int dp[102][102][2];
|
||||
int main()
|
||||
{
|
||||
int z,ca,n,k;
|
||||
scanf("%d",&z);
|
||||
dp[1][0][0] = dp[1][0][1] = 1;
|
||||
for(int i=2;i<=100;i++)
|
||||
{
|
||||
dp[i][0][0] = dp[i-1][0][0] + dp[i-1][0][1];
|
||||
dp[i][0][1] = dp[i-1][0][0];
|
||||
for(int j=1;j<i;j++)
|
||||
{
|
||||
dp[i][j][0] = dp[i-1][j][0] + dp[i-1][j][1];
|
||||
dp[i][j][1] = dp[i-1][j][0] + dp[i-1][j-1][1];
|
||||
}
|
||||
}
|
||||
while(z--)
|
||||
{
|
||||
scanf("%d%d%d",&ca,&n,&k);
|
||||
printf("%d %d\n",ca,dp[n][k][0]+dp[n][k][1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
86
HDOJ/3285_autoAC.cpp
Normal file
86
HDOJ/3285_autoAC.cpp
Normal file
|
@ -0,0 +1,86 @@
|
|||
#include <stdlib.h>
|
||||
#include<iostream>
|
||||
#define eps 1e-8
|
||||
#define zero(x) (((x)>0?(x):-(x))<eps)
|
||||
using namespace std;
|
||||
struct point{int x,y;};
|
||||
point a[100],b[100];
|
||||
int xmult(point p1,point p2,point p0){
|
||||
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
|
||||
}
|
||||
point p1,p2;
|
||||
int graham_cp(const void* a,const void* b){
|
||||
int ret=xmult(*((point*)a),*((point*)b),p1);
|
||||
return zero(ret)?(xmult(*((point*)a),*((point*)b),p2)>0?1:-1):(ret>0?1:-1);
|
||||
}
|
||||
void _graham(int n,point* p,int& s,point* ch){
|
||||
int i,k=0;
|
||||
for (p1=p2=p[0],i=1;i<n;p2.x+=p[i].x,p2.y+=p[i].y,i++)
|
||||
if (p1.y-p[i].y>eps||(zero(p1.y-p[i].y)&&p1.x>p[i].x))
|
||||
p1=p[k=i];
|
||||
p2.x/=n,p2.y/=n;
|
||||
p[k]=p[0],p[0]=p1;
|
||||
qsort(p+1,n-1,sizeof(point),graham_cp);
|
||||
for (ch[0]=p[0],ch[1]=p[1],ch[2]=p[2],s=i=3;i<n;ch[s++]=p[i++])
|
||||
for (;s>2&&xmult(ch[s-2],p[i],ch[s-1])<-eps;s--);
|
||||
}
|
||||
int graham(int n,point* p,point* convex,int maxsize=1,int dir=1){
|
||||
point* temp=new point[n];
|
||||
int s,i;
|
||||
_graham(n,p,s,temp);
|
||||
for (convex[0]=temp[0],n=1,i=(dir?1:(s-1));dir?(i<s):i;i+=(dir?1:-1))
|
||||
if (maxsize||!zero(xmult(temp[i-1],temp[i],temp[(i+1)%s])))
|
||||
convex[n++]=temp[i];
|
||||
delete []temp;
|
||||
return n;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,ii,n,i,maxx,maxy,min1,max1,m,miny,g;
|
||||
bool d;
|
||||
scanf("%d",&t);
|
||||
for(ii=1;ii<=t;ii++)
|
||||
{
|
||||
scanf("%d%d",&m,&n);
|
||||
for(i=0;i<n;i++)
|
||||
scanf("%d%d",&a[i].x,&a[i].y);
|
||||
d=true;
|
||||
for(i=2;i<n;i++)
|
||||
if (xmult(a[0],a[i],a[1])!=0) {d=false;break;}
|
||||
if (d)
|
||||
{
|
||||
maxx=1000000000;
|
||||
maxy=-1000000000;
|
||||
for(i=0;i<n;i++)
|
||||
if ((a[i].y>maxy)||(a[i].y==maxy&&a[i].x<maxx))
|
||||
{
|
||||
max1=i;
|
||||
maxx=a[i].x;
|
||||
maxy=a[i].y;
|
||||
}
|
||||
miny=1000000000;
|
||||
for(i=0;i<n;i++)
|
||||
if (a[i].y<miny)
|
||||
{
|
||||
miny=a[i].y;
|
||||
min1=i;
|
||||
}
|
||||
printf("%d 2\n%d %d\n%d %d\n",ii,maxx,maxy,a[min1].x,a[min1].y);
|
||||
continue;
|
||||
}
|
||||
g=graham(n,a,b,0);
|
||||
maxx=1000000000;
|
||||
maxy=-1000000000;
|
||||
for(i=0;i<g;i++)
|
||||
if ((b[i].y>maxy)||(b[i].y==maxy&&b[i].x<maxx))
|
||||
{
|
||||
max1=i;
|
||||
maxx=b[i].x;
|
||||
maxy=b[i].y;
|
||||
}
|
||||
printf("%d %d\n",ii,g);
|
||||
for(i=0;i<g;i++)
|
||||
printf("%d %d\n",b[(i+max1)%g].x,b[(i+max1)%g].y);
|
||||
}
|
||||
return 0;
|
||||
}
|
82
HDOJ/3286_autoAC.cpp
Normal file
82
HDOJ/3286_autoAC.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
#include<iostream>
|
||||
#include<vector>
|
||||
#include<map>
|
||||
#include<stack>
|
||||
#include<algorithm>
|
||||
#include<queue>
|
||||
#include<list>
|
||||
#include<set>
|
||||
#include<string.h>
|
||||
#include<stdlib.h>
|
||||
#include<math.h>
|
||||
#include<stdio.h>
|
||||
#include<ctype.h>
|
||||
#include<iomanip>
|
||||
#include<limits.h>
|
||||
using namespace std;
|
||||
#define LL long long
|
||||
#define pi acos(-1)
|
||||
#define MAX INT_MAX
|
||||
#define MIN INT_MIN
|
||||
#define eps 1e-6
|
||||
#define N 55
|
||||
struct point{
|
||||
int x,y;
|
||||
}p[N];
|
||||
int n;
|
||||
int ans[10010][3];
|
||||
int tot;
|
||||
void gao(int y){
|
||||
int i,j;
|
||||
double m[5];
|
||||
int cnt=0;
|
||||
for(i=1;i<=n;i++){
|
||||
if(p[i].y==y && p[i-1].y==y)return ;
|
||||
if(p[i].y==y)m[cnt++]=(double)p[i].x;
|
||||
if(p[i-1].y==y)m[cnt++]=(double)p[i-1].x;
|
||||
if((p[i-1].y<y && p[i].y>y) || (p[i-1].y>y && p[i].y<y))
|
||||
m[cnt++]=1.0*(y-p[i].y)*(p[i].x-p[i-1].x)/(p[i].y-p[i-1].y)+p[i].x;
|
||||
}
|
||||
int s,t;
|
||||
if(!cnt)return ;
|
||||
double minm=MAX;
|
||||
double maxm=MIN;
|
||||
for(i=0;i<cnt;i++)
|
||||
{
|
||||
minm=min(minm,m[i]);
|
||||
maxm=max(maxm,m[i]);
|
||||
}
|
||||
s=floor(minm)+1;
|
||||
t=ceil(maxm)-1;
|
||||
if(s>t)return ;
|
||||
ans[tot][0]=y;
|
||||
ans[tot][1]=s;
|
||||
ans[tot][2]=t;
|
||||
tot++;
|
||||
}
|
||||
int main(){
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
int ca;
|
||||
scanf("%d%d",&ca,&n);
|
||||
int i,j;
|
||||
int minm=MAX;
|
||||
int maxm=MIN;
|
||||
for(i=1;i<=n;i++){
|
||||
scanf("%d%d",&p[i].x,&p[i].y);
|
||||
minm=min(minm,p[i].y);
|
||||
maxm=max(maxm,p[i].y);
|
||||
}
|
||||
p[0].x=p[n].x;
|
||||
p[0].y=p[n].y;
|
||||
tot=0;
|
||||
for(i=maxm-1;i>=minm+1;i--){
|
||||
gao(i);
|
||||
}
|
||||
printf("%d %d\n",ca,tot);
|
||||
for(i=0;i<tot;i++)
|
||||
printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]);
|
||||
}
|
||||
return 0;
|
||||
}
|
70
HDOJ/3287_autoAC.cpp
Normal file
70
HDOJ/3287_autoAC.cpp
Normal file
|
@ -0,0 +1,70 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<cstdio>
|
||||
#include <string>
|
||||
#include <deque>
|
||||
#include<cmath>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
struct node{
|
||||
int num;
|
||||
int cnt;
|
||||
string str;
|
||||
}p[830000], tmp, t;
|
||||
int p7[8] = {0, 1, 7, 49, 343, 2401, 16807, 117649};
|
||||
int tnum[8];
|
||||
int num = 1 * p7[1] + 2 * p7[2] + 3 * p7[3] + 4 * p7[4] + 5 * p7[5] + 6 * p7[6] ;
|
||||
int tu[8][8] ={
|
||||
0, 1, 2, 3, 4, 5, 6, 7,
|
||||
0, 0, 1, 0, 0, 0, 6, 0,
|
||||
0, 1, 0, 3, 0, 0, 0, 7,
|
||||
0, 0, 2, 0, 4, 0, 0, 0,
|
||||
0, 0, 0, 3, 0, 5, 0, 0,
|
||||
0, 0, 0, 0, 4, 0, 6, 7,
|
||||
0, 1, 0, 0, 0, 5, 0, 0,
|
||||
0, 0, 2, 0, 0, 5, 0, 0,
|
||||
};
|
||||
deque<node> q;
|
||||
int maxx = 0;
|
||||
void init(){
|
||||
p[num].num = num;
|
||||
p[num].cnt = 0;
|
||||
q.push_back(p[num]);
|
||||
while(!q.empty()){
|
||||
tmp = q.front(); q.pop_front();
|
||||
int k;
|
||||
for(int i = 1, n = tmp.num;i < 8; i ++){
|
||||
tnum[i] = n % 7;
|
||||
if(tnum[i] == 0) k = i;
|
||||
n /= 7;
|
||||
}
|
||||
for(int j = 1; j < 8; j ++)
|
||||
if(tu[k][j]){
|
||||
t.cnt = tmp.cnt + 1;
|
||||
t.num = tmp.num - p7[j] * tnum[j] + p7[k] * tnum[j];
|
||||
if(p[t.num].num == 0) {
|
||||
t.str = tmp.str + (char)(tnum[j] + 'A' - 1);
|
||||
q.push_back(t);
|
||||
p[t.num] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
init();
|
||||
string s;
|
||||
int T, t;
|
||||
scanf("%d", &T);
|
||||
while(T --){
|
||||
scanf("%d", &t);
|
||||
cin>>s;
|
||||
int num = 0;
|
||||
for(int i = 0; i < s.length(); i ++){
|
||||
num += p7[i + 1] * (s[i] - 'A'+ 1);
|
||||
}
|
||||
s = p[num].str;
|
||||
string str(s.rbegin(), s.rend());
|
||||
if(p[num].cnt == 0 && num != 114381) cout<<t<<" "<<"NO SOLUTION"<<endl;
|
||||
else cout<<t<<" "<<p[num].cnt<<" "<<str<<endl;
|
||||
}
|
||||
}
|
59
HDOJ/3288_autoAC.cpp
Normal file
59
HDOJ/3288_autoAC.cpp
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<queue>
|
||||
#define MAXN 10010
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int pri,num;
|
||||
bool friend operator<(const node a,const node b)
|
||||
{
|
||||
if(a.pri!=b.pri)
|
||||
return a.pri>b.pri;
|
||||
return a.num>b.num;
|
||||
}
|
||||
};
|
||||
int hash1[MAXN],h;
|
||||
priority_queue<node> Q[MAXN];
|
||||
int main()
|
||||
{
|
||||
int n,x,y,r,cc;
|
||||
char str[10];
|
||||
while(scanf("%d",&n)==1)
|
||||
{
|
||||
h=0;
|
||||
cc=1;
|
||||
for(int i=0;i<=n;i++)
|
||||
while(!Q[i].empty())
|
||||
Q[i].pop();
|
||||
memset(hash1,-1,sizeof(hash1));
|
||||
while(n--)
|
||||
{
|
||||
node temp;
|
||||
scanf("%s",str);
|
||||
if(str[0]=='R')
|
||||
{
|
||||
scanf("%d %d",&x,&y);
|
||||
if(hash1[x]==-1)
|
||||
hash1[x]=h++;
|
||||
temp.num=cc++;
|
||||
temp.pri=y;
|
||||
Q[hash1[x]].push(temp);
|
||||
}
|
||||
else {
|
||||
scanf("%d",&r);
|
||||
if(hash1[r]==-1)
|
||||
hash1[r]==h++;
|
||||
if(Q[hash1[r]].empty())
|
||||
printf("No one fits!\n");
|
||||
else
|
||||
{
|
||||
temp = Q[hash1[r]].top();
|
||||
printf("%s gets Num %d: %d %d!\n",str,temp.num,r,temp.pri);
|
||||
Q[hash1[r]].pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
131
HDOJ/3289_autoAC.cpp
Normal file
131
HDOJ/3289_autoAC.cpp
Normal file
|
@ -0,0 +1,131 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<queue>
|
||||
#include<vector>
|
||||
using namespace std;
|
||||
const int MAXN = 100010;
|
||||
int spos[MAXN],epos[MAXN],sum[MAXN],w[MAXN];
|
||||
int n,f[MAXN],index;
|
||||
bool vis[MAXN];
|
||||
struct edge
|
||||
{
|
||||
int u,v,w;
|
||||
edge(int a=0,int b=0,int c=0):u(a),v(b),w(c){}
|
||||
bool friend operator<(const edge a,const edge b)
|
||||
{
|
||||
return a.w<b.w;
|
||||
}
|
||||
};
|
||||
priority_queue<edge> Q;
|
||||
vector<int> g[MAXN];
|
||||
void init()
|
||||
{
|
||||
for(int i=0;i<=n;i++)
|
||||
{
|
||||
f[i]=i;
|
||||
w[i]=sum[i]=0;
|
||||
g[i].clear();
|
||||
}
|
||||
}
|
||||
int find(int x)
|
||||
{
|
||||
if(x==f[x])
|
||||
return f[x];
|
||||
f[x]=find(f[x]);
|
||||
return f[x];
|
||||
}
|
||||
void Union(int x,int y)
|
||||
{
|
||||
int a=find(x);
|
||||
int b=find(y);
|
||||
if(a==b) return ;
|
||||
f[a]=b;
|
||||
g[x].push_back(y);
|
||||
g[y].push_back(x);
|
||||
}
|
||||
void Kruskal()
|
||||
{
|
||||
while(!Q.empty())
|
||||
{
|
||||
Union(Q.top().u,Q.top().v);
|
||||
Q.pop();
|
||||
}
|
||||
}
|
||||
int lowbit(int x)
|
||||
{
|
||||
return x&(-x);
|
||||
}
|
||||
void modify(int x,int add)
|
||||
{
|
||||
while(x<=n)
|
||||
{
|
||||
sum[x]+=add;
|
||||
x+=lowbit(x);
|
||||
}
|
||||
}
|
||||
int get_sum(int x)
|
||||
{
|
||||
int ret=0;
|
||||
while(x!=0)
|
||||
{
|
||||
ret+=sum[x];
|
||||
x-=lowbit(x);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
void dfs(int u)
|
||||
{
|
||||
spos[u]=index;
|
||||
vis[u]=true;
|
||||
for(int i=0;i<g[u].size();i++)
|
||||
{
|
||||
int v=g[u][i];
|
||||
if(!vis[v])
|
||||
{
|
||||
index++;
|
||||
dfs(v);
|
||||
}
|
||||
}
|
||||
epos[u]=index;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int m,k,a,b,c;
|
||||
char str[5];
|
||||
while(scanf("%d %d",&n,&m)==2)
|
||||
{
|
||||
init();
|
||||
while(m--)
|
||||
{
|
||||
scanf("%d %d %d",&a,&b,&c);
|
||||
Q.push(edge(a,b,c));
|
||||
}
|
||||
Kruskal();
|
||||
index=1;
|
||||
memset(vis,false,sizeof(vis));
|
||||
dfs(1);
|
||||
scanf("%d",&m);
|
||||
while(m--)
|
||||
{
|
||||
scanf("%s",str);
|
||||
if(str[0]=='G')
|
||||
{
|
||||
scanf("%d %d",&a,&c);
|
||||
modify(spos[a],c);
|
||||
w[a]+=c;
|
||||
}
|
||||
else if(str[0]=='C')
|
||||
{
|
||||
scanf("%d",&a);
|
||||
modify(spos[a],-w[a]);
|
||||
w[a]=0;
|
||||
}
|
||||
else {
|
||||
scanf("%d",&a);
|
||||
int ans=get_sum(epos[a])-get_sum(spos[a]-1);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
46
HDOJ/3290_autoAC.cpp
Normal file
46
HDOJ/3290_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<vector>
|
||||
#define MAXN 20000+10
|
||||
using namespace std;
|
||||
vector<int> g[MAXN];
|
||||
int n,v[MAXN],in[MAXN],out[MAXN];
|
||||
int dfs(int cnt)
|
||||
{
|
||||
if(out[cnt]==0)
|
||||
return cnt;
|
||||
vector<int> ss;
|
||||
for(int i=0;i<out[cnt];i++)
|
||||
ss.push_back(dfs(g[cnt][i]));
|
||||
sort(ss.begin(),ss.end());
|
||||
return ss[(out[cnt]+1)/2-1];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int a;
|
||||
while(scanf("%d",&n)==1)
|
||||
{
|
||||
for(int i=1;i<=n;i++)
|
||||
g[i].clear();
|
||||
memset(in,0,sizeof(in));
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&out[i]);
|
||||
for(int j=0;j<out[i];j++)
|
||||
{
|
||||
scanf("%d",&a);
|
||||
g[i].push_back(a);
|
||||
in[a]++;
|
||||
}
|
||||
}
|
||||
int root;
|
||||
for(int i=1;i<=n;i++)
|
||||
if(in[i]==0)
|
||||
{
|
||||
root=i;
|
||||
break;
|
||||
}
|
||||
printf("%d\n",dfs(root));
|
||||
}
|
||||
return 0;
|
||||
}
|
154
HDOJ/3291_autoAC.cpp
Normal file
154
HDOJ/3291_autoAC.cpp
Normal file
|
@ -0,0 +1,154 @@
|
|||
#include <algorithm>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
const double eps=1e-9;
|
||||
const double maxl=1e10;
|
||||
const double pi=3.1415926535897932384626433832795;
|
||||
const int maxv=20;
|
||||
template <class T>
|
||||
T Max(T a,T b){return a>b?a:b;}
|
||||
template <class T>
|
||||
T Min(T a,T b){return a<b?a:b;}
|
||||
double sqr(double a){return a*a;}
|
||||
int sgn(double a){if (a>eps) return 1;if (a<-eps) return -1;return 0;}
|
||||
struct Point
|
||||
{
|
||||
double x,y;
|
||||
Point(){};
|
||||
Point(double dx,double dy){x=dx;y=dy;}
|
||||
inline int init(){ return scanf("%lf%lf",&x,&y); }
|
||||
};
|
||||
double dis(Point a,Point b);
|
||||
Point operator -(Point a,Point b){Point c;c.x=a.x-b.x;c.y=a.y-b.y;return c;}
|
||||
Point operator +(Point a,Point b){Point c;c.x=a.x+b.x;c.y=a.y+b.y;return c;}
|
||||
Point operator *(Point a,double d){Point c;c.x=a.x*d;c.y=a.y*d;return c;}
|
||||
Point operator *(double d,Point a){Point c;c.x=a.x*d;c.y=a.y*d;return c;}
|
||||
Point operator /(Point a,double d){Point c;c.x=a.x/d;c.y=a.y/d;return c;}
|
||||
double operator *(Point a,Point b){return a.x*b.x+a.y*b.y;}
|
||||
int operator ==(Point a,Point b){return dis(a,b)<eps;}
|
||||
int operator !=(Point a,Point b){return dis(a,b)>=eps;}
|
||||
bool operator < (const Point &l, const Point &r){return sgn(l.y-r.y)<0 ||( sgn(l.y-r.y)==0 && sgn(l.x-r.x)<0 );}
|
||||
double dis(Point a,Point b){a=a-b;return sqrt(sqr(a.x)+sqr(a.y));}
|
||||
double crossmuti(Point a,Point b){return a.x*b.y-a.y*b.x;}
|
||||
struct LineSegment
|
||||
{
|
||||
Point pt1,pt2;
|
||||
LineSegment(){};
|
||||
LineSegment(Point p1,Point p2){pt1=p1;pt2=p2;}
|
||||
};
|
||||
struct Polygon
|
||||
{
|
||||
Point vertex[maxv];
|
||||
int numv;
|
||||
Polygon(){numv=0;}
|
||||
Polygon(Point *s,int num){numv=num;memcpy(vertex,s,num*sizeof(Point));}
|
||||
Point &operator [](int k){return vertex[k];}
|
||||
};
|
||||
struct Line
|
||||
{
|
||||
double a,b,c;
|
||||
Line(){};
|
||||
Line(double p,double q,double r){a=p;b=q;c=r;}
|
||||
Line(Point p,Point q)
|
||||
{
|
||||
a=q.y-p.y;
|
||||
b=p.x-q.x;
|
||||
c=p.y*q.x-p.x*q.y;
|
||||
double one=sqrt(sqr(a)+sqr(b));
|
||||
if (one>0) {a/=one;b/=one;c/=one;}
|
||||
}
|
||||
Line(LineSegment l)
|
||||
{
|
||||
Line ls(l.pt1,l.pt2);
|
||||
a=ls.a;b=ls.b;c=ls.c;
|
||||
}
|
||||
double func(Point &p){return a*p.x+b*p.y+c;}
|
||||
};
|
||||
int ondiffside(Line l,Point a,Point b)
|
||||
{
|
||||
return sgn(l.func(a))*sgn(l.func(b))<0;
|
||||
}
|
||||
int PntonSeg(LineSegment ls,Point p)
|
||||
{
|
||||
Line l(ls.pt1,ls.pt2);
|
||||
if (ls.pt1==p||ls.pt2==p) return 1;
|
||||
if (sgn(l.func(p))==0&&((ls.pt1<p&&p<ls.pt2)||(ls.pt2<p&&p<ls.pt1))) return 1;
|
||||
return 0;
|
||||
}
|
||||
int Intersect(LineSegment L1, LineSegment L2)
|
||||
{
|
||||
if (ondiffside(L1,L2.pt1,L2.pt2)&&ondiffside(L2,L1.pt1,L1.pt2))
|
||||
return 1;
|
||||
if (PntonSeg(L1,L2.pt1)||PntonSeg(L1,L2.pt2)||PntonSeg(L2,L1.pt1)||PntonSeg(L2,L1.pt2))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
int intersection(Line p,Line q,Point &s)
|
||||
{
|
||||
if (sgn(p.a*q.b-p.b*q.a)==0) return 0;
|
||||
s.y=(p.a*q.c-p.c*q.a)/(q.a*p.b-p.a*q.b);
|
||||
s.x=(p.b*q.c-p.c*q.b)/(p.a*q.b-p.b*q.a);
|
||||
return 1;
|
||||
}
|
||||
int poly_lineSg_cross(Polygon &p,LineSegment l,Point &s)
|
||||
{
|
||||
int i;
|
||||
int n=p.numv;
|
||||
if (n==0) return 0;
|
||||
p[n]=p[0];
|
||||
Point t;
|
||||
int find=0;
|
||||
for (i=0;i<n;i++)
|
||||
if (Intersect(LineSegment(p[i],p[i+1]),l))
|
||||
{
|
||||
if (intersection(Line(p[i],p[i+1]),Line(l.pt1,l.pt2),t)==0)
|
||||
t=p[i];
|
||||
if (find==0||dis(Point(0,0),t)<dis(Point(0,0),s))
|
||||
s=t;
|
||||
find=1;
|
||||
}
|
||||
return find;
|
||||
}
|
||||
Polygon p[50];
|
||||
int w[50];
|
||||
int n,m;
|
||||
int cat[50];
|
||||
Point ins[50];
|
||||
void work()
|
||||
{
|
||||
int i,j,k;
|
||||
int tot=0;
|
||||
for (i=0;i<n;i++)
|
||||
{
|
||||
scanf("%d%d",&p[i].numv,w+i);
|
||||
for (j=0;j<p[i].numv;j++) p[i][j].init();
|
||||
}
|
||||
scanf("%d",&m);
|
||||
while (m--)
|
||||
{
|
||||
scanf("%d",&k);
|
||||
LineSegment l;
|
||||
l.pt1=Point(0,0);
|
||||
l.pt2=maxl*Point(cos((double)-k/180.0*pi),sin((double)-k/180.0*pi));
|
||||
for (i=0;i<n;i++)
|
||||
cat[i]=poly_lineSg_cross(p[i],l,ins[i]);
|
||||
int t=-1;
|
||||
for (i=0;i<n;i++)
|
||||
if (cat[i])
|
||||
if (t==-1||dis(Point(0,0),ins[i])<dis(Point(0,0),ins[t]))
|
||||
t=i;
|
||||
if (t>=0)
|
||||
{
|
||||
p[t].numv=0;
|
||||
tot+=w[t];
|
||||
w[t]=0;
|
||||
}
|
||||
}
|
||||
printf("%d\n",tot);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while (scanf("%d",&n)!=EOF)
|
||||
work();
|
||||
return 0;
|
||||
}
|
71
HDOJ/3292_autoAC.cpp
Normal file
71
HDOJ/3292_autoAC.cpp
Normal file
|
@ -0,0 +1,71 @@
|
|||
#include <cstdio>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
#define mod 8191
|
||||
const int maxn=5;
|
||||
typedef struct
|
||||
{
|
||||
int m[maxn][maxn];
|
||||
}Matrix;
|
||||
int N,x,y;
|
||||
void search()
|
||||
{
|
||||
y=1;
|
||||
while(1){
|
||||
x=sqrt(N*y*y+1.0);
|
||||
if(x*x-N*y*y==1) break;
|
||||
y++;
|
||||
}
|
||||
}
|
||||
Matrix per,d;
|
||||
void init()
|
||||
{
|
||||
d.m[0][0]=x%mod;
|
||||
d.m[0][1]=y*N%mod;
|
||||
d.m[1][0]=y%mod;
|
||||
d.m[1][1]=x%mod;
|
||||
for(int i=0;i<2;i++)
|
||||
for(int j=0;j<2;j++)
|
||||
per.m[i][j]= (i==j);
|
||||
}
|
||||
Matrix Multi(Matrix a,Matrix b)
|
||||
{
|
||||
Matrix c;
|
||||
for(int i=0;i<2;i++)
|
||||
for(int j=0;j<2;j++){
|
||||
c.m[i][j]=0;
|
||||
for(int k=0;k<2;k++)
|
||||
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%mod;
|
||||
c.m[i][j]%=mod;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
Matrix power(Matrix a,int k)
|
||||
{
|
||||
Matrix r=per;
|
||||
while(k)
|
||||
{
|
||||
if(k&1) r=Multi(r,a);
|
||||
a=Multi(a,a);
|
||||
k>>=1;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int k;
|
||||
while(~scanf("%d%d",&N,&k))
|
||||
{
|
||||
int tmp=sqrt(N+0.0);
|
||||
if(tmp*tmp==N){
|
||||
printf("No answers can meet such conditions\n");
|
||||
continue;
|
||||
}
|
||||
search();
|
||||
init();
|
||||
d=power(d,k-1);
|
||||
x=(d.m[0][0]*x%mod+d.m[0][1]*y%mod)%mod;
|
||||
printf("%d\n",x);
|
||||
}
|
||||
return 0;
|
||||
}
|
56
HDOJ/3293_autoAC.cpp
Normal file
56
HDOJ/3293_autoAC.cpp
Normal file
|
@ -0,0 +1,56 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
struct NODE
|
||||
{
|
||||
char name[30];
|
||||
char lv[30];
|
||||
char ori[30];
|
||||
} girl[505];
|
||||
int cmp(NODE x,NODE y)
|
||||
{
|
||||
if(strcmp(x.ori,y.ori))
|
||||
return strcmp(x.ori,y.ori)<0;
|
||||
if(strcmp(x.lv,y.lv))
|
||||
{
|
||||
if(!strcmp(x.lv,"wonderful"))
|
||||
return 1;
|
||||
if(!strcmp(y.lv,"wonderful"))
|
||||
return 0;
|
||||
if(!strcmp(y.lv,"so-so"))
|
||||
return 1;
|
||||
if(!strcmp(x.lv,"so-so"))
|
||||
return 0;
|
||||
}
|
||||
return strcmp(x.name,y.name)<0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,i,cas = 1;
|
||||
while(~scanf("%d",&n))
|
||||
{
|
||||
for(i = 0; i<n; i++)
|
||||
scanf("%s%s%s",girl[i].name,girl[i].ori,girl[i].lv);
|
||||
printf("Case %d\n",cas++);
|
||||
sort(girl,girl+n,cmp);
|
||||
char s[30];
|
||||
strcpy(s,girl[0].ori);
|
||||
int flag = 1;
|
||||
for(i = 0; i<n; i++)
|
||||
{
|
||||
if(flag)
|
||||
{
|
||||
printf("%s:\n",s);
|
||||
flag = 0;
|
||||
}
|
||||
printf(" %s %s\n",girl[i].name,girl[i].lv);
|
||||
if(strcmp(s,girl[i+1].ori))
|
||||
{
|
||||
strcpy(s,girl[i+1].ori);
|
||||
flag = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
38
HDOJ/3294_autoAC.cpp
Normal file
38
HDOJ/3294_autoAC.cpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstdlib>
|
||||
#include<cstring>
|
||||
#include<string>
|
||||
#include<queue>
|
||||
#include<map>
|
||||
#include<iomanip>
|
||||
#define INF 99999999
|
||||
using namespace std;
|
||||
const int MAX=200000+10;
|
||||
char s[MAX*2],temp[2];
|
||||
int p[MAX*2];
|
||||
int main(){
|
||||
while(scanf("%s%s",temp,s)!=EOF){
|
||||
int len=strlen(s),id=0,maxid=0;
|
||||
for(int i=len;i>=0;--i){
|
||||
s[i+i+2]=s[i];
|
||||
s[i+i+1]='#';
|
||||
}
|
||||
s[0]='*';
|
||||
for(int i=2;i<2*len+1;++i){
|
||||
if(p[id]+id>i)p[i]=min(p[2*id-i],p[id]+id-i);
|
||||
else p[i]=1;
|
||||
while(s[i+p[i]] == s[i-p[i]])++p[i];
|
||||
if(id+p[id]<i+p[i])id=i;
|
||||
if(p[maxid]<p[i])maxid=i;
|
||||
}
|
||||
if(p[maxid]-1<2)cout<<"No solution!"<<endl;
|
||||
else{
|
||||
cout<<(maxid-p[maxid]+2)/2-1<<' '<<(maxid+p[maxid]-2)/2-1<<endl;
|
||||
int k=temp[0]-'a';
|
||||
for(int i=maxid-p[maxid]+2;i<=maxid+p[maxid]-2;i+=2)printf("%c",(s[i]-'a'-k+26)%26+'a');
|
||||
cout<<endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
184
HDOJ/3295_autoAC.cpp
Normal file
184
HDOJ/3295_autoAC.cpp
Normal file
|
@ -0,0 +1,184 @@
|
|||
#include<stdio.h>
|
||||
#include<cstdio>
|
||||
#include<queue>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
struct Map
|
||||
{
|
||||
int map[6][6];
|
||||
}star;
|
||||
struct P
|
||||
{
|
||||
int x, y;
|
||||
};
|
||||
int n, m, ans;
|
||||
int di[4][2] = {0,1, -1,0, 0,-1, 1,0};
|
||||
int check(struct Map &node)
|
||||
{
|
||||
int i, j;
|
||||
for( i = 0 ; i < n ; i++)
|
||||
for( j = 0 ; j < m ; j++)
|
||||
if( node.map[i][j] != 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
int print( struct Map node)
|
||||
{
|
||||
int i, j;
|
||||
printf("\n");
|
||||
for( i = 0 ; i < n ; i++)
|
||||
{
|
||||
for( j = 0 ; j < m ; j++)
|
||||
printf("%d ", node.map[i][j]);
|
||||
printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
int moveh(struct Map &node)
|
||||
{
|
||||
int i, j, flog, flog2, b;
|
||||
flog2 = 0;
|
||||
for( j = 0 ; j < m ; j++)
|
||||
{
|
||||
flog = 0;
|
||||
for( i = 0 ; i < n ; i++)
|
||||
if(node.map[i][j] != 0)
|
||||
flog = 1;
|
||||
if( flog == 1 && flog2 == 1)
|
||||
{
|
||||
for( i = 0 ; i < n ; i++)
|
||||
node.map[i][b] = node.map[i][j];
|
||||
for( i = 0 ; i < n ; i++)
|
||||
node.map[i][j] = 0;
|
||||
b++;
|
||||
}else if( flog == 0 && flog2 == 0)
|
||||
{
|
||||
flog2 = 1;
|
||||
b = j;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int moves(int s, struct Map &node)
|
||||
{
|
||||
int i, j, flog, b;
|
||||
flog = 0;
|
||||
for( i = n - 1 ; i >= 0 ; i--)
|
||||
{
|
||||
if( node.map[i][s] == 0 && flog == 0)
|
||||
{
|
||||
b = i;
|
||||
flog = 1;
|
||||
}
|
||||
else if( node.map[i][s] != 0 && flog == 1)
|
||||
{
|
||||
node.map[b][s] = node.map[i][s];
|
||||
node.map[i][s] = 0;
|
||||
b--;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int movemap( struct Map &node)
|
||||
{
|
||||
int i;
|
||||
for( i = 0 ; i < m ; i++)
|
||||
moves(i, node);
|
||||
moveh(node);
|
||||
return 0;
|
||||
}
|
||||
int change_map(struct Map &node, int mark[][6], int x, int y)
|
||||
{
|
||||
int i, j, l, num, flog;
|
||||
queue<struct P> Q;
|
||||
struct P per, next;
|
||||
per.x = x;
|
||||
per.y = y;
|
||||
num = node.map[x][y];
|
||||
mark[x][y] = true;
|
||||
Q.push(per);
|
||||
while(!Q.empty())
|
||||
{
|
||||
per = Q.front();
|
||||
Q.pop();
|
||||
if( node.map[per.x][per.y] == 0)
|
||||
continue;
|
||||
node.map[per.x][per.y] = 0;
|
||||
for(l = 0 ; l < 4 ; l++)
|
||||
{
|
||||
i = per.x + di[l][0];
|
||||
j = per.y + di[l][1];
|
||||
if( i < 0 || j < 0 || i >= n || j >= m)
|
||||
continue;
|
||||
next.x = i;
|
||||
next.y = j;
|
||||
if( node.map[i][j] == num)
|
||||
{
|
||||
Q.push(next);
|
||||
mark[i][j] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int r_map(struct Map &a, struct Map &s)
|
||||
{
|
||||
int i, j;
|
||||
for( i = 0 ; i < n ; i++)
|
||||
for( j = 0 ; j < m ; j++)
|
||||
a.map[i][j] = s.map[i][j];
|
||||
return 0;
|
||||
}
|
||||
int DFS(int k, struct Map per)
|
||||
{
|
||||
int i, j;
|
||||
int mark[6][6];
|
||||
struct Map temp;
|
||||
memset(mark, 0, sizeof(mark));
|
||||
if( check(per) == 1)
|
||||
{
|
||||
if( k < ans)
|
||||
ans = k;
|
||||
return 0;
|
||||
}
|
||||
for( i = 0 ; i < n ; i++)
|
||||
{
|
||||
for( j = 0 ; j < m ; j++)
|
||||
{
|
||||
if( per.map[i][j] == 0)
|
||||
continue;
|
||||
if( mark[i][j] == 0)
|
||||
{
|
||||
mark[i][j] = 1;
|
||||
r_map( temp, per);
|
||||
change_map(per, mark, i, j);
|
||||
movemap(per);
|
||||
DFS(k + 1, per);
|
||||
r_map(per, temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int input()
|
||||
{
|
||||
int i, j;
|
||||
for( i = 0 ; i < n ; i++)
|
||||
for( j = 0 ; j < m ; j++)
|
||||
scanf("%d", &star.map[i][j]);
|
||||
return 0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i, j;
|
||||
while(scanf("%d%d", &n, &m) == 2)
|
||||
{
|
||||
input();
|
||||
ans = 65;
|
||||
DFS(0, star);
|
||||
printf("%d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
42
HDOJ/3296_autoAC.cpp
Normal file
42
HDOJ/3296_autoAC.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const double eps = 1e-9;
|
||||
const double pi = 3.1415926535897932384626;
|
||||
#define INF 1e18
|
||||
const int maxn = 2017;
|
||||
int main()
|
||||
{
|
||||
int s[maxn], t[maxn];
|
||||
int S, T, M;
|
||||
int ID, P, Q;
|
||||
int cas = 0;
|
||||
while(scanf("%d%d%d",&S,&T,&M))
|
||||
{
|
||||
if(S==0 && T==0 && M==0)
|
||||
break;
|
||||
memset(s,0,sizeof(s));
|
||||
memset(t,0,sizeof(t));
|
||||
int sum = 0;
|
||||
for(int i = 1; i <= S; i++)
|
||||
{
|
||||
scanf("%d%d%d",&ID,&P,&Q);
|
||||
sum+=P+Q;
|
||||
}
|
||||
int Sid, Tot;
|
||||
for(int i = 1; i <= T; i++)
|
||||
{
|
||||
scanf("%d%d",&Sid,&Tot);
|
||||
if(Tot >= M && t[Sid] == 0)
|
||||
{
|
||||
sum++;
|
||||
t[Sid] = 1;
|
||||
}
|
||||
}
|
||||
printf("Case %d: %d\n",++cas,sum);
|
||||
}
|
||||
return 0;
|
||||
}
|
95
HDOJ/3297_autoAC.cpp
Normal file
95
HDOJ/3297_autoAC.cpp
Normal file
|
@ -0,0 +1,95 @@
|
|||
#include<set>
|
||||
#include<map>
|
||||
#include<queue>
|
||||
#include<stack>
|
||||
#include<ctime>
|
||||
#include<deque>
|
||||
#include<cmath>
|
||||
#include<vector>
|
||||
#include<string>
|
||||
#include<cctype>
|
||||
#include<cstdio>
|
||||
#include<cstdlib>
|
||||
#include<cstring>
|
||||
#include<sstream>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#define REP(i,s,t) for(int i=(s);i<=(t);i++)
|
||||
#define REP2(i,t,s) for(int i=(t);i>=s;i--)
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
typedef unsigned long long ull;
|
||||
typedef unsigned long ul;
|
||||
const int N=20;
|
||||
const int Maxans=10240+10;
|
||||
int a[N];
|
||||
int bit[N];
|
||||
vector<int>G[Maxans];
|
||||
int state[1<<17];
|
||||
bool judge(int x)
|
||||
{
|
||||
int cnt=0;
|
||||
REP(i,1,16)
|
||||
{
|
||||
if(x&(1<<(i-1)))
|
||||
{
|
||||
bit[++cnt]=a[i];
|
||||
}
|
||||
}
|
||||
return cnt==4;
|
||||
}
|
||||
int fuck()
|
||||
{
|
||||
REP(i,0,Maxans)
|
||||
{
|
||||
G[i].clear();
|
||||
}
|
||||
memset(state,0,sizeof(state));
|
||||
sort(a+1,a+1+16);
|
||||
REP(i,0,(1<<16)-1)
|
||||
{
|
||||
if(judge(i))
|
||||
{
|
||||
do
|
||||
{
|
||||
int tmp=bit[1]*1+bit[2]*2+bit[3]*3+bit[4]*4;
|
||||
for(int j=0;j<G[tmp].size();j++)
|
||||
{
|
||||
if((i&G[tmp][j])==0)
|
||||
{
|
||||
state[i|G[tmp][j]]++;
|
||||
}
|
||||
}
|
||||
G[tmp].push_back(i);
|
||||
}while(next_permutation(bit+1,bit+1+4));
|
||||
}
|
||||
}
|
||||
int ans=0;
|
||||
REP(i,0,(1<<16)-1)
|
||||
{
|
||||
ans+=state[i]*state[((1<<16)-1)^i];
|
||||
}
|
||||
return ans/2;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
#ifdef ONLINE_JUDGE
|
||||
#else
|
||||
freopen("test.in","r",stdin);
|
||||
#endif
|
||||
int ca=1;
|
||||
while(~scanf("%d",&a[1]))
|
||||
{
|
||||
if(!a[1])
|
||||
{
|
||||
break;
|
||||
}
|
||||
REP(i,2,16)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
}
|
||||
int ans=fuck();
|
||||
printf("Case %d: %d\n",ca++,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
72
HDOJ/3298_autoAC.cpp
Normal file
72
HDOJ/3298_autoAC.cpp
Normal file
|
@ -0,0 +1,72 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
#include <queue>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <time.h>;
|
||||
#define cler(arr, val) memset(arr, val, sizeof(arr))
|
||||
typedef long long LL;
|
||||
const int MAXN = 200010;
|
||||
const int MAXM = 200006;
|
||||
const int INF = 0x3f3f3f3f;
|
||||
const int mod = 10000007;
|
||||
LL point[MAXN],num[MAXN];
|
||||
vector<int>edge[MAXN];
|
||||
bool vis[MAXN];
|
||||
LL abs1(LL a)
|
||||
{
|
||||
if(a>0) return a;
|
||||
else return -a;
|
||||
}
|
||||
void dfs(int u)
|
||||
{
|
||||
vis[u]=true;
|
||||
for(int i=0;i<edge[u].size();i++)
|
||||
{
|
||||
int v=edge[u][i];
|
||||
if(!vis[v])
|
||||
{
|
||||
dfs(v);
|
||||
point[u]+=point[v];
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int m,n,cas=0;
|
||||
while(scanf("%d%d",&n,&m),m+n)
|
||||
{
|
||||
LL sum=0;
|
||||
cler(point,0);
|
||||
cler(num,0);
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
edge[i].clear();
|
||||
scanf("%I64d",&point[i]);
|
||||
sum+=point[i];
|
||||
}
|
||||
for(int i=1;i<=m;i++)
|
||||
{
|
||||
int a,b;
|
||||
scanf("%d%d",&a,&b);
|
||||
edge[a].push_back(b);
|
||||
edge[b].push_back(a);
|
||||
}
|
||||
LL ans=9999999999999;
|
||||
cler(vis,false);
|
||||
dfs(1);
|
||||
for(int i=1;i<=n;i++)
|
||||
ans=min(ans,abs1(sum-2*point[i]));
|
||||
printf("Case %d: %I64d\n",++cas,ans);
|
||||
}
|
||||
}
|
89
HDOJ/3299_autoAC.cpp
Normal file
89
HDOJ/3299_autoAC.cpp
Normal file
|
@ -0,0 +1,89 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <sstream>
|
||||
#include <math.h>
|
||||
using namespace std;
|
||||
#include <queue>
|
||||
#include <stack>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <time.h>;
|
||||
#define cler(arr, val) memset(arr, val, sizeof(arr))
|
||||
typedef long long LL;
|
||||
const int MAXN = 100010;
|
||||
const int MAXM = 20006;
|
||||
const int INF = 0x3f3f3f3f;
|
||||
const int mod = 10000007;
|
||||
struct node
|
||||
{
|
||||
int x,y;
|
||||
}point[200];
|
||||
bool cmp(node a,node b)
|
||||
{
|
||||
if(a.x==b.x)
|
||||
return a.y<b.y;
|
||||
return a.x<b.x;
|
||||
}
|
||||
int y[123],on1[111],on2[111],line[111];
|
||||
int solve(int n,int m)
|
||||
{
|
||||
cler(on1,0);
|
||||
cler(on2,0);
|
||||
cler(line,0);
|
||||
int ans=0;
|
||||
if(m<=2) return n;
|
||||
for(int i=0;i<m;i++)
|
||||
{
|
||||
for(int j=i+1;j<m;j++)
|
||||
{
|
||||
int y1=y[i],y2=y[j];
|
||||
int num=0;
|
||||
for(int k=0;k<n;k++)
|
||||
{
|
||||
if(k==0||point[k].x!=point[k-1].x)
|
||||
{
|
||||
num++;
|
||||
on1[num]=on2[num]=0;
|
||||
line[num]=line[num-1]+on2[num-1]-on1[num-1];
|
||||
}
|
||||
if(point[k].y>y1&&point[k].y<y2) on1[num]++;
|
||||
if(point[k].y>=y1&&point[k].y<=y2) on2[num]++;
|
||||
}
|
||||
if(num<=2) return n;
|
||||
int maxv=0;
|
||||
for(int k=1;k<=num;k++)
|
||||
{
|
||||
ans=max(ans,line[k]+on2[k]+maxv);
|
||||
maxv=max(maxv,on1[k]-line[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,cas=1;
|
||||
while(scanf("%d",&t),t)
|
||||
{
|
||||
for(int i=0;i<t;i++)
|
||||
{
|
||||
scanf("%d%d",&point[i].x,&point[i].y);
|
||||
y[i]=point[i].y;
|
||||
}
|
||||
sort(y,y+t);
|
||||
int tol2=1;
|
||||
for(int i=1;i<t;i++)
|
||||
{
|
||||
if(y[i]!=y[i-1])
|
||||
y[tol2++]=y[i];
|
||||
}
|
||||
sort(point,point+t,cmp);
|
||||
printf("Case %d: %d\n",cas++,solve(t,tol2));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user