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
3400-3499
This commit is contained in:
parent
120ba634b8
commit
c14ecbe72c
67
HDOJ/3400_autoAC.cpp
Normal file
67
HDOJ/3400_autoAC.cpp
Normal file
|
@ -0,0 +1,67 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cmath>
|
||||
using namespace std;
|
||||
struct point
|
||||
{
|
||||
double x,y;
|
||||
};
|
||||
const double eps=1e-4;
|
||||
double p,q,r;
|
||||
double dis(point a,point b)
|
||||
{
|
||||
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
|
||||
}
|
||||
double cal_ab(point a,point b,point m)
|
||||
{
|
||||
point left=a,right=b;
|
||||
point mid,midmid;
|
||||
double ans1,ans2;
|
||||
do
|
||||
{
|
||||
mid.x=(left.x+right.x)/2.0;
|
||||
mid.y=(left.y+right.y)/2.0;
|
||||
midmid.x=(left.x+mid.x)/2.0;
|
||||
midmid.y=(left.y+mid.y)/2.0;
|
||||
ans1=dis(mid,a)/p+dis(mid,m)/r;
|
||||
ans2=dis(midmid,a)/p+dis(midmid,m)/r;
|
||||
if(ans1<ans2)
|
||||
left=midmid;
|
||||
else
|
||||
right=mid;
|
||||
}while(fabs(ans1-ans2)>eps);
|
||||
return ans1;
|
||||
}
|
||||
double cal_abcd(point a,point b,point c,point d)
|
||||
{
|
||||
point left=c,right=d;
|
||||
point m,mm;
|
||||
double ans1,ans2;
|
||||
do
|
||||
{
|
||||
m.x=(left.x+right.x)/2.0;
|
||||
m.y=(left.y+right.y)/2.0;
|
||||
mm.x=(left.x+m.x)/2.0;
|
||||
mm.y=(left.y+m.y)/2.0;
|
||||
ans1=dis(m,d)/q+cal_ab(a,b,m);
|
||||
ans2=dis(mm,d)/q+cal_ab(a,b,mm);
|
||||
if(ans1<ans2)
|
||||
left=mm;
|
||||
else
|
||||
right=m;
|
||||
}while(fabs(ans1-ans2)>eps);
|
||||
return ans1;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
point a,b,c,d;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y);
|
||||
scanf("%lf%lf%lf",&p,&q,&r);
|
||||
printf("%.2lf\n",cal_abcd(a,b,c,d));
|
||||
}
|
||||
return 0;
|
||||
}
|
66
HDOJ/3401_autoAC.cpp
Normal file
66
HDOJ/3401_autoAC.cpp
Normal file
|
@ -0,0 +1,66 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
const int MAXN = 2000 + 123;
|
||||
int ap[MAXN], bp[MAXN], as[MAXN], bs[MAXN];
|
||||
int f[MAXN][MAXN];
|
||||
struct node
|
||||
{
|
||||
int num, val;
|
||||
}q[MAXN];
|
||||
inline int min(int x,int y)
|
||||
{
|
||||
return x<y?x:y;
|
||||
}
|
||||
inline int max(int x,int y)
|
||||
{
|
||||
return x>y?x:y;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d", &T);
|
||||
while(T--)
|
||||
{
|
||||
int t, maxp, w;
|
||||
scanf("%d%d%d", &t, &maxp, &w);
|
||||
for(int i = 1; i <= t; i++) scanf("%d%d%d%d",&ap[i], &bp[i], &as[i], &bs[i]);
|
||||
memset(f, 200, sizeof(f));
|
||||
for(int i = 1; i <= w + 1; i++)
|
||||
for(int j = 0; j <= min(as[i], maxp); j++)
|
||||
{
|
||||
f[i][j] = -ap[i] * j;
|
||||
}
|
||||
for(int i = 2; i <= t; i++)
|
||||
{
|
||||
for(int j = 0; j <= maxp; j++) f[i][j] = max(f[i][j], f[i-1][j]);
|
||||
if(i < w + 2) continue;
|
||||
int head = 0, tail = -1;
|
||||
q[++tail].num = 0;
|
||||
q[tail].val = f[i - w - 1][0];
|
||||
for(int j = 1; j <= maxp; j++)
|
||||
{
|
||||
while(tail >= head && j - q[head].num > as[i]) head++;
|
||||
if(head <= tail) f[i][j] = max(f[i][j], q[head].val - (j - q[head].num) * ap[i]);
|
||||
while(tail >= head && q[tail].val + (q[tail].num - j) * ap[i] < f[i - w - 1][j]) tail--;
|
||||
q[++tail].num = j;
|
||||
q[tail].val = f[i- w - 1][j];
|
||||
}
|
||||
head = 0, tail = -1;
|
||||
q[++tail].num = maxp;
|
||||
q[tail].val = f[i - w - 1][maxp];
|
||||
for(int j = maxp - 1; j >= 0; j--)
|
||||
{
|
||||
while(tail >= head && q[head].num - j > bs[i]) head++;
|
||||
if(head <= tail) f[i][j] = max(f[i][j], q[head].val + (q[head].num - j) * bp[i]);
|
||||
while(tail >= head && q[tail].val + (q[tail].num - j) * bp[i] < f[i - w - 1][j]) tail--;
|
||||
q[++tail].num = j;
|
||||
q[tail].val = f[i - w - 1][j];
|
||||
}
|
||||
}
|
||||
int rmax = 0;
|
||||
for(int i = 0; i <= maxp; i++)
|
||||
if(f[t][i] > rmax) rmax = f[t][i];
|
||||
printf("%d\n", rmax);
|
||||
}
|
||||
return 0;
|
||||
}
|
35
HDOJ/3402_autoAC.cpp
Normal file
35
HDOJ/3402_autoAC.cpp
Normal file
|
@ -0,0 +1,35 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
double PI = 3.1415926 * 2;
|
||||
int t,n;
|
||||
double r;
|
||||
double dis_tance;
|
||||
double minn;
|
||||
int map[100010];
|
||||
int main()
|
||||
{
|
||||
scanf("%d",&t);
|
||||
while(t --)
|
||||
{
|
||||
minn = 100000.00;
|
||||
scanf("%d%lf",&n,&r);
|
||||
memset(map,0,sizeof(map));
|
||||
for(int i = 1;i <= n;i ++)
|
||||
scanf("%d",&map[i]);
|
||||
if(map[1] == map[n])
|
||||
printf("inf\n");
|
||||
else
|
||||
{
|
||||
sort(map + 1,map + n + 1);
|
||||
dis_tance = (PI * r) / n;
|
||||
for(int i = n;i > 1;i --)
|
||||
if(dis_tance / (map[i] - map[i - 1]) < minn)
|
||||
minn = dis_tance / (map[i] - map[i - 1]);
|
||||
printf("%.3lf\n",minn);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
104
HDOJ/3403_autoAC.cpp
Normal file
104
HDOJ/3403_autoAC.cpp
Normal file
|
@ -0,0 +1,104 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<map>
|
||||
#include<algorithm>
|
||||
#include<stack>
|
||||
#include<queue>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#include<string>
|
||||
#include<cstdlib>
|
||||
#include<vector>
|
||||
#include<cstdio>
|
||||
#include<set>
|
||||
#include<list>
|
||||
#include<numeric>
|
||||
#include<cassert>
|
||||
#include<sstream>
|
||||
#include<ctime>
|
||||
#include<bitset>
|
||||
#include<functional>
|
||||
using namespace std;
|
||||
typedef pair<int, int> pii;
|
||||
int day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
bool isLeap(long long year)
|
||||
{
|
||||
return year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
|
||||
}
|
||||
vector<pii> ht;
|
||||
vector<string> pvt[10];
|
||||
vector<string> leapVt[10];
|
||||
int sum[10];
|
||||
int rev(int t)
|
||||
{
|
||||
char str[10];
|
||||
sprintf(str, "%04d", t);
|
||||
reverse(str, str+4);
|
||||
return atoi(str);
|
||||
}
|
||||
void init()
|
||||
{
|
||||
for (int mm = 1; mm <= 12; mm++) {
|
||||
for (int dd = 1; dd <= day[mm]; dd++) {
|
||||
if (dd % 10 == 0) continue;
|
||||
int t = mm*100 + dd;
|
||||
ht.push_back(pii(rev(t), t));
|
||||
}
|
||||
}
|
||||
sort(ht.begin(), ht.end());
|
||||
long long now = 9220;
|
||||
for (int n = 0; n <= 7; n++, now *= 10) {//9220*..*0229
|
||||
if (n == 0) {
|
||||
pvt[n].push_back("");
|
||||
leapVt[n].push_back("");
|
||||
} else if (n == 1) {
|
||||
for (char i = '0'; i <= '9'; i++) {
|
||||
pvt[n].push_back(string(1, i));//
|
||||
int year = now+(i-'0');
|
||||
if (isLeap(year)) {
|
||||
leapVt[n].push_back(pvt[n].back());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
int nn = n - 2;
|
||||
for (char i = '0'; i <= '9'; i++) {
|
||||
for (vector<string>::iterator it = pvt[nn].begin(); it != pvt[nn].end(); it++) {
|
||||
pvt[n].push_back(i+*it+i);
|
||||
long long year = now+atoi(pvt[n].back().c_str());
|
||||
if (isLeap(year)) {
|
||||
leapVt[n].push_back(pvt[n].back());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
sum[n] = 330*pvt[n].size() + leapVt[n].size();
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
int T, k, n;
|
||||
for (scanf("%d", &T); T--; ) {
|
||||
scanf("%d", &k);
|
||||
k--;
|
||||
for (n = 0; n <= 7; n++) {
|
||||
if (k < sum[n]) break;
|
||||
else k -= sum[n];
|
||||
}
|
||||
int num = pvt[n].size();
|
||||
if (k >= 322*num) {
|
||||
k -= 322*num;
|
||||
if (k < leapVt[n].size()) {
|
||||
printf("9220%s0229\n", leapVt[n][k].c_str());
|
||||
} else {
|
||||
k -= leapVt[n].size();
|
||||
int p = k/num + 322;
|
||||
printf("%d%s%04d\n", ht[p].first, pvt[n][k%num].c_str(), ht[p].second);
|
||||
}
|
||||
} else {
|
||||
int p = k/num;
|
||||
printf("%d%s%04d\n", ht[p].first, pvt[n][k%num].c_str(), ht[p].second);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
50
HDOJ/3404_autoAC.cpp
Normal file
50
HDOJ/3404_autoAC.cpp
Normal file
|
@ -0,0 +1,50 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#define N 2000000
|
||||
using namespace std;
|
||||
int m[2][2]={0,0,0,1};
|
||||
int Nim_Mult_Power(int x,int y){
|
||||
if(x<2)
|
||||
return m[x][y];
|
||||
int a=0;
|
||||
for(;;a++)
|
||||
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
|
||||
break;
|
||||
int m=1<<(1<<a);
|
||||
int p=x/m,s=y/m,t=y%m;
|
||||
int d1=Nim_Mult_Power(p,s);
|
||||
int d2=Nim_Mult_Power(p,t);
|
||||
return (m*(d1^d2))^Nim_Mult_Power(m/2,d1);
|
||||
}
|
||||
int Nim_Mult(int x,int y){
|
||||
if(x<y)
|
||||
return Nim_Mult(y,x);
|
||||
if(x<2)
|
||||
return m[x][y];
|
||||
int a=0;
|
||||
for(;;a++)
|
||||
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
|
||||
break;
|
||||
int m=1<<(1<<a);
|
||||
int p=x/m,q=x%m,s=y/m,t=y%m;
|
||||
int c1=Nim_Mult(p,s),c2=Nim_Mult(p,t)^Nim_Mult(q,s),c3=Nim_Mult(q,t);
|
||||
return (m*(c1^c2))^c3^Nim_Mult_Power(m/2,c1);
|
||||
}
|
||||
int main(){
|
||||
int t,n,x,y;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
scanf("%d",&n);
|
||||
int ret=0;
|
||||
while(n--){
|
||||
scanf("%d%d",&x,&y);
|
||||
ret^=Nim_Mult(x,y);
|
||||
}
|
||||
if(ret)
|
||||
puts("Have a try, lxhgww.");
|
||||
else
|
||||
puts("Don't waste your time.");
|
||||
}
|
||||
return 0;
|
||||
}
|
82
HDOJ/3405_autoAC.cpp
Normal file
82
HDOJ/3405_autoAC.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<string>
|
||||
#include<cmath>
|
||||
const int inf=99999991;
|
||||
using namespace std;
|
||||
double map[55][55],dis[55];
|
||||
int n;
|
||||
bool vs[55];
|
||||
struct Node
|
||||
{
|
||||
int x,y;
|
||||
}node[55];
|
||||
double Min(double a,double b)
|
||||
{
|
||||
if(a>b)return b;
|
||||
else return a;
|
||||
}
|
||||
double prim(int x)
|
||||
{
|
||||
int i,k,mark;
|
||||
memset(vs,0,sizeof(vs));
|
||||
vs[x]=1;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
dis[i]=map[i][0];
|
||||
}vs[0]=1;
|
||||
if(x==0)
|
||||
{
|
||||
for(i=0;i<n;i++){
|
||||
dis[i]=map[i][1];
|
||||
}vs[1]=1;
|
||||
}
|
||||
double MIN,SUM=0;
|
||||
for(k=1;k<n-1;k++)
|
||||
{
|
||||
MIN=inf;
|
||||
for(i=0;i<n;i++)
|
||||
if(!vs[i]&&MIN>dis[i])
|
||||
{
|
||||
MIN=dis[i];
|
||||
mark=i;
|
||||
}
|
||||
SUM+=MIN;
|
||||
vs[mark]=1;
|
||||
for(i=0;i<n;i++)
|
||||
if(!vs[i]&&dis[i]>map[mark][i])
|
||||
dis[i]=map[mark][i];
|
||||
}
|
||||
return SUM;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,CASE;
|
||||
double d,x1,y1;
|
||||
scanf("%d",&CASE);
|
||||
while(CASE--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
map[i][i]=0;
|
||||
scanf("%d%d",&node[i].x,&node[i].y);
|
||||
for(j=i-1;j>=0;j--)
|
||||
{
|
||||
x1=node[i].x-node[j].x;
|
||||
y1=node[i].y-node[j].y;
|
||||
d=sqrt(x1*x1+y1*y1);
|
||||
map[i][j]=map[j][i]=d;
|
||||
}
|
||||
}
|
||||
double h,g=inf;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
h=prim(i);
|
||||
g=Min(g,h);
|
||||
}
|
||||
printf("%.2lf\n",g);
|
||||
}
|
||||
return 0;
|
||||
}
|
74
HDOJ/3406_autoAC.cpp
Normal file
74
HDOJ/3406_autoAC.cpp
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
int dp[(1<<16)+2][10][4];
|
||||
int map[17][17];
|
||||
int bit[(1<<16)+2];
|
||||
int main()
|
||||
{
|
||||
int i,j,n,cnt,k,l,m,p,a,ans;
|
||||
for (i=0;i<(1<<16);i++)
|
||||
{
|
||||
cnt=0;
|
||||
for (j=0;j<16;j++)
|
||||
{
|
||||
if ((i & (1<<j))!=0) cnt++;
|
||||
}
|
||||
bit[i]=cnt;
|
||||
}
|
||||
while(1)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
if (n==0) break;
|
||||
for (i=0;i<n;i++)
|
||||
{
|
||||
for (j=0;j<n;j++)
|
||||
{
|
||||
scanf("%d",&map[i][j]);
|
||||
}
|
||||
}
|
||||
memset(dp,-1,sizeof(dp));
|
||||
ans=0;
|
||||
dp[0][0][0]=0;
|
||||
for (i=0;i<(1<<n);i++)
|
||||
{
|
||||
for (j=0;j<(1<<3);j++)
|
||||
{
|
||||
for (k=0;k<3;k++)
|
||||
{
|
||||
if (dp[i][j][k]==-1) continue;
|
||||
ans=max(ans,dp[i][j][k]);
|
||||
if (k==3) continue;
|
||||
for (l=0;l<n;l++)
|
||||
{
|
||||
if ((i & (1<<l))!=0) continue;
|
||||
p=(i | (1<<l));
|
||||
cnt=bit[p]-1;
|
||||
if (map[l][cnt]==0)
|
||||
{
|
||||
dp[p][j][k+1]=max(dp[p][j][k+1],dp[i][j][k]);
|
||||
}
|
||||
if (map[l][cnt]==1)
|
||||
{
|
||||
if (k==2) continue;
|
||||
if ((j & 4)!=0) dp[p][(j<<1) & 7][k+1]=max(dp[p][(j<<1) & 7][k+1],dp[i][j][k]+1);
|
||||
else dp[p][(j<<1) & 7][k+1]=max(dp[p][(j<<1) & 7][k+1],dp[i][j][k]);
|
||||
}
|
||||
if (map[l][cnt]==2)
|
||||
{
|
||||
if ((j & 4)!=0) dp[p][((j<<1) & 7)+1][k]=max(dp[p][((j<<1) & 7)+1][k],dp[i][j][k]+1);
|
||||
else dp[p][((j<<1) & 7)+1][k]=max(dp[p][((j<<1) & 7)+1][k],dp[i][j][k]);
|
||||
}
|
||||
if (map[l][cnt]==3)
|
||||
{
|
||||
dp[p][0][k]=max(dp[p][0][k],dp[i][j][k]+((j & 1)!=0)+((j & 2)!=0)+((j & 4)!=0)+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
103
HDOJ/3407_autoAC.cpp
Normal file
103
HDOJ/3407_autoAC.cpp
Normal file
|
@ -0,0 +1,103 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <memory.h>
|
||||
#include <algorithm>
|
||||
#include <queue>
|
||||
#define MAXN 100006
|
||||
#define kind 26
|
||||
using namespace std;
|
||||
char word[MAXN];
|
||||
struct Node
|
||||
{
|
||||
int next[kind],v,fail;
|
||||
}Trie[5*MAXN+10];
|
||||
int snode;
|
||||
int N;
|
||||
int cas;
|
||||
void set_node(int x)
|
||||
{
|
||||
memset(Trie[x].next,0,sizeof(Trie[x].next));
|
||||
Trie[x].v=0;
|
||||
Trie[x].fail=0;
|
||||
}
|
||||
void Insert(char s[])
|
||||
{
|
||||
int i=0,pos=0,index;
|
||||
int len=strlen(s);
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
index=s[i]-'a';
|
||||
if(Trie[pos].next[index]==0)
|
||||
{
|
||||
set_node(++snode);
|
||||
Trie[pos].next[index]=snode;
|
||||
}
|
||||
pos=Trie[pos].next[index];
|
||||
}
|
||||
}
|
||||
void Find_Fail(int pre,int ith,int now)
|
||||
{
|
||||
if(!pre)
|
||||
{
|
||||
Trie[now].fail=0;
|
||||
return;
|
||||
}
|
||||
int temp=Trie[pre].fail;
|
||||
while(temp!=-1)
|
||||
{
|
||||
if(Trie[temp].next[ith]!=0)
|
||||
{
|
||||
Trie[now].fail=Trie[temp].next[ith];
|
||||
return;
|
||||
}
|
||||
temp=Trie[temp].fail;
|
||||
}
|
||||
if(temp==-1)
|
||||
Trie[now].fail=0;
|
||||
return;
|
||||
}
|
||||
queue<int>Q;
|
||||
void Build_AC_Fail()
|
||||
{
|
||||
int i,pos;
|
||||
while(!Q.empty()) Q.pop();
|
||||
Trie[0].fail=-1;
|
||||
Q.push(0);
|
||||
while(!Q.empty())
|
||||
{
|
||||
pos=Q.front();Q.pop();
|
||||
for(i=0;i<kind;i++)
|
||||
{
|
||||
if(Trie[pos].next[i]!=0)
|
||||
{
|
||||
Find_Fail(pos,i,Trie[pos].next[i]);
|
||||
Q.push(Trie[pos].next[i]);
|
||||
}
|
||||
else
|
||||
Trie[pos].next[i]=Trie[Trie[pos].fail].next[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
void Solve()
|
||||
{
|
||||
int i,j;
|
||||
set_node(0);snode=0;
|
||||
Insert(word);
|
||||
Build_AC_Fail();
|
||||
for(i=0;i<=snode;i++)
|
||||
{
|
||||
printf("%d",i);
|
||||
for(j=0;j<26;j++)
|
||||
printf(" %d",Trie[i].next[j]);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%s",word)!=EOF)
|
||||
{
|
||||
if(word[0]=='0') break;
|
||||
Solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
130
HDOJ/3408_autoAC.cpp
Normal file
130
HDOJ/3408_autoAC.cpp
Normal file
|
@ -0,0 +1,130 @@
|
|||
#include<iostream>
|
||||
#include<cmath>
|
||||
#include<complex>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
typedef complex<double> point;
|
||||
const int maxn = 15;
|
||||
const double eps = 1e-8;
|
||||
const double pi = acos( -1.0 );
|
||||
struct line
|
||||
{
|
||||
point a, b;
|
||||
line( ){ }
|
||||
line( point u, point v ) : a( u ), b( v ) { }
|
||||
};
|
||||
struct polygon
|
||||
{
|
||||
point p[maxn];
|
||||
int n;
|
||||
};
|
||||
int dblcmp( double x ){ return ( x < -eps ? -1 : x > eps ); }
|
||||
double operator^( point p1, point p2 ){ return imag( conj( p1 ) * p2 ); }
|
||||
double operator&( point p1, point p2 ){ return real( conj( p1 ) * p2 ); }
|
||||
point operator*( line l0, line l1 )
|
||||
{
|
||||
double t = l0.a - l1.a ^ l0.b - l1.a;
|
||||
double s = l0.b - l1.b ^ l0.a - l1.b;
|
||||
return l1.a + ( l1.b - l1.a ) * t / ( t + s );
|
||||
}
|
||||
polygon poly[10];
|
||||
bool same_point( point p1, point p2 )
|
||||
{
|
||||
return dblcmp( imag( p1 ) - imag( p2 ) ) == 0 && dblcmp( real( p1 ) - real( p2 ) ) == 0;
|
||||
}
|
||||
bool on_radial( point p, line l )
|
||||
{
|
||||
if( dblcmp( l.a - p ^ l.b - p ) != 0 )return false;
|
||||
return dblcmp( p - l.a & l.b - l.a ) >= 0;
|
||||
}
|
||||
bool on_segment( point p, line l )
|
||||
{
|
||||
if( dblcmp( l.a - p ^ l.b - p ) != 0 )return false;
|
||||
return dblcmp( l.a - p & l.b - p ) <= 0;
|
||||
}
|
||||
int main( )
|
||||
{
|
||||
int i, j, n, m, sz, len;
|
||||
double x, y, dx, dy;
|
||||
point ss, kk, pp, pp1;
|
||||
point xp[200];
|
||||
line L, L0;
|
||||
while( scanf("%d",&n) && n )
|
||||
{
|
||||
scanf("%lf%lf",&x, &y);
|
||||
ss = point( x, y );
|
||||
scanf("%lf%lf",&dx, &dy);
|
||||
kk = point( dx, dy );
|
||||
L.a = ss;
|
||||
L.b = ss + kk;
|
||||
pp = ss;
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
scanf("%d",&m);
|
||||
poly[i].n = m;
|
||||
for( j = 0; j < m; j++ )
|
||||
{
|
||||
scanf("%lf%lf",&x, &y);
|
||||
poly[i].p[j] = point( x, y );
|
||||
}
|
||||
poly[i].p[m] = poly[i].p[0];
|
||||
}
|
||||
sz = poly[0].n;
|
||||
for( i = 0; i < sz; i++ )
|
||||
{
|
||||
L0 = line( poly[0].p[i], poly[0].p[i+1] );
|
||||
if( dblcmp( L.b - L.a ^ L0.b - L0.a ) == 0 )
|
||||
{
|
||||
if( on_radial( L0.a, L ) )
|
||||
{
|
||||
if( abs( L0.a - ss ) < abs( L0.b - ss ) ) pp = L0.a;
|
||||
else pp = L0.b;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pp1 = L0 * L;
|
||||
if( on_radial( pp1, L ) && on_segment( pp1, L0 ) )
|
||||
{
|
||||
if( same_point( pp , ss ) )
|
||||
pp = pp1;
|
||||
else if( abs( pp1 - ss ) < abs( pp - ss ) )
|
||||
pp = pp1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( same_point( pp, ss ) )
|
||||
{
|
||||
printf("MISS\n");
|
||||
continue;
|
||||
}
|
||||
len = 0;
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
sz = poly[i].n;
|
||||
for( j = 0; j < sz; j++ )
|
||||
{
|
||||
L0 = line( poly[i].p[j], poly[i].p[j+1] );
|
||||
if( dblcmp( L.b - L.a ^ L0.b - L0.a ) == 0 )
|
||||
{
|
||||
if( on_radial( L0.a, L ) )
|
||||
xp[len++] = L0.a, xp[len++] = L0.b;
|
||||
}
|
||||
else
|
||||
{
|
||||
pp1 = L0 * L;
|
||||
if( on_segment( pp1, L0 ) )
|
||||
xp[len++] = pp1;
|
||||
}
|
||||
}
|
||||
}
|
||||
double min = 1e10;
|
||||
for( i = 0; i < len; i++ )
|
||||
if( abs( xp[i] - ss ) < min )
|
||||
pp1 = xp[i], min = abs( xp[i] - ss );
|
||||
if( same_point( pp, pp1 ) )printf("HIT\n");
|
||||
else printf("MISS\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
107
HDOJ/3409_autoAC.cpp
Normal file
107
HDOJ/3409_autoAC.cpp
Normal file
|
@ -0,0 +1,107 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<queue>
|
||||
#include<vector>
|
||||
using namespace std;
|
||||
const int maxn = 205;
|
||||
const int maxe = 20500;
|
||||
const int INF = 0x3f3f3f;
|
||||
struct Edge{
|
||||
int u,v,w;
|
||||
int next;
|
||||
void assign(int u_,int v_,int w_,int next_){
|
||||
u = u_; v = v_; w = w_; next = next_;
|
||||
}
|
||||
bool operator < (const Edge& e) const {
|
||||
return w > e.w;
|
||||
}
|
||||
}edges[maxe];
|
||||
int head[maxn];
|
||||
vector<int> G[maxn];
|
||||
int cnt;
|
||||
int N,M,P;
|
||||
double PT[maxn][maxn/2];
|
||||
double dp[maxn][maxn/2];
|
||||
void addedge(int u,int v,int w){
|
||||
edges[cnt].assign(u,v,w,head[u]);
|
||||
head[u] = cnt++;
|
||||
edges[cnt].assign(v,u,w,head[v]);
|
||||
head[v] = cnt++;
|
||||
}
|
||||
void Dijkstra(){
|
||||
priority_queue<Edge> Q;
|
||||
int d[maxn];
|
||||
bool vis[maxn];
|
||||
memset(d,0x3f,sizeof(d));
|
||||
memset(vis,0,sizeof(vis));
|
||||
for(int i=0;i<N;i++) G[i].clear();
|
||||
Q.push((Edge){0,0,0});
|
||||
d[0] = 0;
|
||||
while(!Q.empty()){
|
||||
Edge e = Q.top(); Q.pop();
|
||||
int u = e.u;
|
||||
if(vis[u]) continue;
|
||||
vis[u] = true;
|
||||
if(e.u != e.v){
|
||||
G[e.v].push_back(e.u);
|
||||
}
|
||||
for(int i=head[u];i!=-1;i=edges[i].next){
|
||||
int v = edges[i].v;
|
||||
if(d[v] > d[u] + edges[i].w){
|
||||
d[v] = d[u] + edges[i].w;
|
||||
Q.push((Edge){v,u,d[v]});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void dfs(int u){
|
||||
int child = G[u].size();
|
||||
double son[maxn];
|
||||
for(int i=0;i<=P;i++) son[i] = 0;
|
||||
if(child == 0){
|
||||
for(int i=1;i<=P;i++){
|
||||
dp[u][i] = PT[u][i];
|
||||
}
|
||||
return;
|
||||
}
|
||||
for(int i=0;i<child;i++){
|
||||
int v = G[u][i];
|
||||
dfs(v);
|
||||
for(int j=P;j>=0;j--)
|
||||
for(int k=0;k<=j;k++)
|
||||
son[j] = max(son[j],dp[v][k]/child+son[j-k]);
|
||||
}
|
||||
for(int i=P;i>=0;i--)
|
||||
for(int j=0;j<=i;j++){
|
||||
dp[u][i] = max(dp[u][i],PT[u][j] + (1-PT[u][j])* son[i-j]);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&N,&M) == 2 && N+M){
|
||||
cnt = 0;
|
||||
memset(dp,0,sizeof(dp));
|
||||
memset(head,-1,sizeof(head));
|
||||
for(int i=1;i<=M;i++){
|
||||
int a,b,c;
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
if(a == b) continue;
|
||||
addedge(a,b,c);
|
||||
}
|
||||
scanf("%d",&P);
|
||||
for(int i=0;i<N;i++) PT[i][0] = 0;
|
||||
for(int i=0;i<N;i++)
|
||||
for(int j=1;j<=P;j++){
|
||||
scanf("%lf",&PT[i][j]);
|
||||
}
|
||||
Dijkstra();
|
||||
dfs(0);
|
||||
double ans = 0;
|
||||
for(int i=0;i<=P;i++)
|
||||
ans = max(ans,dp[0][i]);
|
||||
printf("%.2lf\n",ans*100);
|
||||
}
|
||||
}
|
48
HDOJ/3410_autoAC.cpp
Normal file
48
HDOJ/3410_autoAC.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <stdio.h>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int MAXN = 50010;
|
||||
int main()
|
||||
{
|
||||
int iCase, n, ic = 1;
|
||||
int arr[MAXN], que[MAXN];
|
||||
int rear, front;
|
||||
int l[MAXN], r[MAXN];
|
||||
bool flag;
|
||||
scanf("%d", &iCase);
|
||||
while (iCase--) {
|
||||
arr[0] = 0;
|
||||
memset(que, 0, sizeof(que));
|
||||
scanf("%d", &n);
|
||||
for (int i = 1; i <= n; ++i)
|
||||
scanf("%d", &arr[i]);
|
||||
front = 0, rear = -1;
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
flag = false;
|
||||
while (front <= rear && arr[que[rear]] < arr[i]) {
|
||||
flag = true;
|
||||
rear--;
|
||||
}
|
||||
if (flag) l[i] = que[rear+1];
|
||||
else l[i] = 0;
|
||||
que[++rear] = i;
|
||||
}
|
||||
front = 0, rear = -1;
|
||||
for (int i = n; i >= 1; --i) {
|
||||
flag = false;
|
||||
while (front <= rear && arr[que[rear]] < arr[i]) {
|
||||
flag = true;
|
||||
rear--;
|
||||
}
|
||||
if (flag) r[i] = que[rear+1];
|
||||
else r[i] = 0;
|
||||
que[++rear] = i;
|
||||
}
|
||||
printf("Case %d:\n", ic++);
|
||||
for (int i = 1; i <= n; ++i) {
|
||||
printf("%d %d\n", l[i], r[i]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
80
HDOJ/3411_autoAC.cpp
Normal file
80
HDOJ/3411_autoAC.cpp
Normal file
|
@ -0,0 +1,80 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
#define N 50005
|
||||
#define M 30
|
||||
#define read(a,b,c) scanf("%d%d%d",&a,&b,&c)
|
||||
#define cl(a) memset(a,0,sizeof(a))
|
||||
#define ll long long
|
||||
ll x[M],f[3],r[N][3][3],q;
|
||||
int p;
|
||||
using namespace std;
|
||||
ll bin(ll t)
|
||||
{
|
||||
ll res=1;
|
||||
int i=0;
|
||||
while (t>0)
|
||||
{
|
||||
if (t&1) res=(res*x[i])%p;
|
||||
i++;
|
||||
t>>=1;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
void init()
|
||||
{
|
||||
r[0][1][1]=(q-1+p)%p;
|
||||
r[0][1][2]=q;
|
||||
r[0][2][1]=1;
|
||||
r[0][2][2]=0;
|
||||
f[1]=1;f[2]=0;
|
||||
}
|
||||
void mul(int t)
|
||||
{
|
||||
int i,j,k;
|
||||
for (i=1;i<=2;i++)
|
||||
for (j=1;j<=2;j++)
|
||||
{
|
||||
r[t][i][j]=0;
|
||||
for (k=1;k<=2;k++) r[t][i][j]=r[t][i][j]+(r[t-1][i][k]*r[t-1][k][j])%p;
|
||||
}
|
||||
}
|
||||
void zmul(int i)
|
||||
{
|
||||
ll g1,g2;
|
||||
g1=(f[1]*r[i][1][1])%p+(f[2]*r[i][1][2])%p;
|
||||
g2=(f[1]*r[i][2][1])%p+(f[2]*r[i][2][2])%p;
|
||||
f[1]=g1%p;f[2]=g2%p;
|
||||
}
|
||||
void bin2(int t)
|
||||
{
|
||||
int i=0;
|
||||
while (t>0)
|
||||
{
|
||||
if (t&1) zmul(i);
|
||||
t>>=1;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int x1,y1,z1,y2,z2,i,j;
|
||||
while (read(x1,y1,z1)!=EOF)
|
||||
{
|
||||
if (x1==-1&&y1==-1&&z1==-1) break;
|
||||
read(y2,z2,p);
|
||||
cl(x);
|
||||
x[0]=x1%p;
|
||||
for (i=1;i<M;i++) x[i]=(x[i-1]*x[i-1])%p;
|
||||
q=(bin(y1)+z1)%p;
|
||||
init();
|
||||
for (i=1;i<N;i++) mul(i);
|
||||
zmul(y2);
|
||||
if (z2>0) bin2(z2-1);
|
||||
if (z2>=1) printf("%d\n",f[1]);
|
||||
else printf("%d\n",f[2]);
|
||||
}
|
||||
return 0;
|
||||
}
|
60
HDOJ/3412_autoAC.cpp
Normal file
60
HDOJ/3412_autoAC.cpp
Normal file
|
@ -0,0 +1,60 @@
|
|||
#include<iostream>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
struct T
|
||||
{
|
||||
string name;
|
||||
int s;
|
||||
}t[200];
|
||||
string stu[200];
|
||||
bool flag;
|
||||
int n;
|
||||
bool cmp(T a,T b)
|
||||
{
|
||||
return a.s>b.s;
|
||||
}
|
||||
bool cmp2(string a,string b)
|
||||
{
|
||||
return a<b;
|
||||
}
|
||||
void dfs(int x,int sum,int step)
|
||||
{
|
||||
if(sum==0)
|
||||
{
|
||||
if(step==2||step==3) flag=true;
|
||||
return;
|
||||
}
|
||||
if(step==3&&sum!=0) return;
|
||||
if(sum<t[n-1].s) return;
|
||||
if(x+1>=n) return;
|
||||
for(int i=x+1;i<n;i++)
|
||||
{
|
||||
if(flag) return;
|
||||
if(sum-t[i].s>=0&&step+1<=3) dfs(i,sum-t[i].s,step+1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
for(int i=0;i<n;i++) cin>>t[i].name>>t[i].s;
|
||||
sort(t,t+n,cmp);
|
||||
int k=0;
|
||||
for(int i=n-3;i>=0;i--)
|
||||
{
|
||||
flag=false;
|
||||
dfs(i,t[i].s,0);
|
||||
if(flag) stu[k]=t[i].name,k++;
|
||||
}
|
||||
sort(stu,stu+k,cmp2);
|
||||
cout<<k<<endl;
|
||||
for(int i=0;i<k;i++)
|
||||
cout<<stu[i]<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
93
HDOJ/3413_autoAC.cpp
Normal file
93
HDOJ/3413_autoAC.cpp
Normal file
|
@ -0,0 +1,93 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
#include<iomanip>
|
||||
using namespace std;
|
||||
double task[105];
|
||||
double ans[105];
|
||||
bool vis[105];
|
||||
int main()
|
||||
{
|
||||
ios::sync_with_stdio(false);
|
||||
int T;
|
||||
cin>>T;
|
||||
int kase=0;
|
||||
while(T--)
|
||||
{
|
||||
cout<<"Case "<<++kase<<':'<<endl;
|
||||
memset(vis,0,sizeof(vis));
|
||||
int n;
|
||||
cin>>n;
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
cin>>task[i];
|
||||
}
|
||||
double now=0;
|
||||
int pre=0;
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
for(int j=pre;;++j)
|
||||
{
|
||||
j%=n;
|
||||
if(!vis[j]){pre=j;break;}
|
||||
}
|
||||
pre%=n;
|
||||
double minn=floor(task[pre]);
|
||||
int rec=pre;
|
||||
if(task[pre]>1)
|
||||
for(int j=(pre+1)%n;j!=pre;++j)
|
||||
{
|
||||
j%=n;
|
||||
if(j==pre)break;
|
||||
if(vis[j])continue;
|
||||
if(task[j]<=1){rec=j;break;}
|
||||
if(floor(task[j])<minn)
|
||||
{
|
||||
minn=floor(task[j]);
|
||||
rec=j;
|
||||
}
|
||||
}
|
||||
vis[rec]=true;
|
||||
if(task[rec]<=1)
|
||||
{
|
||||
for(int k=pre;k!=rec;++k)
|
||||
{
|
||||
k%=n;
|
||||
if(k==rec)break;
|
||||
if(vis[k])continue;
|
||||
task[k]-=ceil(task[rec]);
|
||||
now+=ceil(task[rec]);
|
||||
}
|
||||
now+=task[rec];
|
||||
}
|
||||
else{
|
||||
for(int k=pre;k!=rec;++k)
|
||||
{
|
||||
k%=n;
|
||||
if(k==rec)break;
|
||||
if(vis[k])continue;
|
||||
task[k]-=ceil(task[rec]);
|
||||
now+=ceil(task[rec]);
|
||||
}
|
||||
for(int k=rec+1;k!=pre;++k)
|
||||
{
|
||||
k%=n;
|
||||
if(k==pre)break;
|
||||
if(vis[k])continue;
|
||||
task[k]-=(ceil(task[rec])-1);
|
||||
now+=(ceil(task[rec])-1);
|
||||
}
|
||||
now+=task[rec];
|
||||
}
|
||||
ans[rec]=now;
|
||||
pre=rec+1;
|
||||
pre%=n;
|
||||
}
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans[i]<<endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
50
HDOJ/3414_autoAC.cpp
Normal file
50
HDOJ/3414_autoAC.cpp
Normal file
|
@ -0,0 +1,50 @@
|
|||
#include<cstdio>
|
||||
const int N = 1000;
|
||||
bool g[N][N];
|
||||
int n , next[N];
|
||||
bool expand( int s )
|
||||
{
|
||||
for( int i = 0 ; i < n ; next[i++] = -1 );
|
||||
int front = s , back = front;
|
||||
for( int i = 0 ; i < n ; i++ )
|
||||
{
|
||||
if( i == s ) continue;
|
||||
if( g[i][front] ) next[i] = front , front = i;
|
||||
else
|
||||
{
|
||||
int a = front , b = next[front];
|
||||
while( b != -1 && g[b][i] )
|
||||
a = b , b = next[b];
|
||||
next[a] = i;
|
||||
next[i] = b;
|
||||
if( b == -1 ) back = i;
|
||||
}
|
||||
}
|
||||
if( g[back][front] )
|
||||
{
|
||||
next[back] = front;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool solve()
|
||||
{
|
||||
for( int i = 0 ; i < n ; i++ )
|
||||
if( expand(i) ) return true;
|
||||
return false;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while( scanf("%d",&n) , n )
|
||||
{
|
||||
for( int i = 0 ; i < n ; i++ )
|
||||
for( int j = 0 ; j < n ; j++ )
|
||||
scanf("%d",&g[i][j]);
|
||||
if( n == 1 ) puts("1");
|
||||
else if( n == 2 || !solve() ) puts("-1");
|
||||
else
|
||||
for( int i = 0 , j = 0 ; i < n ; i++ , j = next[j] )
|
||||
printf("%d%c",j+1,i==n-1?'\n':' ');
|
||||
}
|
||||
return 0;
|
||||
}
|
48
HDOJ/3415_autoAC.cpp
Normal file
48
HDOJ/3415_autoAC.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <stdio.h>
|
||||
#include <queue>
|
||||
#include <algorithm>
|
||||
#include <string.h>
|
||||
using namespace std;
|
||||
int a[111111];
|
||||
int sum[211111];
|
||||
const int INF = 0x3fffffff;
|
||||
int main()
|
||||
{
|
||||
int t,n,m,i,j,k,head,end;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d",&n,&k);
|
||||
j = n;
|
||||
sum[0] = 0;
|
||||
for(i = 1; i<=n; i++)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
sum[i] = sum[i-1]+a[i];
|
||||
}
|
||||
int ans = -INF;
|
||||
for(i = n+1; i<n+k;i++)
|
||||
sum[i] = sum[i-1]+a[i-n];
|
||||
n = n+k-1;
|
||||
deque<int> Q;
|
||||
Q.clear();
|
||||
for(i = 1; i<=n; i++)
|
||||
{
|
||||
while(!Q.empty() && sum[i-1]<sum[Q.back()])
|
||||
Q.pop_back();
|
||||
while(!Q.empty() && Q.front()<i-k)
|
||||
Q.pop_front();
|
||||
Q.push_back(i-1);
|
||||
if(sum[i]-sum[Q.front()]>ans)
|
||||
{
|
||||
ans = sum[i]-sum[Q.front()];
|
||||
head = Q.front()+1;
|
||||
end = i;
|
||||
}
|
||||
}
|
||||
if(end>j)
|
||||
end%=j;
|
||||
printf("%d %d %d\n",ans,head,end);
|
||||
}
|
||||
return 0;
|
||||
}
|
208
HDOJ/3416_autoAC.cpp
Normal file
208
HDOJ/3416_autoAC.cpp
Normal file
|
@ -0,0 +1,208 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdlib.h>
|
||||
#include<climits>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
#define clr(x)memset(x,0,sizeof(x))
|
||||
#define min(a,b)(a)<(b)?(a):(b)
|
||||
const int INF=INT_MAX;
|
||||
const int maxn=1005;
|
||||
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=1;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=1;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;
|
||||
}
|
||||
struct EDGE
|
||||
{
|
||||
int from,to,next,w;
|
||||
}edge[maxm],ee[maxm];
|
||||
int head2[maxn];
|
||||
int head3[maxn];
|
||||
int tt;
|
||||
int t3;
|
||||
void add2(int s,int t,int wi)
|
||||
{
|
||||
edge[tt].from = s;
|
||||
edge[tt].to = t;
|
||||
edge[tt].w = wi;
|
||||
edge[tt].next = head2[s];
|
||||
head2[s] = tt++;
|
||||
}
|
||||
void add3(int s,int t,int wi)
|
||||
{
|
||||
ee[t3].from = s;
|
||||
ee[t3].to = t;
|
||||
ee[t3].w = wi;
|
||||
ee[t3].next = head3[s];
|
||||
head3[s] = t3++;
|
||||
}
|
||||
struct dd
|
||||
{
|
||||
int xu, di;
|
||||
bool operator < (dd t)const{
|
||||
return t.di<di;
|
||||
}
|
||||
}x,in;
|
||||
priority_queue<dd>dis;
|
||||
int d1[maxn];
|
||||
int d2[maxn];
|
||||
void dijkstra(int u,int*d,int*hed,EDGE*ed,int&t)
|
||||
{
|
||||
int i;
|
||||
in.xu = u;
|
||||
in.di = 0;
|
||||
d[u] = 0;
|
||||
dis.push(in);
|
||||
while(!dis.empty())
|
||||
{
|
||||
x = dis.top();
|
||||
dis.pop();
|
||||
for(i = hed[x.xu]; i; i = ed[i].next){
|
||||
in.xu = ed[i].to;
|
||||
in.di = x.di+ed[i].w;
|
||||
if(in.di < d[in.xu]){
|
||||
d[in.xu] = in.di;
|
||||
dis.push(in);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T, i;
|
||||
int n, m, st, en;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d %d",&n, &m);
|
||||
clr(head2);
|
||||
clr(head3);
|
||||
tt = 1;
|
||||
t3 = 1;
|
||||
int a,b,c;
|
||||
while(m--)
|
||||
{
|
||||
scanf("%d %d %d",&a, &b, &c);
|
||||
add2(a,b,c);
|
||||
add3(b,a,c);
|
||||
}
|
||||
scanf("%d %d",&st,&en);
|
||||
for(i = 1; i <= n; i++)
|
||||
d2[i] = d1[i] = INF;
|
||||
dijkstra(st,d1,head2,edge,tt);
|
||||
dijkstra(en,d2,head3,ee,t3);
|
||||
memset(head,-1,sizeof(head));
|
||||
tot = 0;
|
||||
for(i = 1; i < tt; i++)
|
||||
{
|
||||
if(d1[edge[i].from]+d2[edge[i].to]+edge[i].w == d1[en])
|
||||
add(edge[i].from,edge[i].to,1,0);
|
||||
}
|
||||
int res = maxflow(st,en,n);
|
||||
printf("%d\n",res);
|
||||
}
|
||||
return 0;
|
||||
}
|
76
HDOJ/3417_autoAC.cpp
Normal file
76
HDOJ/3417_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#define ll __int64
|
||||
ll M=19880502ll,A[6],B[6][9999];
|
||||
int n,v[9999];
|
||||
ll gcd(ll a,ll b)
|
||||
{
|
||||
if(!b)return a;
|
||||
return gcd(b,a%b);
|
||||
}
|
||||
ll egcd(ll a,ll b,ll &x,ll &y)
|
||||
{
|
||||
if(!b){x=1;y=0;return a;}
|
||||
ll d=egcd(b,a%b,x,y),t=x;
|
||||
x=y;
|
||||
y=t-a/b*y;
|
||||
return d;
|
||||
}
|
||||
ll Pow(ll a,ll b)
|
||||
{
|
||||
ll r=1;
|
||||
while(b)
|
||||
{
|
||||
if(b&1)r=r*a%M;
|
||||
a=a*a%M;
|
||||
b>>=1;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
ll sol(int k)
|
||||
{
|
||||
ll x,y,t=B[0][k],m=A[0];
|
||||
for(int i=1;i<n;i++)
|
||||
{
|
||||
ll d=egcd(m,A[i],x,y),tp=B[i][k]-t;
|
||||
if(tp%d!=0)return -1;
|
||||
x=tp/d*x%A[i];
|
||||
if(x<0)x+=A[i];
|
||||
t=x*m+t;
|
||||
m=m/gcd(m,A[i])*A[i];
|
||||
}
|
||||
return t%m;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d",&n))
|
||||
{
|
||||
memset(v,0,sizeof(v));
|
||||
memset(B,0,sizeof(B));
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
scanf("%I64d",A+i);
|
||||
ll tp=A[i];
|
||||
for(ll k=2;k*k<=tp;++k)
|
||||
if(tp%k==0)
|
||||
{
|
||||
v[k]=1;
|
||||
while(tp%k==0)
|
||||
{
|
||||
++B[i][k];
|
||||
tp/=k;
|
||||
}
|
||||
}
|
||||
if(tp>1){v[tp]=1;B[i][tp]=1;}
|
||||
}
|
||||
ll res=1;
|
||||
for(int i=2;i<9998;i++)
|
||||
if(v[i])
|
||||
{
|
||||
ll t=sol(i);
|
||||
if(!~t){res=-1;break;}
|
||||
res=res*Pow((ll)i,t)%M;
|
||||
}
|
||||
printf("%I64d\n",res);
|
||||
}
|
||||
}
|
37
HDOJ/3418_autoAC.cpp
Normal file
37
HDOJ/3418_autoAC.cpp
Normal file
|
@ -0,0 +1,37 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
typedef __int64 LL;
|
||||
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
|
||||
LL a[105];
|
||||
int judge(LL mid,LL n,LL m){
|
||||
LL sum = 0;
|
||||
for(int i = 0; i <n; ++i)
|
||||
if(a[i] >= mid) sum += mid;
|
||||
else sum += a[i];
|
||||
if(sum >= m * mid) return 1;
|
||||
return 0;
|
||||
}
|
||||
int main()
|
||||
{ LL n,m,sum,minx;
|
||||
while(~scanf("%I64d%I64d",&n,&m)){
|
||||
sum = 0,minx = INF;
|
||||
for(int i = 0; i < n; ++i){
|
||||
scanf("%d",&a[i]);
|
||||
minx = min(minx,a[i]);
|
||||
sum += a[i];
|
||||
}
|
||||
LL L = minx,R = sum/m,mid,ans;
|
||||
while(L <= R){
|
||||
mid = (R + L) >> 1;
|
||||
if(judge(mid,n,m)){
|
||||
ans = mid;
|
||||
L = mid + 1;
|
||||
}else R = mid - 1;
|
||||
}
|
||||
printf("%I64d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
79
HDOJ/3419_autoAC.cpp
Normal file
79
HDOJ/3419_autoAC.cpp
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
int a,b,c;
|
||||
int ans;
|
||||
int hash[10];
|
||||
int base[11],limit;
|
||||
int t_a;
|
||||
int t_b;
|
||||
void judge()
|
||||
{
|
||||
int i;
|
||||
int t;
|
||||
int temp[10];
|
||||
t=t_a*t_b;
|
||||
if(limit<=t || t<base[c]) return ;
|
||||
memset(temp,0,sizeof(temp));
|
||||
while(t)
|
||||
{
|
||||
if(hash[t%10]) return ;
|
||||
temp[t%10]=1;
|
||||
t/=10;
|
||||
}
|
||||
t=0;
|
||||
for(i=1;i<10;i++) if(temp[i]) t++;
|
||||
if(t!=c) return ;
|
||||
ans++;
|
||||
}
|
||||
void DFS2(int k)
|
||||
{
|
||||
int i;
|
||||
if(k>=base[b+1]) return ;
|
||||
if(base[b]<=k) {t_b=k;judge();return ;}
|
||||
for(i=1;i<10;i++)
|
||||
{
|
||||
if(hash[i]==0)
|
||||
{
|
||||
hash[i]=1;
|
||||
DFS2(k*10+i);
|
||||
hash[i]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
void DFS(int k)
|
||||
{
|
||||
int i;
|
||||
if(k>=base[a+1]) return;
|
||||
if(base[a]<=k)
|
||||
{
|
||||
t_a=k;
|
||||
DFS2(0);
|
||||
return ;
|
||||
}
|
||||
for(i=1;i<10;i++)
|
||||
{
|
||||
if(hash[i]==0)
|
||||
{
|
||||
hash[i]=1;
|
||||
DFS(k*10+i);
|
||||
hash[i]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
while(scanf("%d%d%d",&a,&b,&c),a||b||c)
|
||||
{
|
||||
if(a==0 || b==0 || c==0) {printf("0\n");continue;}
|
||||
if(a+b-2>c) {printf("0\n");continue;}
|
||||
base[1]=1;
|
||||
for(i=2;i<=10;i++) base[i]=base[i-1]*10;
|
||||
limit=base[c+1];
|
||||
ans=0;
|
||||
memset(hash,0,sizeof(hash));
|
||||
DFS(0);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
18
HDOJ/3420_autoAC.cpp
Normal file
18
HDOJ/3420_autoAC.cpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
int cmp(const void *a, const void *b){
|
||||
return *(int *)a - *(int *)b;
|
||||
}
|
||||
int main() {
|
||||
int x[1001], n, i, j, tickets;
|
||||
while(scanf("%d", &n) != EOF){
|
||||
for(i = 0; i < n; i++)
|
||||
scanf("%d", x + i);
|
||||
qsort(x, n, sizeof(x[0]), cmp);
|
||||
tickets = 0;
|
||||
for(i = 0; i < n; i++)
|
||||
if(x[i] * (n - i) > tickets)
|
||||
tickets = x[i] * (n - i);
|
||||
printf("%d\n", tickets);
|
||||
}
|
||||
}
|
41
HDOJ/3421_autoAC.cpp
Normal file
41
HDOJ/3421_autoAC.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include<stdio.h>
|
||||
__int64 he;
|
||||
int main()
|
||||
{
|
||||
int t,n,i,ret,qian,j,dang;
|
||||
scanf("%d",&t);
|
||||
for(i=1;i<=t;)
|
||||
{
|
||||
he=0;
|
||||
scanf("%d",&n);
|
||||
qian=-1;
|
||||
ret=0;
|
||||
int ji=0;
|
||||
for(j=1;j<=n;j++)
|
||||
{
|
||||
scanf("%d",&dang);
|
||||
if(dang>0) he+=dang;
|
||||
if(ji)
|
||||
{
|
||||
if(dang<0)
|
||||
{
|
||||
ji=0;
|
||||
}
|
||||
}else
|
||||
{
|
||||
if(dang==0)
|
||||
{
|
||||
}else if(dang>0)
|
||||
{
|
||||
ji=1;
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(i!=1)
|
||||
printf("\n");
|
||||
printf("Case %d:\n",i++);
|
||||
printf("%d %I64d\n",ret,he);
|
||||
}
|
||||
return 0;
|
||||
}
|
10
HDOJ/3422_autoAC.cpp
Normal file
10
HDOJ/3422_autoAC.cpp
Normal file
|
@ -0,0 +1,10 @@
|
|||
#include <stdio.h>
|
||||
int main()
|
||||
{
|
||||
long long i,j,n;
|
||||
while(scanf("%I64d",&n)!=EOF)
|
||||
{
|
||||
printf("%I64d %I64d\n",4*n*n+6*n-1,2*n*n+2*n+1);
|
||||
}
|
||||
return 0;
|
||||
}
|
113
HDOJ/3423_autoAC.cpp
Normal file
113
HDOJ/3423_autoAC.cpp
Normal file
|
@ -0,0 +1,113 @@
|
|||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <queue>
|
||||
#include <ctime>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#define ll long long
|
||||
#define L(rt) (rt<<1)
|
||||
#define R(rt) (rt<<1|1)
|
||||
using namespace std;
|
||||
const int INF = 1e9;
|
||||
const int maxn = 50005;
|
||||
struct Edge{
|
||||
int v, w, next;
|
||||
}et[maxn * 4];
|
||||
struct node{
|
||||
int u, v, l, id;
|
||||
}ed[maxn * 10];
|
||||
int eh[maxn], fa[maxn], son[maxn], ans[maxn];
|
||||
ll dis1[maxn], dis2[maxn];
|
||||
int n, m, num;
|
||||
ll Min;
|
||||
void init(){
|
||||
memset(eh, -1, sizeof(eh));
|
||||
for(int i = 1; i <= n; i++) fa[i] = i;
|
||||
num = 0;
|
||||
}
|
||||
void add(int u, int v, int w){
|
||||
Edge e = {v, w, eh[u]};
|
||||
et[num] = e;
|
||||
eh[u] = num++;
|
||||
}
|
||||
int find(int x){
|
||||
return x == fa[x] ? x : fa[x] = find(fa[x]);
|
||||
}
|
||||
bool cmp(node a, node b){
|
||||
if(a.l != b.l) return a.l < b.l;
|
||||
return a.id < b.id;
|
||||
}
|
||||
void dfs1(int u, int pre){
|
||||
son[u] = 1;
|
||||
dis1[u] = 0;
|
||||
for(int i = eh[u]; i != -1; i = et[i].next)
|
||||
{
|
||||
int v = et[i].v, w = et[i].w;
|
||||
if(v == pre) continue;
|
||||
dfs1(v, u);
|
||||
son[u] += son[v];
|
||||
dis1[u] += son[v] * w + dis1[v];
|
||||
}
|
||||
}
|
||||
void dfs2(int u, int pre, int pedge){
|
||||
if(pre == -1) dis2[u] = 0;
|
||||
else dis2[u] = dis2[pre] + dis1[pre] - dis1[u] - son[u] * pedge + ((ll)n - son[u]) * pedge;
|
||||
for(int i = eh[u]; i != -1; i = et[i].next)
|
||||
{
|
||||
int v = et[i].v, w = et[i].w;;
|
||||
if(v == pre) continue;
|
||||
dfs2(v, u, w);
|
||||
}
|
||||
if(Min > dis1[u] + dis2[u]) Min = dis1[u] + dis2[u];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
scanf("%d", &t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d", &n, &m);
|
||||
init();
|
||||
for(int i = 0; i < m; i++)
|
||||
{
|
||||
scanf("%d%d%d", &ed[i].u, &ed[i].v, &ed[i].l);
|
||||
ed[i].id = i;
|
||||
}
|
||||
sort(ed, ed + m, cmp);
|
||||
ll ans1 = 0;
|
||||
for(int i = 0; i < m; i++)
|
||||
{
|
||||
int u = ed[i].u, v = ed[i].v, l = ed[i].l;
|
||||
int ru = find(u), rv = find(v);
|
||||
if(ru == rv) continue;
|
||||
fa[ru] = rv;
|
||||
add(u, v, l);
|
||||
add(v, u, l);
|
||||
ans1 += l;
|
||||
}
|
||||
int cnt = 0;
|
||||
for(int i = 1; i <= n; i++)
|
||||
if(i == find(i)) cnt++;
|
||||
if(cnt > 1)
|
||||
{
|
||||
printf("Poor mayor.\n");
|
||||
continue;
|
||||
}
|
||||
Min = 0x7fffffffffffffffLL;
|
||||
dfs1(1, -1);
|
||||
dfs2(1, -1, 0);
|
||||
printf("%I64d\n", ans1);
|
||||
cnt = 0;
|
||||
for(int i = 1; i <= n; i++)
|
||||
if(dis1[i] + dis2[i] == Min)
|
||||
ans[cnt++] = i;
|
||||
for(int i = 0; i < cnt - 1; i++)
|
||||
printf("%d ", ans[i]);
|
||||
printf("%d\n", ans[cnt - 1]);
|
||||
printf("%I64d\n", 2 * Min);
|
||||
}
|
||||
return 0;
|
||||
}
|
17
HDOJ/3424_autoAC.cpp
Normal file
17
HDOJ/3424_autoAC.cpp
Normal file
|
@ -0,0 +1,17 @@
|
|||
#include <cstdio>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
#define F(x) abs(x)>1e-6
|
||||
int main(){
|
||||
double x,y,a,b,s,f;
|
||||
while(scanf("%lf%lf",&x,&y)&&(F(x+1.0)||F(y+1.0))){
|
||||
s=f=0;
|
||||
while(scanf("%lf%lf",&a,&b)&&(F(a)||F(b))){
|
||||
if(b<y){
|
||||
s+=a-x;f+=y-b;
|
||||
}
|
||||
x=a;y=b;
|
||||
}
|
||||
printf("%.0lf\n",s/f*y);
|
||||
}
|
||||
}
|
172
HDOJ/3425_autoAC.cpp
Normal file
172
HDOJ/3425_autoAC.cpp
Normal file
|
@ -0,0 +1,172 @@
|
|||
#include<stdio.h>
|
||||
#include<cmath>
|
||||
#include<algorithm>
|
||||
#include<string.h>
|
||||
#include<iostream>
|
||||
#define eps 1e-8
|
||||
#define N 20010
|
||||
using namespace std;
|
||||
int Sig(double a)
|
||||
{
|
||||
return a<-eps?-1:a>eps;
|
||||
}
|
||||
struct Point
|
||||
{
|
||||
double x,y;
|
||||
Point(){}
|
||||
Point(double x0,double y0):x(x0),y(y0){}
|
||||
bool operator <(Point pt)
|
||||
{
|
||||
if(pt.x==x)
|
||||
return y<pt.y;
|
||||
return x<pt.x;
|
||||
}
|
||||
bool operator >(Point pt)
|
||||
{
|
||||
if(pt.x==x)
|
||||
return y>pt.y;
|
||||
return x>pt.x;
|
||||
}
|
||||
bool operator ==(Point pt)
|
||||
{
|
||||
return !Sig(pt.x-x) && !Sig(pt.y-y);
|
||||
}
|
||||
Point operator +(Point pt)
|
||||
{
|
||||
return Point(x+pt.x,y+pt.y);
|
||||
}
|
||||
Point operator -(Point pt)
|
||||
{
|
||||
return Point(x-pt.x,y-pt.y);
|
||||
}
|
||||
Point operator *(double t)
|
||||
{
|
||||
return Point(x*t,y*t);
|
||||
}
|
||||
void Input()
|
||||
{
|
||||
scanf("%lf%lf",&x,&y);
|
||||
}
|
||||
};
|
||||
struct Range
|
||||
{
|
||||
Point a,b;
|
||||
Range(){}
|
||||
Range(Point a0,Point b0):a(a0),b(b0){}
|
||||
bool operator <(Range r)
|
||||
{
|
||||
if(a==r.a)
|
||||
return b<r.b;
|
||||
return a<r.a;
|
||||
}
|
||||
};
|
||||
int cmp(Range r1,Range r2)
|
||||
{
|
||||
return r1<r2;
|
||||
}
|
||||
Point s,e;
|
||||
Point p[110];
|
||||
Range rang[110];
|
||||
double r[110];
|
||||
int cnt;
|
||||
Point Intersection(Point u1,Point u2,Point v1,Point v2)
|
||||
{
|
||||
Point ret=u1;
|
||||
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/
|
||||
((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
|
||||
ret.x+=(u2.x-u1.x)*t;
|
||||
ret.y+=(u2.y-u1.y)*t;
|
||||
return ret;
|
||||
}
|
||||
double Dis(Point a,Point b)
|
||||
{
|
||||
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
|
||||
}
|
||||
double Xmult(Point o,Point a,Point b)
|
||||
{
|
||||
return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
|
||||
}
|
||||
void Count(Point p,double r)
|
||||
{
|
||||
double d=fabs(Xmult(p,s,e))/Dis(s,e);
|
||||
if(d-r>=0)
|
||||
return ;
|
||||
double h=sqrt(r*r-d*d);
|
||||
Point tmp=Point(e.y-s.y,s.x-e.x);
|
||||
Point o=Intersection(p,p+tmp,s,e);
|
||||
Point p1,p2;
|
||||
p1=o+(e-s)*(h/Dis(s,e));
|
||||
p2=o-(e-s)*(h/Dis(s,e));
|
||||
if(p2<p1)
|
||||
swap(p1,p2);
|
||||
if(p2<s || p2==s || e<p1 || e==p1)
|
||||
return ;
|
||||
if(p1<s)
|
||||
p1=s;
|
||||
if(e<p2)
|
||||
p2=e;
|
||||
rang[cnt++]=Range(p1,p2);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while(scanf("%d",&n) && n)
|
||||
{
|
||||
s.Input();
|
||||
e.Input();
|
||||
if(e<s)
|
||||
swap(s,e);
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
p[i].Input();
|
||||
scanf("%lf",&r[i]);
|
||||
}
|
||||
cnt=0;
|
||||
for(int i=0;i<n;i++)
|
||||
Count(p[i],r[i]);
|
||||
if(cnt==0)
|
||||
{
|
||||
printf("0.00\n");
|
||||
continue;
|
||||
}
|
||||
if(s.x==e.x)
|
||||
{
|
||||
sort(rang,rang+cnt,cmp);
|
||||
double sum=0;
|
||||
double left=rang[0].a.y,right=rang[0].b.y;
|
||||
for(int i=1;i<cnt;i++)
|
||||
{
|
||||
if(rang[i].a.y<=right)
|
||||
right=max(rang[i].b.y,right);
|
||||
else
|
||||
{
|
||||
sum+=(right-left);
|
||||
left=rang[i].a.y;
|
||||
right=rang[i].b.y;
|
||||
}
|
||||
}
|
||||
sum+=(right-left);
|
||||
printf("%.2lf\n",sum/(e.y-s.y)*100);
|
||||
}
|
||||
else
|
||||
{
|
||||
sort(rang,rang+cnt,cmp);
|
||||
double sum=0;
|
||||
double left=rang[0].a.x,right=rang[0].b.x;
|
||||
for(int i=1;i<cnt;i++)
|
||||
{
|
||||
if(rang[i].a.x<=right)
|
||||
right=max(rang[i].b.x,right);
|
||||
else
|
||||
{
|
||||
sum+=(right-left);
|
||||
left=rang[i].a.x;
|
||||
right=rang[i].b.x;
|
||||
}
|
||||
}
|
||||
sum+=(right-left);
|
||||
printf("%.2lf\n",sum/(e.x-s.x)*100);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
88
HDOJ/3426_autoAC.cpp
Normal file
88
HDOJ/3426_autoAC.cpp
Normal file
|
@ -0,0 +1,88 @@
|
|||
#include <stdio.h>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
vector<string> st;
|
||||
int tag_type(const string& s) {
|
||||
int cnt=0;
|
||||
for(int i=0; i<s.size(); ++i) {
|
||||
if(s[i]=='/') { cnt++; continue; }
|
||||
if(!((s[i]<='z' && s[i]>='a') || (s[i]>='0' && s[i]<='9'))) return 0;
|
||||
}
|
||||
if(s.size()-cnt==0) return 0;
|
||||
if(s[0]=='/' && cnt == 1) return 2;
|
||||
if(s[s.size()-1]=='/' && cnt == 1) return 3;
|
||||
if(cnt == 0) return 1;
|
||||
return 0;
|
||||
}
|
||||
bool hex(const string& s) {
|
||||
if(s.size() <= 1 || s.size()%2==0) return false;
|
||||
if(s[0] != 'x') return false;
|
||||
for(int i=1; i<s.size(); ++i)
|
||||
if( !((s[i]<='F' && s[i] >='A') || (s[i]<='9' && s[i]>='0') || (s[i]<='f' && s[i]>='a')) ) return false;
|
||||
return true;
|
||||
}
|
||||
bool bad_qoute(const string& s) {
|
||||
return !(s=="lt" || s=="gt" || s=="amp" || hex(s));
|
||||
}
|
||||
bool bad_txt(const string& s) {
|
||||
string qoute;
|
||||
for(int i=0; i<s.size(); ++i)
|
||||
if(s[i]=='&') {
|
||||
for(int j=i+1; j<s.size() && s[j] != ';'; ++j) qoute += s[j];
|
||||
if(bad_qoute(qoute)) return true;
|
||||
qoute="";
|
||||
}
|
||||
else if(s[i]=='<' || s[i] =='>') return true;
|
||||
else if(s[i]>127 || s[i]<32) return true;
|
||||
return false;
|
||||
}
|
||||
void get_l(stringstream& os, string& s, char del) {
|
||||
char t;
|
||||
while(!os.eof()) {
|
||||
os >> t;
|
||||
if(t==del) return;
|
||||
s += t;
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
string ln;
|
||||
while(getline(cin, ln)) {
|
||||
stringstream ss(ln);
|
||||
st.clear();
|
||||
string s;
|
||||
int inv=0;
|
||||
while(!ss.eof()) {
|
||||
s="";
|
||||
getline(ss,s,'<');
|
||||
if(bad_txt(s)) {
|
||||
inv=1;
|
||||
break;
|
||||
}
|
||||
if(ss.eof()) break;
|
||||
s="";
|
||||
getline(ss,s,'>');
|
||||
if(ss.eof()) {
|
||||
inv=4;
|
||||
break;
|
||||
}
|
||||
int tty = tag_type(s);
|
||||
if(tty==0) {
|
||||
inv=2;
|
||||
break;
|
||||
}
|
||||
else if(tty==1) st.push_back(s);
|
||||
else if(tty==2) {
|
||||
if(st.size()==0 || st.back() != s.substr(1)) {
|
||||
inv=3;
|
||||
break;
|
||||
}
|
||||
else st.pop_back();
|
||||
}
|
||||
}
|
||||
if(inv || st.size() > 0) puts("invalid");
|
||||
else puts("valid");
|
||||
}
|
||||
return 0;
|
||||
}
|
69
HDOJ/3427_autoAC.cpp
Normal file
69
HDOJ/3427_autoAC.cpp
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#define NN 155
|
||||
char str[NN];
|
||||
int mark[NN][NN];
|
||||
int num[NN];
|
||||
char cha[NN];
|
||||
int dfs(int l, int r)
|
||||
{
|
||||
int i, t;
|
||||
if (l == r){
|
||||
if (num[l] > 1)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
if (mark[l][r]>= 0)
|
||||
return mark[l][r];
|
||||
char ch = cha[l];
|
||||
for (i = l + 1; i <= r; i++){
|
||||
if (cha[i] == ch){
|
||||
if (mark[l + 1][i - 1] = dfs(l + 1, i - 1)){
|
||||
t = mark[i][r];
|
||||
mark[i][r] = -1;
|
||||
num[i] += num[l];
|
||||
mark[i][r] = dfs(i, r);
|
||||
num[i] -= num[l];
|
||||
if (mark[i][r] == 1)
|
||||
{
|
||||
mark[i][r] = t;
|
||||
return 1;
|
||||
}
|
||||
mark[i][r] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (num[l] > 1 && (mark[l + 1][r] = dfs(l + 1, r)))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int len, time, index, i;
|
||||
while (scanf("%s", str) != EOF){
|
||||
len = strlen(str);
|
||||
if (len == 0){
|
||||
puts("solvable");
|
||||
continue;
|
||||
}
|
||||
time = 1;
|
||||
index = 0;
|
||||
for (i = 1; i <= len; i++){
|
||||
if (str[i] != str[i - 1]){
|
||||
cha[index] = str[i - 1];
|
||||
num[index] = time;
|
||||
time = 1;
|
||||
index++;
|
||||
}
|
||||
else
|
||||
time++;
|
||||
}
|
||||
memset(mark, -1, sizeof(mark));
|
||||
if (dfs(0, index - 1))
|
||||
puts("solvable");
|
||||
else
|
||||
puts("unsolvable");
|
||||
}
|
||||
return 0;
|
||||
}
|
195
HDOJ/3429_autoAC.cpp
Normal file
195
HDOJ/3429_autoAC.cpp
Normal file
|
@ -0,0 +1,195 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cctype>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
#define i64 __int64
|
||||
class fraction
|
||||
{
|
||||
private:
|
||||
inline i64 Gcd (i64 x,i64 y)
|
||||
{
|
||||
return y==0?x:Gcd(y,x%y);
|
||||
}
|
||||
i64 Lcm (i64 x,i64 y)
|
||||
{
|
||||
x=x/Gcd(x,y)*y;
|
||||
if(x<0) x=-x;
|
||||
return x;
|
||||
}
|
||||
public:
|
||||
i64 a,b;
|
||||
fraction () {}
|
||||
fraction (i64 x)
|
||||
{
|
||||
a=x; b=1;
|
||||
}
|
||||
fraction (i64 x,i64 y)
|
||||
{
|
||||
a=x; b=y;
|
||||
Refresh();
|
||||
}
|
||||
void Refresh ()
|
||||
{
|
||||
if (b<0) b=-b,a=-a;
|
||||
i64 k=Gcd(a,b);
|
||||
if (k<0) k=-k;
|
||||
a/=k; b/=k;
|
||||
}
|
||||
fraction Inverse () const
|
||||
{
|
||||
return fraction (b,a);
|
||||
}
|
||||
fraction operator + (fraction p)
|
||||
{
|
||||
fraction ans;
|
||||
ans.b=Lcm(b,p.b);
|
||||
ans.a=ans.b/b*a+ans.b/p.b*p.a;
|
||||
ans.Refresh();
|
||||
return ans;
|
||||
}
|
||||
fraction operator - (fraction p)
|
||||
{
|
||||
fraction ans;
|
||||
ans.b=Lcm(b,p.b);
|
||||
ans.a=ans.b/b*a-ans.b/p.b*p.a;
|
||||
ans.Refresh();
|
||||
return ans;
|
||||
}
|
||||
fraction operator * (fraction p)
|
||||
{
|
||||
fraction ans;
|
||||
ans.a=a*p.a;
|
||||
ans.b=b*p.b;
|
||||
ans.Refresh();
|
||||
return ans;
|
||||
}
|
||||
fraction operator / (fraction p)
|
||||
{
|
||||
fraction ans;
|
||||
ans.a=a*p.b;
|
||||
ans.b=b*p.a;
|
||||
ans.Refresh();
|
||||
return ans;
|
||||
}
|
||||
bool operator < (const fraction &p) const
|
||||
{
|
||||
return a*p.b<b*p.a;
|
||||
}
|
||||
bool operator > (const fraction &p) const
|
||||
{
|
||||
return a*p.b>b*p.a;
|
||||
}
|
||||
bool operator == (const fraction &p) const
|
||||
{
|
||||
return a*p.b==b*p.a;
|
||||
}
|
||||
fraction operator | (fraction p)
|
||||
{
|
||||
fraction t1=fraction (b,a);
|
||||
fraction t2=p.Inverse ();
|
||||
t1=t1+t2;
|
||||
return t1.Inverse();
|
||||
}
|
||||
void print ()
|
||||
{
|
||||
printf("%I64d/%I64d\n",a,b);
|
||||
}
|
||||
};
|
||||
string s;
|
||||
int len;
|
||||
fraction read (int &now)
|
||||
{
|
||||
int fz=0,fm=0;
|
||||
int i;
|
||||
for (i=now;i<len;i++)
|
||||
{
|
||||
if (s[i]=='/') break;
|
||||
fz*=10;
|
||||
fz+=s[i]-'0';
|
||||
}
|
||||
for (i=i+1;i<len;i++)
|
||||
{
|
||||
if (isdigit(s[i]))
|
||||
{
|
||||
fm*=10;
|
||||
fm+=s[i]-'0';
|
||||
}
|
||||
else break;
|
||||
}
|
||||
fraction tmp(fz,fm);
|
||||
now=i-1;
|
||||
return tmp;
|
||||
}
|
||||
fraction cal (int &now)
|
||||
{
|
||||
fraction ans;
|
||||
int front=-1;
|
||||
for (int i=now+1;i<len;i++)
|
||||
{
|
||||
if (s[i]=='(')
|
||||
{
|
||||
if(front==-1)
|
||||
ans=cal(i);
|
||||
else if(front==0)
|
||||
ans=ans+cal(i);
|
||||
else if(front==1)
|
||||
ans=ans|cal(i);
|
||||
}
|
||||
else if (isdigit(s[i]))
|
||||
{
|
||||
if (front==-1)
|
||||
ans=read(i);
|
||||
else if (front==0)
|
||||
ans=ans+read(i);
|
||||
else if (front==1)
|
||||
ans=ans|read(i);
|
||||
}
|
||||
else if (s[i]==')')
|
||||
{
|
||||
now=i;
|
||||
return ans;
|
||||
}
|
||||
else if (s[i]=='&')
|
||||
front=0;
|
||||
else if (s[i]=='|')
|
||||
front=1;
|
||||
}
|
||||
}
|
||||
int main ()
|
||||
{
|
||||
while (getline(cin,s))
|
||||
{
|
||||
len=s.length();
|
||||
fraction ans;
|
||||
int flag=-1;
|
||||
for (int i=0;i<len;i++)
|
||||
{
|
||||
if (s[i]=='(')
|
||||
{
|
||||
if (flag==-1)
|
||||
ans=cal(i);
|
||||
else if (flag==0)
|
||||
ans=ans+cal(i);
|
||||
else if(flag==1)
|
||||
ans=ans|cal(i);
|
||||
}
|
||||
else if (isdigit(s[i]))
|
||||
{
|
||||
if (flag==-1)
|
||||
ans=read(i);
|
||||
else if (flag==0)
|
||||
ans=ans+read(i);
|
||||
else if (flag==1)
|
||||
ans=ans|read(i);
|
||||
}
|
||||
else if (s[i]=='&')
|
||||
flag=0;
|
||||
else if (s[i]=='|')
|
||||
flag=1;
|
||||
}
|
||||
ans.print();
|
||||
}
|
||||
return 0;
|
||||
}
|
76
HDOJ/3430_autoAC.cpp
Normal file
76
HDOJ/3430_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
const int N = 520;
|
||||
int a[N + 5], b[N + 5], ta[N + 5], tb[N + 5];
|
||||
bool vis[N + 5];
|
||||
long long m[N + 5], c[N + 5];
|
||||
long long exgcd(long long a, long long b, long long &x, long long &y) {
|
||||
if (!b) {
|
||||
x = 1;
|
||||
y = 0;
|
||||
return a;
|
||||
}
|
||||
long long res = exgcd(b, a % b, y, x);
|
||||
y -= a/b*x;
|
||||
return res;
|
||||
}
|
||||
long long mod(long long a, long long b) {
|
||||
long long res = a % b;
|
||||
if (res < 0) res += b;
|
||||
return res;
|
||||
}
|
||||
void solve(int n) {
|
||||
memset(vis, false, sizeof(vis));
|
||||
int cnt = 0;
|
||||
for (int i = 1; i <= n; ++i)
|
||||
if (!vis[i]) {
|
||||
int num = 0, t = i;
|
||||
while (!vis[t]) {
|
||||
vis[t] = true;
|
||||
ta[++num] = t;
|
||||
tb[num] = b[t];
|
||||
t = a[t];
|
||||
}
|
||||
bool same = false;
|
||||
for (int i = 1; i <= num; ++i)
|
||||
if (tb[i] == ta[1]) {
|
||||
same = true;
|
||||
int j = i, k = 1;
|
||||
do {
|
||||
if (tb[j] != ta[k]) same = false;
|
||||
j = j % num + 1;
|
||||
k = k % num + 1;
|
||||
} while (i != j);
|
||||
t = i;
|
||||
break;
|
||||
}
|
||||
if (!same) {
|
||||
printf("-1\n");
|
||||
return;
|
||||
}
|
||||
m[++cnt] = num;
|
||||
c[cnt] = (num - t + 1) % num;
|
||||
}
|
||||
n = cnt;
|
||||
long long ans = c[1], LCM = m[1];
|
||||
for (int i = 2; i <= n; ++i) {
|
||||
long long x, y, g = exgcd(LCM, m[i], x, y);
|
||||
if ((c[i] - ans) % g) {
|
||||
printf("-1\n");
|
||||
return;
|
||||
}
|
||||
ans = mod(ans + LCM*mod((c[i] - ans)/g*x, m[i]/g), LCM/g*m[i]);
|
||||
LCM = LCM/g*m[i];
|
||||
}
|
||||
printf("%I64d\n", ans);
|
||||
return;
|
||||
}
|
||||
int main() {
|
||||
int n;
|
||||
while (scanf("%d", &n), n) {
|
||||
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
|
||||
for (int i = 1; i <= n; ++i) scanf("%d", &b[i]);
|
||||
solve(n);
|
||||
}
|
||||
return 0;
|
||||
}
|
64
HDOJ/3432_autoAC.cpp
Normal file
64
HDOJ/3432_autoAC.cpp
Normal file
|
@ -0,0 +1,64 @@
|
|||
#include<cstdio>
|
||||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<cmath>
|
||||
using namespace std;
|
||||
const double eps=1e-6;
|
||||
int dcmp(double x)
|
||||
{
|
||||
if(fabs(x)<eps)return 0;
|
||||
else return x<0?-1:1;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
double width,height,door,workers;
|
||||
while(scanf("%lf%lf%lf%lf",&width,&height,&door,&workers))
|
||||
{
|
||||
if(width==0&&height==0&&door==0&&workers==0)break;
|
||||
double area=width*height;
|
||||
area/=workers;
|
||||
double d1=width-door;
|
||||
double prex=width;
|
||||
double prey=0;
|
||||
for(int i=0;i<workers-1;++i)
|
||||
{
|
||||
double tmp=area;
|
||||
double x,y;
|
||||
if(dcmp(prey-height)!=0)
|
||||
{
|
||||
if(dcmp(prex-width)==0)
|
||||
{
|
||||
x=width;
|
||||
y=2*tmp/d1+prey;
|
||||
if(y>height)
|
||||
{
|
||||
tmp-=(height-prey)*d1/2;
|
||||
y=height;
|
||||
x=width-tmp*2/y;
|
||||
}
|
||||
}
|
||||
else if(dcmp(prex)==0)
|
||||
{
|
||||
x=0;
|
||||
y=prey-2*tmp/door;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
y=height;
|
||||
x=prex-tmp*2/height;
|
||||
if(x<0)
|
||||
{
|
||||
tmp=tmp-prex*prey/2;
|
||||
x=0;
|
||||
y=height-tmp*2/door;
|
||||
}
|
||||
}
|
||||
prex=x;
|
||||
prey=y;
|
||||
printf("%.3lf %.3lf ",x,y);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
53
HDOJ/3433_autoAC.cpp
Normal file
53
HDOJ/3433_autoAC.cpp
Normal file
|
@ -0,0 +1,53 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
int dp[55][205], a[205], b[205];
|
||||
int _, n, x, y, kase = 0;
|
||||
bool check(int t)
|
||||
{
|
||||
memset(dp, -1, sizeof(dp));
|
||||
dp[0][0] = 0;
|
||||
for(int i = 1; i <= n; ++i)
|
||||
{
|
||||
if(dp[i][x] >= y) return true;
|
||||
for(int j = 0; j <= x; ++j)
|
||||
{
|
||||
if(dp[i - 1][j] != -1)
|
||||
{
|
||||
int temp = min(t/a[i], x-j);
|
||||
for(int k = 0; k <= temp; ++k)
|
||||
{
|
||||
int t1 = (t - a[i] * k) / b[i];
|
||||
dp[i][j + k] = max(dp[i][j + k], dp[i - 1][j] + t1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(dp[n][x] >= y) return true;
|
||||
return false;
|
||||
}
|
||||
int main(void)
|
||||
{
|
||||
scanf("%d", &_);
|
||||
while(_--)
|
||||
{
|
||||
scanf("%d%d%d", &n, &x, &y);
|
||||
for(int i = 1; i <= n; ++i)
|
||||
scanf("%d%d", &a[i], &b[i]);
|
||||
int l = 0, r = a[1] * x + b[1] * y;
|
||||
int ans = r;
|
||||
while(l <= r)
|
||||
{
|
||||
int mid = (l + r) >> 1;
|
||||
if(check(mid))
|
||||
{
|
||||
ans = mid;
|
||||
r = mid - 1;
|
||||
}
|
||||
else l = mid + 1;
|
||||
}
|
||||
printf("Case %d: %d\n", ++kase, ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
38
HDOJ/3434_autoAC.cpp
Normal file
38
HDOJ/3434_autoAC.cpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define L 1000100
|
||||
int a[L],b[L],p[L];
|
||||
long long min(long long x,long long y)
|
||||
{
|
||||
if (x<y) return x;
|
||||
return y;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
int cas=1;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
int n;
|
||||
scanf("%d",&n);
|
||||
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
|
||||
int len=1;
|
||||
b[len]=a[1];
|
||||
for(int i=2;i<=n;i++) if(a[i]!=a[i-1]) b[++len]=a[i];
|
||||
p[1]=0;
|
||||
for(int i=2;i<=len;i++) p[i]=b[i]-b[i-1];
|
||||
long long sum=0,ans=0;
|
||||
for(int i=2;i<=len;i++)
|
||||
{
|
||||
if(p[i]*sum<0) ans+=min(abs(sum),abs(p[i]));
|
||||
sum+=p[i];
|
||||
}
|
||||
sum=abs(sum);
|
||||
ans+=sum;
|
||||
printf("Case %d: %I64d %I64d\n",cas++,ans,sum+1);
|
||||
}
|
||||
return 0;
|
||||
}
|
96
HDOJ/3435_autoAC.cpp
Normal file
96
HDOJ/3435_autoAC.cpp
Normal file
|
@ -0,0 +1,96 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<vector>
|
||||
using namespace std;
|
||||
const int inf=1<<28;
|
||||
int g[1005][1005];
|
||||
int lx[1005],ly[1005];
|
||||
bool sx[1005],sy[1005];
|
||||
int link[1005],n;
|
||||
vector<int> q[1010];
|
||||
int min(int a,int b)
|
||||
{
|
||||
if(a<b) return a;
|
||||
return b;
|
||||
}
|
||||
bool path(int k)
|
||||
{
|
||||
sx[k]=true;
|
||||
for(int i=1; i<=n; i++)
|
||||
{
|
||||
if(!sy[i]&&(lx[k]+ly[i]==g[k][i]))
|
||||
{
|
||||
sy[i]=1;
|
||||
if(link[i]==-1||path(link[i]))
|
||||
{
|
||||
link[i]=k;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
int BestMatch()
|
||||
{
|
||||
int d,sum;
|
||||
memset(ly,0,sizeof(ly));
|
||||
memset(link,-1,sizeof(link));
|
||||
for(int i=1; i<=n; i++)
|
||||
{
|
||||
lx[i]=-inf;
|
||||
for(int j=1; j<=n; j++)
|
||||
if(lx[i]<g[i][j]) lx[i]=g[i][j];
|
||||
}
|
||||
for(int k=1; k<=n; k++)
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
memset(sx,0,sizeof(sx));
|
||||
memset(sy,0,sizeof(sy));
|
||||
if(path(k)) break;
|
||||
d=inf;
|
||||
for(int i=1; i<=n; i++)
|
||||
if(sx[i])
|
||||
for(int j=1; j<=n; j++)
|
||||
if(!sy[j])
|
||||
d=min(d,lx[i]+ly[j]-g[i][j]);
|
||||
for(int i=1; i<=n; i++)
|
||||
{
|
||||
if(sx[i]) lx[i]-=d;
|
||||
if(sy[i]) ly[i]+=d;
|
||||
}
|
||||
}
|
||||
}
|
||||
sum=0;
|
||||
for(int i=1; i<=n; i++)
|
||||
{
|
||||
if(link[i]==-1||g[link[i]][i]==-inf) return -1;
|
||||
sum+=g[link[i]][i];
|
||||
}
|
||||
return -sum;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int m,T,cas=1;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
for(int i=1;i<=n;i++) q[i].clear();
|
||||
for(int i=1; i<=n; i++)
|
||||
for(int j=1; j<=n; j++)
|
||||
g[i][j]=inf;
|
||||
for(int i=1; i<=m; i++)
|
||||
{
|
||||
int x,y,c;
|
||||
scanf("%d%d%d",&x,&y,&c);
|
||||
g[x][y]=g[y][x]=min(g[x][y],c);
|
||||
}
|
||||
for(int i=1; i<=n; i++)
|
||||
for(int j=1; j<=n; j++) g[i][j]=-g[i][j];
|
||||
int t=BestMatch();
|
||||
if(t==-1) printf("Case %d: NO\n",cas++);
|
||||
else printf("Case %d: %d\n",cas++,t);
|
||||
}
|
||||
return 0;
|
||||
}
|
249
HDOJ/3436_autoAC.cpp
Normal file
249
HDOJ/3436_autoAC.cpp
Normal file
|
@ -0,0 +1,249 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdlib.h>
|
||||
#define MAXD 100010
|
||||
int N, Q, T, node, tx[MAXD], begin[MAXD], end[MAXD], nodep[MAXD];
|
||||
int num[2 * MAXD], size[2 * MAXD], left[2 * MAXD], right[2 * MAXD], pre[2 * MAXD], key[2 * MAXD];
|
||||
char b[MAXD][10];
|
||||
int ob[MAXD];
|
||||
int cmp(const void *_p, const void *_q)
|
||||
{
|
||||
int *p = (int *)_p, *q = (int *)_q;
|
||||
return *p - *q;
|
||||
}
|
||||
void update(int cur)
|
||||
{
|
||||
size[cur] = size[left[cur]] + size[right[cur]] + num[cur];
|
||||
}
|
||||
void newnode(int &cur, int k)
|
||||
{
|
||||
cur = ++ node;
|
||||
size[cur] = num[cur] = end[k] - begin[k] + 1;
|
||||
key[cur] = k;
|
||||
nodep[k] = cur;
|
||||
left[cur] = right[cur] = 0;
|
||||
}
|
||||
void build(int &cur, int x, int y, int p)
|
||||
{
|
||||
int mid = (x + y) / 2;
|
||||
newnode(cur, mid);
|
||||
pre[cur] = p;
|
||||
if(x == y)
|
||||
return ;
|
||||
if(x < mid)
|
||||
build(left[cur], x, mid - 1, cur);
|
||||
if(mid < y)
|
||||
build(right[cur], mid + 1, y, cur);
|
||||
update(cur);
|
||||
}
|
||||
void init()
|
||||
{
|
||||
int i, j, k;
|
||||
scanf("%d%d", &N, &Q);
|
||||
k = 0;
|
||||
tx[k ++] = 0;
|
||||
for(i = 0; i < Q; i ++)
|
||||
{
|
||||
scanf("%s%d", b[i], &ob[i]);
|
||||
if(b[i][0] == 'T' || b[i][0] == 'Q')
|
||||
tx[k ++] = ob[i];
|
||||
}
|
||||
tx[k ++] = N;
|
||||
qsort(tx, k, sizeof(tx[0]), cmp);
|
||||
N = 0;
|
||||
for(i = 1; i < k; i ++)
|
||||
if(tx[i] != tx[i - 1])
|
||||
{
|
||||
if(tx[i] - tx[i - 1] > 1)
|
||||
{
|
||||
begin[N] = tx[i - 1] + 1, end[N] = tx[i] - 1;
|
||||
++ N;
|
||||
}
|
||||
begin[N] = end[N] = tx[i];
|
||||
++ N;
|
||||
}
|
||||
T = node = left[0] = right[0] = size[0] = num[0] = 0;
|
||||
build(T, 0, N - 1, 0);
|
||||
}
|
||||
void leftrotate(int x)
|
||||
{
|
||||
int y = right[x], p = pre[x];
|
||||
right[x] = left[y];
|
||||
if(right[x])
|
||||
pre[right[x]] = x;
|
||||
left[y] = x;
|
||||
pre[x] = y;
|
||||
pre[y] = p;
|
||||
if(p == 0)
|
||||
T = y;
|
||||
else
|
||||
right[p] == x ? right[p] = y : left[p] = y;
|
||||
update(x);
|
||||
}
|
||||
void rightrotate(int x)
|
||||
{
|
||||
int y = left[x], p = pre[x];
|
||||
left[x] = right[y];
|
||||
if(left[x])
|
||||
pre[left[x]] = x;
|
||||
right[y] = x;
|
||||
pre[x] = y;
|
||||
pre[y] = p;
|
||||
if(p == 0)
|
||||
T = y;
|
||||
else
|
||||
right[p] == x ? right[p] = y : left[p] = y;
|
||||
update(x);
|
||||
}
|
||||
void splay(int x, int goal)
|
||||
{
|
||||
int y, z;
|
||||
for(;;)
|
||||
{
|
||||
if((y = pre[x]) == goal)
|
||||
break;
|
||||
if((z = pre[y]) == goal)
|
||||
right[y] == x ? leftrotate(y) : rightrotate(y);
|
||||
else
|
||||
{
|
||||
if(right[z] == y)
|
||||
{
|
||||
if(right[y] == x)
|
||||
leftrotate(z), leftrotate(y);
|
||||
else
|
||||
rightrotate(y), leftrotate(z);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(left[y] == x)
|
||||
rightrotate(z), rightrotate(y);
|
||||
else
|
||||
leftrotate(y), rightrotate(z);
|
||||
}
|
||||
}
|
||||
}
|
||||
update(x);
|
||||
}
|
||||
int BS(int x)
|
||||
{
|
||||
int max, mid, min;
|
||||
min = 0, max = N;
|
||||
for(;;)
|
||||
{
|
||||
mid = (max + min) / 2;
|
||||
if(mid == min)
|
||||
break;
|
||||
if(begin[mid] <= x)
|
||||
min = mid;
|
||||
else
|
||||
max = mid;
|
||||
}
|
||||
return mid;
|
||||
}
|
||||
int Delete(int &cur, int p)
|
||||
{
|
||||
int k;
|
||||
if(cur == T || right[cur] == 0)
|
||||
{
|
||||
if(cur == T)
|
||||
{
|
||||
k = Delete(left[cur], cur);
|
||||
left[k] = left[T], right[k] = right[T];
|
||||
if(left[k])
|
||||
pre[left[k]] = k;
|
||||
if(right[k])
|
||||
pre[right[k]] = k;
|
||||
T = k;
|
||||
pre[T] = 0;
|
||||
update(T);
|
||||
}
|
||||
else
|
||||
{
|
||||
k = cur;
|
||||
if(left[k])
|
||||
pre[left[k]] = p;
|
||||
cur = left[k];
|
||||
}
|
||||
return k;
|
||||
}
|
||||
else
|
||||
{
|
||||
k = Delete(right[cur], cur);
|
||||
update(cur);
|
||||
return k;
|
||||
}
|
||||
}
|
||||
void Insert(int &cur, int k, int p)
|
||||
{
|
||||
if(cur == 0)
|
||||
{
|
||||
newnode(cur, k);
|
||||
pre[cur] = p;
|
||||
return ;
|
||||
}
|
||||
Insert(left[cur], k, cur);
|
||||
update(cur);
|
||||
}
|
||||
void Top(int x)
|
||||
{
|
||||
int k, cur;
|
||||
k = BS(x);
|
||||
cur = nodep[k];
|
||||
splay(cur, 0);
|
||||
if(left[T] == 0 || right[T] == 0)
|
||||
{
|
||||
T = left[T] + right[T];
|
||||
pre[T] = 0;
|
||||
}
|
||||
else
|
||||
Delete(T, 0);
|
||||
Insert(T, k, 0);
|
||||
splay(node, 0);
|
||||
}
|
||||
void Query(int x)
|
||||
{
|
||||
int k, cur;
|
||||
k = BS(x);
|
||||
cur = nodep[k];
|
||||
splay(cur, 0);
|
||||
printf("%d\n", size[left[cur]] + 1);
|
||||
}
|
||||
int Search(int cur, int x)
|
||||
{
|
||||
int ls = left[cur], rs = right[cur], k = key[cur];
|
||||
if(x <= size[ls])
|
||||
return Search(left[cur], x);
|
||||
else if(x <= size[ls] + num[cur])
|
||||
return begin[k] + (x - size[ls]) - 1;
|
||||
else
|
||||
return Search(right[cur], x - size[ls] - num[cur]);
|
||||
}
|
||||
void Rank(int x)
|
||||
{
|
||||
printf("%d\n", Search(T, x));
|
||||
}
|
||||
void solve()
|
||||
{
|
||||
int i, j, k;
|
||||
for(i = 0; i < Q; i ++)
|
||||
{
|
||||
if(b[i][0] == 'T')
|
||||
Top(ob[i]);
|
||||
else if(b[i][0] == 'Q')
|
||||
Query(ob[i]);
|
||||
else
|
||||
Rank(ob[i]);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t, tt;
|
||||
scanf("%d", &t);
|
||||
for(tt = 0; tt < t; tt ++)
|
||||
{
|
||||
init();
|
||||
printf("Case %d:\n", tt + 1);
|
||||
solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
117
HDOJ/3437_autoAC.cpp
Normal file
117
HDOJ/3437_autoAC.cpp
Normal file
|
@ -0,0 +1,117 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <math.h>
|
||||
#define zero(x) if(dcmp(x)==0)x=0
|
||||
#define cross(p0,p1,p2) ((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x))
|
||||
#define dot(p0,p1,p2) ((p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y))
|
||||
#define luoti(h) (sqrt(2*(h)/9.18))
|
||||
#define ponseg(p0,p1,p2) (dcmp(cross(p0,p1,p2))==0&&dcmp(dot(p0,p1,p2))<=0)
|
||||
using namespace std;
|
||||
const double eps=1e-4;
|
||||
const double inf=1e10;
|
||||
struct point{
|
||||
double x,y;
|
||||
};
|
||||
struct wx{
|
||||
double z,k;
|
||||
int n,type;
|
||||
point p[11];
|
||||
}rec[11];
|
||||
double cmp(wx a,wx b){
|
||||
return a.z>b.z;
|
||||
}
|
||||
int dcmp(double x){
|
||||
return (x>eps)-(x<-eps);
|
||||
}
|
||||
bool reach(double vx,double vy,double x,double y,double z,wx pol){
|
||||
double sum=luoti(z-pol.z);
|
||||
point p;
|
||||
p.x=x+sum*vx;
|
||||
p.y=y+sum*vy;
|
||||
for(int i=0;i<pol.n;i++)
|
||||
if(ponseg(p,pol.p[i],pol.p[i+1]))
|
||||
return 1;
|
||||
int judge=dcmp(cross(p,pol.p[0],pol.p[1]));
|
||||
for(int i=1;i<pol.n;i++)
|
||||
if(dcmp(cross(p,pol.p[i],pol.p[i+1]))*judge<0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
int segsec(point p1,point p2,point p3,point p4,point &cp){
|
||||
double u=cross(p1,p2,p3),v=cross(p2,p1,p4);
|
||||
if(dcmp(u+v)){
|
||||
cp.x=(p3.x*v+p4.x*u)/(v+u);
|
||||
cp.y=(p3.y*v+p4.y*u)/(v+u);
|
||||
if(ponseg(cp,p1,p2)&&ponseg(cp,p3,p4))return 1;
|
||||
}return 0;
|
||||
}
|
||||
void roat(double x,double y,double &vx,double &vy,double k){
|
||||
double s=sin(k),c=cos(k);
|
||||
zero(s);
|
||||
zero(c);
|
||||
vx=(x*c-y*s);
|
||||
vy=(x*s+y*c);
|
||||
}
|
||||
double judge(point a,point b,double vx,double vy){
|
||||
if(dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0)return 0;
|
||||
if(dcmp(a.x-b.x)==0)return fabs((a.y-b.y)/vy);
|
||||
return fabs((a.x-b.x)/vx);
|
||||
}
|
||||
double into(double &vx,double &vy,double &x,double &y,double &z,wx pol){
|
||||
double sum=luoti(z-pol.z);
|
||||
x+=(sum*vx);
|
||||
y+=(sum*vy);
|
||||
z=pol.z;
|
||||
point p0,p1,cp;
|
||||
p0.x=x;
|
||||
p0.y=y;
|
||||
if(pol.type==1)vx=pol.k;
|
||||
else if(pol.type==2)vy=pol.k;
|
||||
else roat(vx,vy,vx,vy,pol.k);
|
||||
if(dcmp(vx)==0&&dcmp(vy)==0){
|
||||
for(int i=0;i<pol.n;i++)
|
||||
if(ponseg(p0,pol.p[i],pol.p[i+1]))
|
||||
return 0.0;
|
||||
return -inf;
|
||||
}
|
||||
p1.x=x+10000*vx;
|
||||
p1.y=y+10000*vy;
|
||||
for(int i=0;!segsec(p0,p1,pol.p[i],pol.p[i+1],cp)&&i<pol.n;i++);
|
||||
x=cp.x;
|
||||
y=cp.y;
|
||||
sum+=judge(p0,cp,vx,vy);
|
||||
return sum;
|
||||
}
|
||||
int main(){
|
||||
int tim,n;
|
||||
scanf("%d",&tim);
|
||||
for(int cas=0;cas<tim;){
|
||||
double vx,vy,x=0,y=0,z;
|
||||
printf("Case %d: ",++cas);
|
||||
scanf("%lf%lf%lf%d",&vx,&vy,&z,&n);
|
||||
for(int i=0;i<n;i++){
|
||||
scanf("%lf%d",&rec[i].z,&rec[i].n);
|
||||
for(int j=0;j<rec[i].n;j++)
|
||||
scanf("%lf%lf",&rec[i].p[j].x,&rec[i].p[j].y);
|
||||
rec[i].p[rec[i].n]=rec[i].p[0];
|
||||
scanf("%d%lf",&rec[i].type,&rec[i].k);
|
||||
if(rec[i].z<=0||rec[i].z>z){
|
||||
i--;
|
||||
n--;
|
||||
}
|
||||
}
|
||||
if(z<0){
|
||||
puts("Forever!");
|
||||
continue;
|
||||
}
|
||||
sort(rec,rec+n,cmp);
|
||||
double times=0;
|
||||
for(int i=0;times>=0&&i<n;i++)
|
||||
if(reach(vx,vy,x,y,z,rec[i])){
|
||||
times+=into(vx,vy,x,y,z,rec[i]);
|
||||
}
|
||||
if(times<0)puts("Forever!");
|
||||
else printf("%.2lf\n",times+luoti(z));
|
||||
}
|
||||
return 0;
|
||||
}
|
130
HDOJ/3439_autoAC.cpp
Normal file
130
HDOJ/3439_autoAC.cpp
Normal file
|
@ -0,0 +1,130 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<string>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const int maxn=100005;
|
||||
ll n,k,m;
|
||||
ll f1[2*maxn],f2[maxn],c[maxn],mul[maxn],num[maxn],tot;
|
||||
ll cp()
|
||||
{
|
||||
f1[0]=1%m;f1[1]=0;
|
||||
ll i;
|
||||
for(i=2;i<=2*m;++i)
|
||||
f1[i]=(((f1[i-1]+f1[i-2])%m)*(i-1))%m;
|
||||
return f1[(n-k)%(2*m)];
|
||||
}
|
||||
void prem()
|
||||
{
|
||||
ll i,mm;
|
||||
mm=m;
|
||||
tot=0;
|
||||
for(i=2;i*i<=mm;++i)
|
||||
{
|
||||
if(mm%i==0)
|
||||
{
|
||||
c[tot]=i;mul[tot]=1;num[tot]=0;
|
||||
while(mm%i==0)
|
||||
{
|
||||
mul[tot]*=i;
|
||||
num[tot]++;
|
||||
mm/=i;
|
||||
}
|
||||
tot++;
|
||||
}
|
||||
}
|
||||
if(mm!=1)
|
||||
{
|
||||
c[tot]=mm;mul[tot]=mm;num[tot]=1;
|
||||
tot++;
|
||||
}
|
||||
}
|
||||
ll quickpow(ll a,ll b,ll c)
|
||||
{
|
||||
ll ret=1;
|
||||
while(b)
|
||||
{
|
||||
if(b&1)
|
||||
{
|
||||
(ret*=a)%=c;
|
||||
}
|
||||
(a*=a)%=c;
|
||||
b>>=1;
|
||||
}
|
||||
return ret%c;
|
||||
}
|
||||
void ex_gcd(ll a,ll b,ll &x,ll &y)
|
||||
{
|
||||
if(b==0)
|
||||
{
|
||||
x=1;y=0;
|
||||
return ;
|
||||
}
|
||||
ex_gcd(b,a%b,x,y);
|
||||
ll t=x;
|
||||
x=y;
|
||||
y=t-(a/b)*y;
|
||||
}
|
||||
ll count(ll a,ll p)
|
||||
{
|
||||
if(a<p)
|
||||
return 0;
|
||||
else
|
||||
return a/p+count(a/p,p);
|
||||
}
|
||||
ll count2(ll a,ll p,ll mp)
|
||||
{
|
||||
if(a<p)
|
||||
return f2[a];
|
||||
return ((f2[a%mp]*quickpow(f2[mp-1],a/mp,mp))%mp*count2(a/p,p,mp))%mp;
|
||||
}
|
||||
ll work1(ll id)
|
||||
{
|
||||
ll p=c[id];ll mp=mul[id];ll nm=num[id];
|
||||
ll t1;
|
||||
t1=count(n,p)-count(k,p)-count(n-k,p);
|
||||
if(t1>=nm)
|
||||
return 0;
|
||||
ll ret=quickpow(p,t1,mp);
|
||||
ll i,x,y;
|
||||
f2[0]=1;
|
||||
for(i=1;i<=mp;++i)
|
||||
{
|
||||
f2[i]=f2[i-1];
|
||||
if(i%p!=0)
|
||||
f2[i]*=i;
|
||||
f2[i]%=mp;
|
||||
}
|
||||
ex_gcd(count2(k,p,mp)*count2(n-k,p,mp),mp,x,y);
|
||||
(ret*=x)%=mp;
|
||||
(ret*=count2(n,p,mp))%=mp;
|
||||
return ret;
|
||||
}
|
||||
ll work()
|
||||
{
|
||||
ll i,ret=0,tmp,x,y;
|
||||
prem();
|
||||
for(i=0;i<tot;++i)
|
||||
{
|
||||
tmp=work1(i);
|
||||
ex_gcd(m/mul[i],mul[i],x,y);
|
||||
ret+=(((m/mul[i])%m*x)%m*tmp)%m;
|
||||
}
|
||||
ret=(ret%m+m)%m;
|
||||
return (ret*cp())%m;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,cas=0;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
cas++;
|
||||
scanf("%I64d%I64d%I64d",&n,&k,&m);
|
||||
printf("Case %d: %I64d\n",cas,work());
|
||||
}
|
||||
return 0;
|
||||
}
|
92
HDOJ/3440_autoAC.cpp
Normal file
92
HDOJ/3440_autoAC.cpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#include<vector>
|
||||
#include<queue>
|
||||
int T,n,d,dis[1010],nxt[1010],h,in[1010],cnt[1010];
|
||||
const int inf=1000000000;
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int id,h;
|
||||
node(int a=0,int b=0):id(a),h(b){}
|
||||
friend bool operator < (node a,node b)
|
||||
{
|
||||
return a.h<b.h;
|
||||
}
|
||||
};
|
||||
struct edge
|
||||
{
|
||||
int y,l;
|
||||
edge(int a,int b):y(a),l(b){}
|
||||
};
|
||||
vector<edge>vt[1010];
|
||||
node a[1010];
|
||||
int spfa(int x,int y)
|
||||
{
|
||||
fill(dis,dis+1+n,inf);
|
||||
memset(in,0,sizeof(in));
|
||||
dis[x]=0;
|
||||
in[x]=1;
|
||||
memset(cnt,0,sizeof(cnt));
|
||||
cnt[x]=1;
|
||||
queue<int>q;
|
||||
q.push(x);
|
||||
while(!q.empty())
|
||||
{
|
||||
int s=q.front();
|
||||
q.pop();
|
||||
in[s]=0;
|
||||
for(int i=0;i<vt[s].size();i++)
|
||||
{
|
||||
int y=vt[s][i].y,l=vt[s][i].l;
|
||||
if(dis[y]>dis[s]+l)
|
||||
{
|
||||
dis[y]=dis[s]+l;
|
||||
if(!in[y])
|
||||
{
|
||||
q.push(y);
|
||||
cnt[y]++;
|
||||
if(cnt[y]>n)return -1;
|
||||
in[y]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return dis[y];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
scanf("%d",&T);
|
||||
for(int cas=1;cas<=T;cas++)
|
||||
{
|
||||
scanf("%d%d",&n,&d);
|
||||
for(int i=1;i<=n;i++)
|
||||
vt[i].clear();
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&h);
|
||||
a[i]=node(i,h);
|
||||
}
|
||||
sort(a+1,a+1+n);
|
||||
for(int i=1;i<n;i++)
|
||||
{
|
||||
vt[i+1].push_back(edge(i,-1));
|
||||
}
|
||||
for(int i=1;i<n;i++)
|
||||
{
|
||||
vt[min(a[i+1].id,a[i].id)].push_back(edge(max(a[i+1].id,a[i].id),d));
|
||||
}
|
||||
int a1=a[1].id,a2=a[n].id,k;
|
||||
if(a1<a2)
|
||||
{
|
||||
k=spfa(a1,a2);
|
||||
}
|
||||
else
|
||||
{
|
||||
k=spfa(a2,a1);
|
||||
}
|
||||
printf("Case %d: %d\n",cas,k);
|
||||
}
|
||||
return 0;
|
||||
}
|
154
HDOJ/3441_autoAC.cpp
Normal file
154
HDOJ/3441_autoAC.cpp
Normal file
|
@ -0,0 +1,154 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
#define MOD 1000000007
|
||||
#define MAXD 40010
|
||||
using namespace std;
|
||||
int isprime[MAXD], prime[MAXD], P, p[MAXD], pn;
|
||||
long long A, C, K, ANS, T;
|
||||
void exgcd(long long a, long long b, long long &x, long long &y)
|
||||
{
|
||||
if(b == 0)
|
||||
x = 1, y = 0;
|
||||
else
|
||||
exgcd(b, a % b, y, x), y -= x * (a / b);
|
||||
}
|
||||
long long powmod(long long a, long long n)
|
||||
{
|
||||
long long ans = 1;
|
||||
while(n)
|
||||
{
|
||||
if(n & 1)
|
||||
ans = ans * a % MOD;
|
||||
n >>= 1;
|
||||
a = a * a % MOD;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
void prepare()
|
||||
{
|
||||
int i, j, k = 40000;
|
||||
memset(isprime, -1, sizeof(isprime));
|
||||
P = 0;
|
||||
for(i = 2; i <= k; i ++)
|
||||
if(isprime[i])
|
||||
{
|
||||
prime[P ++] = i;
|
||||
for(j = i * i; j <= k; j += i)
|
||||
isprime[j] = 0;
|
||||
}
|
||||
}
|
||||
long long block(long long n, long long c)
|
||||
{
|
||||
long long ans, x, y;
|
||||
ans = powmod(c, n * n);
|
||||
ans = (ans + 2 * powmod(c, n * n / 4 + (n & 1))) % MOD;
|
||||
ans = (ans + powmod(c, n * n / 2 + (n & 1))) % MOD;
|
||||
exgcd(4, MOD, x, y);
|
||||
x = (x % MOD + MOD) % MOD;
|
||||
ans = ans * x % MOD;
|
||||
return ans;
|
||||
}
|
||||
long long euler(long long n)
|
||||
{
|
||||
int i;
|
||||
long long ans = n;
|
||||
for(i = 0; i < pn; i ++)
|
||||
if(n % p[i] == 0)
|
||||
ans = ans / p[i] * (p[i] - 1);
|
||||
return ans;
|
||||
}
|
||||
long long prepareBK()
|
||||
{
|
||||
int i, j, nx, ny, x, y, cnt;
|
||||
long long N = 1;
|
||||
nx = x = A - 1, ny = y = A + 1;
|
||||
pn = 0;
|
||||
for(i = 0; i < P && prime[i] * prime[i] <= ny; i ++)
|
||||
{
|
||||
cnt = 0;
|
||||
if(x % prime[i] == 0 || y % prime[i] == 0)
|
||||
p[pn ++] = prime[i];
|
||||
while(x % prime[i] == 0)
|
||||
++ cnt, x /= prime[i];
|
||||
while(y % prime[i] == 0)
|
||||
++ cnt, y /= prime[i];
|
||||
for(j = 0, cnt /= 2; j < cnt; j ++)
|
||||
N *= prime[i];
|
||||
}
|
||||
if(x > y)
|
||||
i = x, x = y, y = i;
|
||||
if(x > 1)
|
||||
p[pn ++] = x;
|
||||
if(y > 1)
|
||||
p[pn ++] = y;
|
||||
if(x == y)
|
||||
N *= x;
|
||||
return N;
|
||||
}
|
||||
void dfs(int cur, long long R, long long x, long long &c)
|
||||
{
|
||||
int i, cnt = 0;
|
||||
long long t = 1;
|
||||
if(cur == pn)
|
||||
{
|
||||
long long ans, n, x, y;
|
||||
n = euler(K / R) % MOD;
|
||||
T = (T + n * powmod(c, R)) % MOD;
|
||||
return ;
|
||||
}
|
||||
while(x % p[cur] == 0)
|
||||
x /= p[cur], ++ cnt;
|
||||
for(i = 0; i <= cnt; i ++)
|
||||
{
|
||||
dfs(cur + 1, R * t, x, c);
|
||||
t *= p[cur];
|
||||
}
|
||||
}
|
||||
void findB(int cur, long long B, long long x)
|
||||
{
|
||||
int i, cnt = 0;
|
||||
long long t = 1;
|
||||
if(cur == pn)
|
||||
{
|
||||
long long n, x, y, c;
|
||||
c = block(B, C);
|
||||
K = (A * A - 1) / (B * B);
|
||||
T = 0;
|
||||
dfs(0, 1, K, c);
|
||||
exgcd(K, MOD, x, y);
|
||||
x = (x % MOD + MOD) % MOD;
|
||||
T = (T * x) % MOD;
|
||||
ANS = (ANS + T * C) % MOD;
|
||||
return ;
|
||||
}
|
||||
while(x % p[cur] == 0)
|
||||
++ cnt, x /= p[cur];
|
||||
for(i = 0; i <= cnt; i ++)
|
||||
{
|
||||
findB(cur + 1, B * t, x);
|
||||
t *= p[cur];
|
||||
}
|
||||
}
|
||||
void solve()
|
||||
{
|
||||
ANS = 0;
|
||||
findB(0, 1, prepareBK());
|
||||
printf("%I64d\n", ANS);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t, tt;
|
||||
prepare();
|
||||
scanf("%d", &t);
|
||||
for(tt = 0; tt < t; tt ++)
|
||||
{
|
||||
printf("Case %d: ", tt + 1);
|
||||
scanf("%I64d%I64d", &A, &C);
|
||||
if(A == 1)
|
||||
printf("%I64d\n", C);
|
||||
else
|
||||
solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
140
HDOJ/3442_autoAC.cpp
Normal file
140
HDOJ/3442_autoAC.cpp
Normal file
|
@ -0,0 +1,140 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int damage,x,y;
|
||||
int mark[5];
|
||||
bool operator <(const node &a)const
|
||||
{
|
||||
return a.damage<damage;
|
||||
}
|
||||
};
|
||||
typedef struct tt
|
||||
{
|
||||
int x,y,t;
|
||||
}NODE;
|
||||
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
|
||||
node cur,ne;
|
||||
int n,m,tag;NODE cur1,next1;
|
||||
char a[55][55];int mark[55][55],mark1[55][55];
|
||||
void bfs(int x,int y)
|
||||
{
|
||||
priority_queue<node> qu;
|
||||
cur.x=x;cur.y=y;cur.damage =0;
|
||||
queue<NODE> q;
|
||||
int i,j;
|
||||
for(i=0;i<5;i++)
|
||||
{
|
||||
cur.mark[i]=0;
|
||||
}
|
||||
qu.push(cur);
|
||||
while(!qu.empty ())
|
||||
{
|
||||
cur=qu.top ();
|
||||
qu.pop();
|
||||
if(a[cur.x][cur.y]=='!')
|
||||
{
|
||||
tag=1;
|
||||
return ;
|
||||
}
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
ne.x=cur.x+dir[i][0];
|
||||
ne.y=cur.y+dir[i][1];
|
||||
if(ne.x>=1&&ne.x<=n&&ne.y>=1&&ne.y<=m&&a[ne.x][ne.y]!='#'&&a[ne.x][ne.y]!='A'&&a[ne.x][ne.y]!='B'&&a[ne.x][ne.y]!='D'&&a[ne.x][ne.y]!='E')
|
||||
{
|
||||
ne.damage =cur.damage ;
|
||||
for(j=0;j<5;j++)
|
||||
{
|
||||
ne.mark[j]=cur.mark[j];
|
||||
}
|
||||
if(a[ne.x][ne.y]=='C' && cur.mark[2]==0)
|
||||
{
|
||||
ne.damage +=3;
|
||||
ne.mark[2]=1;
|
||||
}
|
||||
memset(mark1,0,sizeof(mark1));
|
||||
while(!q.empty ())
|
||||
q.pop ();
|
||||
cur1.x=ne.x;
|
||||
cur1.y=ne.y;
|
||||
cur1.t=0;
|
||||
q.push(cur1);
|
||||
while(!q.empty ())
|
||||
{
|
||||
cur1=q.front ();
|
||||
q.pop();
|
||||
if(cur1.t>3)
|
||||
break;
|
||||
if(ne.mark[0]==0 && cur1.t<=2 && a[cur1.x][cur1.y]=='A')
|
||||
{
|
||||
ne.damage+=1;
|
||||
ne.mark[0]=1;
|
||||
}
|
||||
if(ne.mark[1]==0 && cur1.t<=3 && a[cur1.x][cur1.y]=='B')
|
||||
{
|
||||
ne.damage +=2;
|
||||
ne.mark[1]=1;
|
||||
}
|
||||
if(ne.mark[3]==0 && cur1.t<=2&&a[cur1.x][cur1.y]=='D')
|
||||
{
|
||||
ne.damage +=4;
|
||||
ne.mark[3]=1;
|
||||
}
|
||||
if(ne.mark[4]==0 && cur1.t<=1&&a[cur1.x][cur1.y]=='E')
|
||||
{
|
||||
ne.damage +=5;
|
||||
ne.mark [4]=1;
|
||||
}
|
||||
for(j=0;j<=4;j++)
|
||||
{
|
||||
next1.x=cur1.x+dir[j][0];
|
||||
next1.y=cur1.y+dir[j][1];
|
||||
if(next1.x>=1&&next1.x<=n&&next1.y>=1&&next1.y<=m&&!mark1[next1.x][next1.y])
|
||||
{
|
||||
mark1[next1.x][next1.y]=1;
|
||||
next1.t=cur1.t+1;
|
||||
q.push(next1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(mark[ne.x][ne.y]>ne.damage)
|
||||
{
|
||||
mark[ne.x][ne.y]=ne.damage;
|
||||
qu.push(ne);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,i,j,sx,sy,count=0;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
count++;tag=0;
|
||||
scanf("%d%d",&n,&m);
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
getchar();
|
||||
for(j=1;j<=m;j++)
|
||||
{
|
||||
scanf("%c",&a[i][j]);
|
||||
mark[i][j]=0xfffffff;
|
||||
if(a[i][j]=='$')
|
||||
{
|
||||
sx=i;sy=j;
|
||||
}
|
||||
}
|
||||
}
|
||||
bfs(sx,sy);
|
||||
if(tag)
|
||||
printf("Case %d: %d\n",count,cur.damage );
|
||||
else
|
||||
printf("Case %d: %d\n",count,-1);
|
||||
}
|
||||
return 0;
|
||||
}
|
14
HDOJ/3443_autoAC.cpp
Normal file
14
HDOJ/3443_autoAC.cpp
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <cstdio>
|
||||
#define LL __int64
|
||||
int main()
|
||||
{
|
||||
LL x,k;
|
||||
while(scanf("%I64d",&x)&&x){
|
||||
k=1;
|
||||
while(k<x)k=k*10+1;
|
||||
k/=10;
|
||||
while(x%k!=0)k/=10;
|
||||
printf("%I64d\n",x/k);
|
||||
}
|
||||
return 0;
|
||||
}
|
170
HDOJ/3446_autoAC.cpp
Normal file
170
HDOJ/3446_autoAC.cpp
Normal file
|
@ -0,0 +1,170 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int N=250;
|
||||
int n;
|
||||
int head;
|
||||
int tail;
|
||||
int Start;
|
||||
int Finish;
|
||||
int link[N];
|
||||
int Father[N];
|
||||
int Base[N];
|
||||
int Q[N];
|
||||
bool mark[N];
|
||||
bool mat[N][N];
|
||||
bool InBlossom[N];
|
||||
bool in_Queue[N];
|
||||
void BlossomContract(int x,int y){
|
||||
memset(mark,0,sizeof(mark));
|
||||
memset(InBlossom,0,sizeof(InBlossom));
|
||||
#define pre Father[link[i]]
|
||||
int lca,i;
|
||||
for (i=x;i;i=pre) {i=Base[i]; mark[i]=true; }
|
||||
for (i=y;i;i=pre) {i=Base[i]; if (mark[i]) {lca=i; break;} }
|
||||
for (i=x;Base[i]!=lca;i=pre){
|
||||
if (Base[pre]!=lca) Father[pre]=link[i];
|
||||
InBlossom[Base[i]]=true;
|
||||
InBlossom[Base[link[i]]]=true;
|
||||
}
|
||||
for (i=y;Base[i]!=lca;i=pre){
|
||||
if (Base[pre]!=lca) Father[pre]=link[i];
|
||||
InBlossom[Base[i]]=true;
|
||||
InBlossom[Base[link[i]]]=true;
|
||||
}
|
||||
#undef pre
|
||||
if (Base[x]!=lca) Father[x]=y;
|
||||
if (Base[y]!=lca) Father[y]=x;
|
||||
for (i=1;i<=n;i++)
|
||||
if (InBlossom[Base[i]]){
|
||||
Base[i]=lca;
|
||||
if (!in_Queue[i]){
|
||||
Q[++tail]=i;
|
||||
in_Queue[i]=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
void Change(){
|
||||
int x,y,z;
|
||||
z=Finish;
|
||||
while (z){
|
||||
y=Father[z];
|
||||
x=link[y];
|
||||
link[y]=z;
|
||||
link[z]=y;
|
||||
z=x;
|
||||
}
|
||||
}
|
||||
void FindAugmentPath(){
|
||||
memset(Father,0,sizeof(Father));
|
||||
memset(in_Queue,0,sizeof(in_Queue));
|
||||
for (int i=1;i<=n;i++) Base[i]=i;
|
||||
head=0; tail=1;
|
||||
Q[1]=Start;
|
||||
in_Queue[Start]=1;
|
||||
while (head!=tail){
|
||||
int x=Q[++head];
|
||||
for (int y=1;y<=n;y++)
|
||||
if (mat[x][y] && Base[x]!=Base[y] && link[x]!=y)
|
||||
if ( Start==y || link[y] && Father[link[y]] )
|
||||
BlossomContract(x,y);
|
||||
else if (!Father[y]){
|
||||
Father[y]=x;
|
||||
if (link[y]){
|
||||
Q[++tail]=link[y];
|
||||
in_Queue[link[y]]=true;
|
||||
}
|
||||
else{
|
||||
Finish=y;
|
||||
Change();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void Edmonds(){
|
||||
memset(link,0,sizeof(link));
|
||||
for (Start=1;Start<=n;Start++)
|
||||
if (link[Start]==0)
|
||||
FindAugmentPath();
|
||||
}
|
||||
int MaxMatch()
|
||||
{
|
||||
Edmonds();
|
||||
int cnt=0;
|
||||
for (int i=1;i<=n;i++)
|
||||
if (link[i]) cnt++;
|
||||
return cnt;
|
||||
}
|
||||
void output(){
|
||||
memset(mark,0,sizeof(mark));
|
||||
int cnt=0;
|
||||
for (int i=1;i<=n;i++)
|
||||
if (link[i]) cnt++;
|
||||
printf("%d\n",cnt);
|
||||
for (int i=1;i<=n;i++)
|
||||
if (!mark[i] && link[i]){
|
||||
mark[i]=true;
|
||||
mark[link[i]]=true;
|
||||
printf("%d %d\n",i,link[i]);
|
||||
}
|
||||
}
|
||||
char str[50][50];
|
||||
const int dx[]={-1,-1,-1,1,1,1,0,0,2,-2,2,-2,2,-2,2,-2,1,-1,-1,1};
|
||||
const int dy[]={-1,1,0,0,1,-1,-1,1,2,2,-2,-2,1,-1,-1,1,2,-2,2,-2};
|
||||
int main()
|
||||
{
|
||||
int ci,pl=1;scanf("%d",&ci);
|
||||
while(ci--)
|
||||
{
|
||||
int r,c;scanf("%d%d",&r,&c);
|
||||
n=r*c;
|
||||
for(int i=0;i<r;i++) scanf("%s",str[i]);
|
||||
int maxMatch,maxMatchK;
|
||||
memset(mat,0,sizeof(mat));
|
||||
for(int i=0;i<r;i++)
|
||||
{
|
||||
for(int j=0;j<c;j++)
|
||||
{
|
||||
int p1=i*c+j+1;
|
||||
if(str[i][j]=='#'||str[i][j]=='K') continue;
|
||||
for(int k=0;k<20;k++)
|
||||
{
|
||||
int x=i+dx[k],y=j+dy[k];
|
||||
if(x>=0&&x<r&&y>=0&&y<c){
|
||||
if(str[x][y]=='#'||str[x][y]=='K') continue;
|
||||
int p2=x*c+y+1;
|
||||
mat[p1][p2]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
maxMatch=MaxMatch();
|
||||
memset(mat,0,sizeof(mat));
|
||||
for(int i=0;i<r;i++)
|
||||
{
|
||||
for(int j=0;j<c;j++)
|
||||
{
|
||||
int p1=i*c+j+1;
|
||||
if(str[i][j]=='#') continue;
|
||||
for(int k=0;k<24;k++)
|
||||
{
|
||||
int x=i+dx[k],y=j+dy[k];
|
||||
if(x>=0&&x<r&&y>=0&&y<c){
|
||||
if(str[x][y]=='#') continue;
|
||||
int p2=x*c+y+1;
|
||||
mat[p1][p2]=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
maxMatchK=MaxMatch();
|
||||
if(maxMatch==maxMatchK)
|
||||
printf("Case #%d: daizhenyang lose\n",pl++);
|
||||
else printf("Case #%d: daizhenyang win\n",pl++);
|
||||
}
|
||||
return 0;
|
||||
}
|
40
HDOJ/3448_autoAC.cpp
Normal file
40
HDOJ/3448_autoAC.cpp
Normal file
|
@ -0,0 +1,40 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
int n,m,k;
|
||||
int wi[60];
|
||||
int cnt;
|
||||
void dfs(int id,int num,int weight)
|
||||
{
|
||||
cnt=max(cnt,weight);
|
||||
if(id==k) return ;
|
||||
dfs(id+1,num,weight);
|
||||
if(weight+wi[id]<=m&&num+1<=n) dfs(id+1,num+1,weight+wi[id]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&m)==2)
|
||||
{
|
||||
scanf("%d",&k);
|
||||
int tsum;
|
||||
for(int i=0;i<k;i++)
|
||||
{
|
||||
scanf("%d",&wi[i]);
|
||||
}
|
||||
sort(wi,wi+k);
|
||||
tsum=0;
|
||||
for(int i=k-1;i>=k-n;i--) tsum+=wi[i];
|
||||
if(wi[0]>m) tsum=0;
|
||||
if(tsum<=m)
|
||||
{
|
||||
printf("%d\n",tsum);
|
||||
continue;
|
||||
}
|
||||
cnt=0;
|
||||
dfs(0,0,0);
|
||||
printf("%d\n",cnt);
|
||||
}
|
||||
return 0;
|
||||
}
|
30
HDOJ/3449_autoAC.cpp
Normal file
30
HDOJ/3449_autoAC.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
const int Ni = 55;
|
||||
const int Mi = 100005;
|
||||
int dp[Ni][Mi];
|
||||
int main()
|
||||
{
|
||||
int n,m,tv,i,j,k,pi,c,w;
|
||||
memset(dp[0],0,sizeof(dp[0]));
|
||||
while(~scanf("%d%d",&n,&tv))
|
||||
{
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d%d",&pi,&m);
|
||||
for(j=0;j<pi;j++) dp[i][j]=-1;
|
||||
for(j=tv;j>=pi;j--) dp[i][j]=dp[i-1][j-pi];
|
||||
for(k=0;k<m;k++)
|
||||
{
|
||||
scanf("%d%d",&c,&w);
|
||||
for(j=tv;j>=c;j--) if(dp[i][j-c]!=-1)
|
||||
dp[i][j]=max(dp[i][j],dp[i][j-c]+w);
|
||||
}
|
||||
for(j=tv;j>=0;j--) dp[i][j]=max(dp[i][j],dp[i-1][j]);
|
||||
}
|
||||
printf("%d\n",dp[n][tv]);
|
||||
}
|
||||
return 0;
|
||||
}
|
69
HDOJ/3450_autoAC.cpp
Normal file
69
HDOJ/3450_autoAC.cpp
Normal file
|
@ -0,0 +1,69 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
const int maxn=100002;
|
||||
const int oo=1000000000;
|
||||
const int mod=9901;
|
||||
int c[maxn],n,d,b[maxn],a[maxn];
|
||||
void add(int x,int val)
|
||||
{
|
||||
while(x<=maxn)
|
||||
{
|
||||
c[x]+=val;
|
||||
c[x]%=mod;
|
||||
x+=(x&-x);
|
||||
}
|
||||
}
|
||||
int sum(int x)
|
||||
{
|
||||
int s=0;
|
||||
while(x>0)
|
||||
{
|
||||
s+=c[x];
|
||||
s%=mod;
|
||||
x-=(x&-x);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,id,up,down,val,ans;
|
||||
while(~scanf("%d%d",&n,&d))
|
||||
{
|
||||
map<int,int>flag;
|
||||
map<int,int>::iterator it;
|
||||
flag[0]=0;
|
||||
memset(c,0,sizeof(c));
|
||||
for(i=0; i<n; i++)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
b[i]=a[i];
|
||||
}
|
||||
sort(b,b+n);
|
||||
int cnt=2;
|
||||
flag[b[0]]=1;
|
||||
for(i=1; i<n; i++)
|
||||
if(b[i]!=b[i-1])
|
||||
flag[b[i]]=cnt++;
|
||||
flag[oo]=cnt++;
|
||||
for(i=0; i<n; i++)
|
||||
{
|
||||
it=flag.lower_bound(a[i]);
|
||||
id=it->second;
|
||||
it=flag.upper_bound(a[i]+d);
|
||||
up=it->second-1;
|
||||
it=flag.lower_bound(a[i]-d);
|
||||
down=it->second;
|
||||
val=sum(up)-sum(down-1)+1;
|
||||
val=(val%mod+mod)%mod;
|
||||
add(id,val);
|
||||
}
|
||||
ans=sum(cnt);
|
||||
ans=((ans-n)%mod+mod)%mod;
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
121
HDOJ/3451_autoAC.cpp
Normal file
121
HDOJ/3451_autoAC.cpp
Normal file
|
@ -0,0 +1,121 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
int board[105][105];
|
||||
int sep[105][105];
|
||||
int n,m,l;
|
||||
struct bnode
|
||||
{
|
||||
int x,y,d,time;
|
||||
};
|
||||
int dir[4][2]={0,-1,0,1,-1,0,1,0};
|
||||
void bfs(int x,int y)
|
||||
{
|
||||
queue<bnode> sav;
|
||||
while(!sav.empty())sav.pop();
|
||||
board[x][y]++;
|
||||
if(board[x][y]>l){
|
||||
board[x][y]=0;
|
||||
sep[x][y]=0;
|
||||
for(int i=0;i<4;++i)
|
||||
{
|
||||
bnode tmp;
|
||||
tmp.x=x+dir[i][0];
|
||||
tmp.y=y+dir[i][1];
|
||||
tmp.d=i;
|
||||
tmp.time=1;
|
||||
if(tmp.x<=n&&tmp.x>=1&&tmp.y<=m&&tmp.y>=1)
|
||||
sav.push(tmp);
|
||||
}
|
||||
}
|
||||
while(!sav.empty())
|
||||
{
|
||||
bnode now=sav.front();
|
||||
sav.pop();
|
||||
if(board[now.x][now.y]<l&&board[now.x][now.y]!=0)
|
||||
{
|
||||
board[now.x][now.y]++;
|
||||
}
|
||||
else if(board[now.x][now.y]==l)
|
||||
{
|
||||
board[now.x][now.y]=0;
|
||||
sep[now.x][now.y]=now.time;
|
||||
for(int i=0;i<4;++i)
|
||||
{
|
||||
bnode tmp;
|
||||
tmp.x=now.x+dir[i][0];
|
||||
tmp.y=now.y+dir[i][1];
|
||||
tmp.d=i;
|
||||
tmp.time=now.time+1;
|
||||
if(tmp.x<=n&&tmp.x>=1&&tmp.y<=m&&tmp.y>=1)
|
||||
sav.push(tmp);
|
||||
}
|
||||
}
|
||||
else if(board[now.x][now.y]==0)
|
||||
{
|
||||
if(sep[now.x][now.y]!=now.time)
|
||||
{
|
||||
bnode tmp;
|
||||
tmp.x=now.x+dir[now.d][0];
|
||||
tmp.y=now.y+dir[now.d][1];
|
||||
tmp.d=now.d;
|
||||
tmp.time=now.time+1;
|
||||
if(tmp.x<=n&&tmp.x>=1&&tmp.y<=m&&tmp.y>=1)
|
||||
sav.push(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
memset(sep,0,sizeof(sep));
|
||||
scanf("%d%d%d",&n,&m,&l);
|
||||
bool flag=false;
|
||||
for(int i=1;i<=n;++i)
|
||||
{
|
||||
for(int j=1;j<=m;++j)
|
||||
{
|
||||
scanf("%d",&board[i][j]);
|
||||
if(board[i][j])flag=true;
|
||||
}
|
||||
}
|
||||
int q;
|
||||
scanf("%d",&q);
|
||||
while(q--)
|
||||
{
|
||||
int x,y;
|
||||
scanf("%d%d",&x,&y);
|
||||
if(!flag)continue;
|
||||
bfs(x,y);
|
||||
flag=false;
|
||||
for(int i=1;i<=n;++i)
|
||||
{
|
||||
if(flag)break;
|
||||
for(int j=1;j<=m;++j)
|
||||
{
|
||||
if(board[i][j]){flag=true;break;}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!flag)printf("YES\n");
|
||||
else
|
||||
{
|
||||
printf("NO\n");
|
||||
for(int i=1;i<=n;++i)
|
||||
{
|
||||
for(int j=1;j<=m;++j)
|
||||
{
|
||||
printf("%d ",board[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
55
HDOJ/3452_autoAC.cpp
Normal file
55
HDOJ/3452_autoAC.cpp
Normal file
|
@ -0,0 +1,55 @@
|
|||
#include<stdio.h>
|
||||
#include<vector>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define N 2005
|
||||
#define INF 0x7fffffff
|
||||
int dp[N];
|
||||
int tmp=0;
|
||||
int e, ne[N], v[N], w[N],adj[N];
|
||||
void add(int x, int y, int z)
|
||||
{
|
||||
v[e] = y, w[e] = z;
|
||||
ne[e] = adj[x], adj[x] = e ++;
|
||||
}
|
||||
void dfs(int cur, int fa)
|
||||
{
|
||||
int i, flag = 0;
|
||||
dp[cur] = 0;
|
||||
for(i = adj[cur]; i != -1; i = ne[i])
|
||||
if(v[i] != fa)
|
||||
{
|
||||
flag = 1;
|
||||
dfs(v[i], cur);
|
||||
dp[cur] += min(w[i], dp[v[i]]);
|
||||
}
|
||||
if(flag == 0) dp[cur] = INF;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,r,a,b,c;
|
||||
while(scanf("%d%d",&n,&r)!=EOF)
|
||||
{
|
||||
if(n==0 && r==0)
|
||||
break;
|
||||
memset(adj,-1,sizeof(adj));
|
||||
for(int i=1; i<n; i++)
|
||||
{
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
add(a,b,c);
|
||||
add(b,a,c);
|
||||
}
|
||||
for(int i=0; i<=n; i++)
|
||||
dp[i]=INF;
|
||||
if(n==1)
|
||||
printf("0\n");
|
||||
else
|
||||
{
|
||||
e=0;
|
||||
dfs(r,-1);
|
||||
printf("%d\n",dp[r]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
45
HDOJ/3455_autoAC.cpp
Normal file
45
HDOJ/3455_autoAC.cpp
Normal file
|
@ -0,0 +1,45 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#include<limits.h>
|
||||
typedef long long LL;
|
||||
using namespace std;
|
||||
const int INF=0x3f3f3f;
|
||||
const int maxn=1e5+100;
|
||||
int dp[maxn][15];
|
||||
int ha[10*maxn];
|
||||
int num[maxn],n;
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d",&n)&&n)
|
||||
{
|
||||
memset(dp,INF,sizeof(dp));
|
||||
memset(ha,-1,sizeof(ha));
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&num[i]);
|
||||
ha[num[i]]=i;
|
||||
}
|
||||
dp[2][num[2]-num[1]]=0;
|
||||
for(int i=2;i<=n;i++)
|
||||
{
|
||||
for(int j=1;j<=10;j++)
|
||||
{
|
||||
if(j>num[i]) break;
|
||||
for(int k=j+1;k<=10;k++)
|
||||
{
|
||||
int tt=num[i]-j;
|
||||
if(ha[tt]>=0)
|
||||
dp[i][j]=min(dp[ha[tt]][k-j]+1,dp[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
int ans=INF;
|
||||
for(int i=1;i<=10;i++)
|
||||
ans=min(ans,dp[n][i]);
|
||||
if(ans<INF) printf("%d\n",ans);
|
||||
else printf("-1\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
33
HDOJ/3456_autoAC.cpp
Normal file
33
HDOJ/3456_autoAC.cpp
Normal file
|
@ -0,0 +1,33 @@
|
|||
#include<iostream>
|
||||
#include<string>
|
||||
using namespace std;
|
||||
string word;
|
||||
string buf;
|
||||
int main(){
|
||||
bool sign=true;
|
||||
while(cin>>word){
|
||||
if(sign){
|
||||
buf+="Forty-two";
|
||||
sign=false;
|
||||
}
|
||||
if(word[word.size()-1]=='.'){
|
||||
buf.clear();
|
||||
sign=true;
|
||||
continue;
|
||||
}
|
||||
if(word[word.size()-1]=='?'){
|
||||
buf+=" ";
|
||||
buf+=word;
|
||||
buf[buf.size()-1]='.';
|
||||
cout<<buf<<endl;
|
||||
buf.clear();
|
||||
sign=true;
|
||||
continue;
|
||||
}
|
||||
if(word != "What"){
|
||||
buf+=" ";
|
||||
buf+=word;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
56
HDOJ/3457_autoAC.cpp
Normal file
56
HDOJ/3457_autoAC.cpp
Normal file
|
@ -0,0 +1,56 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#define Max(a,b) a>b?a:b
|
||||
using namespace std;
|
||||
int n;
|
||||
int dp[1111],map[1111][1111];
|
||||
struct node
|
||||
{
|
||||
int x1,x2,y1,y2;
|
||||
}s[1111];
|
||||
int dfs(int x)
|
||||
{
|
||||
int i,j,k,l;
|
||||
if(dp[x])return dp[x];
|
||||
for(i=0;i<n;i++)
|
||||
if(map[x][i])
|
||||
{
|
||||
dp[x]=Max(dp[x],dfs(i)+1);
|
||||
}
|
||||
dp[x]=Max(dp[x],1);
|
||||
return dp[x];
|
||||
}
|
||||
int main (void)
|
||||
{
|
||||
int i,j,k,l,x1,x2,y1,y2,sum;
|
||||
while(scanf("%d",&n)!=EOF&&n)
|
||||
{
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
|
||||
s[i].x1=x1;
|
||||
s[i].x2=x2;
|
||||
s[i].y1=y1;
|
||||
s[i].y2=y2;
|
||||
}
|
||||
memset(map,0,sizeof(map));
|
||||
memset(dp,0,sizeof(dp));
|
||||
for(i=0;i<n;i++)
|
||||
for(j=0;j<n;j++)
|
||||
{
|
||||
if(s[i].x2<s[j].x1&&s[i].y2<s[j].y1)
|
||||
{
|
||||
map[i][j]=1;
|
||||
}
|
||||
}
|
||||
sum=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
sum=Max(sum,dfs(i));
|
||||
}
|
||||
printf("%d\n",sum);
|
||||
}
|
||||
return 0;
|
||||
}
|
49
HDOJ/3458_autoAC.cpp
Normal file
49
HDOJ/3458_autoAC.cpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
#include<iostream>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define N 200020
|
||||
struct Node {
|
||||
int x,y,lt,id ;
|
||||
}point[N];
|
||||
int n,len,maxlp[N],by[N];
|
||||
int cmp(Node a,Node b) {
|
||||
if(a.x != b.x)
|
||||
return a.x < b.x ;
|
||||
if(a.y == b.y)
|
||||
return a.lt > b.lt ;
|
||||
return a.y < b.y ;
|
||||
}
|
||||
int find(int len,int _y) {
|
||||
int mid, left = 1, right = len ;
|
||||
while(left <= right) {
|
||||
mid = (left+right) >> 1 ;
|
||||
if(by[mid] >= _y)
|
||||
right = mid-1 ;
|
||||
else left = mid+1 ;
|
||||
}
|
||||
return left ;
|
||||
}
|
||||
int main() {
|
||||
while(scanf("%d",&n) && n) {
|
||||
for(int i=0;i<n;i++) {
|
||||
scanf("%d%d",&point[2*i].x,&point[2*i].y);
|
||||
point[2*i].lt = 1 ;
|
||||
scanf("%d%d",&point[2*i+1].x,&point[2*i+1].y);
|
||||
point[2*i+1].lt = 0 ;
|
||||
point[2*i].id = point[2*i+1].id = i ;
|
||||
}
|
||||
n *= 2 ;
|
||||
sort(point,point+n,cmp) ;
|
||||
len = 0 ;
|
||||
for(int i=0;i<n;i++) {
|
||||
if(point[i].lt == 1) maxlp[point[i].id] = find(len,point[i].y) ;
|
||||
else {
|
||||
int tmp = maxlp[point[i].id] ;
|
||||
if(tmp > len) by[++len] = point[i].y ;
|
||||
else by[tmp] = min(by[tmp],point[i].y) ;
|
||||
}
|
||||
}
|
||||
printf("%d\n",len);
|
||||
}
|
||||
return 0;
|
||||
}
|
202
HDOJ/3459_autoAC.cpp
Normal file
202
HDOJ/3459_autoAC.cpp
Normal file
|
@ -0,0 +1,202 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int x,y;
|
||||
} cube[10][10],side[10][10];
|
||||
char color[10],rubik[10][10];
|
||||
int ans[1000];
|
||||
int flag,step;
|
||||
void init()
|
||||
{
|
||||
cube[0][0].x=3,cube[0][0].y=2;
|
||||
cube[0][1].x=3,cube[0][1].y=1;
|
||||
cube[0][2].x=4,cube[0][2].y=2;
|
||||
cube[1][0].x=3,cube[1][0].y=3;
|
||||
cube[1][1].x=3,cube[1][1].y=4;
|
||||
cube[1][2].x=4,cube[1][2].y=3;
|
||||
cube[2][0].x=2,cube[2][0].y=2;
|
||||
cube[2][1].x=2,cube[2][1].y=1;
|
||||
cube[2][2].x=1,cube[2][2].y=2;
|
||||
cube[3][0].x=2,cube[3][0].y=3;
|
||||
cube[3][1].x=1,cube[3][1].y=3;
|
||||
cube[3][2].x=2,cube[3][2].y=4;
|
||||
cube[4][0].x=3,cube[4][0].y=0;
|
||||
cube[4][1].x=5,cube[4][1].y=2;
|
||||
cube[4][2].x=3,cube[4][2].y=7;
|
||||
cube[5][0].x=5,cube[5][0].y=3;
|
||||
cube[5][1].x=3,cube[5][1].y=5;
|
||||
cube[5][2].x=3,cube[5][2].y=6;
|
||||
cube[6][0].x=0,cube[6][0].y=2;
|
||||
cube[6][1].x=2,cube[6][1].y=7;
|
||||
cube[6][2].x=2,cube[6][2].y=0;
|
||||
cube[7][0].x=0,cube[7][0].y=3;
|
||||
cube[7][1].x=2,cube[7][1].y=5;
|
||||
cube[7][2].x=2,cube[7][2].y=6;
|
||||
side[0][0].x=0,side[0][0].y=2;
|
||||
side[0][1].x=0,side[0][1].y=3;
|
||||
side[0][2].x=1,side[0][2].y=2;
|
||||
side[0][3].x=1,side[0][3].y=3;
|
||||
side[1][0].x=2,side[1][0].y=0;
|
||||
side[1][1].x=2,side[1][1].y=1;
|
||||
side[1][2].x=3,side[1][2].y=0;
|
||||
side[1][3].x=3,side[1][3].y=1;
|
||||
side[2][0].x=2,side[2][0].y=2;
|
||||
side[2][1].x=2,side[2][1].y=3;
|
||||
side[2][2].x=3,side[2][2].y=2;
|
||||
side[2][3].x=3,side[2][3].y=3;
|
||||
side[3][0].x=2,side[3][0].y=4;
|
||||
side[3][1].x=2,side[3][1].y=5;
|
||||
side[3][2].x=3,side[3][2].y=4;
|
||||
side[3][3].x=3,side[3][3].y=5;
|
||||
side[4][0].x=2,side[4][0].y=6;
|
||||
side[4][1].x=2,side[4][1].y=7;
|
||||
side[4][2].x=3,side[4][2].y=6;
|
||||
side[4][3].x=3,side[4][3].y=7;
|
||||
side[5][0].x=4,side[5][0].y=2;
|
||||
side[5][1].x=4,side[5][1].y=3;
|
||||
side[5][2].x=5,side[5][2].y=2;
|
||||
side[5][3].x=5,side[5][3].y=3;
|
||||
}
|
||||
char get_color(int A,int B,int C)
|
||||
{
|
||||
for(int i=0; i<8; i++)
|
||||
{
|
||||
if(rubik[cube[i][0].x][cube[i][0].y]==color[A]&&rubik[cube[i][1].x][cube[i][1].y]==color[B]&&rubik[cube[i][2].x][cube[i][2].y]!=color[C])
|
||||
return rubik[cube[i][2].x][cube[i][2].y];
|
||||
if(rubik[cube[i][1].x][cube[i][1].y]==color[A]&&rubik[cube[i][0].x][cube[i][0].y]==color[B]&&rubik[cube[i][2].x][cube[i][2].y]!=color[C])
|
||||
return rubik[cube[i][2].x][cube[i][2].y];
|
||||
if(rubik[cube[i][0].x][cube[i][0].y]==color[A]&&rubik[cube[i][2].x][cube[i][2].y]==color[B]&&rubik[cube[i][1].x][cube[i][1].y]!=color[C])
|
||||
return rubik[cube[i][1].x][cube[i][1].y];
|
||||
if(rubik[cube[i][2].x][cube[i][2].y]==color[A]&&rubik[cube[i][0].x][cube[i][0].y]==color[B]&&rubik[cube[i][1].x][cube[i][1].y]!=color[C])
|
||||
return rubik[cube[i][1].x][cube[i][1].y];
|
||||
if(rubik[cube[i][1].x][cube[i][1].y]==color[A]&&rubik[cube[i][2].x][cube[i][2].y]==color[B]&&rubik[cube[i][0].x][cube[i][0].y]!=color[C])
|
||||
return rubik[cube[i][0].x][cube[i][0].y];
|
||||
if(rubik[cube[i][2].x][cube[i][2].y]==color[A]&&rubik[cube[i][1].x][cube[i][1].y]==color[B]&&rubik[cube[i][0].x][cube[i][0].y]!=color[C])
|
||||
return rubik[cube[i][0].x][cube[i][0].y];
|
||||
}
|
||||
}
|
||||
void turn_x(char maze[10][10])
|
||||
{
|
||||
char tmp;
|
||||
tmp=maze[2][4];
|
||||
maze[2][4]=maze[2][5];
|
||||
maze[2][5]=maze[3][5];
|
||||
maze[3][5]=maze[3][4];
|
||||
maze[3][4]=tmp;
|
||||
tmp=maze[1][3];
|
||||
maze[1][3]=maze[2][6];
|
||||
maze[2][6]=maze[5][3];
|
||||
maze[5][3]=maze[3][3];
|
||||
maze[3][3]=tmp;
|
||||
tmp=maze[0][3];
|
||||
maze[0][3]=maze[3][6];
|
||||
maze[3][6]=maze[4][3];
|
||||
maze[4][3]=maze[2][3];
|
||||
maze[2][3]=tmp;
|
||||
}
|
||||
void turn_y(char maze[10][10])
|
||||
{
|
||||
char tmp;
|
||||
tmp=maze[2][0];
|
||||
maze[2][0]=maze[2][6];
|
||||
maze[2][6]=maze[2][4];
|
||||
maze[2][4]=maze[2][2];
|
||||
maze[2][2]=tmp;
|
||||
tmp=maze[2][1];
|
||||
maze[2][1]=maze[2][7];
|
||||
maze[2][7]=maze[2][5];
|
||||
maze[2][5]=maze[2][3];
|
||||
maze[2][3]=tmp;
|
||||
tmp=maze[0][2];
|
||||
maze[0][2]=maze[0][3];
|
||||
maze[0][3]=maze[1][3];
|
||||
maze[1][3]=maze[1][2];
|
||||
maze[1][2]=tmp;
|
||||
}
|
||||
void turn_z(char maze[10][10])
|
||||
{
|
||||
char tmp;
|
||||
tmp=maze[2][1];
|
||||
maze[2][1]=maze[1][3];
|
||||
maze[1][3]=maze[3][4];
|
||||
maze[3][4]=maze[4][2];
|
||||
maze[4][2]=tmp;
|
||||
tmp=maze[3][1];
|
||||
maze[3][1]=maze[1][2];
|
||||
maze[1][2]=maze[2][4];
|
||||
maze[2][4]=maze[4][3];
|
||||
maze[4][3]=tmp;
|
||||
tmp=maze[2][2];
|
||||
maze[2][2]=maze[2][3];
|
||||
maze[2][3]=maze[3][3];
|
||||
maze[3][3]=maze[3][2];
|
||||
maze[3][2]=tmp;
|
||||
}
|
||||
int get_h(char mid[10][10])
|
||||
{
|
||||
int i,j,sum = 0;
|
||||
for(i = 0; i<6; i++)
|
||||
{
|
||||
for(j = 0; j<4; j++)
|
||||
{
|
||||
if(mid[side[i][j].x][side[i][j].y]!=color[i])
|
||||
sum++;
|
||||
}
|
||||
}
|
||||
return (sum+7)/8;
|
||||
}
|
||||
int IDA(char mid[10][10],int cnt)
|
||||
{
|
||||
if(cnt+get_h(mid)>step)
|
||||
return 0;
|
||||
if(cnt == step)
|
||||
return 1;
|
||||
for(int i = 0; i<3; i++)
|
||||
{
|
||||
char tem[10][10];
|
||||
for(int x = 0; x<6; x++)
|
||||
for(int y = 0; y<8; y++)
|
||||
tem[x][y]=mid[x][y];
|
||||
if(i == 0)
|
||||
turn_x(tem);
|
||||
else if(i == 1)
|
||||
turn_y(tem);
|
||||
else
|
||||
turn_z(tem);
|
||||
ans[cnt] = i;
|
||||
if(IDA(tem,cnt+1))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
init();
|
||||
while(~scanf("%s",rubik[0]))
|
||||
{
|
||||
for(i = 1; i<6; i++)
|
||||
scanf("%s",rubik[i]);
|
||||
if(!strcmp(rubik[0],"........"))
|
||||
break;
|
||||
color[1]=rubik[3][0];
|
||||
color[5]=rubik[5][2];
|
||||
color[4]=rubik[3][7];
|
||||
color[0]=get_color(1,4,5);
|
||||
color[2]=get_color(1,5,4);
|
||||
color[3]=get_color(4,5,1);
|
||||
step = 0;
|
||||
while(1)
|
||||
{
|
||||
if(IDA(rubik,0)) break;
|
||||
step++;
|
||||
}
|
||||
for(i = 0; i<step; i++)
|
||||
printf("%c",ans[i]+'X');
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
67
HDOJ/3460_autoAC.cpp
Normal file
67
HDOJ/3460_autoAC.cpp
Normal file
|
@ -0,0 +1,67 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdlib.h>
|
||||
struct dic
|
||||
{
|
||||
struct dic *child[26];
|
||||
};
|
||||
struct dic *root;
|
||||
int max;
|
||||
int ans;
|
||||
void insert(char *source)
|
||||
{
|
||||
struct dic *now,*newnode;
|
||||
int i,j;
|
||||
int len;
|
||||
len=strlen(source);
|
||||
max=max>len?max:len;
|
||||
now=root;
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
if(now->child[source[i]-'a']!=NULL) now=now->child[source[i]-'a'];
|
||||
else
|
||||
{
|
||||
newnode=(struct dic*)malloc(sizeof(struct dic));
|
||||
for(j=0;j<26;j++) newnode->child[j]=NULL;
|
||||
now->child[source[i]-'a']=newnode;
|
||||
now=newnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
void count(struct dic *now)
|
||||
{
|
||||
int j;
|
||||
for(j=0;j<26;j++)
|
||||
{
|
||||
if(now->child[j]==NULL) continue;
|
||||
else
|
||||
{
|
||||
ans++;
|
||||
count(now->child[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
int i,j;
|
||||
char str[55];
|
||||
while(scanf("%d",&n)!=-1)
|
||||
{
|
||||
root=(struct dic *)malloc(sizeof(struct dic));
|
||||
for(j=0;j<26;j++) root->child[j]=0;
|
||||
max=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
scanf("%s",str);
|
||||
insert(str);
|
||||
}
|
||||
ans=0;
|
||||
count(root);
|
||||
ans*=2;
|
||||
ans-=max;
|
||||
ans+=n;
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
58
HDOJ/3461_autoAC.cpp
Normal file
58
HDOJ/3461_autoAC.cpp
Normal file
|
@ -0,0 +1,58 @@
|
|||
#include<stdio.h>
|
||||
#include<math.h>
|
||||
int set[10000005];
|
||||
int count;
|
||||
#define mod 1000000007
|
||||
int find(int x)
|
||||
{
|
||||
int r=x;
|
||||
while(r!=set[r])
|
||||
r=set[r];
|
||||
int i=x;
|
||||
while(i!=r)
|
||||
{
|
||||
int j=set[i];
|
||||
set[i]=r;
|
||||
i=j;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
void merge(int x,int y)
|
||||
{
|
||||
int fx=find(x);
|
||||
int fy=find(y);
|
||||
if(fx!=fy)
|
||||
{
|
||||
set[fx]=fy;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
long long exp(int n){
|
||||
long long sum=1, tmp=26;
|
||||
while(n){
|
||||
if(n&1){
|
||||
sum = sum*tmp;
|
||||
sum %= mod;
|
||||
}
|
||||
tmp = (tmp*tmp)%mod;
|
||||
n>>=1;
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,m,l,r;
|
||||
while(scanf("%d%d",&n,&m)!=EOF)
|
||||
{
|
||||
count=0;
|
||||
for(int i=0;i<=n;i++)
|
||||
set[i]=i;
|
||||
for(int i=1;i<=m;i++)
|
||||
{
|
||||
scanf("%d%d",&l,&r);
|
||||
merge(l-1,r);
|
||||
}
|
||||
printf("%lld\n",exp(n-count)%mod);
|
||||
}
|
||||
return 0;
|
||||
}
|
138
HDOJ/3462_autoAC.cpp
Normal file
138
HDOJ/3462_autoAC.cpp
Normal file
|
@ -0,0 +1,138 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
#define inf 1000000000
|
||||
struct edge
|
||||
{
|
||||
int to,cost,next;
|
||||
int T, mod;
|
||||
}e[32000];
|
||||
struct node
|
||||
{
|
||||
int x,y,z;
|
||||
node(int _x=0, int _y=0, int _z=0):x(_x),y(_y),z(_z){}
|
||||
bool operator<(const node& a)const
|
||||
{
|
||||
return y>a.y;
|
||||
}
|
||||
};
|
||||
priority_queue<node> que;
|
||||
bool visit[4000];
|
||||
int dis[4000][2];
|
||||
int pre[4000];
|
||||
int next[8000];
|
||||
int n,m,num;
|
||||
int a[40][40];
|
||||
void addedge(int from, int to, int cost, int T, int mod)
|
||||
{
|
||||
e[num].to=to;e[num].cost=cost;
|
||||
e[num].T=T;e[num].mod=mod;
|
||||
e[num].next=pre[from];
|
||||
pre[from]=num;
|
||||
num++;
|
||||
}
|
||||
void make_map()
|
||||
{
|
||||
num=1;
|
||||
memset(pre, 0, sizeof(pre));
|
||||
for (int i=0; i<n; i++)
|
||||
for (int j=0; j<m; j++)
|
||||
{
|
||||
addedge(4*i*m+4*j, 4*i*m+4*j+1, 1, a[i][j], 1);addedge(4*i*m+4*j+1, 4*i*m+4*j, 1, a[i][j], 1);
|
||||
addedge(4*i*m+4*j, 4*i*m+4*j+2, 1, a[i][j], 0);addedge(4*i*m+4*j+2, 4*i*m+4*j, 1, a[i][j], 0);
|
||||
addedge(4*i*m+4*j+3, 4*i*m+4*j+1, 1, a[i][j],0);addedge(4*i*m+4*j+1, 4*i*m+4*j+3, 1, a[i][j], 0);
|
||||
addedge(4*i*m+4*j+3, 4*i*m+4*j+2, 1, a[i][j],1);addedge(4*i*m+4*j+2, 4*i*m+4*j+3, 1, a[i][j], 1);
|
||||
if (j!=m-1)
|
||||
{
|
||||
addedge(4*i*m+4*j+1,4*i*m+4*(j+1),2,0,0);addedge(4*i*m+4*(j+1),4*i*m+4*j+1,2,0,0);
|
||||
addedge(4*i*m+4*j+3,4*i*m+4*(j+1)+2,2,0,0);addedge(4*i*m+4*(j+1)+2,4*i*m+4*j+3,2,0,0);
|
||||
}
|
||||
if (i!=n-1)
|
||||
{
|
||||
addedge(4*i*m+4*j+2,4*(i+1)*m+4*j,1,0,0);addedge(4*(i+1)*m+4*j,4*i*m+4*j+2,1,0,0);
|
||||
addedge(4*i*m+4*j+3,4*(i+1)*m+4*j+1,1,0,0);addedge(4*(i+1)*m+4*j+1,4*i*m+4*j+3,1,0,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
void get_in(int to,int cost,int id)
|
||||
{
|
||||
if (dis[to][id]<=cost||dis[to][0]<=cost) return;
|
||||
dis[to][id]=cost;
|
||||
que.push(node(to,cost,id));
|
||||
}
|
||||
int dfs(int x,int tt)
|
||||
{
|
||||
while(!que.empty()) que.pop();
|
||||
for (int i=0;i<4*n*m;i++)
|
||||
{
|
||||
visit[i]=0;
|
||||
dis[i][0]=dis[i][1]=inf;
|
||||
}
|
||||
que.push(node(x,tt,0));
|
||||
while(!que.empty())
|
||||
{
|
||||
node out=que.top();
|
||||
que.pop();
|
||||
int x=out.x,y=out.y,z=out.z;
|
||||
if (visit[x]) continue;
|
||||
if (z==0)
|
||||
visit[x]=1;
|
||||
if (x==4*n*m-1) break;
|
||||
for (int i=pre[x]; i!=0; i=e[i].next)
|
||||
if (!visit[e[i].to])
|
||||
{
|
||||
int ty;
|
||||
if (e[i].T==0)
|
||||
{
|
||||
ty=y+e[i].cost;
|
||||
get_in(e[i].to,ty,z);
|
||||
}
|
||||
else
|
||||
{
|
||||
int tmp=(y+e[i].T-1)/e[i].T;
|
||||
if (y%e[i].T==0) tmp++;
|
||||
if (tmp%2==e[i].mod)
|
||||
{
|
||||
ty=y+1;
|
||||
get_in(e[i].to,ty,z);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (z==0)
|
||||
{
|
||||
ty=y+1;
|
||||
get_in(e[i].to,ty,1);
|
||||
}
|
||||
ty=y+e[i].T-y%e[i].T+1;
|
||||
get_in(e[i].to,ty,z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return min(dis[4*n*m-1][0],dis[4*n*m-1][1]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while (scanf("%d%d",&n,&m)!=EOF)
|
||||
{
|
||||
n--;m--;
|
||||
for (int i=0; i<n; i++)
|
||||
for (int j=0; j<m; j++)
|
||||
scanf("%d",&a[i][j]);
|
||||
make_map();
|
||||
char tt[50];
|
||||
int ta,tb;
|
||||
scanf("%s",tt);
|
||||
for (int i=0;tt[i];i++)
|
||||
if (tt[i]==':') tt[i]=' ';
|
||||
sscanf(tt,"%d %d",&ta,&tb);
|
||||
ta=ta*60+tb;
|
||||
int ans=dfs(0,ta);
|
||||
ta=ans/60;
|
||||
tb=ans%60;
|
||||
printf("%02d:%02d\n",ta,tb);
|
||||
}
|
||||
return 0;
|
||||
}
|
138
HDOJ/3463_autoAC.cpp
Normal file
138
HDOJ/3463_autoAC.cpp
Normal file
|
@ -0,0 +1,138 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
#define inf 1000000000
|
||||
struct edge
|
||||
{
|
||||
int to,cost,next;
|
||||
int T, mod;
|
||||
}e[32000];
|
||||
struct node
|
||||
{
|
||||
int x,y,z;
|
||||
node(int _x=0, int _y=0, int _z=0):x(_x),y(_y),z(_z){}
|
||||
bool operator<(const node& a)const
|
||||
{
|
||||
return y>a.y;
|
||||
}
|
||||
};
|
||||
priority_queue<node> que;
|
||||
bool visit[4000];
|
||||
int dis[4000][2];
|
||||
int pre[4000];
|
||||
int next[8000];
|
||||
int n,m,num;
|
||||
int a[40][40];
|
||||
void addedge(int from, int to, int cost, int T, int mod)
|
||||
{
|
||||
e[num].to=to;e[num].cost=cost;
|
||||
e[num].T=T;e[num].mod=mod;
|
||||
e[num].next=pre[from];
|
||||
pre[from]=num;
|
||||
num++;
|
||||
}
|
||||
void make_map()
|
||||
{
|
||||
num=1;
|
||||
memset(pre, 0, sizeof(pre));
|
||||
for (int i=0; i<n; i++)
|
||||
for (int j=0; j<m; j++)
|
||||
{
|
||||
addedge(4*i*m+4*j, 4*i*m+4*j+1, 1, a[i][j], 1);addedge(4*i*m+4*j+1, 4*i*m+4*j, 1, a[i][j], 1);
|
||||
addedge(4*i*m+4*j, 4*i*m+4*j+2, 1, a[i][j], 0);addedge(4*i*m+4*j+2, 4*i*m+4*j, 1, a[i][j], 0);
|
||||
addedge(4*i*m+4*j+3, 4*i*m+4*j+1, 1, a[i][j],0);addedge(4*i*m+4*j+1, 4*i*m+4*j+3, 1, a[i][j], 0);
|
||||
addedge(4*i*m+4*j+3, 4*i*m+4*j+2, 1, a[i][j],1);addedge(4*i*m+4*j+2, 4*i*m+4*j+3, 1, a[i][j], 1);
|
||||
if (j!=m-1)
|
||||
{
|
||||
addedge(4*i*m+4*j+1,4*i*m+4*(j+1),2,0,0);addedge(4*i*m+4*(j+1),4*i*m+4*j+1,2,0,0);
|
||||
addedge(4*i*m+4*j+3,4*i*m+4*(j+1)+2,2,0,0);addedge(4*i*m+4*(j+1)+2,4*i*m+4*j+3,2,0,0);
|
||||
}
|
||||
if (i!=n-1)
|
||||
{
|
||||
addedge(4*i*m+4*j+2,4*(i+1)*m+4*j,1,0,0);addedge(4*(i+1)*m+4*j,4*i*m+4*j+2,1,0,0);
|
||||
addedge(4*i*m+4*j+3,4*(i+1)*m+4*j+1,1,0,0);addedge(4*(i+1)*m+4*j+1,4*i*m+4*j+3,1,0,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
void get_in(int to,int cost,int id)
|
||||
{
|
||||
if (dis[to][id]<=cost||dis[to][0]<=cost) return;
|
||||
dis[to][id]=cost;
|
||||
que.push(node(to,cost,id));
|
||||
}
|
||||
int dfs(int x,int tt)
|
||||
{
|
||||
while(!que.empty()) que.pop();
|
||||
for (int i=0;i<4*n*m;i++)
|
||||
{
|
||||
visit[i]=0;
|
||||
dis[i][0]=dis[i][1]=inf;
|
||||
}
|
||||
que.push(node(x,tt,0));
|
||||
while(!que.empty())
|
||||
{
|
||||
node out=que.top();
|
||||
que.pop();
|
||||
int x=out.x,y=out.y,z=out.z;
|
||||
if (visit[x]) continue;
|
||||
if (z==0)
|
||||
visit[x]=1;
|
||||
if (x==4*n*m-1) break;
|
||||
for (int i=pre[x]; i!=0; i=e[i].next)
|
||||
if (!visit[e[i].to])
|
||||
{
|
||||
int ty;
|
||||
if (e[i].T==0)
|
||||
{
|
||||
ty=y+e[i].cost;
|
||||
get_in(e[i].to,ty,z);
|
||||
}
|
||||
else
|
||||
{
|
||||
int tmp=(y+e[i].T-1)/e[i].T;
|
||||
if (y%e[i].T==0) tmp++;
|
||||
if (tmp%2==e[i].mod)
|
||||
{
|
||||
ty=y+1;
|
||||
get_in(e[i].to,ty,z);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (z==0)
|
||||
{
|
||||
ty=y+1;
|
||||
get_in(e[i].to,ty,1);
|
||||
}
|
||||
ty=y+e[i].T-y%e[i].T+1;
|
||||
get_in(e[i].to,ty,z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return min(dis[4*n*m-1][0],dis[4*n*m-1][1]);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while (scanf("%d%d",&n,&m)!=EOF)
|
||||
{
|
||||
n--;m--;
|
||||
for (int i=0; i<n; i++)
|
||||
for (int j=0; j<m; j++)
|
||||
scanf("%d",&a[i][j]);
|
||||
make_map();
|
||||
char tt[50];
|
||||
int ta,tb;
|
||||
scanf("%s",tt);
|
||||
for (int i=0;tt[i];i++)
|
||||
if (tt[i]==':') tt[i]=' ';
|
||||
sscanf(tt,"%d %d",&ta,&tb);
|
||||
ta=ta*60+tb;
|
||||
int ans=dfs(0,ta);
|
||||
ta=ans/60;
|
||||
tb=ans%60;
|
||||
printf("%02d:%02d\n",ta,tb);
|
||||
}
|
||||
return 0;
|
||||
}
|
61
HDOJ/3464_autoAC.cpp
Normal file
61
HDOJ/3464_autoAC.cpp
Normal file
|
@ -0,0 +1,61 @@
|
|||
#include <stdio.h>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int mod=100007;
|
||||
int dp[30];
|
||||
int succ[mod],cycle;
|
||||
void get_T(int m)
|
||||
{
|
||||
int cnt=1;
|
||||
memset(succ,-1,sizeof(succ));
|
||||
succ[0]=0;
|
||||
int now=0;
|
||||
while(1)
|
||||
{
|
||||
now=(now*10+2)%m;
|
||||
if (succ[now]!=-1)
|
||||
{
|
||||
cycle=cnt-succ[now];
|
||||
break;
|
||||
}
|
||||
succ[now]=cnt++;
|
||||
}
|
||||
}
|
||||
int cal(int x,int m)
|
||||
{
|
||||
if (x==1) return 1;
|
||||
get_T(m);
|
||||
int tmp=cal(x-1,cycle);
|
||||
int now=0;
|
||||
while(tmp--)
|
||||
{
|
||||
now=now*10+2;
|
||||
if (now>=m)
|
||||
{
|
||||
int t=(now-mod)/m;
|
||||
now=now-t*m;
|
||||
}
|
||||
}
|
||||
return now;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
for (int i=1;i<10;i++)
|
||||
{
|
||||
dp[i]=(9*cal(i,mod)+1)%mod;
|
||||
}
|
||||
int n;
|
||||
while(scanf("%d",&n)!=EOF)
|
||||
{
|
||||
int ans;
|
||||
if (n<=9)
|
||||
ans=n==1?1:dp[n-1];
|
||||
else
|
||||
if (n%2==1)
|
||||
ans=dp[8];
|
||||
else ans=dp[7];
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
79
HDOJ/3465_autoAC.cpp
Normal file
79
HDOJ/3465_autoAC.cpp
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <queue>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define lowbit(x) (x&(-x))
|
||||
const int maxn=5e4+10;
|
||||
struct node{
|
||||
double a,b;
|
||||
int num;
|
||||
}e[maxn];
|
||||
double l,r;
|
||||
int c[maxn];
|
||||
int cmp1(node x,node y)
|
||||
{
|
||||
if(x.a==y.a)return x.b<y.b;
|
||||
return x.a<y.a;
|
||||
}
|
||||
int cmp2(node x,node y)
|
||||
{
|
||||
if(x.b==y.b)return x.a>y.a;
|
||||
return x.b>y.b;
|
||||
}
|
||||
void add(int x,int val)
|
||||
{
|
||||
while(x<maxn)
|
||||
{
|
||||
c[x]+=val;
|
||||
x+=lowbit(x);
|
||||
}
|
||||
}
|
||||
int sum(int x)
|
||||
{
|
||||
int s=0;
|
||||
while(x>0)
|
||||
{
|
||||
s+=c[x];
|
||||
x-=lowbit(x);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
while(scanf("%d",&n)!=EOF)
|
||||
{
|
||||
int t,tt,i,j,ans=0;
|
||||
double x1,y1,x2,y2,k,b;
|
||||
t=tt=0;
|
||||
scanf("%lf%lf",&l,&r);
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
|
||||
if(x1==x2)
|
||||
{
|
||||
if(x1<r&&x1>l)tt++;
|
||||
continue;
|
||||
}
|
||||
k=(y2-y1)/(x2-x1);
|
||||
b=y1-k*x1;
|
||||
e[t].a=l*k+b;
|
||||
e[t++].b=r*k+b;
|
||||
}
|
||||
sort(e,e+t,cmp1);
|
||||
for(i=0;i<t;i++)
|
||||
e[i].num=i+1;
|
||||
sort(e,e+t,cmp2);
|
||||
memset(c,0,sizeof(c));
|
||||
for(i=0;i<t;i++)
|
||||
{
|
||||
add(e[i].num,1);
|
||||
ans+=sum(e[i].num-1);
|
||||
}
|
||||
printf("%d\n",ans+tt*t);
|
||||
}
|
||||
return 0;
|
||||
}
|
46
HDOJ/3466_autoAC.cpp
Normal file
46
HDOJ/3466_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <map>
|
||||
#define LL long long
|
||||
using namespace std;
|
||||
typedef struct
|
||||
{
|
||||
int p,q,v;
|
||||
}item;
|
||||
const int N = 510;
|
||||
const int M = 5010;
|
||||
int n,m;
|
||||
item t[N];
|
||||
int dp[M];
|
||||
void zero_dp(int i)
|
||||
{
|
||||
for(int j = m; j >= t[i].p && j >= t[i].q; j--)
|
||||
dp[j] = max(dp[j], dp[j-t[i].p]+t[i].v);
|
||||
}
|
||||
int cmp(const void *a, const void *b)
|
||||
{
|
||||
item *aa = (item *)a, *bb = (item *)b;
|
||||
return (aa->q-aa->p) - (bb->q-bb->p);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,k;
|
||||
while(~scanf("%d%d", &n, &m))
|
||||
{
|
||||
for(i = 0; i < n; i++)
|
||||
{
|
||||
scanf("%d%d%d", &t[i].p, &t[i].q, &t[i].v);
|
||||
if(t[i].q > m) i--,n--;
|
||||
}
|
||||
qsort(t, n, sizeof(t[0]), cmp);
|
||||
memset(dp, 0, sizeof(dp));
|
||||
for(i = 0; i < n; i++)
|
||||
zero_dp(i);
|
||||
printf("%d\n", dp[m]);
|
||||
}
|
||||
return 0;
|
||||
}
|
218
HDOJ/3467_autoAC.cpp
Normal file
218
HDOJ/3467_autoAC.cpp
Normal file
|
@ -0,0 +1,218 @@
|
|||
#include <cstdio>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
const int maxn = 10;
|
||||
const double eps = 1e-8;
|
||||
const double PI = acos(-1.0);
|
||||
int dcmp(double x)
|
||||
{ return (x > eps) - (x < -eps); }
|
||||
struct Point
|
||||
{
|
||||
double x, y;
|
||||
Point(double x=0, double y=0):x(x), y(y) {}
|
||||
void read() { scanf("%lf%lf", &x, &y); }
|
||||
};
|
||||
typedef Point Vector;
|
||||
Point operator + (const Vector& a, const Vector& b)
|
||||
{ return Point(a.x+b.x, a.y+b.y); }
|
||||
Point operator - (const Vector& a, const Vector& b)
|
||||
{ return Point(a.x-b.x, a.y-b.y); }
|
||||
Vector operator * (const Vector& a, double p)
|
||||
{ return Point(a.x*p, a.y*p); }
|
||||
Vector operator / (const Vector& a, double p)
|
||||
{ return Point(a.x/p, a.y/p); }
|
||||
bool operator == (const Point& a, const Point& b)
|
||||
{ return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0; }
|
||||
double Dot(const Vector& a, const Vector& b)
|
||||
{ return a.x*b.x + a.y*b.y; }
|
||||
double Cross(const Vector& a, const Vector& b)
|
||||
{ return a.x*b.y - a.y*b.x; }
|
||||
double Length(const Vector& a)
|
||||
{ return sqrt(Dot(a, a)); }
|
||||
Vector unit(const Vector& a)
|
||||
{ return a / Length(a); }
|
||||
Vector Normal(const Vector& a)
|
||||
{
|
||||
double l = Length(a);
|
||||
return Vector(-a.y/l, a.x/l);
|
||||
}
|
||||
double Angle(const Vector& a)
|
||||
{ return atan2(a.y, a.x); }
|
||||
Point Rotate(const Point& p, double angle, const Point& o = Point(0, 0))
|
||||
{
|
||||
Vector t = p - o;
|
||||
t = Vector(t.x*cos(angle)-t.y*sin(angle), t.x*sin(angle)+t.y*cos(angle));
|
||||
return t + o;
|
||||
}
|
||||
struct Region
|
||||
{
|
||||
double st, ed;
|
||||
Region(double s=0, double e=0):st(s), ed(e) {}
|
||||
};
|
||||
struct Circle
|
||||
{
|
||||
Point c;
|
||||
double r;
|
||||
Circle() {}
|
||||
Circle(Point c, double r):c(c), r(r) {}
|
||||
void read() { c.read(); scanf("%lf", &r); }
|
||||
double area() const { return PI * r * r; }
|
||||
bool contain(const Circle& rhs) const
|
||||
{ return dcmp(Length(c-rhs.c) + rhs.r - r) <= 0; }
|
||||
bool contain(const Point& p) const
|
||||
{ return dcmp(Length(c-p) - r) <= 0; }
|
||||
bool intersect(const Circle& rhs) const
|
||||
{ return dcmp(Length(c-rhs.c) - r - rhs.r) < 0; }
|
||||
bool tangency(const Circle& rhs) const
|
||||
{ return dcmp(Length(c-rhs.c) - r - rhs.r) == 0; }
|
||||
Point get_point(double ang) const
|
||||
{ return Point(c.x + r * cos(ang), c.y + r * sin(ang)); }
|
||||
};
|
||||
void IntersectionPoint(const Circle& c1, const Circle& c2, Point& p1, Point& p2)
|
||||
{
|
||||
double d = Length(c1.c - c2.c);
|
||||
double l = (c1.r*c1.r + d*d - c2.r*c2.r) / (2 * d);
|
||||
double h = sqrt(c1.r*c1.r - l*l);
|
||||
Point mid = c1.c + unit(c2.c-c1.c) * l;
|
||||
Vector t = Normal(c2.c - c1.c) * h;
|
||||
p1 = mid + t;
|
||||
p2 = mid - t;
|
||||
}
|
||||
double IntersectionArea(const Circle& c1, const Circle& c2)
|
||||
{
|
||||
double area = 0.0;
|
||||
const Circle& M = c1.r > c2.r ? c1 : c2;
|
||||
const Circle& N = c1.r > c2.r ? c2 : c1;
|
||||
double d = Length(c1.c-c2.c);
|
||||
if(d < M.r + N.r && d > M.r - N.r)
|
||||
{
|
||||
double Alpha = 2.0 * acos((M.r*M.r + d*d - N.r*N.r) / (2 * M.r * d));
|
||||
double Beta = 2.0 * acos((N.r*N.r + d*d - M.r*M.r) / (2 * N.r * d));
|
||||
area = ( M.r*M.r*(Alpha - sin(Alpha)) + N.r*N.r*(Beta - sin(Beta)) ) / 2.0;
|
||||
}
|
||||
else if(d <= M.r - N.r) area = N.area();
|
||||
return area;
|
||||
}
|
||||
struct Region_vector
|
||||
{
|
||||
int n;
|
||||
Region v[5];
|
||||
void clear() { n = 0; }
|
||||
void add(const Region& r) { v[n++] = r; }
|
||||
} *last, *cur;
|
||||
Circle cir[maxn];
|
||||
bool del[maxn];
|
||||
double r;
|
||||
int n = 5;
|
||||
bool IsOnlyOnePoint()
|
||||
{
|
||||
bool flag = false;
|
||||
Point t;
|
||||
for(int i = 0; i < n; ++i)
|
||||
{
|
||||
for(int j = i + 1; j < n; ++j)
|
||||
{
|
||||
if(cir[i].tangency(cir[j]))
|
||||
{
|
||||
t = (cir[i].c + cir[j].c) / 2;
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!flag) return false;
|
||||
for(int i = 0; i < n; ++i)
|
||||
if(!cir[i].contain(t)) return false;
|
||||
printf("Only the point (%.2f, %.2f) is for victory.\n", t.x, t.y);
|
||||
return true;
|
||||
}
|
||||
bool solve()
|
||||
{
|
||||
if(IsOnlyOnePoint()) return true;
|
||||
memset(del, false, sizeof(del));
|
||||
for(int i = 0; i < n; ++i)
|
||||
for(int j = 0; j < n; ++j)
|
||||
{
|
||||
if(del[j] || i == j) continue;
|
||||
if(cir[i].contain(cir[j]))
|
||||
{
|
||||
del[i] = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
double ans = 0.0;
|
||||
for(int i = 0; i < n; ++i)
|
||||
{
|
||||
if(del[i]) continue;
|
||||
last->clear();
|
||||
Point p1, p2;
|
||||
for(int j = 0; j < n; ++j)
|
||||
{
|
||||
if(del[j] || i == j) continue;
|
||||
if(!cir[i].intersect(cir[j])) return false;
|
||||
cur->clear();
|
||||
IntersectionPoint(cir[i], cir[j], p1, p2);
|
||||
double rs = Angle(p2 - cir[i].c);
|
||||
double rt = Angle(p1 - cir[i].c);
|
||||
if(dcmp(rs) < 0) rs += 2 * PI;
|
||||
if(dcmp(rt) < 0) rt += 2 * PI;
|
||||
if(last->n == 0)
|
||||
{
|
||||
if(dcmp(rt - rs) < 0)
|
||||
{
|
||||
cur->add(Region(rs, 2*PI));
|
||||
cur->add(Region(0, rt));
|
||||
}
|
||||
else cur->add(Region(rs, rt));
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int k = 0; k < last->n; ++k)
|
||||
{
|
||||
if(dcmp(rt - rs) < 0)
|
||||
{
|
||||
if(dcmp(last->v[k].st-rt) >= 0 && dcmp(last->v[k].ed-rs) <= 0) continue;
|
||||
if(dcmp(last->v[k].st-rt) < 0) cur->add(Region(last->v[k].st, std::min(last->v[k].ed, rt)));
|
||||
if(dcmp(last->v[k].ed-rs) > 0) cur->add(Region(std::max(last->v[k].st, rs), last->v[k].ed));
|
||||
}
|
||||
else
|
||||
{
|
||||
if(dcmp(rt-last->v[k].st <= 0 || dcmp(rs-last->v[k].ed) >= 0)) continue;
|
||||
cur->add(Region(std::max(rs, last->v[k].st), std::min(rt, last->v[k].ed)));
|
||||
}
|
||||
}
|
||||
}
|
||||
std::swap(cur, last);
|
||||
if(last->n == 0) break;
|
||||
}
|
||||
for(int j = 0; j < last->n; ++j)
|
||||
{
|
||||
p1 = cir[i].get_point(last->v[j].st);
|
||||
p2 = cir[i].get_point(last->v[j].ed);
|
||||
ans += Cross(p1, p2) / 2;
|
||||
double ang = last->v[j].ed - last->v[j].st;
|
||||
ans += cir[i].r * cir[i].r * (ang - sin(ang)) / 2;
|
||||
}
|
||||
}
|
||||
if(dcmp(ans) == 0) return false;
|
||||
printf("The total possible area is %.2f.\n", ans);
|
||||
return true;
|
||||
}
|
||||
int main(void)
|
||||
{
|
||||
last = new Region_vector;
|
||||
cur = new Region_vector;
|
||||
while(scanf("%lf", &r) == 1)
|
||||
{
|
||||
Point t;
|
||||
for(int i = 0; i < n; ++i)
|
||||
{
|
||||
t.read();
|
||||
cir[i] = Circle(t, r);
|
||||
}
|
||||
if(!solve())
|
||||
puts("Poor iSea, maybe 2012 is coming!");
|
||||
}
|
||||
return 0;
|
||||
}
|
197
HDOJ/3468_autoAC.cpp
Normal file
197
HDOJ/3468_autoAC.cpp
Normal file
|
@ -0,0 +1,197 @@
|
|||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <queue>
|
||||
#include <cstdlib>
|
||||
#include <cctype>
|
||||
#define MAXN 105*105*2
|
||||
#define MAXM 105*105*100
|
||||
#define inf 0x3f3f3f3f
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int u,v,f;
|
||||
};
|
||||
node e[MAXM];
|
||||
int first[MAXN],ne[MAXM];
|
||||
int gap[MAXN],d[MAXN],curedge[MAXN],pre[MAXN];
|
||||
int cc, n,m;
|
||||
inline void add_edge(int u,int v,int f)
|
||||
{
|
||||
e[cc].u=u;
|
||||
e[cc].v=v;
|
||||
e[cc].f=f;
|
||||
ne[cc]=first[u];
|
||||
first[u]=cc;
|
||||
cc++;
|
||||
e[cc].u=v;
|
||||
e[cc].v=u;
|
||||
e[cc].f=0;
|
||||
ne[cc]=first[v];
|
||||
first[v]=cc;
|
||||
cc++;
|
||||
}
|
||||
int ISAP(int s,int t,int n)
|
||||
{
|
||||
int cur_flow,flow_ans=0,u,tmp,neck,i,v;
|
||||
memset(d,0,sizeof(d));
|
||||
memset(gap,0,sizeof(gap));
|
||||
memset(pre,-1,sizeof(pre));
|
||||
for(i=0;i<=n;i++)
|
||||
curedge[i]=first[i];
|
||||
gap[0]=n+1;
|
||||
u=s;
|
||||
while(d[s]<=n)
|
||||
{
|
||||
if(u==t)
|
||||
{
|
||||
cur_flow=inf;
|
||||
for(i=s;i!=t;i=e[curedge[i]].v)
|
||||
{
|
||||
if(cur_flow>e[curedge[i]].f)
|
||||
{
|
||||
neck=i;
|
||||
cur_flow=e[curedge[i]].f;
|
||||
}
|
||||
}
|
||||
for(i=s;i!=t;i=e[curedge[i]].v)
|
||||
{
|
||||
tmp=curedge[i];
|
||||
e[tmp].f-=cur_flow;
|
||||
e[tmp^1].f+=cur_flow;
|
||||
}
|
||||
flow_ans+=cur_flow;
|
||||
u=neck;
|
||||
}
|
||||
for(i=curedge[u];i!=-1;i=ne[i])
|
||||
{
|
||||
v=e[i].v;
|
||||
if(e[i].f&&d[u]==d[v]+1)
|
||||
break;
|
||||
}
|
||||
if(i!=-1)
|
||||
{
|
||||
curedge[u]=i;
|
||||
pre[v]=u;
|
||||
u=v;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(0==--gap[d[u]])
|
||||
break;
|
||||
curedge[u]=first[u];
|
||||
for(tmp=n+5,i=first[u];i!=-1;i=ne[i])
|
||||
if(e[i].f)
|
||||
tmp=min(tmp,d[e[i].v]);
|
||||
d[u]=tmp+1;
|
||||
++gap[d[u]];
|
||||
if(u!=s)
|
||||
u=pre[u];
|
||||
}
|
||||
}
|
||||
return flow_ans;
|
||||
}
|
||||
char map[105][105];
|
||||
int rally[105*105];
|
||||
int gold[105*105];
|
||||
int pos[105*105];
|
||||
int dist[55][105*105];
|
||||
int vis[105][105];
|
||||
int xx[4]={0,1,0,-1};
|
||||
int yy[4]={1,0,-1,0};
|
||||
int trans(char word)
|
||||
{
|
||||
if(word>='A'&&word<='Z')
|
||||
return word-'A';
|
||||
else
|
||||
return word-'a'+26;
|
||||
}
|
||||
void bfs(int s)
|
||||
{
|
||||
queue<int> q;
|
||||
memset(vis,0,sizeof(vis));
|
||||
memset(dist[s],inf,sizeof(dist[s]));
|
||||
int t=pos[s];
|
||||
vis[t/m][t%m]=1;
|
||||
q.push(t);
|
||||
dist[s][t]=0;
|
||||
while(!q.empty())
|
||||
{
|
||||
int u=q.front();
|
||||
q.pop();
|
||||
int x=u/m;
|
||||
int y=u%m;
|
||||
int i;
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
int nx=x+xx[i];
|
||||
int ny=y+yy[i];
|
||||
if(nx<0||nx>=n||ny<0||ny>=m)
|
||||
continue;
|
||||
if(vis[nx][ny]||map[nx][ny]=='#')
|
||||
continue;
|
||||
vis[nx][ny]=1;
|
||||
dist[s][nx*m+ny]=dist[s][x*m+y]+1;
|
||||
q.push(nx*m+ny);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&m)!=EOF)
|
||||
{
|
||||
memset(first,-1,sizeof(first));
|
||||
memset(ne,-1,sizeof(ne));
|
||||
cc=0;
|
||||
memset(pos,0,sizeof(pos));
|
||||
int i,j;
|
||||
int cnt1=0;
|
||||
int cnt2=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
scanf("%s",map[i]);
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
if(isalpha(map[i][j]))
|
||||
{
|
||||
pos[trans(map[i][j])]=i*m+j;
|
||||
cnt1++;
|
||||
}
|
||||
else if(map[i][j]=='*')
|
||||
{
|
||||
gold[cnt2]=i*m+j;
|
||||
cnt2++;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i=0;i<cnt1;i++)
|
||||
bfs(i);
|
||||
int flag=1;
|
||||
for(i=1;i<=cnt1-1;i++)
|
||||
{
|
||||
for(j=0;j<cnt2;j++)
|
||||
{
|
||||
if(dist[i][gold[j]]+dist[i-1][gold[j]]==dist[i-1][pos[i]])
|
||||
{
|
||||
add_edge(i,cnt1+j,1);
|
||||
}
|
||||
if(dist[i-1][pos[i]]==inf)
|
||||
{
|
||||
flag=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!flag)
|
||||
{
|
||||
printf("-1\n");
|
||||
continue;
|
||||
}
|
||||
int s=0,t=cnt1+cnt2;
|
||||
for(i=1;i<=cnt1-1;i++)
|
||||
add_edge(s,i,1);
|
||||
for(i=0;i<cnt2;i++)
|
||||
add_edge(cnt1+i,t,1);
|
||||
int res=ISAP(s,t,t);
|
||||
printf("%d\n",res);
|
||||
}
|
||||
return 0;
|
||||
}
|
19
HDOJ/3469_autoAC.cpp
Normal file
19
HDOJ/3469_autoAC.cpp
Normal file
|
@ -0,0 +1,19 @@
|
|||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
int main()
|
||||
{
|
||||
int t, n, re, i;
|
||||
scanf("%d", &t);
|
||||
for(i=1; i<=t; i++)
|
||||
{
|
||||
scanf("%d", &n);
|
||||
if(n==1)
|
||||
re=1;
|
||||
else if(n==2)
|
||||
re=2;
|
||||
else
|
||||
re=2*n-4;
|
||||
printf("Case %d: %d\n", i, re);
|
||||
}
|
||||
return 0;
|
||||
}
|
76
HDOJ/3470_autoAC.cpp
Normal file
76
HDOJ/3470_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include <stdio.h>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#define maxn 1000010
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
int width,height,n;
|
||||
int L,R,U,D,v;
|
||||
bool diffx,diffy;
|
||||
int idx[maxn],idy[maxn];
|
||||
char ch[10];
|
||||
void init(int id[],int n)
|
||||
{
|
||||
id[0]=id[n]=0;
|
||||
for (int i=1;i<n;i++)
|
||||
id[i]=1;
|
||||
}
|
||||
int fold(int id[], int &L, int &R, int v, bool &diff)
|
||||
{
|
||||
bool dir=false;
|
||||
int ret;
|
||||
v+=L;
|
||||
ret=id[v];
|
||||
if (abs(L-v)>abs(R-v)) diff=!diff,dir=true;
|
||||
for (int x=v,y=v;x!=L&&y!=R;x--,y++)
|
||||
{
|
||||
if (!dir)
|
||||
{
|
||||
id[y]+=id[x];
|
||||
id[x]=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
id[x]+=id[y];
|
||||
id[y]=0;
|
||||
}
|
||||
}
|
||||
if (!dir) L=v;
|
||||
else R=v;
|
||||
return ret;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int test;
|
||||
scanf("%d",&test);
|
||||
for (int ii=1;ii<=test;ii++)
|
||||
{
|
||||
scanf("%d%d",&width,&height);
|
||||
scanf("%d",&n);
|
||||
diffx=diffy=0;
|
||||
L=D=0;U=height;R=width;
|
||||
init(idx,width);
|
||||
init(idy,height);
|
||||
LL ans=0;
|
||||
for (int i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%s%d",ch,&v);
|
||||
if (ch[0]=='L'||ch[0]=='R')
|
||||
{
|
||||
if (diffx) v=R-L-v;
|
||||
if (!diffx && ch[0]=='R') diffx=!diffx;
|
||||
if (diffx && ch[0]=='L') diffx=!diffx;
|
||||
ans+=(LL)height*fold(idx, L, R, v, diffx);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (diffy) v=U-D-v;
|
||||
if (!diffy && ch[0]=='U') diffy=!diffy;
|
||||
if (diffy && ch[0]=='D') diffy=!diffy;
|
||||
ans+=(LL)width*fold(idy, D, U, v, diffy);
|
||||
}
|
||||
}
|
||||
printf("Case %d: %I64d\n",ii,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
76
HDOJ/3471_autoAC.cpp
Normal file
76
HDOJ/3471_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cctype>
|
||||
#include <cstdlib>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#define MAX 1<<30
|
||||
using namespace std;
|
||||
const double eps=1e-8;
|
||||
typedef long long ll;
|
||||
int main()
|
||||
{
|
||||
typedef struct
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
double z;
|
||||
} plus;
|
||||
plus r[100],xa[100],p[100];
|
||||
int t,i,j,k,ca=0;
|
||||
double temp[6],pp[100];
|
||||
plus o,v,m,f;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%lf%lf%lf",&o.x,&o.y,&o.z);
|
||||
scanf("%lf%lf%lf",&v.x,&v.y,&v.z);
|
||||
printf("Case %d: ",++ca);
|
||||
for(i=0;i<8;i++)
|
||||
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
|
||||
m.x=p[4].x-p[0].x;
|
||||
m.y=p[4].y-p[0].y;
|
||||
m.z=p[4].z-p[0].z;
|
||||
if(m.x*v.x+m.y*v.y+m.z*v.z<=eps)
|
||||
{
|
||||
printf("Intelligent Larrionda!!!\n");
|
||||
continue;
|
||||
}
|
||||
temp[0] =( (p[0].x-o.x)*m.x+(p[0].y-o.y)*m.y+(p[0].z-o.z)*m.z )/(m.x*v.x+m.y*v.y+m.z*v.z);
|
||||
temp[1] =( (p[4].x-o.x)*m.x+(p[4].y-o.y)*m.y+(p[4].z-o.z)*m.z )/(m.x*v.x+m.y*v.y+m.z*v.z);
|
||||
if(temp[0]<=eps&&temp[1]<=eps)
|
||||
{
|
||||
printf("Intelligent Larrionda!!!\n");
|
||||
continue;
|
||||
}
|
||||
f.x = o.x + temp[0]*v.x;
|
||||
f.y = o.y + temp[0]*v.y;
|
||||
f.z = o.z + temp[0]*v.z;
|
||||
for(i=0;i<4;i++)
|
||||
{
|
||||
r[i].x = p[i].x - f.x;
|
||||
r[i].y = p[i].y - f.y;
|
||||
r[i].z = p[i].z - f.z;
|
||||
}
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
xa[i].x= r[i+1].z*r[i].y-r[i+1].y*r[i].z;
|
||||
xa[i].y= r[i+1].x*r[i].z-r[i+1].z*r[i].x;
|
||||
xa[i].z= r[i+1].y*r[i].x-r[i+1].x*r[i].y;
|
||||
}
|
||||
xa[3].x=-( r[3].z*r[0].y-r[3].y*r[0].z);
|
||||
xa[3].y=-( r[3].x*r[0].z-r[3].z*r[0].x);
|
||||
xa[3].z=-( r[3].y*r[0].x-r[3].x*r[0].y);
|
||||
for(i=0;i<3;i++)
|
||||
{
|
||||
if(xa[i].x*xa[i+1].x+xa[i].y*xa[i+1].y+xa[i].z*xa[i+1].z>0);
|
||||
else
|
||||
{printf("Intelligent Larrionda!!!\n");break;}
|
||||
}
|
||||
if(i==3)
|
||||
printf("Stupid Larrionda!!!\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
189
HDOJ/3472_autoAC.cpp
Normal file
189
HDOJ/3472_autoAC.cpp
Normal file
|
@ -0,0 +1,189 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
using namespace std;
|
||||
const int MAXN = 30;
|
||||
const int MAXM = 10000;
|
||||
const int INF = 0x3f3f3f3f;
|
||||
struct Edge
|
||||
{
|
||||
int to,next,cap,flow;
|
||||
}edge[MAXM];
|
||||
int tol;
|
||||
int head[MAXN];
|
||||
int gap[MAXN], dep[MAXN], pre[MAXN], cur[MAXN];
|
||||
void init()
|
||||
{
|
||||
tol = 0;
|
||||
memset(head,-1,sizeof(head));
|
||||
}
|
||||
void addedge(int u,int v,int w,int rw = 0)
|
||||
{
|
||||
edge[tol].to = v;
|
||||
edge[tol].cap = w;
|
||||
edge[tol].next = head[u];
|
||||
edge[tol].flow = 0;
|
||||
head[u] = tol++;
|
||||
edge[tol].to = u;
|
||||
edge[tol].cap = rw;
|
||||
edge[tol].next = head[v];
|
||||
edge[tol].flow = 0;
|
||||
head[v] = tol++;
|
||||
}
|
||||
int sap(int start,int end,int N)
|
||||
{
|
||||
memset(gap,0,sizeof(gap));
|
||||
memset(dep,0,sizeof(dep));
|
||||
memcpy(cur,head,sizeof(head));
|
||||
int u = start;
|
||||
pre[u] = -1;
|
||||
gap[0] = N;
|
||||
int ans = 0;
|
||||
while(dep[start] < N)
|
||||
{
|
||||
if(u == end)
|
||||
{
|
||||
int Min = INF;
|
||||
for(int i = pre[u];i != -1;i = pre[edge[i^1].to])
|
||||
if(Min > edge[i].cap - edge[i].flow)
|
||||
Min = edge[i].cap - edge[i].flow;
|
||||
for(int i = pre[u]; i != -1;i = pre[edge[i^1].to])
|
||||
{
|
||||
edge[i].flow += Min;
|
||||
edge[i^1].flow -= Min;
|
||||
}
|
||||
u = start;
|
||||
ans += Min;
|
||||
continue;
|
||||
}
|
||||
bool flag = false;
|
||||
int v;
|
||||
for(int i = cur[u]; i != -1;i = edge[i].next)
|
||||
{
|
||||
v = edge[i].to;
|
||||
if(edge[i].cap - edge[i].flow && dep[v] + 1 == dep[u])
|
||||
{
|
||||
flag = true;
|
||||
cur[u] = pre[v] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(flag)
|
||||
{
|
||||
u = v;
|
||||
continue;
|
||||
}
|
||||
int Min = N;
|
||||
for(int i = head[u]; i != -1;i = edge[i].next)
|
||||
if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min)
|
||||
{
|
||||
Min = dep[edge[i].to];
|
||||
cur[u] = i;
|
||||
}
|
||||
gap[dep[u]] --;
|
||||
if(!gap[dep[u]])return ans;
|
||||
dep[u] = Min+1;
|
||||
gap[dep[u]]++;
|
||||
if(u != start) u = edge[pre[u]^1].to;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int in[30],out[30];
|
||||
int F[30];
|
||||
int find(int x)
|
||||
{
|
||||
if(F[x] == -1)return x;
|
||||
else return F[x] = find(F[x]);
|
||||
}
|
||||
void bing(int u,int v)
|
||||
{
|
||||
int t1 = find(u), t2 = find(v);
|
||||
if(t1 != t2)F[t1] = t2;
|
||||
}
|
||||
char str[100];
|
||||
int main()
|
||||
{
|
||||
int T,n;
|
||||
scanf("%d",&T);
|
||||
int iCase = 0;
|
||||
while(T--)
|
||||
{
|
||||
iCase++;
|
||||
scanf("%d",&n);
|
||||
memset(F,-1,sizeof(F));
|
||||
memset(in,0,sizeof(in));
|
||||
memset(out,0,sizeof(out));
|
||||
init();
|
||||
int k;
|
||||
int s = -1;
|
||||
while(n--)
|
||||
{
|
||||
scanf("%s%d",str,&k);
|
||||
int len = strlen(str);
|
||||
int u = str[0] - 'a';
|
||||
int v = str[len-1] - 'a';
|
||||
out[u]++;
|
||||
in[v]++;
|
||||
s = u;
|
||||
if(k == 1)
|
||||
addedge(u,v,1);
|
||||
bing(u,v);
|
||||
}
|
||||
bool flag = true;
|
||||
int cnt = 0;
|
||||
int s1 = -1, s2 = -1;
|
||||
for(int i = 0;i < 26;i++)
|
||||
if(in[i] || out[i])
|
||||
{
|
||||
if(find(i) != find(s))
|
||||
{
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
if((in[i] + out[i])&1)
|
||||
{
|
||||
cnt++;
|
||||
if(s1 == -1)s1 = i;
|
||||
else s2 = i;
|
||||
}
|
||||
}
|
||||
if(cnt != 0 && cnt != 2)flag = false;
|
||||
if(!flag)
|
||||
{
|
||||
printf("Case %d: Poor boy!\n",iCase);
|
||||
continue;
|
||||
}
|
||||
if(cnt == 2)
|
||||
{
|
||||
out[s1]++;
|
||||
in[s2]++;
|
||||
addedge(s1,s2,1);
|
||||
}
|
||||
for(int i = 0;i < 26;i++)
|
||||
{
|
||||
if(out[i] - in[i] > 0)
|
||||
addedge(26,i,(out[i] - in[i])/2);
|
||||
else if(in[i] - out[i] > 0)
|
||||
addedge(i,27,(in[i] - out[i])/2);
|
||||
}
|
||||
sap(26,27,28);
|
||||
for(int i = head[26];i != -1;i = edge[i].next)
|
||||
if(edge[i].cap > 0 && edge[i].cap > edge[i].flow)
|
||||
{
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
if(flag)printf("Case %d: Well done!\n",iCase);
|
||||
else printf("Case %d: Poor boy!\n",iCase);
|
||||
}
|
||||
return 0;
|
||||
}
|
97
HDOJ/3473_autoAC.cpp
Normal file
97
HDOJ/3473_autoAC.cpp
Normal file
|
@ -0,0 +1,97 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<stdlib.h>
|
||||
#define MAXK 20
|
||||
#define MAXD 100010
|
||||
int N, M, sa[MAXD], a[MAXD], rank[MAXK][MAXD], h[MAXK][MAXD];
|
||||
long long int A[MAXK][MAXD], ans;
|
||||
int cmp(const void *_p, const void *_q)
|
||||
{
|
||||
int *p = (int *)_p, *q = (int *)_q;
|
||||
if(a[*p] == a[*q])
|
||||
return *p - *q;
|
||||
return a[*p] - a[*q];
|
||||
}
|
||||
void init()
|
||||
{
|
||||
int i, j, k;
|
||||
scanf("%d", &N);
|
||||
for(i = 1; i <= N; i ++)
|
||||
{
|
||||
scanf("%d", &a[i]);
|
||||
sa[i] = i;
|
||||
}
|
||||
}
|
||||
void build(int lx, int rx, int d)
|
||||
{
|
||||
if(lx == rx)
|
||||
{
|
||||
A[d][lx] = a[sa[rank[d][lx]]];
|
||||
return ;
|
||||
}
|
||||
int i, j, k, p = 0, mid = (lx + rx) / 2;
|
||||
for(i = lx; i <= rx; i ++)
|
||||
{
|
||||
if(rank[d][i] <= mid)
|
||||
rank[d + 1][lx + p ++] = rank[d][i];
|
||||
else
|
||||
rank[d + 1][mid + i - lx + 1 - p] = rank[d][i];
|
||||
h[d][i] = p;
|
||||
A[d][i] = a[sa[rank[d][i]]] + (i == lx ? 0 : A[d][i - 1]);
|
||||
}
|
||||
build(lx, mid, d + 1);
|
||||
build(mid + 1, rx, d + 1);
|
||||
}
|
||||
int search(int lx, int rx, int x, int y, int k, int d)
|
||||
{
|
||||
if(lx == rx)
|
||||
return sa[rank[d][lx]];
|
||||
int j, n, m, mid = (lx + rx) / 2, tx, ty;
|
||||
n = h[d][y], m = x == lx ? 0 : h[d][x - 1];
|
||||
if(n - m >= k)
|
||||
{
|
||||
j = search(lx, mid, lx + m, lx + n - 1, k, d + 1);
|
||||
tx = mid + 1 + x - lx - m, ty = mid + 1 + y - lx - n;
|
||||
if(tx <= ty)
|
||||
ans += A[d + 1][ty] - (tx == mid + 1 ? 0 : A[d + 1][tx - 1]) - (long long int)(ty - tx + 1) * a[j];
|
||||
}
|
||||
else
|
||||
{
|
||||
j = search(mid + 1, rx, mid + 1 + x - lx - m, mid + 1 + y - lx - n, k - n + m, d + 1);
|
||||
tx = lx + m, ty = lx + n - 1;
|
||||
if(tx <= ty)
|
||||
ans += (long long int)(ty - tx + 1) * a[j] - A[d + 1][ty] + (tx == lx ? 0 : A[d + 1][tx - 1]);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
void solve()
|
||||
{
|
||||
int i, j, k, x, y;
|
||||
qsort(sa + 1, N, sizeof(sa[0]), cmp);
|
||||
for(i = 1; i <= N; i ++)
|
||||
rank[0][sa[i]] = i;
|
||||
build(1, N, 0);
|
||||
scanf("%d", &M);
|
||||
for(i = 0; i < M; i ++)
|
||||
{
|
||||
scanf("%d%d", &x, &y);
|
||||
++ x, ++ y;
|
||||
k = (y - x) / 2 + 1;
|
||||
ans = 0;
|
||||
search(1, N, x, y, k, 0);
|
||||
printf("%I64d\n", ans);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t, tt;
|
||||
scanf("%d", &t);
|
||||
for(tt = 0; tt < t; tt ++)
|
||||
{
|
||||
init();
|
||||
printf("Case #%d:\n", tt + 1);
|
||||
solve();
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
134
HDOJ/3475_autoAC.cpp
Normal file
134
HDOJ/3475_autoAC.cpp
Normal file
|
@ -0,0 +1,134 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
#define MAXN 110
|
||||
#define MAXM 15
|
||||
#define MAXD 10010
|
||||
#define HASH 10007
|
||||
#define ST 1030
|
||||
#define INF 0x3f3f3f3f
|
||||
int N, M, D, d[MAXN][MAXM][8], g[MAXN][MAXM], first[ST], e, next[ST], v[ST];
|
||||
char b[MAXN];
|
||||
struct HashMap
|
||||
{
|
||||
int head[HASH], size, next[MAXD], st[MAXD], ans[MAXD];
|
||||
void init()
|
||||
{
|
||||
memset(head, -1, sizeof(head)), size = 0;
|
||||
}
|
||||
void push(int _st, int _ans)
|
||||
{
|
||||
int i, h = _st % HASH;
|
||||
for(i = head[h]; i != -1; i = next[i])
|
||||
if(st[i] == _st) break;
|
||||
if(i == -1)
|
||||
{
|
||||
if(_st == -1) for(;;);
|
||||
st[size] = _st, ans[size] = _ans;
|
||||
next[size] = head[h], head[h] = size ++;
|
||||
}
|
||||
else ans[i] = std::min(ans[i], _ans);
|
||||
}
|
||||
}hm[2];
|
||||
void add(int x, int y)
|
||||
{
|
||||
v[e] = y;
|
||||
next[e] = first[x], first[x] = e ++;
|
||||
}
|
||||
void prepare(int i)
|
||||
{
|
||||
int j, k, st;
|
||||
memset(first, -1, sizeof(first)), e = 0;
|
||||
for(j = 0; j <= D; j ++)
|
||||
{
|
||||
st = 0;
|
||||
for(k = 0; k < M; k ++)
|
||||
if(j & 1 << k)
|
||||
{
|
||||
if(d[i][k][5]) st ^= 1 << k - 1;
|
||||
if(d[i][k][4]) st ^= 1 << k;
|
||||
if(d[i][k][3]) st ^= 1 << k + 1;
|
||||
}
|
||||
add(st, j);
|
||||
}
|
||||
}
|
||||
void init()
|
||||
{
|
||||
int i, j, k;
|
||||
scanf("%d%d", &N, &M);
|
||||
memset(d, 0, sizeof(d));
|
||||
memset(g, 0, sizeof(g));
|
||||
gets(b);
|
||||
for(i = 0; i < N; i ++)
|
||||
{
|
||||
gets(b);
|
||||
for(j = 0; j < M; j ++)
|
||||
{
|
||||
g[i][j] = b[2 * j] == 'o';
|
||||
if(j < M - 1 && b[2 * j + 1] == '-') d[i][j][2] = d[i][j + 1][6] = 1;
|
||||
}
|
||||
if(i < N - 1)
|
||||
{
|
||||
gets(b);
|
||||
for(j = 0; j < M; j ++)
|
||||
{
|
||||
if(b[2 * j] == '|') d[i][j][0] = d[i + 1][j][4] = 1;
|
||||
if(j < M - 1)
|
||||
{
|
||||
if(b[2 * j + 1] == '\\' || b[2 * j + 1] == 'X') d[i][j][1] = d[i + 1][j + 1][5] = 1;
|
||||
if(b[2 * j + 1] == '/' || b[2 * j + 1] == 'X') d[i][j + 1][7] = d[i + 1][j][3] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
D = (1 << M) - 1;
|
||||
}
|
||||
void solve()
|
||||
{
|
||||
int i, j, k, t, cur = 0, st, tc, td, nl, ust, cst, cnt, ans = INF;
|
||||
hm[0].init();
|
||||
for(i = st = 0; i < M; i ++) if(g[0][i]) st |= 1 << i;
|
||||
hm[0].push(st, 0);
|
||||
for(i = 0; i < N; i ++)
|
||||
{
|
||||
hm[cur ^ 1].init();
|
||||
prepare(i);
|
||||
for(j = nl = 0; j < M; j ++) if(g[i + 1][j]) nl |= 1 << j;
|
||||
for(j = 0; j < hm[cur].size; j ++)
|
||||
{
|
||||
ust = hm[cur].st[j] >> M, cst = hm[cur].st[j] & D, td = nl;
|
||||
for(k = first[ust]; k != -1; k = next[k])
|
||||
{
|
||||
st = v[k], cnt = 0;
|
||||
tc = cst ^ st, td = nl;
|
||||
for(t = 0; t < M; t ++)
|
||||
if(st & 1 << t)
|
||||
{
|
||||
++ cnt;
|
||||
if(d[i][t][0]) td ^= 1 << t;
|
||||
if(d[i][t][1]) td ^= 1 << t + 1;
|
||||
if(d[i][t][2]) tc ^= 1 << t + 1;
|
||||
if(d[i][t][6]) tc ^= 1 << t - 1;
|
||||
if(d[i][t][7]) td ^= 1 << t - 1;
|
||||
}
|
||||
hm[cur ^ 1].push(tc << M | td, hm[cur].ans[j] + cnt);
|
||||
}
|
||||
}
|
||||
cur ^= 1;
|
||||
}
|
||||
for(i = 0; i < hm[cur].size; i ++)
|
||||
if((hm[cur].st[i] >> M) == 0) ans = std::min(ans, hm[cur].ans[i]);
|
||||
printf("%d\n", ans == INF ? -1 : ans);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t, tt;
|
||||
scanf("%d", &t);
|
||||
for(tt = 1; tt <= t; tt ++)
|
||||
{
|
||||
init();
|
||||
printf("Case %d: ", tt);
|
||||
solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
5
HDOJ/3476_autoAC.cpp
Normal file
5
HDOJ/3476_autoAC.cpp
Normal file
|
@ -0,0 +1,5 @@
|
|||
#include<cstdio>
|
||||
int main(){
|
||||
printf("13579680\n");
|
||||
return 0;
|
||||
}
|
80
HDOJ/3478_autoAC.cpp
Normal file
80
HDOJ/3478_autoAC.cpp
Normal file
|
@ -0,0 +1,80 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <queue>
|
||||
using namespace std;
|
||||
struct Node
|
||||
{
|
||||
int v;
|
||||
int next;
|
||||
}Edge[500010*2];
|
||||
int pre[100010];
|
||||
void add(int u,int v,int index)
|
||||
{
|
||||
Edge[index].v=v;
|
||||
Edge[index].next=pre[u];
|
||||
pre[u]=index;
|
||||
}
|
||||
int flag[100010];
|
||||
int c[100010];
|
||||
int bfs(int v)
|
||||
{
|
||||
queue <int> q;
|
||||
flag[v]=1;
|
||||
q.push(v);
|
||||
while(!q.empty())
|
||||
{
|
||||
int b=q.front();
|
||||
q.pop();
|
||||
for(int i=pre[b];i!=-1;i=Edge[i].next)
|
||||
{
|
||||
int e=Edge[i].v;
|
||||
if(flag[e]==flag[b])
|
||||
return 0;
|
||||
if(!flag[e])
|
||||
{
|
||||
flag[e]=flag[b]==1?2:1;
|
||||
q.push(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,m,q,cnt=1;
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d%d",&n,&m,&q);
|
||||
int a,b,index=1;
|
||||
memset(flag,0,sizeof(flag));
|
||||
memset(pre,-1,sizeof(pre));
|
||||
memset(c,0,sizeof(c));
|
||||
for(int i=0;i<m;i++)
|
||||
{
|
||||
scanf("%d%d",&a,&b);
|
||||
add(a,b,index++);
|
||||
add(b,a,index++);
|
||||
c[a]++,c[b]++;
|
||||
}
|
||||
int state=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
if(!flag[i]&&c[i])
|
||||
{
|
||||
if(!bfs(i))
|
||||
{
|
||||
state=1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case %d: ",cnt++);
|
||||
if(state)
|
||||
printf("YES\n");
|
||||
else
|
||||
printf("NO\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
67
HDOJ/3480_autoAC.cpp
Normal file
67
HDOJ/3480_autoAC.cpp
Normal file
|
@ -0,0 +1,67 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
#define maxn 10005
|
||||
int save[maxn],q[maxn],sum[maxn],dp[5005][maxn],ans;
|
||||
int n,m,h,t;
|
||||
int M(int k){return k*k;}
|
||||
void solve()
|
||||
{
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
dp[1][i]=M(save[i]-save[1]);
|
||||
}
|
||||
for(int i=2;i<=m;i++)
|
||||
{
|
||||
h=t=1;
|
||||
q[1]=0;
|
||||
q[++t]=i-1;
|
||||
for(int j=i;j<=n;j++)
|
||||
{
|
||||
while(h<t)
|
||||
{
|
||||
int p1 = q[h], p2 = q[h+1];
|
||||
int x1 = save[p1+1],x2=save[p2+1];
|
||||
int y1 = dp[i-1][p1]+x1*x1 , y2=dp[i-1][p2]+x2*x2;
|
||||
if(y2-y1<2*save[j]*(x2 - x1))
|
||||
h++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
int k = q[h];
|
||||
dp[i][j] = dp[i - 1][k]+(save[j]-save[k+1]) * (save[j]-save[k+1]);
|
||||
while(h< t && j != n)
|
||||
{
|
||||
int p1 = q[t-1], p2 = q[t], p3 = j;
|
||||
int x1 = save[p1+1] , x2=save[p2+1] , x3=save[p3+1];
|
||||
int y1 = dp[i-1][p1]+x1*x1, y2=dp[i-1][p2] + x2 * x2, y3 = dp[i - 1][p3] + x3 * x3;
|
||||
if((y3 - y2) * (x2 - x1) <= (y2 - y1) * (x3 - x2))
|
||||
t--;
|
||||
else
|
||||
break;
|
||||
}
|
||||
q[++t] = j;
|
||||
}
|
||||
}
|
||||
ans=dp[m][n];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int cas;
|
||||
scanf("%d",&cas);
|
||||
for(int k=1;k<=cas;k++)
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&save[i]);
|
||||
}
|
||||
sort(save+1,save+1+n);
|
||||
solve();
|
||||
printf("Case %d: %d\n",k, ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
39
HDOJ/3481_autoAC.cpp
Normal file
39
HDOJ/3481_autoAC.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
const int MOD = 987654321;
|
||||
long long dp[110][10];
|
||||
int main()
|
||||
{
|
||||
int n,m;
|
||||
while(scanf("%d%d",&n,&m),n>0)
|
||||
{
|
||||
if(m==1){puts("0");continue;}
|
||||
if(m==2){printf("%d\n",n==1?2:0);continue;}
|
||||
memset(dp,0,sizeof(dp));
|
||||
dp[1][1]=m;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
for(int j=1;j<m;j++)
|
||||
{
|
||||
dp[i][j]%=MOD;
|
||||
dp[i+1][j+1]+=dp[i][j]*(m-j);
|
||||
for(int k=2;k<=j;k++)
|
||||
dp[i+1][k]+=dp[i][j];
|
||||
if(j>1||i==1)
|
||||
{
|
||||
for(int k=1;1+k<=m-1;k++)
|
||||
{
|
||||
dp[i+k][1]+=dp[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
long long ans=0;
|
||||
for(int j=1;j<m;j++)
|
||||
{
|
||||
ans+=dp[n][j];
|
||||
}
|
||||
printf("%I64d\n",ans%MOD);
|
||||
}
|
||||
return 0;
|
||||
}
|
40
HDOJ/3482_autoAC.cpp
Normal file
40
HDOJ/3482_autoAC.cpp
Normal file
|
@ -0,0 +1,40 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#define maxn 1000009
|
||||
#define ll long long
|
||||
using namespace std;
|
||||
const ll mod=987654321;
|
||||
ll f[maxn];
|
||||
int main()
|
||||
{
|
||||
ll n,m;
|
||||
f[1]=1;
|
||||
for(ll i=2;i<maxn-1;i++)
|
||||
{
|
||||
f[i]=f[i-1]*i;
|
||||
if(f[i]>mod)f[i]%=mod;
|
||||
}
|
||||
while(scanf("%lld%lld",&n,&m)&&(n+m)>0)
|
||||
{
|
||||
ll ans=1;
|
||||
if(n<m||m==1||m==2)
|
||||
{
|
||||
while(n>0)
|
||||
{
|
||||
if(n&1)ans*=m;
|
||||
if(ans>mod)ans%=mod;
|
||||
n>>=1;
|
||||
m*=m;
|
||||
if(m>mod)m%=mod;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ans=f[m]+m;
|
||||
if(ans>mod)ans%=mod;
|
||||
}
|
||||
printf("%lld\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
57
HDOJ/3483_autoAC.cpp
Normal file
57
HDOJ/3483_autoAC.cpp
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
#define M 55
|
||||
#define LL long long
|
||||
#define FF(i, n) for(int i = 0; i < n; i++)
|
||||
int ans[M], mod, C[M][M];
|
||||
int ret[M][M], init[M][M];
|
||||
void ini(int n, int x)
|
||||
{
|
||||
memset(init, 0, sizeof(init));
|
||||
FF(i, n) FF(j, i+1)
|
||||
init[i][j] = (LL)x*C[i][j] % mod;
|
||||
FF(i, n) ans[i] = x;
|
||||
ans[n] = 0;
|
||||
init[n][n-1] = init[n][n] = 1;
|
||||
}
|
||||
void matmul(int a[][M], int b[][M], int n)
|
||||
{
|
||||
int tp[M][M] = {0};
|
||||
FF(i, n) FF(k, n) if(a[i][k]) FF(j, n) if(b[k][j])
|
||||
tp[i][j] = (tp[i][j] + (LL)a[i][k]*b[k][j]) % mod;
|
||||
FF(i, n) FF(j, n) a[i][j] = tp[i][j];
|
||||
}
|
||||
void matmul(int a[], int b[][M], int n)
|
||||
{
|
||||
int tp[M] = {0};
|
||||
FF(j, n) if(a[j]) FF(i, n) if(b[i][j])
|
||||
tp[i] = (tp[i] + (LL)a[j]*b[i][j]) % mod;
|
||||
FF(i, n) a[i] = tp[i];
|
||||
}
|
||||
void qmod(int n, int b)
|
||||
{
|
||||
FF(i, n) FF(j, n) ret[i][j] = (i==j);
|
||||
for( ; b; b >>= 1)
|
||||
{
|
||||
if (b & 1) matmul(ret, init, n);
|
||||
matmul(init, init, n);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i, j, n, x;
|
||||
while (cin >> n >> x >> mod, n >= 1)
|
||||
{
|
||||
for(i = 0; i <= x; i++)
|
||||
C[i][0] = C[i][i] = 1;
|
||||
for(i = 2; i <= x; i++)
|
||||
for(j = 1; j < i; j++)
|
||||
C[i][j] = ((LL)C[i-1][j-1]+C[i-1][j]) % mod;
|
||||
ini(x+1, x);
|
||||
qmod(x+2, n);
|
||||
matmul(ans, ret, x+2);
|
||||
cout << ans[x+1] << endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
88
HDOJ/3484_autoAC.cpp
Normal file
88
HDOJ/3484_autoAC.cpp
Normal file
|
@ -0,0 +1,88 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
int ma[105][105],tar[105][105],tmp[105][105];
|
||||
int n,m;
|
||||
void init()
|
||||
{
|
||||
for (int i=1;i<=n;i++)
|
||||
{
|
||||
for (int j=1;j<=m;j++)
|
||||
scanf("%d",&ma[i][j]);
|
||||
}
|
||||
for (int i=1;i<=n;i++)
|
||||
{
|
||||
for (int j=1;j<=m;j++)
|
||||
scanf("%d",&tar[i][j]);
|
||||
}
|
||||
}
|
||||
void cpy(int c)
|
||||
{
|
||||
for (int i=1;i<=m;i++)
|
||||
{
|
||||
for (int j=1;j<=n;j++)
|
||||
{
|
||||
tmp[j][i]=ma[j][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
void change_col(int a,int b)
|
||||
{
|
||||
for (int i=1;i<=n;i++)
|
||||
{
|
||||
int temp=tmp[i][a];
|
||||
tmp[i][a]=tmp[i][b];
|
||||
tmp[i][b]=temp;
|
||||
}
|
||||
}
|
||||
void change_row(int c)
|
||||
{
|
||||
for (int i=1;i<=m;i++)
|
||||
tmp[c][i]^=1;
|
||||
}
|
||||
bool ok(int a,int b)
|
||||
{
|
||||
for (int i=1;i<=n;i++)
|
||||
{
|
||||
if (tar[i][a]!=tmp[i][b])
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while (scanf("%d%d",&n,&m))
|
||||
{
|
||||
if (n==-1) break;
|
||||
init();
|
||||
bool ans=0;
|
||||
for (int i=1;i<=m;i++)
|
||||
{
|
||||
cpy(i);
|
||||
change_col(1,i);
|
||||
for (int j=1;j<=n;j++)
|
||||
{
|
||||
if (tmp[j][1]!=tar[j][1])
|
||||
change_row(j);
|
||||
}
|
||||
for (int j=2;j<=m;j++)
|
||||
{
|
||||
for (int k=j;k<=m;k++)
|
||||
{
|
||||
ans=ok(j,k);
|
||||
if (ans)
|
||||
{
|
||||
change_col(j,k);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ans) break;
|
||||
}
|
||||
if (ans) puts("Yes");
|
||||
else
|
||||
puts("No");
|
||||
}
|
||||
return 0;
|
||||
}
|
24
HDOJ/3485_autoAC.cpp
Normal file
24
HDOJ/3485_autoAC.cpp
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include<iostream>
|
||||
using namespace std;
|
||||
int f[10005];
|
||||
int n;
|
||||
int deal(int n)
|
||||
{
|
||||
if(f[n]!=0)
|
||||
return f[n];
|
||||
f[n-1]=deal(n-1)%9997;
|
||||
f[n-2]=deal(n-2)%9997;
|
||||
f[n-4]=deal(n-4)%9997;
|
||||
return ((f[n-1]+f[n-2]+f[n-4])%9997);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d",&n)!=EOF&&n!=-1)
|
||||
{
|
||||
f[0]=1;
|
||||
f[1]=2;
|
||||
f[2]=4;
|
||||
f[3]=7;
|
||||
printf("%d\n",deal(n));
|
||||
}
|
||||
}
|
59
HDOJ/3486_autoAC.cpp
Normal file
59
HDOJ/3486_autoAC.cpp
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
int n,k,l,r,m,tn,temp,t,M,ss;
|
||||
int f[200001][18];
|
||||
int lg[200001];
|
||||
void pre_rmq()
|
||||
{
|
||||
for(int j=1;(1<<j)<=n;j++)
|
||||
{
|
||||
for(int i=1;i+(1<<j)-1<=n;i++)
|
||||
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
|
||||
}
|
||||
}
|
||||
int find(int x,int y)
|
||||
{
|
||||
t=lg[y-x+1];
|
||||
return max(f[x][t],f[y-(1<<t)+1][t]);
|
||||
}
|
||||
bool check(int k)
|
||||
{
|
||||
tn=n/k*k;
|
||||
temp=0;
|
||||
for(int i=1;i<=tn;i=i+tn/k)
|
||||
temp+=find(i,i+tn/k-1);
|
||||
if(temp>=M+1) return 1;
|
||||
return 0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
for(int i=2;i<=200000;i++)
|
||||
lg[i]=lg[i>>1]+1;
|
||||
while(scanf("%d%d",&n,&M)!=EOF)
|
||||
{
|
||||
ss=0;
|
||||
if(n==-1&&M==-1) break;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&f[i][0]);
|
||||
ss+=f[i][0];
|
||||
}
|
||||
if(ss<=M)
|
||||
{
|
||||
printf("-1\n");
|
||||
continue;
|
||||
}
|
||||
pre_rmq();
|
||||
l=1;r=n;
|
||||
while(l<=r)
|
||||
{
|
||||
m=(l+r)>>1;
|
||||
if(check(m)) r=m-1;
|
||||
else l=m+1;
|
||||
}
|
||||
printf("%d\n",l);
|
||||
}
|
||||
}
|
174
HDOJ/3487_autoAC.cpp
Normal file
174
HDOJ/3487_autoAC.cpp
Normal file
|
@ -0,0 +1,174 @@
|
|||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<queue>
|
||||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
#define N 300015
|
||||
#define inf 1<<29
|
||||
#define MOD 100000007
|
||||
#define LL long long
|
||||
#define Key_value ch[ch[root][1]][0]
|
||||
#define _match(a,b) ((a)==(b))
|
||||
using namespace std;
|
||||
int n,q;
|
||||
int size[N],pre[N],key[N],num[N],rev[N];
|
||||
int ch[N][2],tot,root,node[N];
|
||||
void NewNode(int &r,int k,int father){
|
||||
r=++tot;
|
||||
ch[r][0]=ch[r][1]=0;
|
||||
pre[r]=father;
|
||||
rev[r]=0;
|
||||
key[r]=k;
|
||||
}
|
||||
void Push_Up(int r){
|
||||
size[r]=size[ch[r][0]]+size[ch[r][1]]+1;
|
||||
}
|
||||
void Push_Down(int r){
|
||||
if(rev[r]){
|
||||
swap(ch[r][0],ch[r][1]);
|
||||
rev[ch[r][0]]^=1;
|
||||
rev[ch[r][1]]^=1;
|
||||
rev[r]=0;
|
||||
}
|
||||
}
|
||||
void Bulid(int &r,int L,int R,int father){
|
||||
if(L>R)
|
||||
return ;
|
||||
int mid=(L+R)/2;
|
||||
NewNode(r,mid,father);
|
||||
Bulid(ch[r][0],L,mid-1,r);
|
||||
Bulid(ch[r][1],mid+1,R,r);
|
||||
Push_Up(r);
|
||||
}
|
||||
void Init(){
|
||||
tot=root=0;
|
||||
ch[root][0]=ch[root][1]=pre[root]=rev[root]=size[root]=0;
|
||||
NewNode(root,-1,0);
|
||||
NewNode(ch[root][1],-1,root);
|
||||
size[root]=2;
|
||||
Bulid(Key_value,1,n,ch[root][1]);
|
||||
Push_Up(ch[root][1]);
|
||||
Push_Up(root);
|
||||
}
|
||||
void Rotate(int x,int kind){
|
||||
int y=pre[x];
|
||||
Push_Down(y);
|
||||
Push_Down(x);
|
||||
ch[y][!kind]=ch[x][kind];
|
||||
pre[ch[x][kind]]=y;
|
||||
if(pre[y])
|
||||
ch[pre[y]][ch[pre[y]][1]==y]=x;
|
||||
pre[x]=pre[y];
|
||||
ch[x][kind]=y;
|
||||
pre[y]=x;
|
||||
Push_Up(y);
|
||||
}
|
||||
void Splay(int r,int goal){
|
||||
Push_Down(r);
|
||||
while(pre[r]!=goal){
|
||||
if(pre[pre[r]]==goal)
|
||||
Rotate(r,ch[pre[r]][0]==r);
|
||||
else{
|
||||
int y=pre[r];
|
||||
int kind=(ch[pre[y]][0]==y);
|
||||
if(ch[y][kind]==r){
|
||||
Rotate(r,!kind);
|
||||
Rotate(r,kind);
|
||||
}
|
||||
else{
|
||||
Rotate(y,kind);
|
||||
Rotate(r,kind);
|
||||
}
|
||||
}
|
||||
}
|
||||
Push_Up(r);
|
||||
if(goal==0) root=r;
|
||||
}
|
||||
int Get_Kth(int r,int k){
|
||||
Push_Down(r);
|
||||
int t=size[ch[r][0]];
|
||||
if(t==k-1)
|
||||
return r;
|
||||
if(t>=k)
|
||||
return Get_Kth(ch[r][0],k);
|
||||
else
|
||||
return Get_Kth(ch[r][1],k-t-1);
|
||||
}
|
||||
int Get_Min(int r){
|
||||
Push_Down(r);
|
||||
while(ch[r][0]){
|
||||
r=ch[r][0];
|
||||
Push_Down(r);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
int Get_Max(int r){
|
||||
Push_Down(r);
|
||||
while(ch[r][1]){
|
||||
r=ch[r][1];
|
||||
Push_Down(r);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
void Reversal(int a,int b){
|
||||
int x=Get_Kth(root,a);
|
||||
int y=Get_Kth(root,b+2);
|
||||
Splay(x,0);
|
||||
Splay(y,root);
|
||||
rev[Key_value]^=1;
|
||||
}
|
||||
void Cut(int a,int b,int c){
|
||||
int x=Get_Kth(root,a);
|
||||
int y=Get_Kth(root,b+2);
|
||||
Splay(x,0);
|
||||
Splay(y,root);
|
||||
int tmp=Key_value;
|
||||
Key_value=0;
|
||||
Push_Up(ch[root][1]);
|
||||
Push_Up(root);
|
||||
int z=Get_Kth(root,c+1);
|
||||
Splay(z,0);
|
||||
int m=Get_Min(ch[root][1]);
|
||||
Splay(m,root);
|
||||
Key_value=tmp;
|
||||
pre[Key_value]=ch[root][1];
|
||||
Push_Up(ch[root][1]);
|
||||
Push_Up(root);
|
||||
}
|
||||
int cnt;
|
||||
void InOrder(int r){
|
||||
if(r==0)
|
||||
return;
|
||||
Push_Down(r);
|
||||
InOrder(ch[r][0]);
|
||||
if(cnt>=1&&cnt<=n){
|
||||
if(cnt>1) printf(" ");
|
||||
printf("%d",key[r]);
|
||||
}
|
||||
cnt++;
|
||||
InOrder(ch[r][1]);
|
||||
}
|
||||
int main(){
|
||||
while(scanf("%d%d",&n,&q)!=EOF){
|
||||
if(n==-1&&q==-1)
|
||||
break;
|
||||
Init();
|
||||
while(q--){
|
||||
char str[10];
|
||||
int a,b,c;
|
||||
scanf("%s",str);
|
||||
if(str[0]=='C'){
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
Cut(a,b,c);
|
||||
}
|
||||
else{
|
||||
scanf("%d%d",&a,&b);
|
||||
Reversal(a,b);
|
||||
}
|
||||
}
|
||||
cnt=0;
|
||||
InOrder(root);
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
75
HDOJ/3488_autoAC.cpp
Normal file
75
HDOJ/3488_autoAC.cpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#define inf 1000000
|
||||
#define N 205
|
||||
int n,y[N],g[N][N],lx[N],ly[N],slack[N];
|
||||
char vx[N],vy[N];
|
||||
int search(int u)
|
||||
{
|
||||
vx[u]=1;
|
||||
for(int v=1;v<=n;v++)
|
||||
if(lx[u]+ly[v]==g[u][v])
|
||||
{
|
||||
if(vy[v]==1) continue;
|
||||
vy[v]=1;
|
||||
if(y[v]==-1||search(y[v]))
|
||||
{
|
||||
y[v]=u;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else if(lx[u]+ly[v]-g[u][v]<slack[v])
|
||||
slack[v]=lx[u]+ly[v]-g[u][v];
|
||||
return 0;
|
||||
}
|
||||
int KM()
|
||||
{
|
||||
int i,j,min;
|
||||
memset(y,-1,sizeof(y));
|
||||
memset(ly,0,sizeof(ly));
|
||||
memset(lx,0,sizeof(lx));
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
for(j=1;j<=n;j++)
|
||||
slack[j]=inf;
|
||||
while(1)
|
||||
{
|
||||
memset(vx,0,sizeof(vx));
|
||||
memset(vy,0,sizeof(vy));
|
||||
if(search(i)) break;
|
||||
for(min=inf,j=1;j<=n;j++)
|
||||
if(!vy[j]&&slack[j]<min)
|
||||
min=slack[j];
|
||||
for(j=1;j<=n;j++)
|
||||
if(vx[j]) lx[j]-=min;
|
||||
for(j=1;j<=n;j++)
|
||||
if(vy[j]) ly[j]+=min;
|
||||
else slack[j]-=min;
|
||||
}
|
||||
}
|
||||
int ans=0;
|
||||
for(i=1;i<=n;i++)
|
||||
ans+=g[y[i]][i];
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,m,i,j,u,v,w;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
for(i=1;i<=n;i++)
|
||||
for(j=1;j<=n;j++)
|
||||
g[i][j]=-inf;
|
||||
for(i=0;i<m;i++)
|
||||
{
|
||||
scanf("%d%d%d",&u,&v,&w);
|
||||
if(g[u][v]<-w)
|
||||
g[u][v]=-w;
|
||||
}
|
||||
int ans=-1*KM();
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
38
HDOJ/3489_autoAC.cpp
Normal file
38
HDOJ/3489_autoAC.cpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
# include <iostream>
|
||||
# include <cstdio>
|
||||
# include <cstring>
|
||||
using namespace std;
|
||||
int p[1002][26],pre[1002],n,m;
|
||||
char a[10002],b[1002];
|
||||
int f[10002][1002];
|
||||
void relax(int &i,const int&j){if(i>j) i=j;}
|
||||
int main()
|
||||
{
|
||||
int Case; scanf("%d",&Case);
|
||||
while(Case--){
|
||||
scanf("%s",a+1); scanf("%s",b+1);
|
||||
n = strlen(a+1); m = strlen(b+1);
|
||||
for(int i=1; i<=n; i++)a[i]-='a',b[i]-='a';
|
||||
int k = 0; pre[1] = 0;
|
||||
for(int i=2; i<=m; i++) {
|
||||
while(k && b[k+1]!=b[i]) k = pre[k];
|
||||
if(b[k+1] == b[i]) k++; pre[i]=k;
|
||||
}
|
||||
memset(p,0,sizeof(p));
|
||||
for(int i=1; i<=m; i++) p[i-1][b[i]]=i;
|
||||
for(int i=1; i<=m; i++)
|
||||
for(int j=0; j<26; j++)
|
||||
if(!p[i][j]) p[i][j] = p[pre[i]][j];
|
||||
for(int j=0; j<26; j++) p[m][j] = m;
|
||||
memset(f,0x7f,sizeof(f)); f[0][0]=0;
|
||||
for(int i=0; i<n; i++)
|
||||
for(int j=0; j<m; j++)
|
||||
if( f[i][j]<0x7f7f7f7f )
|
||||
relax(f[i+1][j], f[i][j]+1),
|
||||
relax(f[i+1][p[j][a[i+1]]], f[i][j]);
|
||||
int ans = n+1;
|
||||
for(int i=0; i<m; i++) relax(ans, f[n][i]);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
46
HDOJ/3490_autoAC.cpp
Normal file
46
HDOJ/3490_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
map<string, pair<int, int> > ms;
|
||||
map<int, int> s1, s2;
|
||||
int n;
|
||||
inline int calc(map<int, int>& s) {
|
||||
map<int, int>::iterator ib = s.begin(), ie = s.end();
|
||||
return (--ie)->first - ib->first;
|
||||
}
|
||||
inline void erase(map<int, int> &s, int x) {
|
||||
if (--s[x] == 0)
|
||||
s.erase(x);
|
||||
}
|
||||
int main() {
|
||||
int test;
|
||||
scanf("%d", &test);
|
||||
for (int cas = 1; cas <= test; ++cas) {
|
||||
ms.clear(); s1.clear(); s2.clear();
|
||||
scanf("%d", &n);
|
||||
for (int i = 0; i < n; ++i) {
|
||||
int opt; char buf[100];
|
||||
scanf("%d%s", &opt, buf);
|
||||
if (opt == 1) {
|
||||
int x, y;
|
||||
scanf("%d%d", &x, &y);
|
||||
ms[buf] = pair<int, int>(x, y);
|
||||
s1[x - y]++; s2[x + y]++;
|
||||
} else {
|
||||
map<string, pair<int, int> >::iterator it = ms.find(buf);
|
||||
erase(s1, it->second.first - it->second.second);
|
||||
erase(s2, it->second.first + it->second.second);
|
||||
ms.erase(it);
|
||||
}
|
||||
if (ms.size() == 0)
|
||||
puts("-1");
|
||||
else
|
||||
printf("%d\n", max(calc(s1), calc(s2)));
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
return 0;
|
||||
}
|
128
HDOJ/3491_autoAC.cpp
Normal file
128
HDOJ/3491_autoAC.cpp
Normal file
|
@ -0,0 +1,128 @@
|
|||
#include<iostream>
|
||||
#include<memory.h>
|
||||
#include<string>
|
||||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
#include<math.h>
|
||||
#include<stack>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
const int MAX=205;
|
||||
const int inf=999999;
|
||||
struct node
|
||||
{
|
||||
int v,c,next;
|
||||
}g[MAX*MAX];
|
||||
int adj[MAX],dis[MAX],cur[MAX],num[MAX],pre[MAX];
|
||||
int n,m,e,s,t,vn,S,H;
|
||||
void add(int u,int v,int c)
|
||||
{
|
||||
g[e].v=v; g[e].c=c; g[e].next=adj[u]; adj[u]=e++;
|
||||
g[e].v=u; g[e].c=0; g[e].next=adj[v]; adj[v]=e++;
|
||||
}
|
||||
int sap()
|
||||
{
|
||||
int i,u,v,flag,aug=inf+1,flow=0;
|
||||
for(i=0;i<=vn;i++)
|
||||
{
|
||||
cur[i]=adj[i];
|
||||
num[i]=dis[i]=0;
|
||||
}
|
||||
num[0]=vn;
|
||||
pre[s]=u=s;
|
||||
while(dis[s]<vn)
|
||||
{
|
||||
flag=0;
|
||||
for(i=adj[u];i!=-1;i=g[i].next)
|
||||
{
|
||||
v=g[i].v;
|
||||
if(g[i].c&&dis[u]==dis[v]+1)
|
||||
{
|
||||
flag=1;
|
||||
aug=min(aug,g[i].c);
|
||||
pre[v]=u;
|
||||
cur[u]=i;
|
||||
u=v;
|
||||
if(u==t)
|
||||
{
|
||||
flow+=aug;
|
||||
while(u!=s)
|
||||
{
|
||||
u=pre[u];
|
||||
g[cur[u]].c-=aug;
|
||||
g[cur[u]^1].c+=aug;
|
||||
}
|
||||
aug=inf+1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(flag)
|
||||
continue;
|
||||
if(--num[dis[u]]==0)
|
||||
break;
|
||||
for(dis[u]=inf,i=adj[u];i!=-1;i=g[i].next)
|
||||
{
|
||||
v=g[i].v;
|
||||
if(g[i].c&&dis[v]<dis[u])
|
||||
{
|
||||
dis[u]=dis[v];
|
||||
cur[u]=i;
|
||||
}
|
||||
}
|
||||
dis[u]++;
|
||||
num[dis[u]]++;
|
||||
u=pre[u];
|
||||
}
|
||||
return flow;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,k,T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d%d%d%d",&n,&m,&S,&H);
|
||||
e=0;
|
||||
vn=2*n+2;
|
||||
s=S+n;
|
||||
t=H;
|
||||
memset(adj,-1,sizeof(adj));
|
||||
add(s,S,inf);
|
||||
add(H+n,T,inf);
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&k);
|
||||
if(i!=S&&i!=H)
|
||||
{
|
||||
add(i,i+n,k);
|
||||
}
|
||||
else
|
||||
{
|
||||
add(i,i+n,inf);
|
||||
}
|
||||
}
|
||||
while(m--)
|
||||
{
|
||||
scanf("%d%d",&i,&j);
|
||||
if(i!=s&&j!=t)
|
||||
{
|
||||
add(i+n,j,inf);
|
||||
add(j+n,i,inf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(i==s)
|
||||
{
|
||||
add(s,j,inf);
|
||||
}
|
||||
else
|
||||
{
|
||||
add(i+n,t,inf);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%d\n",sap());
|
||||
}
|
||||
return 0;
|
||||
}
|
66
HDOJ/3492_autoAC.cpp
Normal file
66
HDOJ/3492_autoAC.cpp
Normal file
|
@ -0,0 +1,66 @@
|
|||
#include<stdlib.h>
|
||||
#include <math.h>
|
||||
#include<stdio.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define maxN 300
|
||||
const double eps = 1e-8;
|
||||
typedef struct
|
||||
{
|
||||
double x,y;
|
||||
}point;
|
||||
point l[maxN*2];
|
||||
double direction(point p1,point p2, point p3)
|
||||
{
|
||||
return (p3.x-p1.x)*(p2.y-p1.y)-(p2.x-p1.x)*(p3.y-p1.y);
|
||||
}
|
||||
bool online(point p1,point p2,point p3)
|
||||
{
|
||||
return (min(p1.x,p2.x)<=p3.x&&p3.x<=max(p1.x,p2.x))&&(min(p1.y,p2.y)<=p3.y&&p3.y<=max(p1.y,p2.y));
|
||||
}
|
||||
bool insect(point p1,point p2,point p3,point p4)
|
||||
{
|
||||
double d3=direction(p1,p2,p3);
|
||||
double d4=direction(p1,p2,p4);
|
||||
if(d3*d4<0)
|
||||
return true;
|
||||
else if(d3==0) return true;
|
||||
else if(d4==0) return true;
|
||||
return false ;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int cnt = 0;
|
||||
int N,n,i,j,k;
|
||||
bool flag;
|
||||
scanf("%d",&N);
|
||||
while(N--)
|
||||
{
|
||||
cnt ++;
|
||||
scanf("%d",&n);
|
||||
for(i=0;i<2*n-1;i+=2)
|
||||
{
|
||||
scanf("%lf%lf%lf%lf",&l[i].x,&l[i].y,&l[i+1].x,&l[i+1].y);
|
||||
}
|
||||
bool issame = true;
|
||||
flag = false;
|
||||
for(i=0;i< 2*n -1 && flag==false;i++)
|
||||
for(j=i+1;j < 2*n && flag==false;j++)
|
||||
{
|
||||
if (fabs(l[i].x-l[j].x) <= eps && fabs(l[i].y-l[j].y) <= eps)
|
||||
continue;
|
||||
issame = false;
|
||||
flag=true;
|
||||
for(k=0;k<2*n-1;k+=2)
|
||||
{
|
||||
if(insect(l[i],l[j],l[k],l[k+1]) == false)
|
||||
{flag=false;
|
||||
break;}
|
||||
}
|
||||
}
|
||||
if(flag==true || issame)
|
||||
{printf("Yes\n");}
|
||||
else printf("No\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
56
HDOJ/3493_autoAC.cpp
Normal file
56
HDOJ/3493_autoAC.cpp
Normal file
|
@ -0,0 +1,56 @@
|
|||
#include<iostream>
|
||||
#include<string.h>
|
||||
using namespace std;
|
||||
const int mod=9997;
|
||||
int f[3][3],map[3][3];
|
||||
int t[3][3]={{5,-7,4},{1,0,0},{0,1,0}};
|
||||
int g[4][1]={1,2,6,19},n;
|
||||
void multy_2(int v[][3],int u[][3])
|
||||
{
|
||||
int c[3][3];
|
||||
memset(c,0,sizeof(c));
|
||||
for(int i=0;i<3;i++)
|
||||
{
|
||||
for(int j=0;j<3;j++)
|
||||
{
|
||||
for(int k=0;k<3;k++)
|
||||
{
|
||||
c[i][j]=(c[i][j]+(v[i][k]*u[k][j]+mod)%mod+mod)%mod;
|
||||
}
|
||||
}
|
||||
}
|
||||
memcpy(v,c,sizeof(c));
|
||||
}
|
||||
void multy_1(int k)
|
||||
{
|
||||
for(;k>0;k=k>>1)
|
||||
{
|
||||
if(k & 1) multy_2(map,f);
|
||||
multy_2(f,f);
|
||||
}
|
||||
}
|
||||
void run()
|
||||
{
|
||||
multy_1(n-4);
|
||||
cout<<(g[3][0]*map[0][0]%mod+g[2][0]*map[0][1]%mod+g[1][0]*map[0][2]%mod)%mod<<endl;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d",&n) && n!=0)
|
||||
{
|
||||
if(n<=4)
|
||||
{
|
||||
cout<<g[n-1][0]<<endl;
|
||||
continue;
|
||||
}
|
||||
memcpy(f,t,sizeof(t));
|
||||
memset(g,0,sizeof(g));
|
||||
memset(map,0,sizeof(map));map[0][0]=map[1][1]=map[2][2]=1;
|
||||
g[0][0]=1;
|
||||
g[1][0]=2;
|
||||
g[2][0]=6;
|
||||
g[3][0]=19;
|
||||
run();
|
||||
}
|
||||
return 0;
|
||||
}
|
43
HDOJ/3496_autoAC.cpp
Normal file
43
HDOJ/3496_autoAC.cpp
Normal file
|
@ -0,0 +1,43 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int MAX = 999999;
|
||||
int val[111],time[111],dp[111][1111];
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
int n,m,l;
|
||||
scanf("%d%d%d",&n,&m,&l);
|
||||
int i,j,k;
|
||||
for(i = 0; i<n; i++)
|
||||
scanf("%d%d",&time[i],&val[i]);
|
||||
for(i = 0; i<=m; i++)
|
||||
{
|
||||
for(j = 0; j<=l; j++)
|
||||
{
|
||||
if(i==0)
|
||||
dp[i][j] = 0;
|
||||
else
|
||||
dp[i][j] = -MAX;
|
||||
}
|
||||
}
|
||||
for(i = 0; i<n; i++)
|
||||
{
|
||||
for(j = m; j>=1; j--)
|
||||
{
|
||||
for(k = l; k>=time[i]; k--)
|
||||
{
|
||||
dp[j][k] = max(dp[j][k],dp[j-1][k-time[i]]+val[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(dp[m][l]<0)
|
||||
dp[m][l] = 0;
|
||||
printf("%d\n",dp[m][l]);
|
||||
}
|
||||
return 0;
|
||||
}
|
14
HDOJ/3497_autoAC.cpp
Normal file
14
HDOJ/3497_autoAC.cpp
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cmath>
|
||||
#define IP 3.1415926
|
||||
using namespace std;
|
||||
int main()
|
||||
{
|
||||
double r, h;
|
||||
while( scanf("%lf %lf", &h, &r) != EOF)
|
||||
{
|
||||
double ans = asin(0.01 * r / (4 * h));
|
||||
printf("%0.2lf\n", 180 * ans / IP);
|
||||
}
|
||||
}
|
157
HDOJ/3498_autoAC.cpp
Normal file
157
HDOJ/3498_autoAC.cpp
Normal file
|
@ -0,0 +1,157 @@
|
|||
#include<cstdio>
|
||||
#include<vector>
|
||||
#include<cmath>
|
||||
#include<map>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const ll maxn = 105;
|
||||
int T, n, m, x, y, t, tot, mp[maxn][maxn];
|
||||
inline void read(int &ret)
|
||||
{
|
||||
char c;
|
||||
do {
|
||||
c = getchar();
|
||||
} while (c < '0' || c > '9');
|
||||
ret = c - '0';
|
||||
while ((c = getchar()) >= '0' && c <= '9')
|
||||
ret = ret * 10 + (c - '0');
|
||||
}
|
||||
struct DLX
|
||||
{
|
||||
#define maxn 500005
|
||||
#define F(i,A,s) for (int i=A[s];i!=s;i=A[i])
|
||||
int L[maxn], R[maxn], U[maxn], D[maxn];
|
||||
int row[maxn], col[maxn], ans[maxn], cnt[maxn];
|
||||
int n, m, num, sz;
|
||||
void add(int now, int l, int r, int u, int d, int x, int y)
|
||||
{
|
||||
L[now] = l; R[now] = r; U[now] = u;
|
||||
D[now] = d; row[now] = x; col[now] = y;
|
||||
}
|
||||
void reset(int n, int m)
|
||||
{
|
||||
num = 0x7FFFFFFF;
|
||||
this->n = n; this->m = m;
|
||||
for (int i = 0; i <= m; i++)
|
||||
{
|
||||
add(i, i - 1, i + 1, i, i, 0, i);
|
||||
cnt[i] = 0;
|
||||
}
|
||||
L[0] = m; R[m] = 0; sz = m + 1;
|
||||
}
|
||||
void insert(int x, int y)
|
||||
{
|
||||
int ft = sz - 1;
|
||||
if (row[ft] != x)
|
||||
{
|
||||
add(sz, sz, sz, U[y], y, x, y);
|
||||
U[D[sz]] = sz; D[U[sz]] = sz;
|
||||
}
|
||||
else
|
||||
{
|
||||
add(sz, ft, R[ft], U[y], y, x, y);
|
||||
R[L[sz]] = sz; L[R[sz]] = sz;
|
||||
U[D[sz]] = sz; D[U[sz]] = sz;
|
||||
}
|
||||
++cnt[y]; ++sz;
|
||||
}
|
||||
void remove(int now)
|
||||
{
|
||||
R[L[now]] = R[now];
|
||||
L[R[now]] = L[now];
|
||||
F(i, D, now) F(j, R, i)
|
||||
{
|
||||
D[U[j]] = D[j];
|
||||
U[D[j]] = U[j];
|
||||
--cnt[col[j]];
|
||||
}
|
||||
}
|
||||
void resume(int now)
|
||||
{
|
||||
F(i, U, now) F(j, L, i)
|
||||
{
|
||||
D[U[j]] = j;
|
||||
U[D[j]] = j;
|
||||
++cnt[col[j]];
|
||||
}
|
||||
R[L[now]] = now;
|
||||
L[R[now]] = now;
|
||||
}
|
||||
bool dfs(int x)
|
||||
{
|
||||
if (!R[0]) { num = min(num, x); return true; }
|
||||
int now = R[0];
|
||||
F(i, R, 0) if (cnt[now]>cnt[i]) now = i;
|
||||
remove(now);
|
||||
F(i, D, now)
|
||||
{
|
||||
ans[x] = row[i];
|
||||
F(j, R, i) remove(col[j]);
|
||||
if (dfs(x + 1)) return true;
|
||||
F(j, L, i) resume(col[j]);
|
||||
}
|
||||
resume(now);
|
||||
return false;
|
||||
}
|
||||
void Remove(int now)
|
||||
{
|
||||
F(i, D, now)
|
||||
{
|
||||
L[R[i]] = L[i];
|
||||
R[L[i]] = R[i];
|
||||
}
|
||||
}
|
||||
void Resume(int now)
|
||||
{
|
||||
F(i, U, now) L[R[i]] = R[L[i]] = i;
|
||||
}
|
||||
int vis[maxn];
|
||||
int flag[maxn];
|
||||
int A()
|
||||
{
|
||||
int dis = 0;
|
||||
F(i, R, 0) vis[i] = 0;
|
||||
F(i, R, 0) if (!vis[i])
|
||||
{
|
||||
dis++; vis[i] = 1;
|
||||
F(j, D, i) F(k, R, j) vis[col[k]] = 1;
|
||||
}
|
||||
return dis;
|
||||
}
|
||||
void Dfs(int x)
|
||||
{
|
||||
if (!R[0]) num = min(num, x);
|
||||
else if (x + A()<num)
|
||||
{
|
||||
int now = R[0];
|
||||
F(i, R, 0) if (cnt[now]>cnt[i]) now = i;
|
||||
F(i, D, now)
|
||||
{
|
||||
Remove(i); F(j, R, i) Remove(j);
|
||||
Dfs(x + 1);
|
||||
F(j, L, i) Resume(j); Resume(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}dlx;
|
||||
int main()
|
||||
{
|
||||
while (scanf("%d%d", &n, &m) == 2)
|
||||
{
|
||||
memset(mp, 0, sizeof(mp));
|
||||
dlx.reset(n, n);
|
||||
while (m--)
|
||||
{
|
||||
scanf("%d%d", &x, &y);
|
||||
mp[x][y] = mp[y][x] = 1;
|
||||
}
|
||||
for (int i = 1; i <= n;i++)
|
||||
for (int j = 1; j <= n;j++)
|
||||
if (i == j || mp[i][j]) dlx.insert(i, j);
|
||||
dlx.Dfs(0);
|
||||
printf("%d\n", dlx.num);
|
||||
}
|
||||
return 0;
|
||||
}
|
102
HDOJ/3499_autoAC.cpp
Normal file
102
HDOJ/3499_autoAC.cpp
Normal file
|
@ -0,0 +1,102 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<string>
|
||||
#include<algorithm>
|
||||
#include<queue>
|
||||
#include<map>
|
||||
using namespace std;
|
||||
typedef __int64 ll;
|
||||
const int N=100010;
|
||||
const int M=500010;
|
||||
const ll inf=1LL<<60;
|
||||
struct node
|
||||
{
|
||||
int to;
|
||||
ll dis;
|
||||
node *next;
|
||||
}E[M<<1],*G1[N],*G2[N],*head;
|
||||
int n,m,num;
|
||||
ll d1[N],d2[N];
|
||||
bool inq[N];
|
||||
map<string,int> dict;
|
||||
inline void add(int a,int b,ll c,node *G[])
|
||||
{
|
||||
head->to=b;
|
||||
head->dis=c;
|
||||
head->next=G[a];
|
||||
G[a]=head++;
|
||||
}
|
||||
inline int change(char *s)
|
||||
{
|
||||
if(dict.count(s)) return dict[s];
|
||||
else return dict[s]=num++;
|
||||
}
|
||||
void SPFA(int s,ll d[],node *G[])
|
||||
{
|
||||
deque<int> Q;
|
||||
Q.push_back(s);
|
||||
memset(inq,false,sizeof(inq));
|
||||
fill(d,d+N,inf);
|
||||
d[s]=0;
|
||||
int to;
|
||||
ll dis;
|
||||
while(!Q.empty())
|
||||
{
|
||||
int u=Q.front();
|
||||
Q.pop_front();
|
||||
inq[u]=false;
|
||||
for(node *p=G[u];p;p=p->next)
|
||||
{
|
||||
to=p->to;
|
||||
dis=p->dis;
|
||||
if(d[to]>d[u]+dis)
|
||||
{
|
||||
d[to]=d[u]+dis;
|
||||
if(!inq[to])
|
||||
{
|
||||
inq[to]=true;
|
||||
if(!Q.empty() && d[to]<=d[Q.front()]) Q.push_front(to);
|
||||
else Q.push_back(to);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
char s1[20],s2[20];
|
||||
while(~scanf("%d%d",&n,&m))
|
||||
{
|
||||
num=0;
|
||||
dict.clear();
|
||||
memset(G1,NULL,sizeof(G1));
|
||||
memset(G2,NULL,sizeof(G2));
|
||||
head=E;
|
||||
int s,t;
|
||||
ll dis;
|
||||
for(int i=0;i<m;i++)
|
||||
{
|
||||
scanf("%s %s %I64d",s1,s2,&dis);
|
||||
s=change(s1),t=change(s2);
|
||||
add(s,t,dis,G1);
|
||||
add(t,s,dis,G2);
|
||||
}
|
||||
scanf("%s %s",s1,s2);
|
||||
s=dict[s1],t=dict[s2];
|
||||
SPFA(s,d1,G1);
|
||||
SPFA(t,d2,G2);
|
||||
ll ans=inf;
|
||||
for(int i=0;i<n;i++)
|
||||
{
|
||||
for(node *p=G1[i];p;p=p->next)
|
||||
{
|
||||
int j=p->to;
|
||||
if(d1[i]<inf && d2[j]<inf) ans=min(ans,d1[i]+d2[j]+(p->dis)/2);
|
||||
}
|
||||
}
|
||||
if(ans==inf) printf("-1\n");
|
||||
else printf("%I64d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user