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
4600-4699
This commit is contained in:
parent
c9791a72c9
commit
34d0415174
90
HDOJ/4600_autoAC.cpp
Normal file
90
HDOJ/4600_autoAC.cpp
Normal file
|
@ -0,0 +1,90 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#define LL __int64
|
||||
struct corns {
|
||||
int q, p, n, m;
|
||||
}a[1111];
|
||||
int s[11] , ss[11], D, Y;
|
||||
LL ans , val[1002];
|
||||
void solve1(int i) {
|
||||
LL cur = Y;
|
||||
int day = 0, j;
|
||||
while(day <= D) {
|
||||
if(day + a[i].n <= D) {
|
||||
LL tot = cur/a[i].q;
|
||||
for(j = 9;j >= 1; j--) if(s[j]) {
|
||||
if(j*a[i].p > a[i].q) {
|
||||
if(tot <= s[j]) {
|
||||
cur += tot * (LL)( j*a[i].p - a[i].q );
|
||||
tot = 0;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
cur += (LL)s[j] * ( j*a[i].p - a[i].q );
|
||||
tot -= s[j];
|
||||
}
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
day += a[i].n;
|
||||
}
|
||||
if(cur > ans) ans = cur;
|
||||
}
|
||||
void solve2(int i) {
|
||||
int j, k, l;
|
||||
memset(val, 0, sizeof(val));
|
||||
LL cur = Y;
|
||||
for(j = 1;j <= 9; j++) ss[j] = s[j];
|
||||
for(j= 0;j <= D; j++) {
|
||||
cur += val[j];
|
||||
LL tot = cur/a[i].q;
|
||||
for(k = 9;k >= 1; k--) if(ss[k]){
|
||||
int to = j+a[i].n;
|
||||
if(to > D) break;
|
||||
LL now = k*a[i].p;
|
||||
now += (LL)(D-to)/a[i].m * k*a[i].p;
|
||||
if(now > a[i].q) {
|
||||
LL get;
|
||||
if(tot > ss[k]) get = ss[k];
|
||||
else get = tot;
|
||||
ss[k] -= (int)get;
|
||||
tot -= get;
|
||||
cur -= get*a[i].q;
|
||||
val[to] += get * k *a[i].p;
|
||||
for(l = to+a[i].m;l <= D; l += a[i].m) val[l] += get *k * a[i].p;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
if(cur > ans) ans = cur;
|
||||
}
|
||||
int main() {
|
||||
int t, w, h, A, i;
|
||||
scanf("%d", &t);
|
||||
while(t--) {
|
||||
scanf("%d%d%d%d%d", &w, &h, &A, &D, &Y);
|
||||
memset(s, 0, sizeof(s));
|
||||
s[9] = (w/3) * (h/3);
|
||||
s[(w%3)*3] += h/3;
|
||||
s[(h%3)*3] += w/3;
|
||||
if((w%3) * (h%3) == 1) {
|
||||
s[5]++; s[3] -= 2; s[1] += 2;
|
||||
}
|
||||
else if((w%3) * (h%3) == 4) {
|
||||
s[8]++; s[6] -= 2; s[4] += 2;
|
||||
}
|
||||
else if((w%3)*(h%3) == 2) {
|
||||
s[7]++; s[6]--; s[3]--; s[2] += 2;
|
||||
}
|
||||
else s[(w%3)*(h%3)] ++;
|
||||
for(i =0;i < A; i++) scanf("%d%d%d%d", &a[i].q, &a[i].p, &a[i].n, &a[i].m);
|
||||
ans = Y;
|
||||
for(i = 0;i < A ; i++) {
|
||||
if(a[i].m == 0) solve1(i);
|
||||
else solve2(i);
|
||||
}
|
||||
printf("%I64d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
179
HDOJ/4601_autoAC.cpp
Normal file
179
HDOJ/4601_autoAC.cpp
Normal file
|
@ -0,0 +1,179 @@
|
|||
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
#include<vector>
|
||||
#define ll __int64
|
||||
using namespace std ;
|
||||
const int maxn = 211111 ;
|
||||
int c[26][maxn] , tot , dis[maxn] , pos[maxn] , rk[maxn] ;
|
||||
int tim[maxn] , dp[25][maxn] , cnt[maxn] , g[maxn] , line[maxn] , lon[maxn] ;
|
||||
ll val[maxn] , f[25] , pow26[maxn] ;
|
||||
const int mod = 1000000007 ;
|
||||
struct Edge
|
||||
{
|
||||
int to , next , v ;
|
||||
} edge[maxn<<1] ;
|
||||
int head[maxn] , E , n ;
|
||||
struct Point
|
||||
{
|
||||
int id ;
|
||||
int tim ;
|
||||
bool operator < ( const Point &t ) const
|
||||
{
|
||||
return tim < t.tim ;
|
||||
}
|
||||
} ;
|
||||
vector<Point> vec[maxn] ;
|
||||
void new_edge ( int a , int b , char *s )
|
||||
{
|
||||
edge[E].to = b ;
|
||||
edge[E].next = head[a] ;
|
||||
edge[E].v = s[0] - 'a' ;
|
||||
head[a] = E ++ ;
|
||||
edge[E].to = a ;
|
||||
edge[E].next = head[b] ;
|
||||
edge[E].v = s[0] - 'a' ;
|
||||
head[b] = E ++ ;
|
||||
}
|
||||
int new_node ()
|
||||
{
|
||||
int i ;
|
||||
for ( i = 0 ; i < 26 ; i ++ ) c[i][tot] = 0 ;
|
||||
val[tot] = 0 ;
|
||||
return tot ++ ;
|
||||
}
|
||||
int step ;
|
||||
void cal ( int u , int fa , int now )
|
||||
{
|
||||
int i ;
|
||||
Point fuck ;
|
||||
for ( i = head[u] ; i != -1 ; i = edge[i].next )
|
||||
{
|
||||
int v = edge[i].to ;
|
||||
if ( v == fa ) continue ;
|
||||
dis[v] = dis[u] + 1 ;
|
||||
tim[v] = ++ step ;
|
||||
fuck.id = v , fuck.tim = step ;
|
||||
vec[dis[v]].push_back ( fuck ) ;
|
||||
int k = edge[i].v ;
|
||||
if ( !c[k][now] )
|
||||
{
|
||||
c[k][now] = new_node () ;
|
||||
val[c[k][now]] = ( (ll) val[now] * 26 % mod + k ) % mod ;
|
||||
}
|
||||
pos[v] = c[k][now] ;
|
||||
cal ( v , u , c[k][now] ) ;
|
||||
lon[u] = max ( lon[u] , lon[v] ) ;
|
||||
cnt[u] += cnt[v] ;
|
||||
}
|
||||
lon[u] = max ( lon[u] , dis[u] ) ;
|
||||
cnt[u] ++ ;
|
||||
}
|
||||
void cal1 ( int now )
|
||||
{
|
||||
rk[now] = step ++ ;
|
||||
g[rk[now]] = now ;
|
||||
int i ;
|
||||
for ( i = 0 ; i < 26 ; i ++ )
|
||||
if ( c[i][now] )
|
||||
cal1 ( c[i][now] ) ;
|
||||
}
|
||||
int dep ;
|
||||
void init ()
|
||||
{
|
||||
for ( int i = 0 ; i <= n ; i ++ )
|
||||
{
|
||||
head[i] = -1 , vec[i].clear () ;
|
||||
lon[i] = dis[i] = rk[i] = cnt[i] = 0 ;
|
||||
}
|
||||
tot = E = 0 ;
|
||||
new_node () ;
|
||||
}
|
||||
int T ;
|
||||
void rmq ()
|
||||
{
|
||||
int i , j ;
|
||||
T = 0 ;
|
||||
for ( i = 1 ; i <= n ; i ++ )
|
||||
{
|
||||
int l = vec[i].size () ;
|
||||
if ( l == 0 ) break ;
|
||||
line[i] = T + 1 ;
|
||||
for ( j = 0 ; j < l ; j ++ )
|
||||
dp[0][++T] = rk[pos[vec[i][j].id]] ;
|
||||
}
|
||||
for ( i = 1 ; f[i] <= T ; i ++ )
|
||||
for ( j = 1 ; j + f[i] - 1 <= T ; j ++ )
|
||||
dp[i][j] = max ( dp[i-1][j] , dp[i-1][j+f[i-1]] ) ;
|
||||
}
|
||||
int query ( int l , int r )
|
||||
{
|
||||
if ( l == r ) return dp[0][l] ;
|
||||
if ( l > r ) swap ( l , r ) ;
|
||||
int i , j , k ;
|
||||
for ( i = 0 ; i <= 22 ; i ++ )
|
||||
if ( f[i] >= ( r - l + 1 ) )
|
||||
{
|
||||
k = i - 1 ;
|
||||
break ;
|
||||
}
|
||||
return max ( dp[k][l] , dp[k][r-f[k]+1] ) ;
|
||||
}
|
||||
char s[111] ;
|
||||
int main ()
|
||||
{
|
||||
int cas , i , j , a , b , q ;
|
||||
f[0] = pow26[0] = 1 ;
|
||||
for ( i = 1 ; i <= 22 ; i ++ )
|
||||
f[i] = (ll) f[i-1] * 2 % mod ;
|
||||
for ( i = 1 ; i < 100005 ; i ++ )
|
||||
pow26[i] = (ll) pow26[i-1] * 26 % mod ;
|
||||
scanf ( "%d" , &cas ) ;
|
||||
while ( cas -- )
|
||||
{
|
||||
scanf ( "%d" , &n ) ;
|
||||
init () ;
|
||||
for ( i = 1 ; i < n ; i ++ )
|
||||
{
|
||||
scanf ( "%d%d%s" , &a , &b , s ) ;
|
||||
new_edge ( a , b , s ) ;
|
||||
}
|
||||
step = 0 ;
|
||||
cal ( 1 , 0 , 0 ) ;
|
||||
step = 0 ;
|
||||
cal1 ( 0 ) ;
|
||||
rmq () ;
|
||||
pos[1] = 0 ;
|
||||
scanf ( "%d" , &q ) ;
|
||||
while ( q -- )
|
||||
{
|
||||
int u , m ;
|
||||
scanf ( "%d%d" , &u , &m ) ;
|
||||
if ( m == 0 )
|
||||
{
|
||||
puts ( "0" ) ;
|
||||
continue ;
|
||||
}
|
||||
if ( dis[u] + m > lon[u] )
|
||||
{
|
||||
puts ( "IMPOSSIBLE" ) ;
|
||||
continue ;
|
||||
}
|
||||
int dep = dis[u] + m ;
|
||||
Point fuck ;
|
||||
fuck.tim = tim[u] ;
|
||||
int l = lower_bound ( vec[dep].begin () , vec[dep].end () , fuck ) - vec[dep].begin () ;
|
||||
if ( l == vec[dep].size () ) l -- ;
|
||||
l += line[dep] ;
|
||||
fuck.tim = tim[u] + cnt[u] - 1 ;
|
||||
int r = upper_bound ( vec[dep].begin () , vec[dep].end () , fuck ) - vec[dep].begin () ;
|
||||
r -- ;
|
||||
r += line[dep] ;
|
||||
int k = query ( l , r ) ;
|
||||
k = g[k] ;
|
||||
u = pos[u] ;
|
||||
printf ( "%I64d\n" , ( val[k] - val[u] * pow26[m] % mod + mod ) % mod ) ;
|
||||
}
|
||||
}
|
||||
}
|
68
HDOJ/4602_autoAC.cpp
Normal file
68
HDOJ/4602_autoAC.cpp
Normal file
|
@ -0,0 +1,68 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
using namespace std;
|
||||
const int mod=1000000007;
|
||||
struct Matrix{
|
||||
long long arr[2][2];
|
||||
};
|
||||
Matrix init,unit;
|
||||
int n,k;
|
||||
long long num[2][2]={{4,-4},{1,0}};
|
||||
void Init(){
|
||||
for(int i=0;i<2;i++)
|
||||
for(int j=0;j<2;j++){
|
||||
init.arr[i][j]=num[i][j];
|
||||
unit.arr[i][j]=(i==j)?1:0;
|
||||
}
|
||||
}
|
||||
Matrix Mul(Matrix a,Matrix b){
|
||||
Matrix c;
|
||||
for(int i=0;i<2;i++)
|
||||
for(int j=0;j<2;j++){
|
||||
c.arr[i][j]=0;
|
||||
for(int k=0;k<2;k++)
|
||||
c.arr[i][j]=(c.arr[i][j]%mod+a.arr[i][k]*b.arr[k][j]%mod+mod)%mod;
|
||||
c.arr[i][j]%=mod;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
Matrix Pow(Matrix a,Matrix b,int k){
|
||||
while(k){
|
||||
if(k&1){
|
||||
b=Mul(a,b);
|
||||
}
|
||||
a=Mul(a,a);
|
||||
k>>=1;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
int main(){
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
scanf("%d%d",&n,&k);
|
||||
Init();
|
||||
if(k>n){
|
||||
printf("0\n");
|
||||
continue;
|
||||
}
|
||||
int tmp=n-k+1;
|
||||
if(tmp==1){
|
||||
printf("1\n");
|
||||
continue;
|
||||
}
|
||||
if(tmp==2){
|
||||
printf("2\n");
|
||||
continue;
|
||||
}
|
||||
if(tmp==3){
|
||||
printf("5\n");
|
||||
continue;
|
||||
}
|
||||
Matrix res=Pow(init,unit,tmp-3);
|
||||
long long ans=(res.arr[0][0]*5+res.arr[0][1]*2)%mod;
|
||||
cout<<ans<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
370
HDOJ/4603_autoAC.cpp
Normal file
370
HDOJ/4603_autoAC.cpp
Normal file
|
@ -0,0 +1,370 @@
|
|||
#pragma comment(linker, "/STACK:102400000,102400000")
|
||||
#include<iostream>
|
||||
#include<vector>
|
||||
#include<algorithm>
|
||||
#include<cstdio>
|
||||
#include<queue>
|
||||
#include<stack>
|
||||
#include<string>
|
||||
#include<map>
|
||||
#include<set>
|
||||
#include<cmath>
|
||||
#include<cassert>
|
||||
#include<cstring>
|
||||
#include<iomanip>
|
||||
#include<ctime>
|
||||
using namespace std;
|
||||
#ifdef _WIN32
|
||||
typedef __int64 i64;
|
||||
#define out64 "%I64d\n"
|
||||
#define in64 "%I64d"
|
||||
#else
|
||||
typedef long long i64;
|
||||
#define out64 "%lld\n"
|
||||
#define in64 "%lld"
|
||||
#endif
|
||||
#define foreach(c,itr) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
|
||||
#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)
|
||||
#define FF(i,a) for( int i = 0 ; i < (a) ; i ++)
|
||||
#define FFD(i,a,b) for( int i = (a) ; i >= (b) ; i --)
|
||||
#define S64(a) scanf(in64,&a)
|
||||
#define SS(a) scanf("%d",&a)
|
||||
#define LL(a) ((a)<<1)
|
||||
#define RR(a) (((a)<<1)+1)
|
||||
#define pb push_back
|
||||
#define pf push_front
|
||||
#define X first
|
||||
#define Y second
|
||||
#define CL(Q) while(!Q.empty())Q.pop()
|
||||
#define MM(name,what) memset(name,what,sizeof(name))
|
||||
#define MC(a,b) memcpy(a,b,sizeof(b))
|
||||
#define MAX(a,b) ((a)>(b)?(a):(b))
|
||||
#define MIN(a,b) ((a)<(b)?(a):(b))
|
||||
const int inf = 0x3f3f3f3f;
|
||||
const long long inf64 = 0x3f3f3f3f3f3f3f3fLL;
|
||||
const double oo = 10e9;
|
||||
const double eps = 10e-9;
|
||||
const double pi = acos(-1.0);
|
||||
const int maxn = 100111;
|
||||
const int maxlevel = 21;
|
||||
struct Node
|
||||
{
|
||||
int now;
|
||||
int to;
|
||||
int c;
|
||||
int tot;
|
||||
int ss;
|
||||
const bool operator < (const Node& cmp) const {
|
||||
return tot > cmp.tot;
|
||||
}
|
||||
};
|
||||
int all;
|
||||
int n, m;
|
||||
vector<Node>g[maxn];
|
||||
int t[maxn];
|
||||
int dep[maxn];
|
||||
int df;
|
||||
int dfn[maxn];
|
||||
int dfv[maxn * 2];
|
||||
int st[maxn * 2][maxlevel];
|
||||
int up[maxn][maxlevel];
|
||||
int dp[maxn]; //down sum
|
||||
int xtof[maxn];
|
||||
int ftox[maxn];
|
||||
int vis[maxn];
|
||||
int lg2[maxn*2];
|
||||
void dfs(int now)
|
||||
{
|
||||
vis[now] = true;
|
||||
int to;
|
||||
for (int i = 0; i < (int)g[now].size(); i++) {
|
||||
to = g[now][i].to;
|
||||
if (!vis[to]) {
|
||||
t[to] = now;
|
||||
dfs(to);
|
||||
}
|
||||
}
|
||||
}
|
||||
int treedp(int now)
|
||||
{
|
||||
int to,id;
|
||||
dp[now] = 0;
|
||||
for (int i = 0; i < (int)g[now].size(); i++) {
|
||||
to = g[now][i].to;
|
||||
if (to != t[now]) {
|
||||
int temp = treedp(to) + g[now][i].c;
|
||||
g[now][i].tot = temp;
|
||||
dp[now] += temp;
|
||||
}
|
||||
else {
|
||||
id = i;
|
||||
}
|
||||
}
|
||||
if (t[now] != -1) {
|
||||
g[now][id].tot = all - dp[now];
|
||||
}
|
||||
return dp[now];
|
||||
}
|
||||
void euler_circuit(int now ,int step)
|
||||
{
|
||||
dep[now] = step;
|
||||
dfn[now] = df;
|
||||
dfv[df++] = now;
|
||||
int to;
|
||||
for (int i = 0; i < (int)g[now].size(); i++) {
|
||||
to = g[now][i].to;
|
||||
if (to != t[now]) {
|
||||
euler_circuit(to,step+1);
|
||||
dfv[df++] = now;
|
||||
}
|
||||
}
|
||||
}
|
||||
void get_up_node()
|
||||
{
|
||||
for (int i = 1; i <= n; i++) {
|
||||
up[i][0] = t[i];
|
||||
}
|
||||
int to;
|
||||
for (int step = 1; step < maxlevel; step++) {
|
||||
for (int now = 1; now <= n; now++) {
|
||||
to = up[now][step - 1];
|
||||
if (to == -1) {
|
||||
up[now][step] = -1;
|
||||
}
|
||||
else {
|
||||
up[now][step] = up[to][step - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void sparse_table()
|
||||
{
|
||||
for (int i = 1; i < df; i++){
|
||||
st[i][0] = dep[dfv[i]];
|
||||
}
|
||||
int to;
|
||||
for (int step = 1; step <= lg2[n] + 1; step++){
|
||||
for (int now = 1; now < df; now++) {
|
||||
to = now + (1 << (step - 1));
|
||||
if (to < df){
|
||||
st[now][step] = min(st[now][step - 1], st[to][step - 1]);
|
||||
}
|
||||
else{
|
||||
st[now][step] = st[now][step - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void relation()
|
||||
{
|
||||
int to;
|
||||
for (int now = 1; now <= n; now++){
|
||||
for (int i = 0; i < (int)g[now].size(); i++){
|
||||
to = g[now][i].to;
|
||||
if (to == t[now]){
|
||||
xtof[now] = i;
|
||||
}
|
||||
else{
|
||||
ftox[to] = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int rmq(int l,int r)
|
||||
{
|
||||
return min(st[l][lg2[r - l]], st[r - (1 << lg2[r - l])][lg2[r - l]] );
|
||||
}
|
||||
int calculate(int x,bool first,int id1,int id2=-1)
|
||||
{
|
||||
if (id2 != -1){
|
||||
if (id1 > id2){
|
||||
swap(id1, id2);
|
||||
}
|
||||
}
|
||||
int sum = g[x][0].ss;
|
||||
sum -= g[x][id1].tot;
|
||||
if (id2 != -1){
|
||||
sum -= g[x][id2].tot;
|
||||
}
|
||||
int size = (int)g[x].size() - 1;
|
||||
if (size >= 1){
|
||||
sum += g[x][1].ss;
|
||||
}
|
||||
int ans = g[x][0].ss;
|
||||
if (id1 % 2 ){
|
||||
if (id1 + 1 <= size){
|
||||
ans -= g[x][id1 + 1].ss;
|
||||
if (id1 + 2 <= size){
|
||||
ans += g[x][id1 + 2].ss;
|
||||
}
|
||||
}
|
||||
if (id2 != -1){
|
||||
if (id2 % 2){
|
||||
ans -= g[x][id2].ss;
|
||||
if (id2 + 1 <= size){
|
||||
ans += g[x][id2 + 1].ss;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if (id2 + 1 <= size){
|
||||
ans -= g[x][id2 + 1].ss;
|
||||
if (id2 + 2 <= size){
|
||||
ans += g[x][id2 + 2].ss;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
ans -= g[x][id1].ss;
|
||||
if (id1 + 1 <= size){
|
||||
ans += g[x][id1 + 1].ss;
|
||||
}
|
||||
if (id2 != -1){
|
||||
if (id2 % 2){
|
||||
ans -= g[x][id2].ss;
|
||||
if (id2 + 1 <= size){
|
||||
ans += g[x][id2 + 1].ss;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if (id2 + 1 <= size){
|
||||
ans -= g[x][id2 + 1].ss;
|
||||
if (id2 + 2 <= size){
|
||||
ans += g[x][id2 + 2].ss;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (first) return ans;
|
||||
else return sum - ans;
|
||||
}
|
||||
int go_up(int now, int x)
|
||||
{
|
||||
int step = 0;
|
||||
while (x) {
|
||||
if (x & 1) {
|
||||
now = up[now][step];
|
||||
}
|
||||
step++;
|
||||
x >>= 1;
|
||||
}
|
||||
return now;
|
||||
}
|
||||
int find(int a,int b)
|
||||
{
|
||||
int l = dfn[a];
|
||||
int r = dfn[b];
|
||||
if (l == r){
|
||||
return g[a][0].ss;
|
||||
}
|
||||
if (l > r){
|
||||
swap(l, r);
|
||||
}
|
||||
int lca = rmq(l, r + 1);
|
||||
if (dep[a] - lca + dep[b] - lca == 1){
|
||||
if (dep[a] == lca){
|
||||
return g[b][xtof[b]].tot + calculate(b, false, xtof[b]);
|
||||
}
|
||||
else if (dep[b] == lca){
|
||||
return g[b][ftox[a]].tot + calculate(b, false, ftox[a]);
|
||||
}
|
||||
}
|
||||
else if (dep[a] > dep[b]+1){
|
||||
int temp = dep[a] - dep[b];
|
||||
int mid = lca + temp / 2;
|
||||
int child = go_up(a, dep[a] - mid - 1);
|
||||
if (temp % 2){
|
||||
return g[t[child]][ftox[child]].tot + calculate(t[child], false, ftox[child], xtof[t[child]]);
|
||||
}
|
||||
else{
|
||||
return g[t[child]][ftox[child]].tot + calculate(t[child], true, ftox[child], xtof[t[child]]);
|
||||
}
|
||||
}
|
||||
else if (dep[a] == dep[b] + 1) {
|
||||
int ca = go_up(a, dep[a] - lca - 1);
|
||||
int cb = go_up(b, dep[b] - lca - 1);
|
||||
int meet = t[ca];
|
||||
return g[meet][ftox[ca]].tot + calculate(meet, false, ftox[ca], ftox[cb]);
|
||||
}
|
||||
else if (dep[a] < dep[b]){
|
||||
int temp = dep[b] - dep[a];
|
||||
int mid = lca + (temp + 1)/ 2;
|
||||
int child = go_up(b, dep[b] - mid - 1);
|
||||
if (temp % 2){
|
||||
return g[t[child]][xtof[t[child]]].tot + calculate(t[child], false, xtof[t[child]], ftox[child]);
|
||||
}
|
||||
else{
|
||||
return g[t[child]][xtof[t[child]]].tot + calculate(t[child], true, xtof[t[child]], ftox[child]);
|
||||
}
|
||||
}
|
||||
else if(dep[a] == dep[b]) {
|
||||
int ca = go_up(a, dep[a] - lca - 1);
|
||||
int cb = go_up(b, dep[b] - lca - 1);
|
||||
int meet = t[ca];
|
||||
return g[meet][ftox[ca]].tot + calculate(meet, true, ftox[ca], ftox[cb]);
|
||||
}
|
||||
assert(false);
|
||||
}
|
||||
void start()
|
||||
{
|
||||
for (int i = 1; i <= n; i++) {
|
||||
vis[i] = false;
|
||||
}
|
||||
t[0] = t[1] = -1;
|
||||
dfs(1);
|
||||
treedp(1);
|
||||
for (int now = 1; now <= n; now++) {
|
||||
sort(g[now].begin(), g[now].end());
|
||||
for (int i =(int) g[now].size() - 1; i >= 0; i--) {
|
||||
g[now][i].ss = g[now][i].tot;
|
||||
if (i + 3 <= (int)g[now].size()) {
|
||||
g[now][i].ss += g[now][i + 2].ss;
|
||||
}
|
||||
}
|
||||
}
|
||||
df = 1;
|
||||
euler_circuit(1, 0);
|
||||
get_up_node();
|
||||
sparse_table();
|
||||
relation();
|
||||
}
|
||||
int main()
|
||||
{
|
||||
for (int i = 0; i < maxlevel; i++){
|
||||
if ( (1<<i) < maxn*2)
|
||||
lg2[1 << i] = i;
|
||||
}
|
||||
for (int i = 3; i < maxn*2; i++) {
|
||||
if (!lg2[i]){
|
||||
lg2[i] = lg2[i - 1];
|
||||
}
|
||||
}
|
||||
int T;
|
||||
cin >> T;
|
||||
while (T--) {
|
||||
all = 0;
|
||||
cin >> n >> m;
|
||||
for (int i = 0; i <= n; i++){
|
||||
g[i].clear();
|
||||
}
|
||||
Node node;
|
||||
for (int i = 1; i <= n - 1; i++) {
|
||||
SS(node.now);
|
||||
SS(node.to);
|
||||
SS(node.c);
|
||||
g[node.now].push_back(node);
|
||||
swap(node.now, node.to);
|
||||
g[node.now].push_back(node);
|
||||
all += node.c;
|
||||
}
|
||||
start();
|
||||
int a, b;
|
||||
for (int i = 1; i <= m; i++){
|
||||
SS(a); SS(b);
|
||||
printf("%d\n", find(a, b));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
59
HDOJ/4604_autoAC.cpp
Normal file
59
HDOJ/4604_autoAC.cpp
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <map>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#define MAXM 111111
|
||||
#define MAXN 111111
|
||||
#define INF 1000000007
|
||||
#define eps 1e-8
|
||||
using namespace std;
|
||||
typedef vector<int>::iterator Viter;
|
||||
int n;
|
||||
vector<int>g;
|
||||
int a[MAXN];
|
||||
int dp1[MAXN], dp2[MAXN], num1[MAXN], num2[MAXN];
|
||||
void gao(int dp[], int num[])
|
||||
{
|
||||
g.clear();
|
||||
Viter it;
|
||||
for(int i = n - 1; i >= 0; i--)
|
||||
{
|
||||
int sz = g.size();
|
||||
if(!sz || a[i] >= g[sz - 1])
|
||||
{
|
||||
g.push_back(a[i]);
|
||||
dp[i] = sz + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
it = upper_bound(g.begin(), g.end(), a[i]);
|
||||
dp[i] = it - g.begin() + 1;
|
||||
*it = a[i];
|
||||
}
|
||||
pair<Viter, Viter>bounds = equal_range(g.begin(), g.end(), a[i]);
|
||||
num[i] = bounds.second - bounds.first;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d", &T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d", &n);
|
||||
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
|
||||
gao(dp1, num1);
|
||||
for(int i = 0; i < n; i++) a[i] = -a[i];
|
||||
gao(dp2, num2);
|
||||
int ans = 0;
|
||||
for(int i = 0; i < n; i++)
|
||||
ans = max(ans, dp1[i] + dp2[i] - min(num1[i], num2[i]));
|
||||
printf("%d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
142
HDOJ/4605_autoAC.cpp
Normal file
142
HDOJ/4605_autoAC.cpp
Normal file
|
@ -0,0 +1,142 @@
|
|||
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||
#include<stdio.h>
|
||||
#include<iostream>
|
||||
#include<vector>
|
||||
#include<algorithm>
|
||||
#include<string.h>
|
||||
using namespace std;
|
||||
#define maxn 100005
|
||||
struct list
|
||||
{
|
||||
int l,r;
|
||||
int w;
|
||||
}node[maxn];
|
||||
int fs[maxn*2];
|
||||
int fss[maxn*2];
|
||||
struct qq
|
||||
{
|
||||
int x;
|
||||
int id;
|
||||
}xx;
|
||||
vector<qq>num[maxn];
|
||||
int ans[maxn][2];
|
||||
int sum[maxn][2];
|
||||
int w[maxn];
|
||||
int n,m,q,len;
|
||||
int lowbit(int x)
|
||||
{
|
||||
return (x&(-x));
|
||||
}
|
||||
int search(int l,int r,int w)
|
||||
{
|
||||
while(l<r)
|
||||
{
|
||||
int mid=(l+r)/2;
|
||||
if(fs[mid]==w)return mid;
|
||||
if(fs[mid]<w)l=mid+1;
|
||||
else r=mid;
|
||||
}
|
||||
}
|
||||
void add(int x,int bs,int num)
|
||||
{
|
||||
for(;x<len;x+=lowbit(x))
|
||||
{
|
||||
sum[x][bs]+=num;
|
||||
}
|
||||
}
|
||||
int allsum(int s,int bs)
|
||||
{
|
||||
int ss;
|
||||
ss=0;
|
||||
while(s>0)
|
||||
{
|
||||
ss+=sum[s][bs];
|
||||
s=s-lowbit(s);
|
||||
}
|
||||
return ss;
|
||||
}
|
||||
void dfs(int x)
|
||||
{
|
||||
int s;
|
||||
s=num[x].size();
|
||||
for(int i=0;i<s;i++)
|
||||
{
|
||||
xx=num[x][i];
|
||||
int z,id;
|
||||
z=search(1,len,xx.x);
|
||||
id=xx.id;
|
||||
if(allsum(z,0)-allsum(z-1,0)+allsum(z,1)-allsum(z-1,1)>0)
|
||||
{
|
||||
ans[id][0]=-1;
|
||||
continue;
|
||||
}
|
||||
int ll,lr,rl,rr;
|
||||
ll=allsum(len-1,0)-allsum(z,0);
|
||||
rl=allsum(z,0);
|
||||
lr=allsum(len-1,1)-allsum(z,1);
|
||||
rr=allsum(z,1);
|
||||
ans[id][0]=rr;
|
||||
ans[id][1]=(rl+rr)*3+ll+lr;
|
||||
}
|
||||
s=search(1,len,node[x].w);
|
||||
if(node[x].l!=-1)
|
||||
{
|
||||
add(s,0,1);
|
||||
dfs(node[x].l);
|
||||
add(s,0,-1);
|
||||
}
|
||||
if(node[x].r!=-1)
|
||||
{
|
||||
add(s,1,1);
|
||||
dfs(node[x].r);
|
||||
add(s,1,-1);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,a,b,c,i;
|
||||
cin>>T;
|
||||
while(T--)
|
||||
{
|
||||
cin>>n;
|
||||
int ll=1;
|
||||
memset(fs,0,sizeof(fs));
|
||||
memset(ans,0,sizeof(ans));
|
||||
memset(fss,0,sizeof(fss));
|
||||
for (i = 1; i <= n; ++i) node[i].l = node[i].r = node[i].w = -1;
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
num[i].clear();
|
||||
scanf("%d",&w[i]);
|
||||
node[i].w=w[i];
|
||||
fss[ll++]=w[i];
|
||||
}
|
||||
cin>>m;
|
||||
for(i=1;i<=m;i++)
|
||||
{
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
node[a].l=b;
|
||||
node[a].r=c;
|
||||
}
|
||||
cin>>q;
|
||||
for(i=1;i<=q;i++)
|
||||
{
|
||||
scanf("%d%d",&a,&b);
|
||||
fss[ll++]=b;
|
||||
xx.id=i;
|
||||
xx.x=b;
|
||||
num[a].push_back(xx);
|
||||
}
|
||||
len=1;
|
||||
sort(fss,fss+ll);
|
||||
for(i=1;i<ll;i++)
|
||||
if(fss[i]!=fss[i-1])fs[len++]=fss[i];
|
||||
dfs(1);
|
||||
for(i=1;i<=q;i++)
|
||||
{
|
||||
if(ans[i][0]==-1)printf("0\n");
|
||||
else printf("%d %d\n",ans[i][0],ans[i][1]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
191
HDOJ/4606_autoAC.cpp
Normal file
191
HDOJ/4606_autoAC.cpp
Normal file
|
@ -0,0 +1,191 @@
|
|||
#include <stdio.h>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
const double eps = 1e-6;
|
||||
int sgn(double x)
|
||||
{
|
||||
if(fabs(x) < eps)return 0;
|
||||
if(x < 0)return -1;
|
||||
else return 1;
|
||||
}
|
||||
struct Point
|
||||
{
|
||||
double x,y;
|
||||
Point(double _x = 0,double _y = 0)
|
||||
{
|
||||
x = _x; y = _y;
|
||||
}
|
||||
Point operator -(const Point &b)const
|
||||
{
|
||||
return Point(x-b.x,y-b.y);
|
||||
}
|
||||
double operator ^(const Point &b)const
|
||||
{
|
||||
return x*b.y - y*b.x;
|
||||
}
|
||||
double operator *(const Point &b)const
|
||||
{
|
||||
return x*b.x + y*b.y;
|
||||
}
|
||||
void input()
|
||||
{
|
||||
scanf("%lf%lf",&x,&y);
|
||||
}
|
||||
};
|
||||
struct Line
|
||||
{
|
||||
Point s,e;
|
||||
Line(){}
|
||||
Line(Point _s,Point _e)
|
||||
{
|
||||
s = _s; e = _e;
|
||||
}
|
||||
void input()
|
||||
{
|
||||
s.input();
|
||||
e.input();
|
||||
}
|
||||
};
|
||||
double dist(Point a,Point b)
|
||||
{
|
||||
return sqrt((a-b)*(a-b));
|
||||
}
|
||||
bool inter(Line l1,Line l2)
|
||||
{
|
||||
return
|
||||
sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) < 0 &&
|
||||
sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) < 0;
|
||||
}
|
||||
const int MAXN = 440;
|
||||
Point p[MAXN];
|
||||
Line line[MAXN];
|
||||
const double INF = 100000000.0;
|
||||
double dis[MAXN][MAXN];
|
||||
int n,m,P;
|
||||
int b[MAXN];
|
||||
int uN,vN;
|
||||
struct Edge
|
||||
{
|
||||
int to,next;
|
||||
}edge[MAXN*MAXN];
|
||||
int head[MAXN];
|
||||
int tot;
|
||||
void addedge(int u,int v)
|
||||
{
|
||||
edge[tot].to = v;
|
||||
edge[tot].next = head[u];
|
||||
head[u] = tot++;
|
||||
}
|
||||
void init()
|
||||
{
|
||||
tot = 0;
|
||||
memset(head,-1,sizeof(head));
|
||||
}
|
||||
int linker[MAXN];
|
||||
bool used[MAXN];
|
||||
bool dfs(int u)
|
||||
{
|
||||
for(int i = head[u]; i!= -1;i = edge[i].next)
|
||||
{
|
||||
int v = edge[i].to;
|
||||
if(!used[v])
|
||||
{
|
||||
used[v] = true;
|
||||
if(linker[v]==-1 || dfs(linker[v]))
|
||||
{
|
||||
linker[v] = u;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
int hungary()
|
||||
{
|
||||
int res = 0;
|
||||
memset(linker,-1,sizeof(linker));
|
||||
for(int u = 0;u < uN;u ++)
|
||||
{
|
||||
memset(used,false,sizeof(used));
|
||||
if(dfs(u))res++;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
bool check(double d)
|
||||
{
|
||||
uN = vN = n;
|
||||
init();
|
||||
for(int i = 0;i < n;i++)
|
||||
for(int j = i+1;j < n;j++)
|
||||
if(dis[b[i]][b[j]] < d + eps)
|
||||
addedge(b[i],b[j]);
|
||||
if(n - hungary() <= P)return true;
|
||||
else return false;
|
||||
}
|
||||
double solve()
|
||||
{
|
||||
double l = 0, r = 100000.0;
|
||||
double ans;
|
||||
while(r-l >= eps)
|
||||
{
|
||||
double mid = (l+r)/2;
|
||||
if(check(mid))
|
||||
{
|
||||
ans = mid;
|
||||
r = mid - eps;
|
||||
}
|
||||
else l = mid + eps;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d%d%d",&n,&m,&P);
|
||||
for(int i = 0;i < n;i++)
|
||||
p[i].input();
|
||||
int t = n;
|
||||
for(int i = 0;i < m;i++)
|
||||
{
|
||||
line[i].input();
|
||||
p[n+2*i] = line[i].s;
|
||||
p[n+2*i+1] = line[i].e;
|
||||
}
|
||||
for(int i = 0;i < n+2*m;i++)
|
||||
for(int j = 0;j < n+2*m;j++)
|
||||
{
|
||||
if(i == j)
|
||||
{
|
||||
dis[i][j] = 0;
|
||||
continue;
|
||||
}
|
||||
bool flag = false;
|
||||
for(int k = 0;k < m;k++)
|
||||
if(inter(line[k],Line(p[i],p[j])))
|
||||
{
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
if(flag)dis[i][j] = 1e20;
|
||||
else dis[i][j] = dist(p[i],p[j]);
|
||||
}
|
||||
for(int k = 0;k < n+2*m;k++)
|
||||
for(int i = 0;i < n+2*m;i++)
|
||||
for(int j = 0;j < n+2*m;j++)
|
||||
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
scanf("%d",&b[i]);
|
||||
b[i]--;
|
||||
}
|
||||
printf("%.2lf\n",solve());
|
||||
}
|
||||
return 0;
|
||||
}
|
81
HDOJ/4607_autoAC.cpp
Normal file
81
HDOJ/4607_autoAC.cpp
Normal file
|
@ -0,0 +1,81 @@
|
|||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
using namespace std;
|
||||
const int N=200010;
|
||||
int head[N],to[N],ne[N],w[N];
|
||||
int dis[N],que[N];
|
||||
bool vis[N];
|
||||
int edge,m,n;
|
||||
void init()
|
||||
{
|
||||
memset(head,-1,sizeof(head));
|
||||
edge=0;
|
||||
}
|
||||
void add(int u,int v,int c)
|
||||
{
|
||||
to[edge]=v,w[edge]=c,ne[edge]=head[u],head[u]=edge++;
|
||||
to[edge]=u,w[edge]=c,ne[edge]=head[v],head[v]=edge++;
|
||||
}
|
||||
void bfs(int s)
|
||||
{
|
||||
memset(vis,0,sizeof(vis));
|
||||
memset(dis,0,sizeof(dis));
|
||||
int l,r,v,u;
|
||||
l=r=0;
|
||||
vis[s]=1;
|
||||
dis[s]=0;
|
||||
que[r++]=s;
|
||||
while(r>l)
|
||||
{
|
||||
u=que[l++];
|
||||
for(int i=head[u]; ~i; i=ne[i])
|
||||
{
|
||||
if(!vis[v=to[i]])
|
||||
{
|
||||
vis[v]=1;
|
||||
dis[v]=dis[u]+w[i];
|
||||
que[r++]=v;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int treediameter(int s)
|
||||
{
|
||||
int u,maxl;
|
||||
bfs(s);
|
||||
maxl=0,u=s;
|
||||
for(int i=1; i<=n; i++)
|
||||
if(dis[i]>maxl)
|
||||
u=i,maxl=dis[i];
|
||||
bfs(u);
|
||||
maxl=0;
|
||||
for(int i=1; i<=n; i++)
|
||||
if(dis[i]>maxl)
|
||||
maxl=dis[i];
|
||||
return maxl;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int u,v,d=1,t,i,j,x;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
init();
|
||||
scanf("%d%d",&n,&m);
|
||||
for(i=1;i<=n-1;i++)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
add(u,v,1);
|
||||
}
|
||||
int ans=treediameter(1);
|
||||
ans++;
|
||||
while(m--)
|
||||
{
|
||||
scanf("%d",&x);
|
||||
if(x<=ans) printf("%d\n",x-1);
|
||||
else printf("%d\n",(x-ans)*2+ans-1);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
61
HDOJ/4608_autoAC.cpp
Normal file
61
HDOJ/4608_autoAC.cpp
Normal file
|
@ -0,0 +1,61 @@
|
|||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
char str[100050];
|
||||
int num[100050];
|
||||
int main()
|
||||
{
|
||||
int t,i;
|
||||
while(~scanf("%d",&t))
|
||||
{
|
||||
while(t--)
|
||||
{
|
||||
scanf("%s",str);
|
||||
int n;
|
||||
n = strlen(str);
|
||||
for(i = 0;i < n;i++)
|
||||
num[i] = str[i]-'0';
|
||||
int rest;
|
||||
rest = 0;
|
||||
for(i = 0;i < n;i++)
|
||||
rest += num[i];
|
||||
rest = 10-rest%10;
|
||||
num[n-1] += rest;
|
||||
int bit;
|
||||
bit = 0;
|
||||
if(num[n-1] > 9)
|
||||
{
|
||||
for(i = n-2;i >= 0;i--)
|
||||
{
|
||||
bit++;
|
||||
num[i]++;
|
||||
num[i] %= 10;
|
||||
if(num[i])
|
||||
break;
|
||||
}
|
||||
if(i<0)
|
||||
{
|
||||
printf("1");
|
||||
for(i = n-1;i > 0;i--)
|
||||
printf("0");
|
||||
puts("9");
|
||||
}
|
||||
else
|
||||
{
|
||||
num[n-1] = (num[n-1]+1000000-bit)%10;
|
||||
for(i = 0;i < n;i++)
|
||||
printf("%d",num[i]);
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(i = 0;i < n;i++)
|
||||
printf("%d",num[i]);
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
121
HDOJ/4609_autoAC.cpp
Normal file
121
HDOJ/4609_autoAC.cpp
Normal file
|
@ -0,0 +1,121 @@
|
|||
#include <stdio.h>
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <algorithm>
|
||||
#include <math.h>
|
||||
using namespace std;
|
||||
const double PI = acos(-1.0);
|
||||
struct complex
|
||||
{
|
||||
double r,i;
|
||||
complex(double _r = 0,double _i = 0)
|
||||
{
|
||||
r = _r; i = _i;
|
||||
}
|
||||
complex operator +(const complex &b)
|
||||
{
|
||||
return complex(r+b.r,i+b.i);
|
||||
}
|
||||
complex operator -(const complex &b)
|
||||
{
|
||||
return complex(r-b.r,i-b.i);
|
||||
}
|
||||
complex operator *(const complex &b)
|
||||
{
|
||||
return complex(r*b.r-i*b.i,r*b.i+i*b.r);
|
||||
}
|
||||
};
|
||||
void change(complex y[],int len)
|
||||
{
|
||||
int i,j,k;
|
||||
for(i = 1, j = len/2;i < len-1;i++)
|
||||
{
|
||||
if(i < j)swap(y[i],y[j]);
|
||||
k = len/2;
|
||||
while( j >= k)
|
||||
{
|
||||
j -= k;
|
||||
k /= 2;
|
||||
}
|
||||
if(j < k)j += k;
|
||||
}
|
||||
}
|
||||
void fft(complex y[],int len,int on)
|
||||
{
|
||||
change(y,len);
|
||||
for(int h = 2;h <= len;h <<= 1)
|
||||
{
|
||||
complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
|
||||
for(int j = 0;j < len;j += h)
|
||||
{
|
||||
complex w(1,0);
|
||||
for(int k = j;k < j+h/2;k++)
|
||||
{
|
||||
complex u = y[k];
|
||||
complex t = w*y[k+h/2];
|
||||
y[k] = u+t;
|
||||
y[k+h/2] = u-t;
|
||||
w = w*wn;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(on == -1)
|
||||
for(int i = 0;i < len;i++)
|
||||
y[i].r /= len;
|
||||
}
|
||||
const int MAXN = 400040;
|
||||
complex x1[MAXN];
|
||||
int a[MAXN/4];
|
||||
long long num[MAXN];
|
||||
long long sum[MAXN];
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
int n;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
memset(num,0,sizeof(num));
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
num[a[i]]++;
|
||||
}
|
||||
sort(a,a+n);
|
||||
int len1 = a[n-1]+1;
|
||||
int len = 1;
|
||||
while( len < 2*len1 )len <<= 1;
|
||||
for(int i = 0;i < len1;i++)
|
||||
x1[i] = complex(num[i],0);
|
||||
for(int i = len1;i < len;i++)
|
||||
x1[i] = complex(0,0);
|
||||
fft(x1,len,1);
|
||||
for(int i = 0;i < len;i++)
|
||||
x1[i] = x1[i]*x1[i];
|
||||
fft(x1,len,-1);
|
||||
for(int i = 0;i < len;i++)
|
||||
num[i] = (long long)(x1[i].r+0.5);
|
||||
len = 2*a[n-1];
|
||||
for(int i = 0;i < n;i++)
|
||||
num[a[i]+a[i]]--;
|
||||
for(int i = 1;i <= len;i++)
|
||||
{
|
||||
num[i]/=2;
|
||||
}
|
||||
sum[0] = 0;
|
||||
for(int i = 1;i <= len;i++)
|
||||
sum[i] = sum[i-1]+num[i];
|
||||
long long cnt = 0;
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
cnt += sum[len]-sum[a[i]];
|
||||
cnt -= (long long)(n-1-i)*i;
|
||||
cnt -= (n-1);
|
||||
cnt -= (long long)(n-1-i)*(n-i-2)/2;
|
||||
}
|
||||
long long tot = (long long)n*(n-1)*(n-2)/6;
|
||||
printf("%.7lf\n",(double)cnt/tot);
|
||||
}
|
||||
return 0;
|
||||
}
|
142
HDOJ/4610_autoAC.cpp
Normal file
142
HDOJ/4610_autoAC.cpp
Normal file
|
@ -0,0 +1,142 @@
|
|||
#include<cstdio>
|
||||
#include<iostream>
|
||||
#include<bitset>
|
||||
#include<cmath>
|
||||
#include<cstring>
|
||||
#include<vector>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const int N = (int)4e6+10;
|
||||
const int M = (int)1e6+10;
|
||||
typedef pair<int,int> pii;
|
||||
bool p[N];
|
||||
int prime[M];
|
||||
void init(){
|
||||
memset(p,true,sizeof(p));
|
||||
p[0] = p[1] = false;
|
||||
for(int i=2;i*i<N;i++)
|
||||
for(int j=i;j*i<N;j++)
|
||||
p[i*j] = 0;
|
||||
prime[0] = 0;
|
||||
for(int i=2;i<N;i++)
|
||||
if(p[i])prime[++prime[0]] = i;
|
||||
}
|
||||
vector<pii>factor;
|
||||
void div(int n){
|
||||
factor.clear();
|
||||
for(int i=1;prime[i] * prime[i] <= n;i++){
|
||||
if(n % prime[i] == 0){
|
||||
int cnt = 0;
|
||||
while(n % prime[i] == 0){
|
||||
n /= prime[i];
|
||||
++cnt;
|
||||
}
|
||||
factor.push_back(make_pair(prime[i],cnt));
|
||||
}
|
||||
}
|
||||
if(n > 1)factor.push_back(make_pair(n,1));
|
||||
}
|
||||
ll Pow(ll a,ll b){
|
||||
ll ans = 1;
|
||||
while(b){
|
||||
if(b&1)ans = ans * a;
|
||||
a = a * a;
|
||||
b >>= 1;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
bool isPrime_amount(int n){
|
||||
if(factor.size() > 1|| n==1 )return false;
|
||||
return p[factor[0].second + 1];
|
||||
}
|
||||
bool isPrime_sum(int n){
|
||||
if(factor.size() > 1|| n== 1)return false;
|
||||
int a = factor[0].first,b = factor[0].second;
|
||||
int sum = 1LL*(Pow(a,b+1) - 1) / (a - 1);
|
||||
return p[sum];
|
||||
}
|
||||
bool isSquare(ll n){
|
||||
ll _ = sqrt(n*1.0);
|
||||
return _ * _ == n;
|
||||
}
|
||||
bool isSquare_product(int n){
|
||||
int all = 1;
|
||||
for(int i=0;i<factor.size();i++)
|
||||
all *= factor[i].second + 1;
|
||||
ll sq = sqrt(n*1.0);
|
||||
ll cur = 1;
|
||||
int p = all >> 1;
|
||||
if(p & 1)cur *= n;
|
||||
if(all & 1)cur *= sq;
|
||||
return isSquare(cur);
|
||||
}
|
||||
int extra[5];
|
||||
int V[16],cur[5],hash[16];
|
||||
int have[16];
|
||||
int main(){
|
||||
for(int i=0;i<16;i++){
|
||||
int all = 0;
|
||||
for(int j=0;j<4;j++)
|
||||
if(!(i&(1<<j)))++all;
|
||||
have[i] = all;
|
||||
}
|
||||
init();
|
||||
int T,n,K;
|
||||
scanf("%d",&T);
|
||||
while(T--){
|
||||
memset(V,0,sizeof(V));
|
||||
scanf("%d%d",&n,&K);
|
||||
for(int i=1;i<=n;i++){
|
||||
int a,b;
|
||||
scanf("%d%d",&a,&b);
|
||||
int flag = 15,cnt = 0;
|
||||
div(a);
|
||||
if(p[a])flag ^= 1<<0 ,cnt ++;
|
||||
if(isPrime_amount(a)) flag ^= 1<<1,cnt ++;
|
||||
if(isPrime_sum(a))flag ^= 1<<2,cnt ++;
|
||||
if(isSquare_product(a)) flag ^= 1<<3,cnt++;
|
||||
V[flag] += b;
|
||||
if(i!=1)printf(" ");
|
||||
printf("%d",cnt);
|
||||
}
|
||||
puts("");
|
||||
int ans = -(~0u>>2);
|
||||
for(int i=0;i< 4;i++)scanf("%d",&extra[i]);
|
||||
for(int i=0;i < 1<<16;i++){
|
||||
memset(cur,0,sizeof(cur));
|
||||
int res = K,number = 0,all = 0;
|
||||
int flag = 15;
|
||||
for(int j = 0;j < 16;j++){
|
||||
if(i&(1<<j)){
|
||||
if(V[j] > 0){
|
||||
flag &= j;
|
||||
res --;
|
||||
all += have[j];
|
||||
cur[have[j]] += V[j] - 1;
|
||||
}else{
|
||||
res = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(res < 0 )continue;
|
||||
for(int k=4;k >= 0 && res > 0;k--){
|
||||
if(cur[k] <= res){
|
||||
all += k * cur[k];
|
||||
res -= cur[k];
|
||||
}else{
|
||||
all += res * k;
|
||||
res =0;
|
||||
}
|
||||
}
|
||||
if(res == 0){
|
||||
for(int j=0;j<4;j++)
|
||||
if(flag & (1<<j))all += extra[j];
|
||||
ans = max(ans,all);
|
||||
}
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
38
HDOJ/4611_autoAC.cpp
Normal file
38
HDOJ/4611_autoAC.cpp
Normal file
|
@ -0,0 +1,38 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
long long gcd(long long x,long long y)
|
||||
{
|
||||
return y==0?x:gcd(y,x%y);
|
||||
}
|
||||
long long Count(long long n,long long a,long long b)
|
||||
{
|
||||
long long now=0,ret=0,tmp,x=0,y=0;
|
||||
while(now<n)
|
||||
{
|
||||
tmp=min(a-x,b-y);
|
||||
if (now+tmp>n) tmp=n-now;
|
||||
ret+=tmp*abs(x-y);
|
||||
x=(x+tmp)%a;
|
||||
y=(y+tmp)%b;
|
||||
now+=tmp;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,T;
|
||||
long long a,b,n,l,ans;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
cin>>n>>a>>b;
|
||||
l=a*b/gcd(a,b);
|
||||
if (l>=n) ans=Count(n,a,b);
|
||||
else ans=Count(l,a,b)*(n/l)+Count(n%l,a,b);
|
||||
cout<<ans<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
171
HDOJ/4612_autoAC.cpp
Normal file
171
HDOJ/4612_autoAC.cpp
Normal file
|
@ -0,0 +1,171 @@
|
|||
#pragma comment(linker,"/STACK:102400000,102400000")
|
||||
#include<iostream>
|
||||
#include<string>
|
||||
#include<algorithm>
|
||||
#include<cstdlib>
|
||||
#include<cstdio>
|
||||
#include<set>
|
||||
#include<map>
|
||||
#include<vector>
|
||||
#include<cstring>
|
||||
#include<stack>
|
||||
#include<cmath>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
#define CL(x,v); memset(x,v,sizeof(x));
|
||||
#define INF 0x3f3f3f3f
|
||||
#define LL long long
|
||||
#define REP(i,r,n) for(int i=r;i<=n;i++)
|
||||
#define RREP(i,n,r) for(int i=n;i>=r;i--)
|
||||
const int MAXN=2e5+100;
|
||||
int n,m;
|
||||
struct Edge{
|
||||
int u,v;
|
||||
Edge(){}
|
||||
Edge(int a,int b){
|
||||
u=a;
|
||||
v=b;
|
||||
}
|
||||
};
|
||||
vector<Edge> edges;
|
||||
vector<int> G[MAXN];
|
||||
vector<int> P[MAXN];
|
||||
int dfs_clock,bcc_cnt;
|
||||
int pre[MAXN];
|
||||
int T[MAXN];
|
||||
int dfs1(int u,int fa)
|
||||
{
|
||||
int lowu=pre[u]=++dfs_clock;
|
||||
for(int i=0;i<G[u].size();i++)
|
||||
{
|
||||
int mm=G[u][i];
|
||||
int v=edges[mm].v;
|
||||
if(fa==(mm^1))continue;
|
||||
if(!pre[v])
|
||||
{
|
||||
int lowv=dfs1(v,mm);
|
||||
lowu=min(lowu,lowv);
|
||||
if(lowv>pre[u])
|
||||
{
|
||||
P[v].push_back(u);
|
||||
P[u].push_back(v);
|
||||
}
|
||||
}
|
||||
else if(pre[v]<pre[u])
|
||||
{
|
||||
lowu=min(pre[v],lowu);
|
||||
}
|
||||
}
|
||||
return lowu;
|
||||
}
|
||||
void dfs2(int u,int fa)
|
||||
{
|
||||
T[u]=bcc_cnt;
|
||||
for(int i=0;i<G[u].size();i++)
|
||||
{
|
||||
int v=edges[G[u][i]].v;
|
||||
bool f=true;
|
||||
for(int j=0;j<P[u].size();j++)
|
||||
{
|
||||
int vv=P[u][j];
|
||||
if(v==vv)
|
||||
{
|
||||
f=false;break;
|
||||
}
|
||||
}
|
||||
if(!f||T[v])continue;
|
||||
dfs2(v,u);
|
||||
}
|
||||
}
|
||||
void find_bcc(int n)
|
||||
{
|
||||
dfs_clock=0,bcc_cnt=0;
|
||||
memset(pre,0,sizeof(pre));
|
||||
memset(T,0,sizeof(T));
|
||||
for(int i=1;i<=n;i++)
|
||||
if(!pre[i])
|
||||
dfs1(i,-1);
|
||||
for(int i=1;i<=n;i++)
|
||||
if(!T[i])
|
||||
{
|
||||
bcc_cnt++;
|
||||
dfs2(i,-1);
|
||||
}
|
||||
}
|
||||
vector<int> GG[MAXN];
|
||||
int d[MAXN];
|
||||
void dfs(int u,int dep)
|
||||
{
|
||||
d[u]=dep;
|
||||
for(int i=0;i<GG[u].size();i++)
|
||||
{
|
||||
int v=GG[u][i];
|
||||
if(!d[v])
|
||||
{
|
||||
dfs(v,dep+1);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(~scanf("%d%d",&n,&m))
|
||||
{
|
||||
if(n+m==0)break;
|
||||
REP(i,0,n){
|
||||
G[i].clear();
|
||||
P[i].clear();
|
||||
}
|
||||
edges.clear();
|
||||
int a,b;
|
||||
REP(i,1,m)
|
||||
{
|
||||
scanf("%d%d",&a,&b);
|
||||
Edge e;
|
||||
e=Edge(a,b);
|
||||
edges.push_back(e);
|
||||
e=Edge(b,a);
|
||||
edges.push_back(e);
|
||||
int mm=edges.size();
|
||||
G[a].push_back(mm-2);
|
||||
G[b].push_back(mm-1);
|
||||
}
|
||||
find_bcc(n);
|
||||
REP(i,0,n)
|
||||
{
|
||||
GG[i].clear();
|
||||
}
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
for(int j=0;j<P[i].size();j++)
|
||||
{
|
||||
int v=P[i][j];
|
||||
if(T[i]!=T[v])
|
||||
{
|
||||
GG[T[i]].push_back(T[v]);
|
||||
}
|
||||
}
|
||||
}
|
||||
CL(d,0);
|
||||
dfs(1,1);
|
||||
int maxn=0;
|
||||
int flag=0;
|
||||
for(int i=1;i<=bcc_cnt;i++)
|
||||
{
|
||||
if(d[i]>maxn)
|
||||
{
|
||||
maxn=d[i];
|
||||
flag=i;
|
||||
}
|
||||
}
|
||||
CL(d,0);
|
||||
dfs(flag,1);
|
||||
maxn=0;
|
||||
for(int i=1;i<=bcc_cnt;i++)
|
||||
{
|
||||
if(d[i]>maxn)
|
||||
maxn=d[i];
|
||||
}
|
||||
cout<<bcc_cnt-maxn<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
205
HDOJ/4614_autoAC.cpp
Normal file
205
HDOJ/4614_autoAC.cpp
Normal file
|
@ -0,0 +1,205 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <string>
|
||||
#include <math.h>
|
||||
using namespace std;
|
||||
const int MAXN = 50010;
|
||||
struct Node
|
||||
{
|
||||
int l,r;
|
||||
int sum;
|
||||
int lazy;
|
||||
int first;
|
||||
int last;
|
||||
}segTree[MAXN*3];
|
||||
void push_up(int i)
|
||||
{
|
||||
if(segTree[i].l==segTree[i].r)return;
|
||||
segTree[i].sum = segTree[i<<1].sum+segTree[(i<<1)|1].sum;
|
||||
if(segTree[i<<1].first != -1)segTree[i].first = segTree[i<<1].first;
|
||||
else segTree[i].first = segTree[(i<<1)|1].first;
|
||||
if(segTree[(i<<1)|1].last != -1)segTree[i].last = segTree[(i<<1)|1].last;
|
||||
else segTree[i].last = segTree[(i<<1)].last;
|
||||
}
|
||||
void push_down(int i)
|
||||
{
|
||||
if(segTree[i].r == segTree[i].l)return;
|
||||
if(segTree[i].lazy==1)
|
||||
{
|
||||
segTree[i<<1].first = segTree[i<<1].l;
|
||||
segTree[i<<1].last = segTree[i<<1].r;
|
||||
segTree[i<<1].sum = segTree[i<<1].r-segTree[i<<1].l+1;
|
||||
segTree[i<<1].lazy=1;
|
||||
segTree[(i<<1)|1].first = segTree[(i<<1)|1].l;
|
||||
segTree[(i<<1)|1].last = segTree[(i<<1)|1].r;
|
||||
segTree[(i<<1)|1].sum = segTree[(i<<1)|1].r-segTree[(i<<1)|1].l+1;
|
||||
segTree[(i<<1)|1].lazy=1;
|
||||
}
|
||||
if(segTree[i].lazy == -1)
|
||||
{
|
||||
segTree[i<<1].first = -1;
|
||||
segTree[i<<1].last = -1;
|
||||
segTree[i<<1].sum = 0;
|
||||
segTree[i<<1].lazy=-1;
|
||||
segTree[(i<<1)|1].first = -1;
|
||||
segTree[(i<<1)|1].last = -1;
|
||||
segTree[(i<<1)|1].sum = 0;
|
||||
segTree[(i<<1)|1].lazy=-1;
|
||||
}
|
||||
segTree[i].lazy = 0;
|
||||
}
|
||||
void build(int i,int l,int r)
|
||||
{
|
||||
segTree[i].l = l;
|
||||
segTree[i].r = r;
|
||||
segTree[i].sum = r-l+1;
|
||||
segTree[i].lazy = 0;
|
||||
segTree[i].first = l;
|
||||
segTree[i].last = r;
|
||||
if(l==r)return ;
|
||||
int mid = (l+r)/2;
|
||||
build(i<<1,l,mid);
|
||||
build((i<<1)|1,mid+1,r);
|
||||
}
|
||||
void update(int i,int l,int r,int type)
|
||||
{
|
||||
if(segTree[i].l == l && segTree[i].r==r)
|
||||
{
|
||||
if(type == 0)
|
||||
{
|
||||
if(segTree[i].sum == 0)return;
|
||||
segTree[i].sum = 0;
|
||||
segTree[i].lazy = -1;
|
||||
segTree[i].first = -1;
|
||||
segTree[i].last = -1;
|
||||
return;
|
||||
}
|
||||
else if(type == 1)
|
||||
{
|
||||
if(segTree[i].sum == segTree[i].r-segTree[i].l+1)return;
|
||||
segTree[i].sum = segTree[i].r-segTree[i].l+1;
|
||||
segTree[i].lazy = 1;
|
||||
segTree[i].first = segTree[i].l;
|
||||
segTree[i].last = segTree[i].r;
|
||||
return;
|
||||
}
|
||||
}
|
||||
push_down(i);
|
||||
int mid = (segTree[i].l + segTree[i].r)/2;
|
||||
if(r <= mid)update(i<<1,l,r,type);
|
||||
else if(l > mid)update((i<<1)|1,l,r,type);
|
||||
else
|
||||
{
|
||||
update(i<<1,l,mid,type);
|
||||
update((i<<1)|1,mid+1,r,type);
|
||||
}
|
||||
push_up(i);
|
||||
}
|
||||
int sum(int i,int l,int r)
|
||||
{
|
||||
if(segTree[i].l == l && segTree[i].r == r)
|
||||
{
|
||||
return segTree[i].sum;
|
||||
}
|
||||
push_down(i);
|
||||
int mid = (segTree[i].l + segTree[i].r)/2;
|
||||
if(r <= mid)return sum(i<<1,l,r);
|
||||
else if(l > mid)return sum((i<<1)|1,l,r);
|
||||
else return sum((i<<1)|1,mid+1,r)+sum(i<<1,l,mid);
|
||||
}
|
||||
int n,m;
|
||||
int query1(int i,int l,int r)
|
||||
{
|
||||
if(segTree[i].l == l && segTree[i].r == r)
|
||||
{
|
||||
return segTree[i].first;
|
||||
}
|
||||
push_down(i);
|
||||
int mid = (segTree[i].l + segTree[i].r)/2;
|
||||
int ans1,ans2;
|
||||
if(r <= mid)return query1(i<<1,l,r);
|
||||
else if(l > mid)return query1((i<<1)|1,l,r);
|
||||
else
|
||||
{
|
||||
ans1 = query1(i<<1,l,mid);
|
||||
if(ans1 != -1)return ans1;
|
||||
return query1((i<<1)|1,mid+1,r);
|
||||
}
|
||||
}
|
||||
int query2(int i,int l,int r)
|
||||
{
|
||||
if(segTree[i].l == l && segTree[i].r == r)
|
||||
{
|
||||
return segTree[i].last;
|
||||
}
|
||||
push_down(i);
|
||||
int mid = (segTree[i].l + segTree[i].r)/2;
|
||||
int ans1,ans2;
|
||||
if(r <= mid)return query2(i<<1,l,r);
|
||||
else if(l > mid)return query2((i<<1)|1,l,r);
|
||||
else
|
||||
{
|
||||
ans1 = query2((i<<1)|1,mid+1,r);
|
||||
if(ans1 != -1)return ans1;
|
||||
return query2(i<<1,l,mid);
|
||||
}
|
||||
}
|
||||
int bisearch(int A,int F)
|
||||
{
|
||||
if(sum(1,A,n)==0)return -1;
|
||||
if(sum(1,A,n)<F)return n;
|
||||
int l= A,r = n;
|
||||
int ans=A;
|
||||
while(l<=r)
|
||||
{
|
||||
int mid = (l+r)/2;
|
||||
if(sum(1,A,mid)>=F)
|
||||
{
|
||||
ans = mid;
|
||||
r = mid-1;
|
||||
}
|
||||
else l = mid+1;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
build(1,1,n);
|
||||
int op,u,v;
|
||||
while(m--)
|
||||
{
|
||||
scanf("%d%d%d",&op,&u,&v);
|
||||
if(op == 1)
|
||||
{
|
||||
u++;
|
||||
int t = bisearch(u,v);
|
||||
if(t==-1)
|
||||
{
|
||||
printf("Can not put any one.\n");
|
||||
continue;
|
||||
}
|
||||
printf("%d %d\n",query1(1,u,t)-1,query2(1,u,t)-1);
|
||||
update(1,u,t,0);
|
||||
}
|
||||
else
|
||||
{
|
||||
u++;v++;
|
||||
printf("%d\n",v-u+1-sum(1,u,v));
|
||||
update(1,u,v,1);
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
81
HDOJ/4616_autoAC.cpp
Normal file
81
HDOJ/4616_autoAC.cpp
Normal file
|
@ -0,0 +1,81 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#define N 50005
|
||||
#define INF 99999999
|
||||
struct Edge
|
||||
{
|
||||
int e, next;
|
||||
}edge[N*2];
|
||||
int head[N], eNum;
|
||||
int c[N], val[N], n, k, ans, dp[N][4][2];
|
||||
void init()
|
||||
{
|
||||
memset(head, -1, sizeof(head));
|
||||
eNum = 0; ans = 0;
|
||||
for(int i=0; i<n; i++)
|
||||
{
|
||||
for(int j=0; j<4; j++)
|
||||
{
|
||||
for(int l=0; l<2; l++)
|
||||
dp[i][j][l] = -INF;
|
||||
}
|
||||
}
|
||||
}
|
||||
void AddEdge(int u, int v)
|
||||
{
|
||||
edge[eNum].e = v;
|
||||
edge[eNum].next = head[u];
|
||||
head[u] = eNum++;
|
||||
}
|
||||
int max2(int x, int y)
|
||||
{
|
||||
return x > y ? x : y;
|
||||
}
|
||||
void dfs(int u, int fa)
|
||||
{
|
||||
dp[u][c[u]][c[u]] = val[u];
|
||||
for(int i=head[u]; i!=-1; i=edge[i].next)
|
||||
{
|
||||
int v = edge[i].e;
|
||||
if(v==fa) continue;
|
||||
dfs(v, u);
|
||||
for(int j=0; j<=k; j++)
|
||||
{
|
||||
for(int l=0; l+j<=k; l++)
|
||||
{
|
||||
ans = max2(ans, dp[u][j][1]+dp[v][l][1]);
|
||||
if(j+l!=k) ans = max2(ans, dp[u][j][0]+dp[v][l][0]);
|
||||
ans = max2(ans, dp[u][j][0]+dp[v][l][1]);
|
||||
ans = max2(ans, dp[u][j][1]+dp[v][l][0]);
|
||||
}
|
||||
}
|
||||
for(int j=0; j<k; j++)
|
||||
{
|
||||
dp[u][j+c[u]][1] = max2(dp[u][j+c[u]][1],dp[v][j][1]+val[u]);
|
||||
dp[u][j+c[u]][0] = max2(dp[u][j+c[u]][0],dp[v][j][0]+val[u]);
|
||||
}
|
||||
if(c[u]==0) dp[u][k][1] = max2(dp[u][k][1], dp[v][k][1]+val[u]);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d%d",&n,&k);
|
||||
for(int i=0; i<n; i++)
|
||||
scanf("%d%d",&val[i],&c[i]);
|
||||
init();
|
||||
int u, v;
|
||||
for(int i=0; i<n-1; i++)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
AddEdge(u, v);
|
||||
AddEdge(v, u);
|
||||
}
|
||||
dfs(0,-1);
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
120
HDOJ/4617_autoAC.cpp
Normal file
120
HDOJ/4617_autoAC.cpp
Normal file
|
@ -0,0 +1,120 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <string>
|
||||
#include <math.h>
|
||||
using namespace std;
|
||||
const double eps = 1e-8;
|
||||
int sgn(double x)
|
||||
{
|
||||
if(fabs(x) < eps)return 0;
|
||||
if(x < 0)return -1;
|
||||
else return 1;
|
||||
}
|
||||
struct Point3D
|
||||
{
|
||||
double x,y,z;
|
||||
Point3D(double _x = 0,double _y = 0,double _z = 0)
|
||||
{
|
||||
x = _x;
|
||||
y = _y;
|
||||
z = _z;
|
||||
}
|
||||
Point3D operator -(const Point3D &b)const
|
||||
{
|
||||
return Point3D(x-b.x,y-b.y,z-b.z);
|
||||
}
|
||||
Point3D operator ^(const Point3D &b)const
|
||||
{
|
||||
return Point3D(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);
|
||||
}
|
||||
double operator *(const Point3D &b)const
|
||||
{
|
||||
return x*b.x+y*b.y+z*b.z;
|
||||
}
|
||||
void input()
|
||||
{
|
||||
scanf("%lf%lf%lf",&x,&y,&z);
|
||||
}
|
||||
};
|
||||
double Norm(Point3D p)
|
||||
{
|
||||
return sqrt(p*p);
|
||||
}
|
||||
double calc(Point3D a,Point3D k1,Point3D b,Point3D k2)
|
||||
{
|
||||
Point3D tmp = k1^k2;
|
||||
return fabs(tmp*(a-b))/sqrt(tmp*tmp);
|
||||
}
|
||||
struct Node
|
||||
{
|
||||
Point3D o,p1,p2;
|
||||
void input()
|
||||
{
|
||||
o.input();
|
||||
p1.input();
|
||||
p2.input();
|
||||
}
|
||||
}node[50];
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
int n;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
for(int i = 0;i < n;i++)
|
||||
node[i].input();
|
||||
bool flag = false;
|
||||
double Min = 1e20;
|
||||
for(int i = 0;i < n;i++)
|
||||
for(int j = i+1;j < n;j++)
|
||||
{
|
||||
if(flag)break;
|
||||
double r1 = sqrt((node[i].p1-node[i].o)*(node[i].p1-node[i].o));
|
||||
double r2 = sqrt((node[j].p1-node[j].o)*(node[j].p1-node[j].o));
|
||||
Point3D k1 = (node[i].p1-node[i].o)^(node[i].p2-node[i].o);
|
||||
Point3D k2 = (node[j].p1-node[j].o)^(node[j].p2-node[j].o);
|
||||
if(sgn(Norm(k1^k2))==0)
|
||||
{
|
||||
if(sgn( Norm( k1^(node[i].o-node[j].o)) ) == 0)
|
||||
{
|
||||
if(sgn(r1-r2) == 0)
|
||||
{
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
else continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
double dd = (k1*(node[i].o-node[j].o))/Norm(k1);
|
||||
double d = sqrt( Norm(node[i].o-node[j].o)*Norm(node[i].o-node[j].o) - dd*dd );
|
||||
if(d > fabs(r1-r2) &&d < fabs(r1+r2))
|
||||
{
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
Min = min(Min,d-r1-r2);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
double d = calc(node[i].o,k1,node[j].o,k2);
|
||||
if(d < r1 + r2 -eps)
|
||||
{
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
Min = min(Min,d-r1-r2);
|
||||
}
|
||||
if(flag || sgn(Min)<=0)printf("Lucky\n");
|
||||
else printf("%.2lf\n",Min);
|
||||
}
|
||||
return 0;
|
||||
}
|
82
HDOJ/4619_autoAC.cpp
Normal file
82
HDOJ/4619_autoAC.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
#include<stdio.h>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<string.h>
|
||||
#include<vector>
|
||||
using namespace std;
|
||||
const int MAXN=2505;
|
||||
int linker[MAXN];
|
||||
bool used[MAXN];
|
||||
vector<int>map[MAXN];
|
||||
int uN;
|
||||
bool dfs(int u)
|
||||
{
|
||||
for(int i=0;i<map[u].size();i++)
|
||||
{
|
||||
if(!used[map[u][i]])
|
||||
{
|
||||
used[map[u][i]]=true;
|
||||
if(linker[map[u][i]]==-1||dfs(linker[map[u][i]]))
|
||||
{
|
||||
linker[map[u][i]]=u;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
int hungary()
|
||||
{
|
||||
int u;
|
||||
int res=0;
|
||||
memset(linker,-1,sizeof(linker));
|
||||
for(u=0;u<uN;u++)
|
||||
{
|
||||
memset(used,false,sizeof(used));
|
||||
if(dfs(u)) res++;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
pair<int,int>p1[MAXN];
|
||||
pair<int,int>p2[MAXN];
|
||||
int main()
|
||||
{
|
||||
int n,m;
|
||||
int x,y;
|
||||
while(scanf("%d%d",&n,&m)==2)
|
||||
{
|
||||
if(n==0 &&m==0)break;
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
scanf("%d%d",&x,&y);
|
||||
p1[i]= make_pair(x,y);
|
||||
}
|
||||
for(int i = 0;i < m;i++)
|
||||
{
|
||||
scanf("%d%d",&x,&y);
|
||||
p2[i]= make_pair(x,y);
|
||||
}
|
||||
uN = n;
|
||||
for(int i = 0;i < n;i++)
|
||||
map[i].clear();
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
for(int j = 0;j < m;j++)
|
||||
{
|
||||
int x1 = p1[i].first;
|
||||
int y1 = p1[i].second;
|
||||
int x2 = p2[j].first;
|
||||
int y2 = p2[j].second;
|
||||
if( (x1==x2 && y1==y2)
|
||||
||(x1==x2 && y1==y2+1)
|
||||
||(x1+1==x2 && y1==y2)
|
||||
||(x1+1==x2 && y1==y2+1)
|
||||
)
|
||||
map[i].push_back(j);
|
||||
}
|
||||
}
|
||||
int ans = n+m-hungary();
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
76
HDOJ/4620_autoAC.cpp
Normal file
76
HDOJ/4620_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
struct node
|
||||
{
|
||||
int t,p[15],c,id;
|
||||
}cut[35];
|
||||
bool cmp(node x,node y)
|
||||
{
|
||||
return x.t<y.t;
|
||||
}
|
||||
int T,longe,ans[35],tmpa[35],tmpl,n,w,m,vis[205],num;
|
||||
void dfs(int pos,int lastt)
|
||||
{
|
||||
if(n-pos+tmpl<=longe) return;
|
||||
int num,i,j,tmp;
|
||||
for(i=pos+1;i<=n;i++)
|
||||
{
|
||||
for(j=1,num=0;j<=cut[i].c;j++)
|
||||
{
|
||||
tmp=cut[i].p[j];
|
||||
if(vis[tmp]==0)
|
||||
num++;
|
||||
vis[tmp]++;
|
||||
}
|
||||
if((cut[i].t-lastt<=w||!tmpl)&&num>=3)
|
||||
{
|
||||
tmpl++;
|
||||
tmpa[tmpl]=cut[i].id;
|
||||
dfs(i,cut[i].t);
|
||||
tmpl--;
|
||||
}
|
||||
for(j=1;j<=cut[i].c;j++)
|
||||
{
|
||||
tmp=cut[i].p[j];
|
||||
vis[tmp]--;
|
||||
}
|
||||
}
|
||||
if(longe<tmpl)
|
||||
{
|
||||
longe=tmpl;
|
||||
for(j=0;j<longe;j++)
|
||||
ans[j]=tmpa[j+1];
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d%d%d",&n,&m,&w);
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d%d",&cut[i].c,&cut[i].t);
|
||||
for(j=1;j<=cut[i].c;j++)
|
||||
scanf("%d",&cut[i].p[j]);
|
||||
cut[i].id=i;
|
||||
}
|
||||
sort(cut+1,cut+n+1,cmp);
|
||||
memset(vis,0,sizeof vis);
|
||||
longe=0;tmpl=0;
|
||||
dfs(0,cut[1].t);
|
||||
sort(ans,ans+longe);
|
||||
printf("%d\n",longe);
|
||||
for(i=0;i<longe-1;i++)
|
||||
printf("%d ",ans[i]);
|
||||
printf("%d\n",ans[longe-1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
116
HDOJ/4622_autoAC.cpp
Normal file
116
HDOJ/4622_autoAC.cpp
Normal file
|
@ -0,0 +1,116 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
#include <stdlib.h>
|
||||
#define ll __int64
|
||||
using namespace std ;
|
||||
const int maxn = 1111111 ;
|
||||
ll f[maxn] , g[maxn] ;
|
||||
int wa[maxn] , wb[maxn] , wv[maxn] , ws[maxn] , pos[maxn] ;
|
||||
struct suf
|
||||
{
|
||||
int sa[maxn] , hei[maxn] , rank[maxn] ;
|
||||
int cmp ( int *r , int i , int j , int l )
|
||||
{
|
||||
return r[i] == r[j] && r[i+l] == r[j+l] ;
|
||||
}
|
||||
void da ( int *r , int n , int m )
|
||||
{
|
||||
int *x = wa , *y = wb , *t ;
|
||||
int i , j , p ;
|
||||
for ( i = 0 ; i < m ; i ++ ) ws[i] = 0 ;
|
||||
for ( i = 0 ; i < n ; i ++ ) ws[x[i]=r[i]] ++ ;
|
||||
for ( i = 1 ; i < m ; i ++ ) ws[i] += ws[i-1] ;
|
||||
for ( i = n - 1 ; i >= 0 ; i -- ) sa[--ws[x[i]]] = i ;
|
||||
for ( j = 1 , p = 1 ; p < n ; j *= 2 , m = p )
|
||||
{
|
||||
for ( p = 0 , i = n - j ; i < n ; i ++ ) y[p++] = i ;
|
||||
for ( i = 0 ; i < n ; i ++ ) if ( sa[i] >= j ) y[p++] = sa[i] - j ;
|
||||
for ( i = 0 ; i < m ; i ++ ) ws[i] = 0 ;
|
||||
for ( i = 0 ; i < n ; i ++ ) ws[x[i]] ++ ;
|
||||
for ( i = 1 ; i < m ; i ++ ) ws[i] += ws[i-1] ;
|
||||
for ( i = n - 1 ; i >= 0 ; i -- ) sa[--ws[x[y[i]]]] = y[i] ;
|
||||
for ( t = x , x = y , y = t , p = 1 , x[sa[0]] = 0 , i = 1 ; i < n ; i ++ )
|
||||
x[sa[i]] = cmp ( y , sa[i-1] , sa[i] , j ) ? p - 1 : p ++ ;
|
||||
}
|
||||
int k = 0 ;
|
||||
for ( i = 1 ; i < n ; i ++ ) rank[sa[i]] = i ;
|
||||
for ( i = 0 ; i < n - 1 ; hei[rank[i++]] = k )
|
||||
for ( k ? k -- : 0 , j = sa[rank[i]-1] ; r[i+k] == r[j+k] ; k ++ ) ;
|
||||
}
|
||||
int solve ( int n )
|
||||
{
|
||||
int ans = 0 , i ;
|
||||
for ( i = 1 ; i <= n ; i ++ )
|
||||
ans += n - sa[i] - hei[i] ;
|
||||
return ans ;
|
||||
}
|
||||
} arr ;
|
||||
int s1[maxn] , dp[20][2222] ;
|
||||
void rmq ( int n )
|
||||
{
|
||||
int i , j ;
|
||||
f[0] = 1 ;
|
||||
for ( i = 1 ; i <= 15 ; i ++ )
|
||||
f[i] = f[i-1] * 2 ;
|
||||
g[0] = -1 ;
|
||||
for ( i = 1 ; i < 2222 ; i ++ )
|
||||
g[i] = g[i>>1] + 1 ;
|
||||
for ( i = 1 ; f[i] <= n ; i ++ )
|
||||
for ( j = 1 ; j + f[i] - 1 <= n ; j ++ )
|
||||
dp[i][j] = min ( dp[i-1][j] , dp[i-1][j+f[i-1]] ) ;
|
||||
}
|
||||
int query ( int l , int r )
|
||||
{
|
||||
if ( l == r ) return dp[0][l] ;
|
||||
if ( l > r ) swap ( l , r ) ;
|
||||
int i , j , k ;
|
||||
k = g[r-l+1] ;
|
||||
return min ( dp[k][l] , dp[k][r-f[k]+1] ) ;
|
||||
}
|
||||
char s[maxn] ;
|
||||
int num[maxn] ;
|
||||
int main ()
|
||||
{
|
||||
int n , k , i , l , r ;
|
||||
int cas ;
|
||||
scanf ( "%d" , &cas ) ;
|
||||
while ( cas -- )
|
||||
{
|
||||
int q ;
|
||||
scanf ( "%s" , s ) ;
|
||||
int len = strlen ( s ) ;
|
||||
for ( i = 0 ; i < len ; i ++ ) s1[i] = s[i] ;
|
||||
s1[len] = 0 ;
|
||||
arr.da ( s1 , len + 1 , 555 ) ;
|
||||
for ( i = 1 ; i <= len ; i ++ )
|
||||
dp[0][i] = arr.hei[i] ;
|
||||
rmq ( len ) ;
|
||||
n = len ;
|
||||
scanf ( "%d" , &q ) ;
|
||||
while ( q -- )
|
||||
{
|
||||
scanf ( "%d%d" , &l , &r ) ;
|
||||
int ans = ( r - l + 1 ) * ( r - l + 2) / 2 ;
|
||||
for ( i = 0 ; i <= n ; i ++ ) pos[i] = -1 ;
|
||||
for ( i = l ; i <= r ; i ++ )
|
||||
pos[arr.rank[i-1]] = i - 1 ;
|
||||
int last = -1 , d = 0 ;
|
||||
for ( i = 1 ; i <= n ; i ++ )
|
||||
{
|
||||
if ( pos[i] != -1 )
|
||||
{
|
||||
if ( last != -1 )
|
||||
{
|
||||
int t = query ( arr.rank[last] + 1 , arr.rank[pos[i]] ) ;
|
||||
d = min ( d , t ) ;
|
||||
d = max ( d , min ( t , r - last ) ) ;
|
||||
ans -= min ( d , r - pos[i] );
|
||||
}
|
||||
last = pos[i] ;
|
||||
}
|
||||
}
|
||||
printf ( "%d\n" , ans ) ;
|
||||
}
|
||||
}
|
||||
}
|
123
HDOJ/4623_autoAC.cpp
Normal file
123
HDOJ/4623_autoAC.cpp
Normal file
|
@ -0,0 +1,123 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int prime[]={2,3,5,7,11,13,17,19,23};
|
||||
const int np=9;
|
||||
int state[30];
|
||||
int g[300][300];
|
||||
int vi[300];
|
||||
int num[30];
|
||||
int base[30];
|
||||
short dp[19][2000000];
|
||||
bool ok[29];
|
||||
int n,m,ns,st;
|
||||
void ini()
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
memset(g,0,sizeof(g));
|
||||
memset(vi,0,sizeof(vi));
|
||||
memset(num,0,sizeof(num));
|
||||
ns=0;
|
||||
state[++ns]=0;
|
||||
num[ns]=1;
|
||||
for(int i=2;i<=n;i++)
|
||||
{
|
||||
st=0;
|
||||
if(ok[i])
|
||||
{
|
||||
num[1]++;
|
||||
continue;
|
||||
}
|
||||
for(int j=0;j<np;j++)
|
||||
{
|
||||
if(i%prime[j]==0)
|
||||
{
|
||||
st|=(1<<j);
|
||||
}
|
||||
}
|
||||
if(!vi[st])
|
||||
{
|
||||
state[++ns]=st;
|
||||
num[ns]=1;
|
||||
vi[st]=ns;
|
||||
}
|
||||
else
|
||||
{
|
||||
num[vi[st]]++;
|
||||
}
|
||||
}
|
||||
for(int i=1;i<=ns;i++)
|
||||
{
|
||||
for(int j=1;j<=ns;j++)
|
||||
{
|
||||
if((state[i]&state[j])==0)
|
||||
g[i][j]=1;
|
||||
}
|
||||
}
|
||||
base[1]=1;
|
||||
st=0;
|
||||
for(int i=1;i<=ns;i++)
|
||||
{
|
||||
base[i+1]=base[i]*(num[i]+1);
|
||||
st+=base[i]*num[i];
|
||||
}
|
||||
}
|
||||
int getnum(int i,int x)
|
||||
{
|
||||
int res=(x%base[i+1])/(base[i]);
|
||||
return res;
|
||||
}
|
||||
int getstate(int i,int num)
|
||||
{
|
||||
return num*base[i];
|
||||
}
|
||||
void dfs(int t,int x)
|
||||
{
|
||||
if(t==0)
|
||||
{
|
||||
dp[x][0]=1;
|
||||
return ;
|
||||
}
|
||||
if(dp[x][t]!=-1)
|
||||
return;
|
||||
dp[x][t]=0;
|
||||
for(int i=1;i<=ns;i++)
|
||||
{
|
||||
if(g[x][i]&&getnum(i,t)>=1)
|
||||
{
|
||||
dfs(t-base[i],i);
|
||||
dp[x][t]=((int)dp[x][t]+dp[i][t-base[i]])%m;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
memset(ok,0,sizeof(ok));
|
||||
ok[17]=1;
|
||||
ok[19]=1;
|
||||
ok[23]=1;
|
||||
while(T--)
|
||||
{
|
||||
ini();
|
||||
memset(dp,-1,sizeof(dp));
|
||||
int ans=0;
|
||||
for(int i=1;i<=ns;i++)
|
||||
{
|
||||
dfs(st-base[i],i);
|
||||
ans=((int)ans+dp[i][st-base[i]])%m;
|
||||
}
|
||||
for(int i=1;i<=ns;i++)
|
||||
{
|
||||
while(num[i]>1)
|
||||
{
|
||||
ans=((int)ans*num[i])%m;
|
||||
num[i]--;
|
||||
}
|
||||
}
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
}
|
94
HDOJ/4625_autoAC.cpp
Normal file
94
HDOJ/4625_autoAC.cpp
Normal file
|
@ -0,0 +1,94 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
const int maxn = 5e4 + 10;
|
||||
const int maxk = 5e2 + 10;
|
||||
const int mod = 10007;
|
||||
typedef long long LL;
|
||||
struct edge {
|
||||
int v, to;
|
||||
};
|
||||
vector<edge> E;
|
||||
int L[maxn];
|
||||
void graph_init()
|
||||
{
|
||||
E.clear();
|
||||
memset(L, -1, sizeof(L));
|
||||
}
|
||||
void graph_add(int u, int v)
|
||||
{
|
||||
edge t = {v, L[u]};
|
||||
L[u] = E.size();
|
||||
E.push_back(t);
|
||||
}
|
||||
int s[maxk][maxk];
|
||||
int f[maxk];
|
||||
int c[maxk][maxk];
|
||||
void init()
|
||||
{
|
||||
s[0][0] = f[0] = c[0][0] = 1;
|
||||
for (int i = 1; i < maxk; i++) {
|
||||
f[i] = f[i-1] * i % mod;
|
||||
c[i][0] = 1;
|
||||
for (int j = 1; j < maxk; j++) {
|
||||
s[i][j] = (j * s[i-1][j] % mod + s[i-1][j-1]) % mod;
|
||||
c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod;
|
||||
}
|
||||
}
|
||||
}
|
||||
int n, k;
|
||||
int d[maxn][maxk];
|
||||
void dp_son(int u = 0, int p = -1)
|
||||
{
|
||||
memset(d[u], 0, sizeof(d[u]));
|
||||
for (int i = L[u]; i != -1; i = E[i].to)
|
||||
if (i != p) {
|
||||
int v = E[i].v;
|
||||
dp_son(v, i^1);
|
||||
for (int j = 0; j <= k; j++)
|
||||
d[u][j] = (d[u][j] + d[v][j] + (j? d[v][j-1]: 0) + c[1][j]) % mod;
|
||||
}
|
||||
}
|
||||
int tmp[maxk];
|
||||
void dp_father(int u = 0, int p = -1)
|
||||
{
|
||||
if (p != -1) {
|
||||
int v = E[p].v;
|
||||
memcpy(tmp, d[v], sizeof(d[v]));
|
||||
for (int j = 0; j <= k; j++)
|
||||
tmp[j] = (tmp[j] - (d[u][j] + (j? d[u][j-1]: 0) + c[1][j]) % mod + mod) % mod;
|
||||
for (int j = 0; j <= k; j++)
|
||||
d[u][j] = (d[u][j] + tmp[j] + (j? tmp[j-1]: 0) + c[1][j]) % mod;
|
||||
}
|
||||
for (int i = L[u]; i != -1; i = E[i].to)
|
||||
if (i != p) dp_father(E[i].v, i^1);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
int T;
|
||||
scanf("%d", &T);
|
||||
for ( ; T--; ) {
|
||||
graph_init();
|
||||
scanf("%d%d", &n, &k);
|
||||
for (int i = 0; i < n-1; i++) {
|
||||
int u, v;
|
||||
scanf("%d%d", &u, &v);
|
||||
u--, v--;
|
||||
graph_add(u, v);
|
||||
graph_add(v, u);
|
||||
}
|
||||
dp_son();
|
||||
dp_father();
|
||||
for (int u = 0; u < n; u++) {
|
||||
int sum = 0;
|
||||
for (int i = 0; i <= k; i++)
|
||||
sum = (sum + s[k][i]*f[i]%mod*d[u][i]%mod) % mod;
|
||||
printf("%d\n", sum);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
30
HDOJ/4627_autoAC.cpp
Normal file
30
HDOJ/4627_autoAC.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<iostream>
|
||||
using namespace std;
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
__int64 n;
|
||||
scanf("%I64d",&n);
|
||||
if(n==2)
|
||||
{
|
||||
printf("1\n");
|
||||
continue;
|
||||
}
|
||||
if(n&1)
|
||||
printf("%I64d\n",(n/2)*(n/2+1));
|
||||
else
|
||||
{
|
||||
n/=2;
|
||||
if(n&1)
|
||||
printf("%I64d\n",(n-2)*(n+2));
|
||||
else
|
||||
printf("%I64d\n",(n-1)*(n+1));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
48
HDOJ/4628_autoAC.cpp
Normal file
48
HDOJ/4628_autoAC.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
bool legal[(1<<16)+1];
|
||||
int dp[(1<<16)+1];
|
||||
char s[20];
|
||||
char str[20];
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
scanf("%s",s);
|
||||
int num=0;
|
||||
int len=strlen(s);
|
||||
for(int i=1;i<(1<<len);i++)
|
||||
{
|
||||
int cnt=0;
|
||||
for(int j=0;j<len;j++)
|
||||
if(i&(1<<j))
|
||||
str[cnt++]=s[j];
|
||||
int l=0,r=cnt-1;
|
||||
while(l<r && str[l]==str[r])
|
||||
{
|
||||
l++;
|
||||
r--;
|
||||
}
|
||||
if(l==r || l-1==r)
|
||||
legal[i]=true;
|
||||
else
|
||||
legal[i]=false;
|
||||
}
|
||||
memset(dp,0x3f,sizeof(dp));
|
||||
dp[0]=0;
|
||||
for(int i=1;i<(1<<len);i++)
|
||||
{
|
||||
for(int j=i;j>0;j=i&(j-1))
|
||||
if(legal[j])
|
||||
dp[i]=min(dp[i],dp[i-j]+1);
|
||||
}
|
||||
printf("%d\n",dp[(1<<len)-1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
168
HDOJ/4629_autoAC.cpp
Normal file
168
HDOJ/4629_autoAC.cpp
Normal file
|
@ -0,0 +1,168 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
#include<vector>
|
||||
#include<cstdlib>
|
||||
#define pbk push_back
|
||||
using namespace std;
|
||||
const int N = 25050+10;
|
||||
const double eps = 1e-10;
|
||||
inline double sqr(double x){
|
||||
return x * x;
|
||||
}
|
||||
inline int dcmp(double x){
|
||||
return x < -eps ? -1 : x > eps;
|
||||
}
|
||||
struct Point{
|
||||
double x,y;
|
||||
int kind;
|
||||
Point(){}
|
||||
Point(double x,double y,int kind = 0):x(x),y(y),kind(kind){}
|
||||
bool operator < (const Point &p)const{
|
||||
return dcmp(x - p.x) < 0 || ( dcmp(x - p.x) == 0 && dcmp(y - p.y) < 0 );
|
||||
}
|
||||
Point operator - (const Point &p)const{
|
||||
return Point(x - p.x, y - p.y);
|
||||
}
|
||||
Point operator + (const Point &p)const{
|
||||
return Point(x + p.x, y + p.y);
|
||||
}
|
||||
Point operator * (const double &k)const{
|
||||
return Point (x*k , y*k);
|
||||
}
|
||||
Point operator / (const double &k)const{
|
||||
return Point (x/k, y/k);
|
||||
}
|
||||
double operator * (const Point &p)const{
|
||||
return x * p.y - y * p.x;
|
||||
}
|
||||
double operator / (const Point &p)const{
|
||||
return x * p.x + y * p.y;
|
||||
}
|
||||
void input(){
|
||||
scanf("%lf%lf",&x,&y);
|
||||
}
|
||||
void ot(){
|
||||
printf("%lf %lf\n",x,y);
|
||||
}
|
||||
};
|
||||
struct Line{
|
||||
Point a,b;
|
||||
int kind;
|
||||
Line (){}
|
||||
Line (Point a,Point b,int kind = 0):a(a),b(b),kind(kind){}
|
||||
double operator * (const Point &p)const{
|
||||
return ( b - a ) * ( p - a );
|
||||
}
|
||||
double operator / (const Point &p)const{
|
||||
return ( p - a) / ( p - b);
|
||||
}
|
||||
bool parallel(const Line &v){
|
||||
return !dcmp( ( b - a ) * ( v.b - v.a ) );
|
||||
}
|
||||
int LineCrossLine(const Line &v){
|
||||
if ( (*this).parallel(v) ){
|
||||
return ( dcmp( v * a ) == 0);
|
||||
}return 2;
|
||||
}
|
||||
int SegCrossSeg(const Line &v){
|
||||
int d1 = dcmp( (*this) * v.a);
|
||||
int d2 = dcmp( (*this) * v.b);
|
||||
int d3 = dcmp( v * a);
|
||||
int d4 = dcmp( v * b);
|
||||
if ( ( d1 ^ d2 ) == -2 && ( d3 ^ d4 ) == -2 ) return 2;
|
||||
return ( ( d1 == 0 && dcmp( (*this) / v.a ) <= 0 )
|
||||
|| ( d2 == 0 && dcmp( (*this) / v.b ) <= 0 )
|
||||
|| ( d3 == 0 && dcmp( v / a ) <= 0 )
|
||||
|| ( d4 == 0 && dcmp( v / b ) <= 0 )
|
||||
);
|
||||
}
|
||||
Point CrossPoint(const Line &v){
|
||||
double s1 = v * a, s2 = v * b;
|
||||
return ( a * s2 - b * s1) / (s2 - s1);
|
||||
}
|
||||
void input(){
|
||||
a.input(); b.input();
|
||||
}
|
||||
void ot(){
|
||||
a.ot(); b.ot();
|
||||
}
|
||||
};
|
||||
int n,poly_n,xn;
|
||||
vector<double> lx;
|
||||
vector<Line> line;
|
||||
double ans[N];
|
||||
void init(){
|
||||
int sz = line.size();
|
||||
for (int i = 0; i < sz; i++){
|
||||
for (int j = i+1; j < sz; j++){
|
||||
if (line[i].SegCrossSeg(line[j]) == 2){
|
||||
Point p = line[i].CrossPoint(line[j]);
|
||||
lx.pbk(p.x);
|
||||
}
|
||||
}
|
||||
}
|
||||
sort(lx.begin(),lx.end());
|
||||
xn = unique(lx.begin(),lx.end()) - lx.begin();
|
||||
}
|
||||
vector<Point> qu[N];
|
||||
void work(){
|
||||
for (int i = 0; i <= n; i++) ans[i] = 0;
|
||||
for (int i = 0; i < xn-1; i++){
|
||||
int k = 0;
|
||||
for (int j = 0; j+1 < qu[i].size(); j++){
|
||||
k += qu[i][j].kind;
|
||||
ans[ k ] += (lx[i+1] - lx[i]) * (qu[i][j+1].x+qu[i][j+1].y - qu[i][j].x - qu[i][j].y) / 2;
|
||||
}
|
||||
}
|
||||
for (int i = 1; i <= n; i++) printf("%.10lf\n",ans[i]);
|
||||
}
|
||||
void solve(){
|
||||
for (int i = 0; i < xn; i++) qu[i].clear();
|
||||
for (int i = 0; i < line.size(); i++){
|
||||
int j = lower_bound(lx.begin(),lx.begin()+xn,line[i].a.x) - lx.begin();
|
||||
for (; j+1 < xn; j++ ){
|
||||
double l = lx[j], r = lx[j+1];
|
||||
if (dcmp(r - line[i].b.x) > 0) break;
|
||||
Point p1 = line[i].CrossPoint(Line(Point(l,0), Point(l,1)));
|
||||
Point p2 = line[i].CrossPoint(Line(Point(r,0), Point(r,1)));
|
||||
qu[j].pbk(Point(p1.y, p2.y,line[i].kind));
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < xn - 1; i++) sort(qu[i].begin(), qu[i].end());
|
||||
work();
|
||||
}
|
||||
int main(){
|
||||
int T; scanf("%d",&T);
|
||||
while (T--){
|
||||
scanf("%d",&n);
|
||||
lx.clear(); line.clear();;
|
||||
for (int i = 0; i < n ;i++){
|
||||
Point t[4];
|
||||
for (int j = 0; j < 3; j++ ){
|
||||
t[j].input();
|
||||
}
|
||||
t[3] = t[0];
|
||||
int flag = 1;
|
||||
if (dcmp( (t[1] - t[0])*(t[2] - t[0]) ) == 0) flag = 0;
|
||||
for (int i = 0; i < 3 && flag; i++ ){
|
||||
lx.pbk(t[i].x);
|
||||
for (int j = i+1; j < 3; j++){
|
||||
Line tmp; tmp.a = t[i]; tmp.b = t[j];
|
||||
if (dcmp( tmp.a.x - tmp.b.x ) > 0) swap(tmp.a, tmp.b);
|
||||
Line tmp2 = Line(t[3-i-j], Point(t[3-i-j].x, t[3-i-j].y - 1));
|
||||
if (tmp.LineCrossLine(tmp2) != 2) continue;
|
||||
Point tp = tmp.CrossPoint(tmp2);
|
||||
if (dcmp(tp.y - t[3-i-j].y) < 0) tmp.kind = 1;
|
||||
else tmp.kind = -1;
|
||||
line.pbk(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
init();
|
||||
solve();
|
||||
}
|
||||
return 0;
|
||||
}
|
121
HDOJ/4630_autoAC.cpp
Normal file
121
HDOJ/4630_autoAC.cpp
Normal file
|
@ -0,0 +1,121 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
#define lz 2*u,l,mid
|
||||
#define rz 2*u+1,mid+1,r
|
||||
const int maxn=50005;
|
||||
int maxx[4*maxn], flag[4*maxn];
|
||||
int a[maxn];
|
||||
int pre[maxn];
|
||||
int n, m, T;
|
||||
vector<int>vt;
|
||||
struct node
|
||||
{
|
||||
int l, r, id;
|
||||
int ans;
|
||||
friend bool operator<(const node A, const node B)
|
||||
{
|
||||
return A.r<B.r;
|
||||
}
|
||||
}f[maxn];
|
||||
bool cmp(node A, node B)
|
||||
{
|
||||
return A.id<B.id;
|
||||
}
|
||||
void push_down(int u, int l, int r)
|
||||
{
|
||||
if(flag[u])
|
||||
{
|
||||
flag[2*u]=max(flag[2*u],flag[u]);
|
||||
flag[2*u+1]=max(flag[2*u+1],flag[u]);
|
||||
maxx[2*u]=max(maxx[2*u],flag[u]);
|
||||
maxx[2*u+1]=max(maxx[2*u+1],flag[u]);
|
||||
flag[u]=0;
|
||||
}
|
||||
}
|
||||
void Update(int u, int l, int r, int tl, int tr, int val)
|
||||
{
|
||||
maxx[u]=max(maxx[u],val);
|
||||
if(tl<=l&&r<=tr)
|
||||
{
|
||||
flag[u]=max(flag[u],val);
|
||||
maxx[u]=max(maxx[u],val);
|
||||
return ;
|
||||
}
|
||||
push_down(u,l,r);
|
||||
int mid=(l+r)>>1;
|
||||
if(tr<=mid) Update(lz,tl,tr,val);
|
||||
else if(tl>mid) Update(rz,tl,tr,val);
|
||||
else
|
||||
{
|
||||
Update(lz,tl,mid,val);
|
||||
Update(rz,mid+1,tr,val);
|
||||
}
|
||||
}
|
||||
int Query(int u, int l, int r, int tl, int tr)
|
||||
{
|
||||
if(tl<=l&&r<=tr) return maxx[u];
|
||||
push_down(u,l,r);
|
||||
int mid=(l+r)>>1;
|
||||
if(tr<=mid) return Query(lz,tl,tr);
|
||||
else if(tl>mid) return Query(rz,tl,tr);
|
||||
else
|
||||
{
|
||||
int t1=Query(lz,tl,mid);
|
||||
int t2=Query(rz,mid+1,tr);
|
||||
return max(t1,t2);
|
||||
}
|
||||
}
|
||||
void Solve(int x, int r)
|
||||
{
|
||||
vt.clear();
|
||||
vt.push_back(x);
|
||||
for(int i=2; i*i<=x; i++)
|
||||
if(x%i==0)
|
||||
{
|
||||
vt.push_back(i);
|
||||
vt.push_back(x/i);
|
||||
}
|
||||
for(int i=0; i<vt.size(); i++)
|
||||
{
|
||||
int l=pre[ vt[i] ];
|
||||
pre[ vt[i] ]=r;
|
||||
if(l==-1||l==r) continue;
|
||||
Update(1,1,n,l,l,vt[i]);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
cin >> T;
|
||||
while(T--)
|
||||
{
|
||||
cin >> n;
|
||||
for(int i=1; i<=n; i++) scanf("%d", a+i), pre[i]=-1;
|
||||
cin >> m;
|
||||
for(int i=1; i<=m; i++) f[i].id=i, scanf("%d%d",&f[i].l,&f[i].r);
|
||||
sort(f+1,f+m+1);
|
||||
for(int i=1; i<=4*n; i++) maxx[i]=1, flag[i]=0;
|
||||
int i=1, j=1;
|
||||
while(j<=m)
|
||||
{
|
||||
if(i<=f[j].r&&i<=n)
|
||||
{
|
||||
Solve(a[i],i);
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(f[j].l!=f[j].r)f[j].ans=Query(1,1,n,f[j].l,f[j].r);
|
||||
else f[j].ans=0;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
sort(f+1,f+m+1,cmp);
|
||||
for(int i=1; i<=m; i++)
|
||||
printf("%d\n",f[i].ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
113
HDOJ/4631_autoAC.cpp
Normal file
113
HDOJ/4631_autoAC.cpp
Normal file
|
@ -0,0 +1,113 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <math.h>
|
||||
using namespace std;
|
||||
const int MAXN = 500010;
|
||||
struct Point
|
||||
{
|
||||
int x,y;
|
||||
int id;
|
||||
int index;
|
||||
Point(int _x = 0,int _y = 0,int _index = 0)
|
||||
{
|
||||
x = _x;
|
||||
y = _y;
|
||||
index = _index;
|
||||
}
|
||||
};
|
||||
Point P[MAXN];
|
||||
long long dist(Point a,Point b)
|
||||
{
|
||||
return ((long long)(a.x-b.x)*(a.x-b.x) + (long long)(a.y-b.y)*(a.y-b.y));
|
||||
}
|
||||
Point p[MAXN];
|
||||
Point tmpt[MAXN];
|
||||
bool cmpxy(Point a,Point b)
|
||||
{
|
||||
if(a.x != b.x)return a.x < b.x;
|
||||
else return a.y < b.y;
|
||||
}
|
||||
bool cmpy(Point a,Point b)
|
||||
{
|
||||
return a.y < b.y;
|
||||
}
|
||||
pair<int,int> Closest_Pair(int left,int right)
|
||||
{
|
||||
long long d = (1LL<<50);
|
||||
if(left == right)return make_pair(left,right);
|
||||
if(left + 1 == right)
|
||||
return make_pair(left,right);
|
||||
int mid = (left+right)/2;
|
||||
pair<int,int>pr1 = Closest_Pair(left,mid);
|
||||
pair<int,int>pr2 = Closest_Pair(mid+1,right);
|
||||
long long d1,d2;
|
||||
if(pr1.first == pr1.second)
|
||||
d1 = (1LL<<50);
|
||||
else d1 = dist(p[pr1.first],p[pr1.second]);
|
||||
if(pr2.first == pr2.second)
|
||||
d2 = (1LL<<50);
|
||||
else d2 = dist(p[pr2.first],p[pr2.second]);
|
||||
pair<int,int>ans;
|
||||
if(d1 < d2)ans = pr1;
|
||||
else ans = pr2;
|
||||
d = min(d1,d2);
|
||||
int k = 0;
|
||||
for(int i = left;i <= right;i++)
|
||||
{
|
||||
if((long long)(p[mid].x - p[i].x)*(p[mid].x - p[i].x) <= d)
|
||||
tmpt[k++] = p[i];
|
||||
}
|
||||
sort(tmpt,tmpt+k,cmpy);
|
||||
for(int i = 0;i <k;i++)
|
||||
{
|
||||
for(int j = i+1;j < k && (long long)(tmpt[j].y - tmpt[i].y)*(tmpt[j].y - tmpt[i].y) < d;j++)
|
||||
{
|
||||
if(d > dist(tmpt[i],tmpt[j]))
|
||||
{
|
||||
d = dist(tmpt[i],tmpt[j]);
|
||||
ans = make_pair(tmpt[i].id,tmpt[j].id);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
int n,Ax,Ay,Bx,By,Cx,Cy;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d%d%d%d%d%d%d",&n,&Ax,&Bx,&Cx,&Ay,&By,&Cy);
|
||||
P[0] = Point(0,0,0);
|
||||
for(int i = 1;i <= n;i++)
|
||||
{
|
||||
long long x= ((long long)P[i-1].x*Ax + Bx)%Cx;
|
||||
long long y = ((long long)P[i-1].y*Ay + By)%Cy;
|
||||
P[i] = Point(x,y,i);
|
||||
}
|
||||
int end = n;
|
||||
long long ans = 0;
|
||||
while(end > 1)
|
||||
{
|
||||
for(int i = 0;i < end;i++)
|
||||
p[i] = P[i+1];
|
||||
sort(p,p+end,cmpxy);
|
||||
for(int i = 0;i < end;i++)
|
||||
p[i].id = i;
|
||||
pair<int,int>pr = Closest_Pair(0,end-1);
|
||||
int Max = max(p[pr.first].index,p[pr.second].index);
|
||||
ans += (long long)(end-Max+1)*dist(p[pr.first],p[pr.second]);
|
||||
end = Max-1;
|
||||
}
|
||||
printf("%I64d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
66
HDOJ/4632_autoAC.cpp
Normal file
66
HDOJ/4632_autoAC.cpp
Normal file
|
@ -0,0 +1,66 @@
|
|||
#include"iostream"
|
||||
#include"cstdio"
|
||||
#include"cstring"
|
||||
using namespace std;
|
||||
const int N=1006;
|
||||
const int mod=10007;
|
||||
int n,lowbit[N];
|
||||
__int64 C[N],ans[N];
|
||||
char str[N];
|
||||
void update(int k,int dir)
|
||||
{
|
||||
while(0<k && k<=n)
|
||||
{
|
||||
C[k]=(C[k]+dir)%mod;
|
||||
k+=lowbit[k];
|
||||
}
|
||||
}
|
||||
int sum(int k)
|
||||
{
|
||||
__int64 p=0;
|
||||
while(0<k && k<=n)
|
||||
{
|
||||
p=(p+C[k])%mod;
|
||||
k-=lowbit[k];
|
||||
}
|
||||
return p;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,Case;
|
||||
int i,l;
|
||||
__int64 a,b,t;
|
||||
__int64 hehe;
|
||||
for(i=1;i<=1000;i++) lowbit[i]=i&(-i);
|
||||
cin>>T;
|
||||
for(Case=1;Case<=T;Case++)
|
||||
{
|
||||
hehe=0;
|
||||
scanf("%s",str+1);
|
||||
memset(C,0,sizeof(C));
|
||||
memset(ans,0,sizeof(ans));
|
||||
for(n=1;str[n];n++);
|
||||
n--;
|
||||
for(i=n;i>=1;i--)
|
||||
{
|
||||
ans[i]=1;
|
||||
update(i,1);
|
||||
for(l=n;l>i;l--)
|
||||
{
|
||||
if(str[l]==str[i])
|
||||
{
|
||||
a=sum(i);
|
||||
b=sum(l-1);
|
||||
t=(b-a)%mod;
|
||||
while(t<0) t+=mod;
|
||||
ans[i]=(ans[i]+1+t)%mod;
|
||||
update(l,1+t);
|
||||
}
|
||||
}
|
||||
}
|
||||
hehe=0;
|
||||
for(i=1;i<=n;i++) hehe=(hehe+ans[i])%mod;
|
||||
printf("Case %d: %I64d\n",Case,hehe);
|
||||
}
|
||||
return 0;
|
||||
}
|
40
HDOJ/4633_autoAC.cpp
Normal file
40
HDOJ/4633_autoAC.cpp
Normal file
|
@ -0,0 +1,40 @@
|
|||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const LL MOD=10007;
|
||||
LL quick_mod(LL a,LL b)
|
||||
{
|
||||
LL ans=1;
|
||||
a%=MOD;
|
||||
while(b)
|
||||
{
|
||||
if(b&1)
|
||||
{
|
||||
ans=ans*a%MOD;
|
||||
b--;
|
||||
}
|
||||
b>>=1;
|
||||
a=a*a%MOD;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
LL tt=1,t,k,ans;
|
||||
cin>>t;
|
||||
while(t--)
|
||||
{
|
||||
cin>>k;
|
||||
ans=quick_mod(k,74);
|
||||
ans+=3*(2*quick_mod(k,20)+quick_mod(k,38))%MOD;
|
||||
ans+=6*quick_mod(k,38);
|
||||
ans+=8*quick_mod(k,26);
|
||||
ans%=MOD;
|
||||
ans*=quick_mod(24,MOD-2);
|
||||
ans%=MOD;
|
||||
printf("Case %I64d: %I64d\n",tt++,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
142
HDOJ/4634_autoAC.cpp
Normal file
142
HDOJ/4634_autoAC.cpp
Normal file
|
@ -0,0 +1,142 @@
|
|||
#include <stdio.h>
|
||||
#include <algorithm>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <math.h>
|
||||
using namespace std;
|
||||
char g[220][220];
|
||||
int sx,sy,ex,ey;
|
||||
int n,m;
|
||||
int keynum;
|
||||
int key_s[220][220];
|
||||
int mo[][2] = {{0,1},{0,-1},{1,0},{-1,0}};
|
||||
struct Node
|
||||
{
|
||||
int key;
|
||||
int num;
|
||||
int x,y;
|
||||
};
|
||||
queue<Node>q;
|
||||
bool used[202][202][1<<7];
|
||||
bool used2[202][202][1<<7][4];
|
||||
int bfs()
|
||||
{
|
||||
while(!q.empty())q.pop();
|
||||
Node tmp,now;
|
||||
tmp.key = 0;
|
||||
tmp.num = 0;
|
||||
tmp.x = sx;
|
||||
tmp.y = sy;
|
||||
q.push(tmp);
|
||||
memset(used,false,sizeof(used));
|
||||
memset(used2,false,sizeof(used2));
|
||||
used[sx][sy][0] = true;
|
||||
while(!q.empty())
|
||||
{
|
||||
tmp = q.front();
|
||||
q.pop();
|
||||
for(int i = 0;i < 4;i++)
|
||||
{
|
||||
int mx = mo[i][0];
|
||||
int my = mo[i][1];
|
||||
int x = tmp.x;
|
||||
int y = tmp.y;
|
||||
int ss = tmp.key;
|
||||
while(1)
|
||||
{
|
||||
if(g[x][y] =='L')
|
||||
{
|
||||
mx = 0; my = -1;
|
||||
}
|
||||
if(g[x][y] == 'U')
|
||||
{
|
||||
mx = -1;my = 0;
|
||||
}
|
||||
if(g[x][y] == 'D')
|
||||
{
|
||||
mx = 1;my = 0;
|
||||
}
|
||||
if(g[x][y] == 'R')
|
||||
{
|
||||
mx = 0; my = 1;
|
||||
}
|
||||
int dir;
|
||||
if(mx==-1&&my==0)dir=0;
|
||||
else if(mx==1&&my==0)dir=1;
|
||||
else if(mx==0&&my==1)dir=2;
|
||||
else if(mx==0&&my==-1)dir=3;
|
||||
if(used2[x][y][ss][dir])break;
|
||||
used2[x][y][ss][dir] = true;
|
||||
x += mx;
|
||||
y += my;
|
||||
if(x < 0 || y < 0 || x >= n || y >= m)break;
|
||||
if(g[x][y] =='#')break;
|
||||
if( x == ex && y== ey && ss ==((1<<keynum)-1) )
|
||||
return tmp.num+1;
|
||||
if(g[x][y] =='L')
|
||||
{
|
||||
mx = 0; my = -1;
|
||||
}
|
||||
if(g[x][y] == 'U')
|
||||
{
|
||||
mx = -1;my = 0;
|
||||
}
|
||||
if(g[x][y] == 'D')
|
||||
{
|
||||
mx = 1;my = 0;
|
||||
}
|
||||
if(g[x][y] == 'R')
|
||||
{
|
||||
mx = 0; my = 1;
|
||||
}
|
||||
if(g[x][y] == 'K')
|
||||
ss |= key_s[x][y];
|
||||
if(x+mx >=0 && x+mx < n && y+my>=0 && y+my < m && g[x+mx][y+my]=='#')
|
||||
{
|
||||
if(used[x][y][ss])break;
|
||||
now.x = x;now.y = y;
|
||||
now.key = ss;
|
||||
now.num = tmp.num + 1;
|
||||
q.push(now);
|
||||
used[x][y][ss] = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&m)==2)
|
||||
{
|
||||
keynum = 0;
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
scanf("%s",g[i]);
|
||||
for(int j = 0;j < m;j++)
|
||||
{
|
||||
if(g[i][j] == 'S')
|
||||
{
|
||||
sx = i;sy = j;
|
||||
}
|
||||
if(g[i][j] == 'E')
|
||||
{
|
||||
ex = i;ey = j;
|
||||
}
|
||||
if(g[i][j] == 'K')
|
||||
{
|
||||
key_s[i][j] = (1<<keynum);
|
||||
keynum++;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%d\n",bfs());
|
||||
}
|
||||
return 0;
|
||||
}
|
93
HDOJ/4635_autoAC.cpp
Normal file
93
HDOJ/4635_autoAC.cpp
Normal file
|
@ -0,0 +1,93 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int VM=200010;
|
||||
const int EM=200010;
|
||||
const int INF=0x3f3f3f3f;
|
||||
struct Edge{
|
||||
int to,nxt;
|
||||
}edge[EM<<1];
|
||||
long long n,m,cnt,head[VM];
|
||||
long long dep,top,atype;
|
||||
long long dfn[VM],low[VM],vis[VM],stack[VM],belong[VM],indeg[VM],outdeg[VM],sum[VM];
|
||||
void addedge(int cu,int cv){
|
||||
edge[cnt].to=cv; edge[cnt].nxt=head[cu]; head[cu]=cnt++;
|
||||
}
|
||||
void Tarjan(int u){
|
||||
dfn[u]=low[u]=++dep;
|
||||
stack[top++]=u;
|
||||
vis[u]=1;
|
||||
for(int i=head[u];i!=-1;i=edge[i].nxt){
|
||||
int v=edge[i].to;
|
||||
if(!dfn[v]){
|
||||
Tarjan(v);
|
||||
low[u]=min(low[u],low[v]);
|
||||
}else if(vis[v]){
|
||||
low[u]=min(low[u],dfn[v]);
|
||||
}
|
||||
}
|
||||
int j;
|
||||
if(dfn[u]==low[u]){
|
||||
atype++;
|
||||
do{
|
||||
j=stack[--top];
|
||||
belong[j]=atype;
|
||||
sum[atype]++;
|
||||
vis[j]=0;
|
||||
}while(u!=j);
|
||||
}
|
||||
}
|
||||
void init(){
|
||||
cnt=0;
|
||||
memset(head,-1,sizeof(head));
|
||||
dep=0, top=0, atype=0;
|
||||
memset(dfn,0,sizeof(dfn));
|
||||
memset(low,0,sizeof(low));
|
||||
memset(vis,0,sizeof(vis));
|
||||
memset(belong,0,sizeof(belong));
|
||||
memset(indeg,0,sizeof(indeg));
|
||||
memset(outdeg,0,sizeof(outdeg));
|
||||
memset(sum,0,sizeof(sum));
|
||||
}
|
||||
int main(){
|
||||
int t,cases=0;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
cin>>n>>m;
|
||||
if(n==1){
|
||||
printf("Case %d: -1\n",++cases);
|
||||
continue;
|
||||
}
|
||||
init();
|
||||
int u,v;
|
||||
for(int i=0;i<m;i++){
|
||||
scanf("%d%d",&u,&v);
|
||||
addedge(u,v);
|
||||
}
|
||||
for(int i=1;i<=n;i++)
|
||||
if(!dfn[i])
|
||||
Tarjan(i);
|
||||
if(atype==1){
|
||||
printf("Case %d: -1\n",++cases);
|
||||
continue;
|
||||
}
|
||||
for(int u=1;u<=n;u++)
|
||||
for(int i=head[u];i!=-1;i=edge[i].nxt){
|
||||
int v=edge[i].to;
|
||||
if(belong[u]!=belong[v]){
|
||||
outdeg[belong[u]]++;
|
||||
indeg[belong[v]]++;
|
||||
}
|
||||
}
|
||||
long long ans=0,tmp;
|
||||
for(long long i=1;i<=atype;i++)
|
||||
if(indeg[i]==0 || outdeg[i]==0){
|
||||
tmp=sum[i];
|
||||
ans=max(ans,tmp*(tmp-1)+(n-tmp)*(n-tmp-1)+tmp*(n-tmp)-m);
|
||||
}
|
||||
cout<<"Case "<<(++cases)<<": "<<ans<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
98
HDOJ/4636_autoAC.cpp
Normal file
98
HDOJ/4636_autoAC.cpp
Normal file
|
@ -0,0 +1,98 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <queue>
|
||||
#include <vector>
|
||||
#define MID(x,y) ((x+y)>>1)
|
||||
#define iabs(x) ((x)>0?(x):-(x))
|
||||
using namespace std;
|
||||
vector <int>v[40];
|
||||
inline void v_pb(int a,int b){
|
||||
v[a].push_back(b);
|
||||
}
|
||||
int num[40];
|
||||
queue<int>q;
|
||||
bool vis[40];
|
||||
bool bfs(int s,int flag){
|
||||
while(!q.empty()) q.pop();
|
||||
q.push(s);
|
||||
int cnt = -1;
|
||||
while(!q.empty()){
|
||||
int k = q.front(); q.pop();
|
||||
cnt++;
|
||||
for (int i = 0; i < v[k].size(); i++){
|
||||
int d = v[k][i];
|
||||
if (!vis[d] && num[d] == flag){
|
||||
vis[d] = 1;
|
||||
q.push(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(flag == 0 && cnt == 0)return 1;
|
||||
return 0;
|
||||
}
|
||||
int main(){
|
||||
v_pb(1,2);v_pb(1,3);v_pb(1,17);v_pb(1,18);v_pb(1,20);v_pb(1,13);
|
||||
v_pb(2,1);v_pb(2,3);v_pb(2,4);v_pb(2,7);v_pb(2,12);v_pb(2,13);
|
||||
v_pb(3,1);v_pb(3,2);v_pb(3,4);v_pb(3,5);v_pb(3,20);
|
||||
v_pb(4,2);v_pb(4,3);v_pb(4,5);v_pb(4,6);v_pb(4,7);v_pb(4,8);
|
||||
v_pb(5,3);v_pb(5,4);v_pb(5,6);v_pb(5,20);v_pb(5,21);v_pb(5,24);
|
||||
v_pb(6,4);v_pb(6,5);v_pb(6,8);v_pb(6,9);v_pb(6,24);
|
||||
v_pb(7,2);v_pb(7,4);v_pb(7,8);v_pb(7,10);v_pb(7,12);
|
||||
v_pb(8,4);v_pb(8,6);v_pb(8,7);v_pb(8,9);v_pb(8,10);v_pb(8,11);
|
||||
v_pb(9,6);v_pb(9,8);v_pb(9,11);v_pb(9,24);v_pb(9,26);v_pb(9,27);
|
||||
v_pb(10,7);v_pb(10,8);v_pb(10,11);v_pb(10,12);v_pb(10,14);v_pb(10,16);
|
||||
v_pb(11,8);v_pb(11,9);v_pb(11,10);v_pb(11,16);v_pb(11,27);
|
||||
v_pb(12,2);v_pb(12,7);v_pb(12,10);v_pb(12,13);v_pb(12,14);v_pb(12,15);
|
||||
v_pb(13,12);v_pb(13,15);v_pb(13,2);v_pb(13,1);v_pb(13,17);
|
||||
v_pb(14,10);v_pb(14,12);v_pb(14,15);v_pb(14,16);v_pb(14,30);
|
||||
v_pb(15,12);v_pb(15,13);v_pb(15,14);v_pb(15,30);v_pb(15,32);v_pb(15,17);
|
||||
v_pb(16,10);v_pb(16,11);v_pb(16,14);v_pb(16,27);v_pb(16,29);v_pb(16,30);
|
||||
v_pb(17,1);v_pb(17,18);v_pb(17,19);v_pb(17,13);v_pb(17,15);v_pb(17,32);
|
||||
v_pb(18,1);v_pb(18,17);v_pb(18,19);v_pb(18,20);v_pb(18,22);
|
||||
v_pb(19,17);v_pb(19,18);v_pb(19,31);v_pb(19,22);v_pb(19,23);v_pb(19,32);
|
||||
v_pb(20,1);v_pb(20,3);v_pb(20,5);v_pb(20,18);v_pb(20,21);v_pb(20,22);
|
||||
v_pb(21,5);v_pb(21,20);v_pb(21,22);v_pb(21,24);v_pb(21,25);
|
||||
v_pb(22,19);v_pb(22,18);v_pb(22,20);v_pb(22,21);v_pb(22,23);v_pb(22,25);
|
||||
v_pb(23,19);v_pb(23,22);v_pb(23,25);v_pb(23,28);v_pb(23,31);
|
||||
v_pb(24,5);v_pb(24,6);v_pb(24,9);v_pb(24,21);v_pb(24,25);v_pb(24,26);
|
||||
v_pb(25,21);v_pb(25,22);v_pb(25,23);v_pb(25,24);v_pb(25,26);v_pb(25,28);
|
||||
v_pb(26,9);v_pb(26,24);v_pb(26,25);v_pb(26,27);v_pb(26,28);
|
||||
v_pb(27,9);v_pb(27,11);v_pb(27,16);v_pb(27,26);v_pb(27,28);v_pb(27,29);
|
||||
v_pb(28,25);v_pb(28,26);v_pb(28,27);v_pb(28,29);v_pb(28,31);v_pb(28,23);
|
||||
v_pb(29,16);v_pb(29,27);v_pb(29,28);v_pb(29,30);v_pb(29,31);
|
||||
v_pb(30,14);v_pb(30,15);v_pb(30,16);v_pb(30,29);v_pb(30,31);v_pb(30,32);
|
||||
v_pb(31,28);v_pb(31,29);v_pb(31,30);v_pb(31,32);v_pb(31,23);v_pb(31,19);
|
||||
v_pb(32,30);v_pb(32,31);v_pb(32,15);v_pb(32,19);v_pb(32,17);
|
||||
int t;
|
||||
scanf("%d", &t);
|
||||
for (int cas = 1; cas <= t; cas++){
|
||||
printf("Case %d: ", cas);
|
||||
int black = 0,white = 0;
|
||||
for (int i = 1; i <= 32; ++i){
|
||||
scanf("%d", &num[i]);
|
||||
if(num[i]) black ++;
|
||||
}
|
||||
if (black == 0) {puts("0");continue;}
|
||||
memset(vis,0,sizeof(vis));
|
||||
black = 0;
|
||||
for (int i = 1; i <= 32; ++i){
|
||||
if (!vis[i]){
|
||||
vis[i] = 1;
|
||||
if (num[i]){
|
||||
black ++;
|
||||
bfs(i,1);
|
||||
}else {
|
||||
white ++;
|
||||
if(bfs(i,0)) white --;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(black <= 2) printf("%d\n", black);
|
||||
else if (white == 1) puts("2");
|
||||
else puts("3");
|
||||
}
|
||||
return 0;
|
||||
}
|
317
HDOJ/4637_autoAC.cpp
Normal file
317
HDOJ/4637_autoAC.cpp
Normal file
|
@ -0,0 +1,317 @@
|
|||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <set>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const double eps=1e-10;
|
||||
const int INF=1<<29;
|
||||
const double PI=acos(-1.0);
|
||||
int doublecmp(double x){
|
||||
if(fabs(x)<eps)return 0;else return x<0?-1:1;
|
||||
}
|
||||
struct Point{
|
||||
double x,y;
|
||||
Point(double x=0,double y=0):x(x),y(y){}
|
||||
};
|
||||
typedef Point Vector;
|
||||
Vector operator+(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
|
||||
Vector operator-(Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}
|
||||
Vector operator*(Vector a,double p){return Vector(a.x*p,a.y*p);}
|
||||
Vector operator/(Vector a,double p){return Vector(a.x/p,a.y/p);}
|
||||
bool operator<(const Point&a,const Point&b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
|
||||
bool operator==(const Point&a,const Point&b){
|
||||
return doublecmp(a.x-b.x)==0&&doublecmp(a.y-b.y)==0;
|
||||
}
|
||||
bool operator!=(const Point&a,const Point&b){return a==b?false:true;}
|
||||
struct Segment{
|
||||
Point a,b;
|
||||
Segment(){}
|
||||
Segment(Point _a,Point _b){a=_a,b=_b;}
|
||||
bool friend operator<(const Segment& p,const Segment& q){return p.a<q.a||(p.a==q.a&&p.b<q.b);}
|
||||
bool friend operator==(const Segment& p,const Segment& q){return (p.a==q.a&&p.b==q.b)||(p.a==q.b&&p.b==q.a);}
|
||||
};
|
||||
struct Circle{
|
||||
Point c;
|
||||
double r;
|
||||
Circle(){}
|
||||
Circle(Point _c, double _r):c(_c),r(_r) {}
|
||||
Point point(double a)const{return Point(c.x+cos(a)*r,c.y+sin(a)*r);}
|
||||
bool friend operator<(const Circle& a,const Circle& b){return a.r<b.r;}
|
||||
};
|
||||
struct Line{
|
||||
Point p;
|
||||
Vector v;
|
||||
double ang;
|
||||
Line() {}
|
||||
Line(const Point &_p, const Vector &_v):p(_p),v(_v){ang = atan2(v.y, v.x);}
|
||||
bool operator<(const Line &L)const{return ang < L.ang;}
|
||||
};
|
||||
double Dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}
|
||||
double Length(Vector a){return sqrt(Dot(a,a));}
|
||||
double Angle(Vector a,Vector b){return acos(Dot(a,b)/Length(a)/Length(b));}
|
||||
double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
|
||||
double Area2(Point a,Point b,Point c){return Cross(b-a,c-a);}
|
||||
double DegreeToRadius(double deg){return deg/180*PI;}
|
||||
double GetRerotateAngle(Vector a,Vector b){
|
||||
double tempa=Angle(a,Vector(1,0));
|
||||
if(a.y<0) tempa=2*PI-tempa;
|
||||
double tempb=Angle(b,Vector(1,0));
|
||||
if(b.y<0) tempb=2*PI-tempb;
|
||||
if((tempa-tempb)>0) return tempa-tempb;
|
||||
else return tempa-tempb+2*PI;
|
||||
}
|
||||
Vector Rotate(Vector a,double rad){
|
||||
return Vector(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
|
||||
}
|
||||
Vector Normal(Vector a){
|
||||
double L=Length(a);
|
||||
return Vector(-a.y/L,a.x/L);
|
||||
}
|
||||
Point GetLineProjection(Point p,Point a,Point b){
|
||||
Vector v=b-a;
|
||||
return a+v*(Dot(v,p-a)/Dot(v,v));
|
||||
}
|
||||
Point GetLineIntersection(Point p,Vector v,Point q,Vector w){
|
||||
Vector u=p-q;
|
||||
double t=Cross(w,u)/Cross(v,w);
|
||||
return p+v*t;
|
||||
}
|
||||
int ConvexHull(Point* p,int n,Point* ch){
|
||||
sort(p,p+n);
|
||||
int m=0;
|
||||
for(int i=0;i<n;i++){
|
||||
while(m>1&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
|
||||
ch[m++]=p[i];
|
||||
}
|
||||
int k=m;
|
||||
for(int i=n-2;i>=0;i--){
|
||||
while(m>k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--;
|
||||
ch[m++]=p[i];
|
||||
}
|
||||
if(n>0) m--;
|
||||
return m;
|
||||
}
|
||||
double Heron(double a,double b,double c){
|
||||
double p=(a+b+c)/2;
|
||||
return sqrt(p*(p-a)*(p-b)*(p-c));
|
||||
}
|
||||
bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2){
|
||||
double c1=Cross(a2-a1,b1-a1),c2=Cross(a2-a1,b2-a1);
|
||||
double c3=Cross(b2-b1,a1-b1),c4=Cross(b2-b1,a2-b1);
|
||||
return doublecmp(c1)*doublecmp(c2)<0&&doublecmp(c3)*doublecmp(c4)<0;
|
||||
}
|
||||
double CutConvex(const int n,Point* poly, const Point a,const Point b, vector<Point> result[3]){
|
||||
vector<Point> points;
|
||||
Point p;
|
||||
Point p1=a,p2=b;
|
||||
int cur,pre;
|
||||
result[0].clear();
|
||||
result[1].clear();
|
||||
result[2].clear();
|
||||
if(n==0) return 0;
|
||||
double tempcross;
|
||||
tempcross=Cross(p2-p1,poly[0]-p1);
|
||||
if(doublecmp(tempcross)==0) pre=cur=2;
|
||||
else if(tempcross>0) pre=cur=0;
|
||||
else pre=cur=1;
|
||||
for(int i=0;i<n;i++){
|
||||
tempcross=Cross(p2-p1,poly[(i+1)%n]-p1);
|
||||
if(doublecmp(tempcross)==0) cur=2;
|
||||
else if(tempcross>0) cur=0;
|
||||
else cur=1;
|
||||
if(cur==pre){
|
||||
result[cur].push_back(poly[(i+1)%n]);
|
||||
}
|
||||
else{
|
||||
p1=poly[i];
|
||||
p2=poly[(i+1)%n];
|
||||
p=GetLineIntersection(p1,p2-p1,a,b-a);
|
||||
points.push_back(p);
|
||||
result[pre].push_back(p);
|
||||
result[cur].push_back(p);
|
||||
result[cur].push_back(poly[(i+1)%n]);
|
||||
pre=cur;
|
||||
}
|
||||
}
|
||||
sort(points.begin(),points.end());
|
||||
if(points.size()<2){
|
||||
return 0;
|
||||
}
|
||||
else{
|
||||
return Length(points.front()-points.back());
|
||||
}
|
||||
}
|
||||
double DistanceToSegment(Point p,Segment s){
|
||||
if(s.a==s.b) return Length(p-s.a);
|
||||
Vector v1=s.b-s.a,v2=p-s.a,v3=p-s.b;
|
||||
if(doublecmp(Dot(v1,v2))<0) return Length(v2);
|
||||
else if(doublecmp(Dot(v1,v3))>0) return Length(v3);
|
||||
else return fabs(Cross(v1,v2))/Length(v1);
|
||||
}
|
||||
bool isPointOnSegment(Point p,Segment s){
|
||||
return doublecmp(DistanceToSegment(p,s))==0;
|
||||
}
|
||||
int isPointInPolygon(Point p, Point* poly,int n){
|
||||
int wn=0;
|
||||
for(int i=0;i<n;i++){
|
||||
Point& p2=poly[(i+1)%n];
|
||||
if(isPointOnSegment(p,Segment(poly[i],p2))) return -1;
|
||||
int k=doublecmp(Cross(p2-poly[i],p-poly[i]));
|
||||
int d1=doublecmp(poly[i].y-p.y);
|
||||
int d2=doublecmp(p2.y-p.y);
|
||||
if(k>0&&d1<=0&&d2>0)wn++;
|
||||
if(k<0&&d2<=0&&d1>0)wn--;
|
||||
}
|
||||
if(wn) return 1;
|
||||
else return 0;
|
||||
}
|
||||
double PolygonArea(vector<Point> p){
|
||||
double area=0;
|
||||
int n=p.size();
|
||||
for(int i=1;i<n-1;i++)
|
||||
area+=Cross(p[i]-p[0],p[i+1]-p[0]);
|
||||
return area/2;
|
||||
}
|
||||
int PSLGtoPolygons(Segment arr[],int n,vector<Point>* Polygons){
|
||||
int count=n-1;
|
||||
bool vis[9999];memset(vis,0,sizeof vis);
|
||||
Point star=arr[0].a,pre=arr[0].a,cur=arr[0].b,purpose=arr[0].b;vis[0]=true;
|
||||
int mark;
|
||||
while(purpose!=star){
|
||||
double theta=-INF;
|
||||
for(int i=0;i<n;i++)if(!vis[i]&&arr[i].a==cur&&arr[i].b!=pre){
|
||||
if(theta<GetRerotateAngle(pre-cur,arr[i].b-cur)){
|
||||
theta=GetRerotateAngle(pre-cur,arr[i].b-cur);
|
||||
purpose=arr[i].b;
|
||||
mark=i;
|
||||
}
|
||||
}
|
||||
vis[mark]=true;count--;
|
||||
pre=cur;cur=purpose;
|
||||
}
|
||||
int polyidx=0;
|
||||
while(count>0){
|
||||
for(int i=0;i<n;i++)if(!vis[i]){
|
||||
star=arr[i].a,pre=arr[i].a,cur=arr[i].b,purpose=arr[i].b;vis[i]=true;count--;
|
||||
Polygons[polyidx].clear();
|
||||
Polygons[polyidx].push_back(cur);
|
||||
break;
|
||||
}
|
||||
while(purpose!=star){
|
||||
double theta=-INF;
|
||||
for(int i=0;i<n;i++)if(!vis[i]&&arr[i].a==cur&&arr[i].b!=pre){
|
||||
if(theta<GetRerotateAngle(pre-cur,arr[i].b-cur)){
|
||||
theta=GetRerotateAngle(pre-cur,arr[i].b-cur);
|
||||
purpose=arr[i].b;
|
||||
mark=i;
|
||||
}
|
||||
}
|
||||
vis[mark]=true;count--;
|
||||
Polygons[polyidx].push_back(purpose);
|
||||
pre=cur;cur=purpose;
|
||||
}
|
||||
polyidx++;
|
||||
}
|
||||
return polyidx;
|
||||
}
|
||||
int GetLineCircleIntersection(Line L,Circle C,Point& p1,Point& p2){
|
||||
double a = L.v.x, b = L.p.x - C.c.x, c = L.v.y, d = L.p.y-C.c.y;
|
||||
double e = a*a + c*c, f = 2*(a*b+c*d), g = b*b + d*d -C.r*C.r;
|
||||
double delta = f*f - 4*e*g;
|
||||
if(doublecmp(delta) < 0) return 0;
|
||||
if(doublecmp(delta) == 0) {
|
||||
p1=p1=C.point(-f/(2*e));
|
||||
return 1;
|
||||
}
|
||||
p1=(L.p+L.v*(-f-sqrt(delta))/(2*e));
|
||||
p2=(L.p+L.v*(-f+sqrt(delta))/(2*e));
|
||||
return 2;
|
||||
}
|
||||
struct Allpoint{
|
||||
Point p;
|
||||
int pos;
|
||||
bool friend operator<(Allpoint a,Allpoint b){
|
||||
if(a.pos==-1&&a.pos==b.pos) return a.p<b.p;
|
||||
else if(a.pos==-1) return true;
|
||||
else if(b.pos==-1) return false;
|
||||
else return a.p<b.p;
|
||||
}
|
||||
}allpoint[8000];
|
||||
int idx=0;
|
||||
int lpint(Line l, Point a, Point b, Point c, Allpoint *sol) {
|
||||
int ret = 0;
|
||||
if (doublecmp(Cross(l.v, a - b)) != 0) {
|
||||
sol[ret].p = GetLineIntersection(l.p,l.v, a, b-a);
|
||||
if (isPointOnSegment(sol[ret].p, Segment(a, b))) ret++;
|
||||
}
|
||||
if (doublecmp(Cross(l.v, c - b)) != 0) {
|
||||
sol[ret].p = GetLineIntersection(l.p,l.v,c, b-c);
|
||||
if (isPointOnSegment(sol[ret].p, Segment(c, b))) ret++;
|
||||
}
|
||||
if (doublecmp(Cross(l.v, a - c)) != 0) {
|
||||
sol[ret].p = GetLineIntersection(l.p,l.v, a, c-a);
|
||||
if (isPointOnSegment(sol[ret].p, Segment(a, c))) ret++;
|
||||
}
|
||||
if (ret < 2) return 0;
|
||||
sort(sol, sol + ret);
|
||||
if (ret == 3) {
|
||||
if (sol[0].p == sol[1].p) sol[1].p = sol[2].p;
|
||||
}
|
||||
if (sol[0].p == sol[1].p) return 0;
|
||||
return 2;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,cas=1;
|
||||
scanf("%d",&T);
|
||||
while(T--){
|
||||
double v1,v2,v,t,x;
|
||||
int n;
|
||||
idx=0;
|
||||
scanf("%lf%lf%lf%lf%lf",&v1,&v2,&v,&t,&x);
|
||||
scanf("%d",&n);
|
||||
double time = v2 * t / (v2 - v1);
|
||||
Line l = Line(Point(x, 0), Point(x - v1 * time, v * time)-Point(x,0));
|
||||
for(int i=0;i<n;i++){
|
||||
Point O;
|
||||
double r,h;
|
||||
Allpoint ip[4];
|
||||
scanf("%lf%lf%lf%lf", &O.x, &O.y, &r, &h);
|
||||
int ipp = lpint(l, Point(O.x + r, O.y), Point(O.x - r, O.y), Point(O.x, O.y + h), ip);
|
||||
if (ipp) {
|
||||
if (ip[1] < ip[0]) swap(ip[0], ip[1]);
|
||||
for (int i = 0; i < 2; i++) ip[i].pos= i & 1, allpoint[idx++] = ip[i];
|
||||
}
|
||||
int ipc = GetLineCircleIntersection(l,Circle(O, r), ip[0].p,ip[1].p);
|
||||
if (ipc==2) {
|
||||
if (ip[1] < ip[0]) swap(ip[0], ip[1]);
|
||||
if (doublecmp(ip[1].p.y - O.y) >= 0) continue;
|
||||
if (doublecmp(ip[0].p.y - O.y) > 0) ip[0].p = GetLineIntersection(l.p,l.v, O, Point(1.0, 0));
|
||||
for (int i = 0; i < 2; i++) ip[i].pos = i & 1, allpoint[idx++] = ip[i];
|
||||
}
|
||||
}
|
||||
sort(allpoint, allpoint + idx);
|
||||
int cnt = 0;
|
||||
double sum = 0, lp = x - v1 * time, rp = x, ls = lp;
|
||||
for (int i = 0; i < idx; i++) {
|
||||
if (allpoint[i].p.x > rp) break;
|
||||
if (allpoint[i].p.x < lp) {
|
||||
if (allpoint[i].pos) cnt--;
|
||||
else cnt++;
|
||||
} else {
|
||||
if (allpoint[i].pos) {
|
||||
if (cnt == 1) sum += allpoint[i].p.x - ls;
|
||||
cnt--;
|
||||
} else {
|
||||
if (cnt == 0) ls = allpoint[i].p.x;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cnt > 0) sum += rp - ls;
|
||||
printf("Case %d: %.4f\n", cas++, sum / v1);
|
||||
}
|
||||
}
|
101
HDOJ/4638_autoAC.cpp
Normal file
101
HDOJ/4638_autoAC.cpp
Normal file
|
@ -0,0 +1,101 @@
|
|||
#include<iostream>
|
||||
#include<string>
|
||||
#include<algorithm>
|
||||
#include<cstdlib>
|
||||
#include<cstdio>
|
||||
#include<set>
|
||||
#include<map>
|
||||
#include<vector>
|
||||
#include<cstring>
|
||||
#include<stack>
|
||||
#include<cmath>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
#define CL(x,v); memset(x,v,sizeof(x));
|
||||
#define INF 0x3f3f3f3f
|
||||
#define LL long long
|
||||
#define REP(i,r,n) for(int i=r;i<=n;i++)
|
||||
#define RREP(i,n,r) for(int i=n;i>=r;i--)
|
||||
const int MAXN=1e5+100;
|
||||
int tree[MAXN];
|
||||
int n;
|
||||
int lowbit(int x)
|
||||
{
|
||||
return x&(-x);
|
||||
}
|
||||
void add(int pos,int val)
|
||||
{
|
||||
while(pos <=n)
|
||||
{
|
||||
tree[pos] += val;
|
||||
pos += lowbit(pos);
|
||||
}
|
||||
}
|
||||
int read(int x)
|
||||
{
|
||||
int s=0;
|
||||
while(x>0)
|
||||
{
|
||||
s += tree[x];
|
||||
x -= lowbit(x);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
int A[MAXN],pos[MAXN];
|
||||
struct node{
|
||||
int l,r,index;
|
||||
bool operator <(const node& rsh)const{
|
||||
if(r==rsh.r)
|
||||
return l<rsh.l;
|
||||
else return r<rsh.r;
|
||||
}
|
||||
};
|
||||
vector<node> Q;
|
||||
int ans[MAXN];
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
int m;
|
||||
scanf("%d%d",&n,&m);
|
||||
REP(i,1,n){
|
||||
scanf("%d",&A[i]);
|
||||
pos[A[i]]=i;
|
||||
}
|
||||
Q.clear();
|
||||
node tmp;
|
||||
REP(i,1,m)
|
||||
{
|
||||
scanf("%d%d",&tmp.l,&tmp.r);
|
||||
tmp.index=i;
|
||||
Q.push_back(tmp);
|
||||
}
|
||||
sort(Q.begin(),Q.end());
|
||||
CL(tree,0);
|
||||
int j=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
add(i,1);
|
||||
if(A[i]+1<=n&&pos[A[i]+1]<i)
|
||||
{
|
||||
add(pos[A[i]+1],-1);
|
||||
}
|
||||
if(A[i]-1>=1&&pos[A[i]-1]<i)
|
||||
{
|
||||
add(pos[A[i]-1],-1);
|
||||
}
|
||||
while(Q[j].r==i)
|
||||
{
|
||||
ans[Q[j].index]=read(Q[j].r)-read(Q[j].l-1);
|
||||
j++;
|
||||
}
|
||||
}
|
||||
REP(i,1,m)
|
||||
{
|
||||
printf("%d\n",ans[i]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
37
HDOJ/4639_autoAC.cpp
Normal file
37
HDOJ/4639_autoAC.cpp
Normal file
|
@ -0,0 +1,37 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
const int V = 5050 + 50;
|
||||
const int MaxN = 500 + 5;
|
||||
const int mod = 10000 + 7;
|
||||
int T, ans, num[V];
|
||||
char ch[10100];
|
||||
int main() {
|
||||
int i, j, k;
|
||||
scanf("%d", &T);
|
||||
num[0] = num[1] = 1;
|
||||
for(i = 2; i <= V; ++i)
|
||||
num[i] = (num[i - 1] + num[i - 2]) % mod;
|
||||
for(i = 1; i <= T; ++i) {
|
||||
ans = 1;
|
||||
int sum = 0;
|
||||
scanf("%s", &ch);
|
||||
int len = strlen(ch);
|
||||
for(j = 1; j < len; ++j) {
|
||||
if(ch[j] == 'e' && ch[j - 1] == 'h') {
|
||||
sum++;
|
||||
j++;
|
||||
}
|
||||
else {
|
||||
ans = (ans * num[sum]) % mod;
|
||||
sum = 0;
|
||||
}
|
||||
}
|
||||
ans = (ans * num[sum]) % mod;
|
||||
printf("Case %d: %d\n", i, ans);
|
||||
}
|
||||
}
|
91
HDOJ/4640_autoAC.cpp
Normal file
91
HDOJ/4640_autoAC.cpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
#define INF 2000000000
|
||||
int q[4*(1<<17)][2];
|
||||
int maxQ=4*(1<<17)-3;
|
||||
int front,rear,n,m;
|
||||
int mat[20][20];
|
||||
int dp[1<<17],f[1<<17],dist[1<<17][18],vis[1<<17][18];
|
||||
int main ()
|
||||
{
|
||||
int T;scanf("%d",&T);
|
||||
for(int kk=1;kk<=T;++kk)
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
memset(dist,127,sizeof(dist));
|
||||
memset(dp,127,sizeof(dp));
|
||||
memset(vis,0,sizeof(vis));
|
||||
memset(mat,127,sizeof(mat));
|
||||
front=rear=0;
|
||||
int u,v,s;
|
||||
for(int i=1;i<=m;++i)
|
||||
{
|
||||
scanf("%d%d%d",&u,&v,&s);
|
||||
u--;v--;
|
||||
if(mat[u][v]>s)
|
||||
mat[u][v]=mat[v][u]=s;
|
||||
}
|
||||
dist[0][0]=0;
|
||||
q[++rear][0]=0;q[rear][1]=0;
|
||||
vis[0][0]=1;
|
||||
while(front!=rear)
|
||||
{
|
||||
if(++front==maxQ) front=0;
|
||||
int u_sta=q[front][0],u=q[front][1];
|
||||
vis[u_sta][u]=0;
|
||||
for(int i=0;i<n;++i)
|
||||
{
|
||||
int v_sta=u_sta|(1<<i);
|
||||
if(dist[v_sta][i]>dist[u_sta][u]+mat[u][i])
|
||||
{
|
||||
dist[v_sta][i]=dist[u_sta][u]+mat[u][i];
|
||||
if(!vis[v_sta][i])
|
||||
{
|
||||
if(++rear==maxQ) rear=0;
|
||||
vis[v_sta][i]=1;
|
||||
q[rear][0]=v_sta;q[rear][1]=i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int i=0;i<(1<<n);++i)
|
||||
for(int j=0;j<n;++j)
|
||||
dp[i>>1]=min(dp[i>>1],dist[i][j]);
|
||||
int tot_sta=1<<n-1;
|
||||
for(int i=0;i<tot_sta;++i)
|
||||
f[i]=dp[i];
|
||||
for(int k=1;k<=2;++k)
|
||||
{
|
||||
for(int i=tot_sta-1;i;--i)
|
||||
for(u=i;u;u=(--u)&i)
|
||||
{
|
||||
v=i^u;
|
||||
if(dp[i]>max(dp[u],f[v]))
|
||||
{
|
||||
if(i==224 && max(dp[u],f[v])==5)
|
||||
cout<<"dd";
|
||||
dp[i]=max(dp[u],f[v]);
|
||||
}
|
||||
}
|
||||
}
|
||||
int query;scanf("%d",&query);
|
||||
int sta=0;
|
||||
while(query--)
|
||||
{
|
||||
scanf("%d",&u);
|
||||
sta|=1<<u-2;
|
||||
}
|
||||
int ans=INF;
|
||||
for(int i=0;i<tot_sta;++i)
|
||||
if((i&sta)==sta)
|
||||
{
|
||||
ans=min(ans,dp[i]);
|
||||
}
|
||||
if(ans>=INF)
|
||||
printf("Case %d: -1\n",kk);
|
||||
else printf("Case %d: %d\n",kk,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
131
HDOJ/4641_autoAC.cpp
Normal file
131
HDOJ/4641_autoAC.cpp
Normal file
|
@ -0,0 +1,131 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
#define Maxn 250009
|
||||
int root,last;
|
||||
int tots;
|
||||
int l;
|
||||
int sv[Maxn*2];
|
||||
struct query{int a;long long ans;}qu[Maxn];
|
||||
struct sam_node{
|
||||
int fa,son[26];
|
||||
int len;
|
||||
void init(int _len){len=_len;fa=-1;memset(son,-1,sizeof(son));}
|
||||
}t[Maxn*2];
|
||||
void sam_init(){
|
||||
tots=0;
|
||||
root=last=0;
|
||||
t[tots].init(0);
|
||||
}
|
||||
void extend(int w){
|
||||
int p=last;
|
||||
int np=++tots;t[tots].init(t[p].len+1);
|
||||
sv[l]=np;
|
||||
int q,nq;
|
||||
while(p!=-1&&t[p].son[w]==-1){t[p].son[w]=np;p=t[p].fa;}
|
||||
if (p==-1) t[np].fa=root;
|
||||
else{
|
||||
q=t[p].son[w];
|
||||
if (t[p].len+1==t[q].len){t[np].fa=q;}
|
||||
else{
|
||||
nq=++tots;t[nq].init(0);
|
||||
t[nq]=t[q];
|
||||
t[nq].len=t[p].len+1;
|
||||
t[q].fa=nq;t[np].fa=nq;
|
||||
while(p!=-1&&t[p].son[w]==q){t[p].son[w]=nq;p=t[p].fa;}
|
||||
}
|
||||
}
|
||||
last=np;
|
||||
}
|
||||
int w[Maxn],r[Maxn*2];
|
||||
void topsort(){
|
||||
int i;
|
||||
for(i=0;i<=l;++i) w[i]=0;
|
||||
for(i=1;i<=tots;++i)w[t[i].len]++;
|
||||
for(i=1;i<=l;++i) w[i]+=w[i-1];
|
||||
for(i=tots;i>=1;--i)r[w[t[i].len]--]=i;
|
||||
r[0]=0;
|
||||
}
|
||||
int dp[Maxn*2];
|
||||
int sub[Maxn*2];
|
||||
char s[Maxn];
|
||||
int set[Maxn*2];
|
||||
int findset(int x){
|
||||
int y;
|
||||
while(x!=set[x]){
|
||||
y=set[x];
|
||||
set[x]=set[y];
|
||||
x=y;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
int main(){
|
||||
int n,m,k,f,y,p,i,a;
|
||||
long long ans;
|
||||
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
|
||||
scanf("%s",s);
|
||||
int tl=strlen(s);
|
||||
l=0;
|
||||
sam_init();
|
||||
for(i=0;i<tl;++i){
|
||||
++l;
|
||||
extend(s[i]-'a');
|
||||
}
|
||||
char ts[20];
|
||||
for(i=1;i<=m;++i){
|
||||
scanf("%d",&a);
|
||||
if (a==1){
|
||||
scanf("%s",ts);
|
||||
s[l++]=ts[0];
|
||||
qu[i].a=a;
|
||||
extend(ts[0]-'a');
|
||||
}
|
||||
else if (a==2) qu[i].a=a;
|
||||
}
|
||||
for(i=0;i<=tots;++i){dp[i]=0;}
|
||||
topsort();
|
||||
p=root;
|
||||
for(i=0;i<l;++i){
|
||||
p=t[p].son[s[i]-'a'];
|
||||
dp[p]++;
|
||||
}
|
||||
for(i=tots;i>=1;--i){
|
||||
p=r[i];
|
||||
if (t[p].fa!=-1) dp[t[p].fa]+=dp[p];
|
||||
}
|
||||
ans=0;
|
||||
for(i=1;i<=tots;++i)
|
||||
if (dp[i]>=k) ans+=t[i].len-t[t[i].fa].len;
|
||||
for(i=0;i<=tots;++i){set[i]=i;sub[i]=0;}
|
||||
for(i=m;i>=1;--i){
|
||||
if (qu[i].a==2) qu[i].ans=ans;
|
||||
else{
|
||||
p=sv[l];
|
||||
l--;
|
||||
y=findset(p);
|
||||
while(y!=0&&dp[y]<k){
|
||||
f=t[y].fa;
|
||||
set[y]=f=findset(f);
|
||||
y=f;
|
||||
}
|
||||
y=findset(p);
|
||||
if (y==root) {continue;}
|
||||
sub[y]++;
|
||||
while(y!=0&&(dp[y]-sub[y]<k)){
|
||||
ans=ans-t[y].len+t[t[y].fa].len;
|
||||
f=t[y].fa;
|
||||
f=findset(f);
|
||||
sub[f]+=sub[y];
|
||||
set[y]=f;
|
||||
y=f;
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i=1;i<=m;++i)if (qu[i].a==2){
|
||||
printf("%I64d\n",qu[i].ans);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
22
HDOJ/4642_autoAC.cpp
Normal file
22
HDOJ/4642_autoAC.cpp
Normal file
|
@ -0,0 +1,22 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
int n,m;
|
||||
int main(){
|
||||
int t;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
scanf("%d%d",&n,&m);
|
||||
int x;
|
||||
for(int i=0;i<n;i++)
|
||||
for(int j=0;j<m;j++)
|
||||
scanf("%d",&x);
|
||||
if(x)
|
||||
puts("Alice");
|
||||
else
|
||||
puts("Bob");
|
||||
}
|
||||
return 0;
|
||||
}
|
190
HDOJ/4643_autoAC.cpp
Normal file
190
HDOJ/4643_autoAC.cpp
Normal file
|
@ -0,0 +1,190 @@
|
|||
#include<stdio.h>
|
||||
#include<algorithm>
|
||||
#include<math.h>
|
||||
using namespace std;
|
||||
const double eps=1e-11;
|
||||
struct point
|
||||
{
|
||||
double x,y;
|
||||
}city[55],base[55];
|
||||
int N,M,K,a,b;
|
||||
struct node
|
||||
{
|
||||
int i,j;
|
||||
point p;
|
||||
double dist;
|
||||
}jiao[3000];
|
||||
inline bool mo_ee(double x,double y)
|
||||
{
|
||||
double ret=x-y;
|
||||
if(ret<0) ret=-ret;
|
||||
if(ret<eps) return 1;
|
||||
return 0;
|
||||
}
|
||||
inline bool mo_gg(double x,double y) { return x > y + eps;} // x > y
|
||||
inline bool mo_ll(double x,double y) { return x < y - eps;} // x < y
|
||||
inline bool mo_ge(double x,double y) { return x > y - eps;} // x >= y
|
||||
inline bool mo_le(double x,double y) { return x < y + eps;} // x <= y
|
||||
inline double min(double a,double b)
|
||||
{
|
||||
if(a<b) return a;
|
||||
return b;
|
||||
}
|
||||
inline double max(double a,double b)
|
||||
{
|
||||
if(a>b) return a;
|
||||
return b;
|
||||
}
|
||||
point getxiang(point xiang)
|
||||
{
|
||||
point a;
|
||||
if(mo_ee(xiang.x,0))
|
||||
{
|
||||
a.x=1;
|
||||
a.y=0;
|
||||
return a;
|
||||
}else if(mo_ee(xiang.y,0))
|
||||
{
|
||||
a.x=0;
|
||||
a.y=1;
|
||||
return a;
|
||||
}else
|
||||
{
|
||||
a.x=1;
|
||||
a.y=-1.0*xiang.x/xiang.y;
|
||||
return a;
|
||||
}
|
||||
}
|
||||
inline double mo_distance(point p1,point p2)
|
||||
{
|
||||
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
|
||||
}
|
||||
point mo_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;
|
||||
}
|
||||
int segjiao(point &ji,point a,point b,point c,point d)
|
||||
{
|
||||
ji=mo_intersection(a,b,c,d);
|
||||
if(mo_ll(ji.x,min(c.x,d.x))) return 0;
|
||||
if(mo_ll(ji.y,min(c.y,d.y))) return 0;
|
||||
if(mo_gg(ji.x,max(c.x,d.x))) return 0;
|
||||
if(mo_gg(ji.y,max(c.y,d.y))) return 0;
|
||||
return 1;
|
||||
}
|
||||
node jiaojiao(int a,int b,int ii,int jj)
|
||||
{
|
||||
node cur;
|
||||
point xiang1,xiang2;
|
||||
xiang1.x=city[b].x-city[a].x,xiang1.y=city[b].y-city[a].y;
|
||||
xiang2.x=base[jj].x-base[ii].x,xiang2.y=base[jj].y-base[ii].y;
|
||||
if(mo_ee(xiang1.x*xiang2.x,xiang1.y*xiang2.y))
|
||||
{
|
||||
cur.i=-1;
|
||||
return cur;
|
||||
}
|
||||
xiang2=getxiang(xiang2);
|
||||
point zhong;
|
||||
zhong.x=(base[ii].x+base[jj].x)/2,zhong.y=(base[ii].y+base[jj].y)/2;
|
||||
point zhongxia;
|
||||
zhongxia.x=zhong.x+xiang2.x;
|
||||
zhongxia.y=zhong.y+xiang2.y;
|
||||
point jiaodian;
|
||||
int jjao=segjiao(jiaodian,zhong,zhongxia,city[a],city[b]);
|
||||
if(jjao==0)
|
||||
{
|
||||
cur.i=-1;
|
||||
return cur;
|
||||
}
|
||||
cur.p=jiaodian;
|
||||
cur.i=ii;
|
||||
cur.j=jj;
|
||||
cur.dist=mo_distance(jiaodian,city[a]);
|
||||
return cur;
|
||||
}
|
||||
bool cmp(const node &aa,const node &bb)
|
||||
{
|
||||
if(mo_ee(aa.dist,bb.dist))
|
||||
{
|
||||
point temp;
|
||||
temp.x=(base[aa.i].x+base[aa.j].x)/2;
|
||||
temp.y=(base[aa.i].y+base[aa.j].y)/2;
|
||||
double dist1=mo_distance(aa.p,temp);
|
||||
temp.x=(base[bb.i].x+base[bb.j].x)/2;
|
||||
temp.y=(base[bb.i].y+base[bb.j].y)/2;
|
||||
double dist2=mo_distance(bb.p,temp);
|
||||
return mo_ll(dist1,dist2);
|
||||
}
|
||||
return mo_ll(aa.dist,bb.dist);
|
||||
}
|
||||
inline int nextno(int j,int no)
|
||||
{
|
||||
if(jiao[j].i==no) return jiao[j].j;
|
||||
if(jiao[j].j==no) return jiao[j].i;
|
||||
return no;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int i,j,ncase;
|
||||
while(scanf("%d%d",&N,&M)!=EOF)
|
||||
{
|
||||
for(i=1;i<=N;++i)
|
||||
{
|
||||
scanf("%lf%lf",&city[i].x,&city[i].y);
|
||||
}
|
||||
for(i=1;i<=M;++i)
|
||||
{
|
||||
scanf("%lf%lf",&base[i].x,&base[i].y);
|
||||
}
|
||||
scanf("%d",&K);
|
||||
for(ncase=0;ncase<K;++ncase)
|
||||
{
|
||||
int yong=0;
|
||||
scanf("%d%d",&a,&b);
|
||||
for(i=1;i<=M;++i)
|
||||
{
|
||||
for(j=i+1;j<=M;++j)
|
||||
{
|
||||
if(i==j) continue;
|
||||
node cur=jiaojiao(a,b,i,j);
|
||||
if(cur.i<0)
|
||||
{
|
||||
continue;
|
||||
}else
|
||||
{
|
||||
jiao[yong++]=cur;
|
||||
}
|
||||
}
|
||||
}
|
||||
sort(jiao,jiao+yong,cmp);
|
||||
double mindist=-1;
|
||||
int minno;
|
||||
for(i=1;i<=M;++i)
|
||||
{
|
||||
double disttemp=sqrt((city[a].x-base[i].x)*(city[a].x-base[i].x)+(city[a].y-base[i].y)*(city[a].y-base[i].y));
|
||||
if(mindist<0||mo_ll(disttemp,mindist))
|
||||
{
|
||||
mindist=disttemp;
|
||||
minno=i;
|
||||
}
|
||||
}
|
||||
int dang=minno,ret=0;
|
||||
for(i=0;i<yong;++i)
|
||||
{
|
||||
int xinno=nextno(i,dang);
|
||||
if(xinno!=dang)
|
||||
{
|
||||
dang=xinno;
|
||||
ret++;
|
||||
}
|
||||
}
|
||||
printf("%d\n",ret);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
56
HDOJ/4644_autoAC.cpp
Normal file
56
HDOJ/4644_autoAC.cpp
Normal file
|
@ -0,0 +1,56 @@
|
|||
#include<cstdio>
|
||||
#include<iostream>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
char str[2000100];
|
||||
char t[100100];
|
||||
pair<int,int>s[100100];
|
||||
int index[100100];
|
||||
int n;
|
||||
int ne[100100];
|
||||
void get_next(char* str,int len){
|
||||
ne[0]=0;
|
||||
for(int i=1;i<len;i++){
|
||||
int j=ne[i-1];
|
||||
while(j&&str[i]!=str[j])j=ne[j-1];
|
||||
if(str[i]==str[j])j++;
|
||||
ne[i]=j;
|
||||
}
|
||||
}
|
||||
bool match(char *s,int len){
|
||||
int k=0;
|
||||
for(int i=0;i<n;i++){
|
||||
while(k&&str[k]!=s[i])k=ne[k-1];
|
||||
if(str[k]==s[i])k++;
|
||||
if(k==len)return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
int main(){
|
||||
while(~scanf("%s",str)){
|
||||
n=strlen(str);
|
||||
for(int i=0;i<n;i++){
|
||||
s[i].first=str[i];
|
||||
s[i].second=i;
|
||||
}
|
||||
stable_sort(s,s+n);
|
||||
for(int i=0;i<n;i++)index[i]=s[i].second;
|
||||
int now=index[0];
|
||||
n--;
|
||||
for(int i=0;i<n;i++){
|
||||
t[i]=s[now].first;
|
||||
now=index[now];
|
||||
}
|
||||
t[n]='\0';
|
||||
int q;
|
||||
scanf("%d",&q);
|
||||
while(q--){
|
||||
scanf("%s",str);
|
||||
int len=strlen(str);
|
||||
get_next(str,len);
|
||||
if(match(t,len))printf("YES\n");
|
||||
else printf("NO\n");
|
||||
}
|
||||
}
|
||||
}
|
59
HDOJ/4646_autoAC.cpp
Normal file
59
HDOJ/4646_autoAC.cpp
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#define ll long long
|
||||
using namespace std;
|
||||
ll t,n;
|
||||
map<ll,ll> g;
|
||||
ll f(ll x)
|
||||
{
|
||||
if (x%2==0) return 2*(x/6+1)-1;
|
||||
else return 2*((x-3)/6+1);
|
||||
}
|
||||
ll get(ll x)
|
||||
{
|
||||
if (g[x]!=0) return g[x];
|
||||
g[x]=f(x);
|
||||
for (ll i=2; i*i<=x; i++)
|
||||
{
|
||||
if (x%i>0) continue;
|
||||
g[x]-=get(i);
|
||||
if (i*i!=x)
|
||||
{
|
||||
g[x]-=get(x/i);
|
||||
}
|
||||
}
|
||||
return g[x];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
scanf("%I64d",&t);
|
||||
while (t--)
|
||||
{
|
||||
scanf("%I64d",&n);
|
||||
if (n%3==0)
|
||||
{
|
||||
printf("0\n");
|
||||
continue;
|
||||
}
|
||||
if ((n&1)==0)
|
||||
{
|
||||
printf("0\n");
|
||||
continue;
|
||||
}
|
||||
if (n==1)
|
||||
{
|
||||
printf("1\n");
|
||||
continue;
|
||||
}
|
||||
if (n==3)
|
||||
{
|
||||
printf("0\n");
|
||||
continue;
|
||||
}
|
||||
n=(n+3)>>1;
|
||||
printf("%I64d\n",get(n));
|
||||
}
|
||||
return 0;
|
||||
}
|
32
HDOJ/4647_autoAC.cpp
Normal file
32
HDOJ/4647_autoAC.cpp
Normal file
|
@ -0,0 +1,32 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int N=100010;
|
||||
int n,m;
|
||||
double a[N];
|
||||
int cmp(double x,double y){
|
||||
return x>y;
|
||||
}
|
||||
int main(){
|
||||
while(~scanf("%d%d",&n,&m)){
|
||||
for(int i=1;i<=n;i++)
|
||||
scanf("%lf",&a[i]);
|
||||
int u,v,w;
|
||||
while(m--){
|
||||
scanf("%d%d%d",&u,&v,&w);
|
||||
a[u]+=1.0*w/2;
|
||||
a[v]+=1.0*w/2;
|
||||
}
|
||||
double t1=0,t2=0;
|
||||
sort(a+1,a+1+n,cmp);
|
||||
for(int i=1;i<=n;i++)
|
||||
if(i&1)
|
||||
t1+=a[i];
|
||||
else
|
||||
t2+=a[i];
|
||||
printf("%.0lf\n",t1-t2);
|
||||
}
|
||||
return 0;
|
||||
}
|
32
HDOJ/4648_autoAC.cpp
Normal file
32
HDOJ/4648_autoAC.cpp
Normal file
|
@ -0,0 +1,32 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
const int V = 100000 + 50;
|
||||
const int MaxN = 80 + 5;
|
||||
const int mod = 10000 + 7;
|
||||
const __int64 INF = 0x7FFFFFFFFFFFFFFFLL;
|
||||
const int inf = 0x7fffffff;
|
||||
int n, m, sum[V], ans;
|
||||
int main() {
|
||||
int i, j;
|
||||
while(~scanf("%d%d", &n, &m)) {
|
||||
ans = 0;
|
||||
for(i = 1; i <= n; ++i) {
|
||||
int temp;
|
||||
scanf("%d", &temp);
|
||||
sum[i] = (sum[i - 1] + temp) % m;
|
||||
}
|
||||
for(i = n; i >= 1 && i > ans; --i) {
|
||||
for(j = 1; j + i - 1 <= n; ++j)
|
||||
if((sum[j + i - 1] - sum[j - 1]) % m == 0) {
|
||||
ans = max(ans, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
printf("%d\n", ans);
|
||||
}
|
||||
}
|
72
HDOJ/4649_autoAC.cpp
Normal file
72
HDOJ/4649_autoAC.cpp
Normal file
|
@ -0,0 +1,72 @@
|
|||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stack>
|
||||
#include <queue>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <math.h>
|
||||
#include <bitset>
|
||||
#include <algorithm>
|
||||
#include <climits>
|
||||
using namespace std;
|
||||
#define ls 2*i
|
||||
#define rs 2*i+1
|
||||
#define UP(i,x,y) for(i=x;i<=y;i++)
|
||||
#define DOWN(i,x,y) for(i=x;i>=y;i--)
|
||||
#define MEM(a,x) memset(a,x,sizeof(a))
|
||||
#define W(a) while(a)
|
||||
#define gcd(a,b) __gcd(a,b)
|
||||
#define LL long long
|
||||
#define N 205
|
||||
#define MOD 1000000007
|
||||
#define INF 0x3f3f3f3f
|
||||
#define EXP 1e-8
|
||||
#define rank rank1
|
||||
const int mod = 10007;
|
||||
int n,a[N];
|
||||
double dp[N],p[N],ans;
|
||||
char op[N][5];
|
||||
int main()
|
||||
{
|
||||
int i,j,k,cas=1;
|
||||
while(~scanf("%d",&n))
|
||||
{
|
||||
for(i = 0; i<=n; i++)
|
||||
scanf("%d",&a[i]);
|
||||
for(i = 1; i<=n; i++)
|
||||
scanf("%s",op[i]);
|
||||
for(i = 1; i<=n; i++)
|
||||
scanf("%lf",&p[i]);
|
||||
ans = 0;
|
||||
for(i = 0; i<=20; i++)
|
||||
{
|
||||
double q;
|
||||
if(a[0]&(1<<i)) q = 1;
|
||||
else q = 0;
|
||||
for(j = 1; j<=n; j++)
|
||||
{
|
||||
if(a[j]&(1<<i))
|
||||
{
|
||||
if(op[j][0]=='&')
|
||||
continue;
|
||||
else if(op[j][0]=='^')
|
||||
q = q*p[j]+(1-q)*(1-p[j]);
|
||||
else
|
||||
q = q*p[j]+(1-p[j]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(op[j][0]=='&')
|
||||
q = q*p[j];
|
||||
else
|
||||
continue;
|
||||
}
|
||||
}
|
||||
ans += q*(1<<i);
|
||||
}
|
||||
printf("Case %d:\n%lf\n",cas++,ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
61
HDOJ/4650_autoAC.cpp
Normal file
61
HDOJ/4650_autoAC.cpp
Normal file
|
@ -0,0 +1,61 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
using namespace std;
|
||||
const int N = 101;
|
||||
const double INF = 10000000000.0;
|
||||
const int INF_INT =10000000;
|
||||
int side[N][N];
|
||||
int dis[N][N];
|
||||
int vis[N][N];
|
||||
int tmp[N][N];
|
||||
double ans[N][N];
|
||||
int main(){
|
||||
int n,m;
|
||||
while(~scanf("%d%d",&n,&m)){
|
||||
memset(vis,-1,sizeof(vis));
|
||||
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){ans[i][j]=INF;side[i][j]=INF_INT;}
|
||||
for(int i=0;i<m;i++){
|
||||
int u,v,w;
|
||||
scanf("%d%d%d",&u,&v,&w);
|
||||
side[u][v]=w;
|
||||
vis[u][v]=1;
|
||||
}
|
||||
for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)if(vis[i][k]!=-1){
|
||||
for(int j=1;j<=n;j++)if(vis[k][j]!=-1){
|
||||
if(vis[i][j]==-1)vis[i][j]=vis[i][k]+vis[k][j];
|
||||
else vis[i][j]=min(vis[i][j],vis[i][k]+vis[k][j]);
|
||||
}
|
||||
}
|
||||
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dis[i][j]=side[i][j];
|
||||
for(int k=1;k<=n;k++){
|
||||
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(vis[i][j]!=-1&&k>=vis[i][j]){
|
||||
ans[i][j]=min(ans[i][j],(double)dis[i][j]/k);
|
||||
}
|
||||
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){tmp[i][j]=dis[i][j];dis[i][j]=INF_INT;}
|
||||
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
|
||||
for(int h=1;h<=n;h++){
|
||||
if(vis[i][h]==-1||k<vis[i][h])continue;
|
||||
if(vis[h][j]==-1||k<vis[h][j])continue;
|
||||
dis[i][j]=min(dis[i][j],tmp[i][h]+side[h][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(vis[i][j]!=-1){
|
||||
for(int k=1;k<=n;k++)if(vis[i][k]!=-1&&vis[k][j]!=-1&&vis[k][k]!=-1){
|
||||
ans[i][j]=min(ans[i][j],ans[k][k]);
|
||||
}
|
||||
}
|
||||
for(int i=1;i<=n;i++){
|
||||
int j=1;
|
||||
if(vis[i][j]==-1)printf("NO");
|
||||
else printf("%.3lf",ans[i][j]);
|
||||
for(j=2;j<=n;j++){
|
||||
if(vis[i][j]==-1)printf(" NO");
|
||||
else printf(" %.3lf",ans[i][j]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
49
HDOJ/4651_autoAC.cpp
Normal file
49
HDOJ/4651_autoAC.cpp
Normal file
|
@ -0,0 +1,49 @@
|
|||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
long long tar[100002];
|
||||
const int MOD=1000000007;
|
||||
void init()
|
||||
{
|
||||
memset(tar,0,sizeof(tar));
|
||||
tar[0]=1;
|
||||
for(int i=1;i<=100000;i++)
|
||||
{
|
||||
int nbit;
|
||||
for(int j=1;;j++)
|
||||
{
|
||||
int element1,element2;
|
||||
element1=i-j*(3*j-1)/2;
|
||||
element2=i-j*(3*j+1)/2;
|
||||
if(j&1)
|
||||
nbit=1;
|
||||
else if(j%2==0)
|
||||
nbit=-1;
|
||||
if(element2<0 && element1<0)
|
||||
break;
|
||||
if(element1>=0)
|
||||
{
|
||||
tar[i]=(tar[i]+nbit*tar[element1])%MOD;
|
||||
}
|
||||
if(element2>=0)
|
||||
{
|
||||
tar[i]=(tar[i]+nbit*tar[element2])%MOD;
|
||||
}
|
||||
}
|
||||
tar[i]=(tar[i]+MOD)%MOD;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int testcase;
|
||||
init();
|
||||
cin>>testcase;
|
||||
while(testcase--)
|
||||
{
|
||||
int rat;
|
||||
cin>>rat;
|
||||
cout<<tar[rat]<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
41
HDOJ/4652_autoAC.cpp
Normal file
41
HDOJ/4652_autoAC.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
using namespace std;
|
||||
double solve0(int m,int n)
|
||||
{
|
||||
double ans=0;
|
||||
for(int i=0;i<=n-1;i++)
|
||||
ans+=pow(1.0*m,i);
|
||||
return ans;
|
||||
}
|
||||
double solve1(int m,int n)
|
||||
{
|
||||
double ans=0;
|
||||
double tmp=1;
|
||||
for(int i=1;i<=n;i++)
|
||||
{
|
||||
ans+=tmp;
|
||||
tmp*=(m+0.0)/(m-i);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t;
|
||||
while(scanf("%d",&t)!=EOF)
|
||||
{
|
||||
while(t--)
|
||||
{
|
||||
int n,m,op;
|
||||
scanf("%d%d%d",&op,&m,&n);
|
||||
if(op==0)
|
||||
printf("%.9lf\n",solve0(m,n));
|
||||
else
|
||||
printf("%.9lf\n",solve1(m,n));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
102
HDOJ/4654_autoAC.cpp
Normal file
102
HDOJ/4654_autoAC.cpp
Normal file
|
@ -0,0 +1,102 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
#define inf (1<<29)
|
||||
const int maxn = 105;
|
||||
int g[maxn][maxn],a[maxn][maxn],p[maxn];
|
||||
bool vis[maxn],combine[maxn],par[maxn];
|
||||
int d[maxn],node[maxn],st[maxn],k,s,t;
|
||||
vector <int> vst[maxn];
|
||||
vector <int> pa , pb;
|
||||
int prim(int n) {
|
||||
memset(vis,0,sizeof(vis));
|
||||
memset(d,0,sizeof(d));
|
||||
int mincut = 0 , tmp = -1;
|
||||
s = t = -1;
|
||||
int top = 0;
|
||||
for(int i=0;i<k;i++) {
|
||||
int maxi = -inf;
|
||||
for(int j=0;j<k;j++) {
|
||||
int u = node[j];
|
||||
if(!combine[u]&&!vis[u]&&d[u]>maxi) {
|
||||
tmp = u;
|
||||
maxi = d[u];
|
||||
}
|
||||
}
|
||||
st[top++] = tmp;
|
||||
vis[tmp] = true;
|
||||
if(i == k-1)
|
||||
mincut = d[tmp];
|
||||
for(int j=0;j<k;j++) {
|
||||
int u = node[j];
|
||||
if(!combine[u]&&!vis[u])
|
||||
d[u] += g[tmp][u];
|
||||
}
|
||||
}
|
||||
s = st[top-2];
|
||||
t = st[top-1];
|
||||
for(int i=0;i<top;i++) node[i] = st[i];
|
||||
return mincut;
|
||||
}
|
||||
int stoer_wagner(int n) {
|
||||
for(int i=0;i<n;i++) {
|
||||
vst[i].clear();
|
||||
vst[i].push_back(i);
|
||||
}
|
||||
int ans = inf;
|
||||
memset(combine,0,sizeof(combine));
|
||||
for(int i=0;i<n;i++) node[i] = i;
|
||||
for(int i=1;i<n;i++) {
|
||||
k = n - i + 1;
|
||||
int cur = prim(n);
|
||||
if(cur < ans) {
|
||||
ans = cur;
|
||||
for(int j=0;j<n;j++) par[j] = 0;
|
||||
for(int j=0;j<vst[t].size();j++) par[ vst[t][j] ] = 1;
|
||||
}
|
||||
combine[t] = true;
|
||||
for(int j=0;j<vst[t].size();j++) vst[s].push_back(vst[t][j]);
|
||||
for(int j=0;j<n;j++) {
|
||||
if(j == s) continue;
|
||||
if(!combine[j]) {
|
||||
g[s][j] += g[t][j];
|
||||
g[j][s] += g[j][t];
|
||||
}
|
||||
}
|
||||
}
|
||||
pa.clear(); pb.clear();
|
||||
for(int i=0;i<n;i++)
|
||||
if(par[i]) pa.push_back(i);
|
||||
else pb.push_back(i);
|
||||
return ans;
|
||||
}
|
||||
int K;
|
||||
int dfs(vector <int> t) {
|
||||
int n = t.size();
|
||||
for(int i=0;i<n;i++) for(int j=0;j<n;j++) g[i][j] = a[t[i]][t[j]];
|
||||
if(stoer_wagner(n) >= K) return 1;
|
||||
vector <int> x , y;
|
||||
for(int i=0;i<pa.size();i++) x.push_back(t[pa[i]]);
|
||||
for(int i=0;i<pb.size();i++) y.push_back(t[pb[i]]);
|
||||
return dfs(x) + dfs(y);
|
||||
}
|
||||
int main() {
|
||||
int n , m;
|
||||
while(~scanf("%d%d%d",&n,&m,&K)) {
|
||||
memset(a , 0 ,sizeof(a));
|
||||
while(m--) {
|
||||
int u , v;
|
||||
scanf("%d%d",&u,&v);
|
||||
u --; v --;
|
||||
a[u][v] += 1;
|
||||
a[v][u] += 1;
|
||||
}
|
||||
vector <int> t;
|
||||
for(int i=0;i<n;i++) t.push_back(i);
|
||||
printf("%d\n" , dfs(t));
|
||||
}
|
||||
return 0;
|
||||
}
|
57
HDOJ/4655_autoAC.cpp
Normal file
57
HDOJ/4655_autoAC.cpp
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#include <time.h>
|
||||
using namespace std;
|
||||
const int MOD = 1e9+7;
|
||||
long long inv(long long a,long long m)
|
||||
{
|
||||
if(a == 1)return 1;
|
||||
return inv(m%a,m)*(m-m/a)%m;
|
||||
}
|
||||
const int MAXN = 1000010;
|
||||
int a[MAXN];
|
||||
int main()
|
||||
{
|
||||
int T;
|
||||
int n;
|
||||
scanf("%d",&T);
|
||||
while(T--)
|
||||
{
|
||||
scanf("%d",&n);
|
||||
long long S = 1;
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
S *= a[i];
|
||||
S %=MOD;
|
||||
}
|
||||
long long ans = S*n%MOD;
|
||||
sort(a,a+n);
|
||||
reverse(a,a+n);
|
||||
int cnt = n-1;
|
||||
for(int i = 0;i < n;i++)
|
||||
{
|
||||
if(cnt == 0)break;
|
||||
long long tmp = S*inv(a[i],MOD)%MOD;
|
||||
ans -= tmp;
|
||||
ans = (ans%MOD+MOD)%MOD;
|
||||
cnt--;
|
||||
if(cnt == 0)break;
|
||||
ans -= tmp;
|
||||
ans = (ans%MOD+MOD)%MOD;
|
||||
cnt--;
|
||||
if(cnt == 0)break;
|
||||
}
|
||||
printf("%I64d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
116
HDOJ/4656_autoAC.cpp
Normal file
116
HDOJ/4656_autoAC.cpp
Normal file
|
@ -0,0 +1,116 @@
|
|||
#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 P = 1000003;
|
||||
const int N1 = 262144;
|
||||
const int N2 = N1+1;
|
||||
const int P1 = 998244353;
|
||||
const int P2 = 995622913;
|
||||
const int E1 = 996173970;
|
||||
const int E2 = 88560779;
|
||||
const int F1 = 121392023;
|
||||
const int F2 = 840835547;
|
||||
const int I1 = 998240545;
|
||||
const int I2 = 995619115;
|
||||
const long long M1 = 397550359381069386LL;
|
||||
const long long M2 = 596324591238590904LL;
|
||||
const long long MM = 993874950619660289LL;
|
||||
long long mul(long long x,long long y,long long z){
|
||||
return (x*y - (long long)(x/(long double)z*y+1e-3)*z+z)%z;
|
||||
}
|
||||
int trf(int x1,int x2){
|
||||
return (mul(M1,x1,MM)+mul(M2,x2,MM))%MM%P;
|
||||
}
|
||||
int A[N2],B[N2],C[N2];
|
||||
int A1[N2],B1[N2],C1[N2];
|
||||
void fft(int *A,int PM,int PW){
|
||||
for(int m = N1,h;h = m/2, m >= 2;PW = (long long)PW*PW%PM,m=h)
|
||||
for(int i = 0,w=1;i < h;i++, w = (long long)w*PW%PM)
|
||||
for(int j = i;j < N1;j += m){
|
||||
int k = j+h, x = (A[j]-A[k]+PM)%PM;
|
||||
(A[j]+=A[k])%=PM;
|
||||
A[k] = (long long)w*x%PM;
|
||||
}
|
||||
for(int i = 0,j = 1;j < N1-1;j++){
|
||||
for(int k = N1/2; k > (i^=k);k /= 2);
|
||||
if(j < i)swap(A[i],A[j]);
|
||||
}
|
||||
}
|
||||
void mul(){
|
||||
memset(C,0,sizeof(C));
|
||||
memcpy(A1,A,sizeof(A));
|
||||
memcpy(B1,B,sizeof(B));
|
||||
fft(A1,P1,E1); fft(B1,P1,E1);
|
||||
for(int i = 0;i < N1;i++)C1[i] = (long long)A1[i]*B1[i]%P1;
|
||||
fft(C1,P1,F1);
|
||||
for(int i = 0;i < N1;i++)C1[i] = (long long)C1[i]*I1%P1;
|
||||
fft(A,P2,E2); fft(B,P2,E2);
|
||||
for(int i = 0;i < N1;i++)C[i] = (long long)A[i]*B[i]%P2;
|
||||
fft(C,P2,F2);
|
||||
for(int i = 0;i < N1;i++)C[i] = (long long)C[i]*I2%P2;
|
||||
for(int i = 0;i < N1;i++)C[i] = trf(C1[i],C[i]);
|
||||
}
|
||||
int INV[P];
|
||||
const int MAXN = 100010;
|
||||
int F[MAXN];
|
||||
int a[MAXN];
|
||||
int pd[MAXN];
|
||||
int pb[MAXN];
|
||||
int pc2[MAXN];
|
||||
int p[MAXN];
|
||||
int main()
|
||||
{
|
||||
INV[1] = 1;
|
||||
for(int i = 2;i < P;i++)
|
||||
INV[i] = (long long)P/i*(P-INV[P%i])%P;
|
||||
F[0] = 1;
|
||||
for(int i = 1;i < MAXN;i++)
|
||||
F[i] = (long long)F[i-1]*i%P;
|
||||
int n,b,c,d;
|
||||
while(scanf("%d%d%d%d",&n,&b,&c,&d) == 4){
|
||||
for(int i = 0;i < n;i++)scanf("%d",&a[i]);
|
||||
pd[0] = 1;
|
||||
for(int i = 1;i < n;i++)
|
||||
pd[i] = (long long)pd[i-1]*d%P;
|
||||
memset(A,0,sizeof(A));
|
||||
memset(B,0,sizeof(B));
|
||||
for(int i = 0;i < n;i++)
|
||||
A[i] = (long long)a[n-1-i]*F[n-1-i]%P;
|
||||
for(int i = 0;i < n;i++)
|
||||
B[i] = (long long)pd[i]*INV[F[i]]%P;
|
||||
mul();
|
||||
for(int i = 0;i < n;i++)p[i] = C[i];
|
||||
reverse(p,p+n);
|
||||
memset(A,0,sizeof(A));
|
||||
pb[0] = 1;
|
||||
for(int i = 1;i < n;i++)
|
||||
pb[i] = (long long)pb[i-1]*b%P;
|
||||
pc2[0] = 1;
|
||||
int c2 = (long long)c*c%P;
|
||||
for(int i = 1, s = c;i < n;i++){
|
||||
pc2[i] = (long long)pc2[i-1]*s%P;
|
||||
s = (long long)s*c2%P;
|
||||
}
|
||||
for(int i = 0;i < n;i++)
|
||||
A[i] = (long long)pb[i]*INV[F[i]]%P*p[i]%P*pc2[i]%P;
|
||||
memset(B,0,sizeof(B));
|
||||
B[0] = 1;
|
||||
for(int i = 1;i < n;i++)
|
||||
B[i] = B[N1-i] = INV[pc2[i]];
|
||||
mul();
|
||||
for(int i = 0;i < n;i++)C[i] = (long long)C[i]*pc2[i]%P;
|
||||
for(int i = 0;i < n;i++)
|
||||
printf("%d\n",C[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
45
HDOJ/4657_autoAC.cpp
Normal file
45
HDOJ/4657_autoAC.cpp
Normal file
|
@ -0,0 +1,45 @@
|
|||
#include<iostream>
|
||||
#include<stdio.h>
|
||||
#include<algorithm>
|
||||
#include<iomanip>
|
||||
#include<cmath>
|
||||
#include<ctime>
|
||||
#include<cstring>
|
||||
#include<vector>
|
||||
#define ll __int64
|
||||
#define pi acos(-1.0)
|
||||
#define MAX 100005
|
||||
#define mod 1000003
|
||||
using namespace std;
|
||||
int a[MAX],b[MAX],c[MAX],index[MAX];
|
||||
int main(){
|
||||
int t,n,i,j;
|
||||
scanf("%d",&t);
|
||||
while(t--){
|
||||
scanf("%d",&n);
|
||||
for(i=0;i<n;i++) scanf("%d",&b[i]);
|
||||
for(i=0;i<n;i++) a[i]=c[i]=index[i]=i;
|
||||
for(i=0;i<n;i++){
|
||||
int cur=i;
|
||||
while((a[cur]+b[cur])%n!=c[cur]){
|
||||
int l = index[(c[cur]-b[cur]+n)%n];
|
||||
swap(a[l],a[cur]);
|
||||
swap(index[a[l]],index[a[cur]]);
|
||||
if(l>i) break;
|
||||
cur=l;
|
||||
swap(c[i+1],c[cur]);
|
||||
}
|
||||
}
|
||||
for(i=0;i<n;i++){
|
||||
printf("%d",a[i]);
|
||||
if(i!=n-1) printf(" ");
|
||||
else printf("\n");
|
||||
}
|
||||
for(i=0;i<n;i++){
|
||||
printf("%d",c[i]);
|
||||
if(i!=n-1) printf(" ");
|
||||
else printf("\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
58
HDOJ/4658_autoAC.cpp
Normal file
58
HDOJ/4658_autoAC.cpp
Normal file
|
@ -0,0 +1,58 @@
|
|||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
const int mod=1e9+7;
|
||||
int f[100010];
|
||||
void init()
|
||||
{
|
||||
f[0]=1;
|
||||
int i,j,k,flag,t,tt;
|
||||
for(i=1;i<=100000;i++)
|
||||
{
|
||||
f[i]=0;
|
||||
flag=1;
|
||||
for(j=1;;j++)
|
||||
{
|
||||
t=i-j*(3*j-1)/2;
|
||||
tt=i-j*(3*j+1)/2;
|
||||
if(t<0)break;
|
||||
f[i]=(f[i]+flag*f[t])%mod;
|
||||
if(tt<0)break;
|
||||
f[i]=(f[i]+flag*f[tt])%mod;
|
||||
flag=-flag;
|
||||
}
|
||||
f[i]=(f[i]+mod)%mod;
|
||||
}
|
||||
}
|
||||
int find(int n,int k)
|
||||
{
|
||||
int i,j,ans,flag=-1,t,tt;
|
||||
ans=f[n];
|
||||
for(i=1;;i++)
|
||||
{
|
||||
t=k*i*(i*3-1)/2;
|
||||
tt=k*i*(i*3+1)/2;
|
||||
if(t>n)break;
|
||||
ans=(ans+flag*f[n-t])%mod;
|
||||
if(tt>n)break;
|
||||
ans=(ans+flag*f[n-tt])%mod;
|
||||
flag=-flag;
|
||||
}
|
||||
return (ans+mod)%mod;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
init();
|
||||
int T;
|
||||
cin>>T;
|
||||
while(T--)
|
||||
{
|
||||
int n,k,ans;
|
||||
scanf("%d%d",&n,&k);
|
||||
ans=find(n,k) ;
|
||||
printf("%d\n",ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
141
HDOJ/4661_autoAC.cpp
Normal file
141
HDOJ/4661_autoAC.cpp
Normal file
|
@ -0,0 +1,141 @@
|
|||
#pragma comment(linker,"/STACK:102400000,102400000")
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
typedef long long LL;
|
||||
#define MAXN 1000010
|
||||
#define MAXM 2000010
|
||||
#define MOD 1000000007
|
||||
int n;
|
||||
LL fac[MAXN];
|
||||
LL invfac[MAXN];
|
||||
int first[MAXN], next[MAXM], v[MAXM], e;
|
||||
bool vis[MAXN];
|
||||
LL dp[MAXN];
|
||||
LL f[MAXN];
|
||||
int size[MAXN];
|
||||
LL ext_gcd(LL a, LL b, LL &x, LL &y) {
|
||||
LL t, d;
|
||||
if (b == 0) {
|
||||
x = 1;
|
||||
y = 0;
|
||||
return a;
|
||||
}
|
||||
d = ext_gcd(b, a % b, x, y);
|
||||
t = x;
|
||||
x = y;
|
||||
y = t - a / b * y;
|
||||
return d;
|
||||
}
|
||||
LL invmod(LL a, LL n = MOD) {
|
||||
LL x, y;
|
||||
if (ext_gcd(a, n, x, y) != 1)
|
||||
return -1;
|
||||
return (x % n + n) % n;
|
||||
}
|
||||
void init() {
|
||||
int i;
|
||||
fac[0] = 1;
|
||||
for (i = 1; i < MAXN; i++) {
|
||||
fac[i] = fac[i - 1] * i;
|
||||
fac[i] %= MOD;
|
||||
}
|
||||
for (i = 0; i < MAXN; i++) {
|
||||
invfac[i] = invmod(fac[i]);
|
||||
}
|
||||
}
|
||||
inline void addEdge(int x, int y) {
|
||||
v[e] = y;
|
||||
next[e] = first[x];
|
||||
first[x] = e++;
|
||||
}
|
||||
void getSize(int x) {
|
||||
vis[x] = true;
|
||||
size[x] = 1;
|
||||
for (int i = first[x]; i != -1; i = next[i]) {
|
||||
int y = v[i];
|
||||
if (!vis[y]) {
|
||||
getSize(y);
|
||||
size[x] += size[y];
|
||||
}
|
||||
}
|
||||
}
|
||||
void dfs(int x) {
|
||||
vis[x] = true;
|
||||
dp[x] = fac[size[x] - 1];
|
||||
for (int i = first[x]; i != -1; i = next[i]) {
|
||||
int y = v[i];
|
||||
if (!vis[y]) {
|
||||
dfs(y);
|
||||
dp[x] *= invfac[size[y]];
|
||||
dp[x] %= MOD;
|
||||
dp[x] *= dp[y];
|
||||
dp[x] %= MOD;
|
||||
}
|
||||
}
|
||||
}
|
||||
void search(int x, int pre) {
|
||||
vis[x] = true;
|
||||
if (pre != -1) {
|
||||
f[x] = fac[n - 1];
|
||||
f[x] *= invfac[n - size[x]];
|
||||
f[x] %= MOD;
|
||||
LL tmp = f[pre];
|
||||
tmp *= invfac[n - 1];
|
||||
tmp %= MOD;
|
||||
tmp *= fac[n - 1 - size[x]];
|
||||
tmp %= MOD;
|
||||
tmp *= fac[size[x]];
|
||||
tmp %= MOD;
|
||||
tmp *= invmod(dp[x]);
|
||||
tmp %= MOD;
|
||||
f[x] *= tmp;
|
||||
f[x] %= MOD;
|
||||
for (int i = first[x]; i != -1; i = next[i]) {
|
||||
int y = v[i];
|
||||
if (!vis[y]) {
|
||||
f[x] *= invfac[size[y]];
|
||||
f[x] %= MOD;
|
||||
f[x] *= dp[y];
|
||||
f[x] %= MOD;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = first[x]; i != -1; i = next[i]) {
|
||||
int y = v[i];
|
||||
if (!vis[y]) {
|
||||
search(y, x);
|
||||
}
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
int T;
|
||||
int i;
|
||||
int x, y;
|
||||
int ans;
|
||||
init();
|
||||
scanf("%d", &T);
|
||||
while (T--) {
|
||||
scanf("%d", &n);
|
||||
e = 0;
|
||||
memset(first, -1, sizeof(first));
|
||||
for (i = 1; i < n; i++) {
|
||||
scanf("%d%d", &x, &y);
|
||||
addEdge(x, y);
|
||||
addEdge(y, x);
|
||||
}
|
||||
memset(vis, false, sizeof(vis));
|
||||
getSize(1);
|
||||
memset(vis, false, sizeof(vis));
|
||||
dfs(1);
|
||||
memset(vis, false, sizeof(vis));
|
||||
f[1] = dp[1];
|
||||
search(1, -1);
|
||||
ans = 0;
|
||||
for (i = 1; i <= n; i++) {
|
||||
ans += (f[i] * f[i]) % MOD;
|
||||
ans %= MOD;
|
||||
}
|
||||
printf("%d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
46
HDOJ/4662_autoAC.cpp
Normal file
46
HDOJ/4662_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#define MAXN 1000010
|
||||
char str[MAXN];
|
||||
bool isOK(int len) {
|
||||
if (str[0] != 'M') {
|
||||
return false;
|
||||
}
|
||||
for (int i = 1; i < len; i++) {
|
||||
if (str[i] == 'M') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
int main() {
|
||||
int T;
|
||||
int len;
|
||||
int cnt;
|
||||
int i;
|
||||
scanf("%d", &T);
|
||||
while (T--) {
|
||||
scanf(" %s", str);
|
||||
len = strlen(str);
|
||||
if (isOK(len)) {
|
||||
cnt = 0;
|
||||
for (i = 1; i < len; i++) {
|
||||
if (str[i] == 'U') {
|
||||
cnt += 3;
|
||||
} else {
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
if (len == 2 && str[1] == 'I') {
|
||||
puts("Yes");
|
||||
} else if (cnt % 6 == 2 || cnt % 6 == 4) {
|
||||
puts("Yes");
|
||||
} else {
|
||||
puts("No");
|
||||
}
|
||||
} else {
|
||||
puts("No");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
65
HDOJ/4664_autoAC.cpp
Normal file
65
HDOJ/4664_autoAC.cpp
Normal file
|
@ -0,0 +1,65 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#define MAXN 1010
|
||||
int sg[MAXN];
|
||||
bool vis[MAXN];
|
||||
int SG(int n) {
|
||||
if (n == 0) {
|
||||
sg[n] = 0;
|
||||
} else if (n == 1) {
|
||||
sg[n] = 0;
|
||||
} else if (n == 2) {
|
||||
sg[n] = 1;
|
||||
} else if (n == 3) {
|
||||
sg[n] = 1;
|
||||
} else if (sg[n] == -1) {
|
||||
int i;
|
||||
memset(vis, false, sizeof(vis));
|
||||
for (i = 0; i <= n - 2; i++) {
|
||||
vis[SG(i) ^ SG(n - i - 2)] = true;
|
||||
}
|
||||
for (i = 0;; i++) {
|
||||
if (!vis[i]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
sg[n] = i;
|
||||
}
|
||||
return sg[n];
|
||||
}
|
||||
void init() {
|
||||
int i;
|
||||
memset(sg, -1, sizeof(sg));
|
||||
for (i = 0; i < MAXN; i++) {
|
||||
sg[i] = SG(i);
|
||||
}
|
||||
}
|
||||
int getSG(int n) {
|
||||
if (n < MAXN) {
|
||||
return sg[n];
|
||||
} else {
|
||||
return sg[n % 34 + 2 * 34];
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
int T;
|
||||
int n;
|
||||
int tmp;
|
||||
int res;
|
||||
init();
|
||||
scanf("%d", &T);
|
||||
while (T--) {
|
||||
scanf("%d", &n);
|
||||
res = 0;
|
||||
while (n--) {
|
||||
scanf("%d", &tmp);
|
||||
res ^= getSG(tmp);
|
||||
}
|
||||
if (res) {
|
||||
puts("Carol");
|
||||
} else {
|
||||
puts("Dave");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
82
HDOJ/4665_autoAC.cpp
Normal file
82
HDOJ/4665_autoAC.cpp
Normal file
|
@ -0,0 +1,82 @@
|
|||
#include<cstdio>
|
||||
#include<algorithm>
|
||||
#include<cstring>
|
||||
#include<vector>
|
||||
#define MAXN 2010
|
||||
using namespace std;
|
||||
int arr[MAXN];
|
||||
char str[MAXN];
|
||||
bool flag;
|
||||
int idx[MAXN];
|
||||
int cnt[MAXN];
|
||||
int st[2][MAXN];
|
||||
int belong[MAXN];
|
||||
int n;
|
||||
vector<int> pos[MAXN];
|
||||
void dfs(int x, int p1, int p2) {
|
||||
if (x > n) {
|
||||
flag = true;
|
||||
}
|
||||
if (flag) {
|
||||
return;
|
||||
}
|
||||
if (p1 > 0 && p2 > 0
|
||||
&& arr[st[0][min(p1, p2)]] != arr[st[1][min(p1, p2)]]) {
|
||||
return;
|
||||
}
|
||||
if (belong[x] == 0) {
|
||||
st[0][p1 + 1] = x;
|
||||
dfs(x + 1, p1 + 1, p2);
|
||||
} else if (belong[x] == 1) {
|
||||
st[1][p2 + 1] = x;
|
||||
dfs(x + 1, p1, p2 + 1);
|
||||
} else {
|
||||
st[0][p1 + 1] = x;
|
||||
belong[pos[arr[x]][2]] = 1;
|
||||
dfs(x + 1, p1 + 1, p2);
|
||||
if (!flag) {
|
||||
st[1][p2 + 1] = x;
|
||||
belong[pos[arr[x]][2]] = 0;
|
||||
dfs(x + 1, p1, p2 + 1);
|
||||
belong[pos[arr[x]][2]] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
int T;
|
||||
int i;
|
||||
scanf("%d", &T);
|
||||
while (T--) {
|
||||
scanf("%d", &n);
|
||||
memset(idx, 0, sizeof(idx));
|
||||
memset(cnt, 0, sizeof(cnt));
|
||||
for (i = 1; i <= n; i++) {
|
||||
scanf("%d", &arr[i]);
|
||||
cnt[arr[i]]++;
|
||||
idx[i] = cnt[arr[i]];
|
||||
pos[arr[i]].clear();
|
||||
}
|
||||
memset(belong, -1, sizeof(belong));
|
||||
for (i = 1; i <= n; i++) {
|
||||
if (idx[i] == 1) {
|
||||
belong[i] = 0;
|
||||
} else if (idx[i] == 2 && cnt[arr[i]] == 2) {
|
||||
belong[i] = 1;
|
||||
} else if (idx[i] == 4) {
|
||||
belong[i] = 1;
|
||||
}
|
||||
pos[arr[i]].push_back(i);
|
||||
}
|
||||
flag = false;
|
||||
dfs(1, 0, 0);
|
||||
for (i = 1; i <= (n >> 1); i++) {
|
||||
str[st[0][i]] = '0';
|
||||
str[st[1][i]] = '1';
|
||||
}
|
||||
for (i = 1; i <= n; i++) {
|
||||
putchar(str[i]);
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
return 0;
|
||||
}
|
66
HDOJ/4666_autoAC.cpp
Normal file
66
HDOJ/4666_autoAC.cpp
Normal file
|
@ -0,0 +1,66 @@
|
|||
#include<stdio.h>
|
||||
#include<iostream>
|
||||
#include<algorithm>
|
||||
#include<set>
|
||||
using namespace std;
|
||||
#define maxn 60002
|
||||
int maps[maxn][6];
|
||||
multiset<int>se[1<<5];
|
||||
multiset<int>::iterator i1,i2;
|
||||
int main()
|
||||
{
|
||||
int i,j,leap,x,n,m,a;
|
||||
while(~scanf("%d%d",&n,&m))
|
||||
{
|
||||
for(i=0;i<(1<<5);i++)
|
||||
se[i].clear();
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&leap);
|
||||
if(leap==0)
|
||||
{
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
scanf("%d",&maps[i][j]);
|
||||
}
|
||||
for(a=0;a<(1<<m);a++)
|
||||
{
|
||||
int as;
|
||||
as=0;
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
if(a&(1<<j))as+=maps[i][j];
|
||||
else as-=maps[i][j];
|
||||
}
|
||||
se[a].insert(as);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
scanf("%d",&x);
|
||||
for(a=0;a<(1<<m);a++)
|
||||
{
|
||||
int as;
|
||||
as=0;
|
||||
for(j=0;j<m;j++)
|
||||
{
|
||||
if(a&(1<<j))as+=maps[x][j];
|
||||
else as-=maps[x][j];
|
||||
}
|
||||
i1=se[a].find(as);
|
||||
se[a].erase(i1);
|
||||
}
|
||||
}
|
||||
int ans=0;
|
||||
for(a=0;a<(1<<m);a++)
|
||||
{
|
||||
i1=se[a].begin();
|
||||
i2=se[a].end();
|
||||
i2--;
|
||||
ans=max(ans,(*i2)-(*i1));
|
||||
}
|
||||
cout<<ans<<endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
116
HDOJ/4667_autoAC.cpp
Normal file
116
HDOJ/4667_autoAC.cpp
Normal file
|
@ -0,0 +1,116 @@
|
|||
#include<stdio.h>
|
||||
#include<iostream>
|
||||
#include<math.h>
|
||||
#include<algorithm>
|
||||
#define PI 3.1415926
|
||||
using namespace std;
|
||||
struct list
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
int r;
|
||||
int pos;
|
||||
}point[500001],tu[500001],pp;
|
||||
int tops,num;
|
||||
int cmp1(struct list a,struct list b)
|
||||
{
|
||||
if(a.y!=b.y)return a.y<b.y;
|
||||
else return a.x<b.x;
|
||||
}
|
||||
int cmp2(struct list a,struct list b)
|
||||
{
|
||||
if((a.x-point[0].x)*(b.y-point[0].y)==(b.x-point[0].x)*(a.y-point[0].y))
|
||||
return ((a.x-point[0].x)*(a.x-point[0].x)+(a.y-point[0].y)*(a.y-point[0].y))<((point[0].x-b.x)*(point[0].x-b.x)+(point[0].y-b.y)*(point[0].y-b.y));
|
||||
return (a.x-point[0].x)*(b.y-point[0].y)>(b.x-point[0].x)*(a.y-point[0].y);
|
||||
}
|
||||
int ts;
|
||||
void yuan(int x,int y,int r)
|
||||
{
|
||||
pp.r=r;
|
||||
for(int i=0;i<500;i++)
|
||||
{
|
||||
double du;
|
||||
du=(double)2.0*PI*i/500.0;
|
||||
pp.x=1.0*x+1.0*r*cos(du);
|
||||
pp.y=1.0*y+1.0*r*sin(du);
|
||||
pp.pos=ts;
|
||||
point[tops++]=pp;
|
||||
}
|
||||
}
|
||||
int pan(int z,int b,int a)
|
||||
{
|
||||
double x1,y1,x2,y2;
|
||||
if(a<0)return 1;
|
||||
x1=tu[b].x-tu[a].x;
|
||||
y1=tu[b].y-tu[a].y;
|
||||
x2=point[z].x-tu[b].x;
|
||||
y2=point[z].y-tu[b].y;
|
||||
if(x1*y2>x2*y1)return 1;
|
||||
return 0;
|
||||
}
|
||||
double len(struct list p1,struct list p2)
|
||||
{
|
||||
return (double)sqrt(1.0*((p1.x-p2.x)*(p1.x-p2.x)+1.0*(p1.y-p2.y)*(p1.y-p2.y)));
|
||||
}
|
||||
void init(int n,int m)
|
||||
{
|
||||
int i,j;
|
||||
tops=0;
|
||||
int a,b,c;
|
||||
ts=0;
|
||||
for(i=0;i<n;i++)
|
||||
{
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
ts++;
|
||||
yuan(a,b,c);
|
||||
}
|
||||
for(i=0;i<m;i++)
|
||||
for(j=0;j<3;j++)
|
||||
{
|
||||
scanf("%lf%lf",&point[tops].x,&point[tops].y);
|
||||
point[tops].pos=0;
|
||||
tops++;
|
||||
}
|
||||
}
|
||||
void jiantu()
|
||||
{
|
||||
int i;
|
||||
sort(point,point+tops,cmp1);
|
||||
sort(point+1,point+tops,cmp2);
|
||||
tu[0]=point[0];
|
||||
tu[1]=point[1];
|
||||
tu[2]=point[2];
|
||||
num=3;
|
||||
for(i=3;i<tops;i++)
|
||||
{
|
||||
while(!pan(i,num-1,num-2))num--;
|
||||
tu[num++]=point[i];
|
||||
}
|
||||
}
|
||||
void print()
|
||||
{
|
||||
double lens;
|
||||
int i;
|
||||
lens=0.0;
|
||||
for(i=0;i<num;i++)
|
||||
{
|
||||
if(tu[i].pos>0&&(tu[i].pos==tu[(i+1)%num].pos))
|
||||
{
|
||||
lens+=1.0*tu[i].r*2*PI/500.0;
|
||||
}
|
||||
else
|
||||
lens+=len(tu[i],tu[(i+1)%num]);
|
||||
}
|
||||
printf("%.5lf\n",lens);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n,m;
|
||||
while(~scanf("%d%d",&n,&m))
|
||||
{
|
||||
init(n,m);
|
||||
jiantu();
|
||||
print();
|
||||
}
|
||||
return 0;
|
||||
}
|
147
HDOJ/4668_autoAC.cpp
Normal file
147
HDOJ/4668_autoAC.cpp
Normal file
|
@ -0,0 +1,147 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <queue>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#define lson step << 1
|
||||
#define rson step << 1 | 1
|
||||
#pragma comment(linker,"/STACK:102400000,102400000")
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const int N = 5005;
|
||||
struct Node {
|
||||
string s;
|
||||
int cnt;
|
||||
Node () {}
|
||||
Node (string _s , int c) :s(_s) , cnt(c) {}
|
||||
string cat () {
|
||||
string t = s;
|
||||
for (int i = 1 ; i < cnt ; i ++)
|
||||
s = s + t;
|
||||
cnt = 1;
|
||||
return s;
|
||||
}
|
||||
LL len () {
|
||||
return (LL)s.size() * cnt;
|
||||
}
|
||||
string prefix (int l) {
|
||||
string str = s;
|
||||
for (int i = 1 ; i < cnt && str.size() < l ; i ++) {
|
||||
str += s;
|
||||
}
|
||||
return str.substr (0 , l);
|
||||
}
|
||||
string suffix (int l) {
|
||||
string str = s;
|
||||
for (int i = 1 ; i < cnt && str.size() < l ; i ++) {
|
||||
str += s;
|
||||
}
|
||||
return str.substr (str.size() - l , l);
|
||||
}
|
||||
}a[N];
|
||||
char str[N] , pat[N];
|
||||
int ne[N] , idx , l , p;
|
||||
void get_next (char *s , int l) {
|
||||
ne[0] = -1;
|
||||
int i = 0 , j = -1;
|
||||
while (i < l) {
|
||||
if (j == -1 || s[i] == s[j]) {
|
||||
i ++; j ++;
|
||||
ne[i] = j;
|
||||
}
|
||||
else j = ne[j];
|
||||
}
|
||||
}
|
||||
void gao (string s , int tot) {
|
||||
if (s == "") return ;
|
||||
if (idx == 0 || s.size() * tot >= p || a[idx - 1].len() >= p) {
|
||||
a[idx ++] = Node (s , tot);
|
||||
}
|
||||
else {
|
||||
a[idx - 1].cat ();
|
||||
a[idx - 1].s += Node (s , tot).cat();
|
||||
}
|
||||
}
|
||||
int match (string s , char *t , int p) {
|
||||
int l = s.size() ;
|
||||
int i = 0 , j = 0 , ans = 0;
|
||||
while (i < s.size()) {
|
||||
if (j == - 1 || s[i] == t[j]) {
|
||||
i ++; j ++;
|
||||
if (j == p) {
|
||||
ans ++;
|
||||
j = ne[j];
|
||||
}
|
||||
}
|
||||
else j = ne[j];
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
int main () {
|
||||
while (scanf ("%s %s" , str , pat) != EOF) {
|
||||
idx = 0;
|
||||
l = strlen (str);p = strlen (pat);
|
||||
get_next (pat , p);
|
||||
string s = "";
|
||||
int tot = 1;
|
||||
for (int i = 0 ; i < l ; i ++) {
|
||||
if (str[i] == '[') {
|
||||
if (s == "") continue;
|
||||
gao (s , tot);
|
||||
s = ""; tot = 1;
|
||||
}
|
||||
else if (str[i] == ']') {
|
||||
tot = 0;
|
||||
i ++;
|
||||
while (isdigit(str[i]))
|
||||
tot = tot * 10 + str[i ++] - '0';
|
||||
i --;
|
||||
gao (s , tot);
|
||||
s = ""; tot = 1;
|
||||
}
|
||||
else s += str[i];
|
||||
}
|
||||
gao (s , tot);
|
||||
s = ""; tot = 1;
|
||||
LL ans = 0;
|
||||
for (int i = 0 ; i < idx ; i ++) {
|
||||
if (a[i].len() < p) continue;
|
||||
if (a[i].cnt == 1) ans += match (a[i].s , pat , p);
|
||||
else {
|
||||
int use = min(a[i].cnt , 1 + (p - 1 + (int)a[i].s.size() - 1) / (int)a[i].s.size());
|
||||
string s = "";
|
||||
for (int j = 1 ; j < use ; j ++) {
|
||||
s += a[i].s;
|
||||
}
|
||||
s = a[i].s + s.substr (0 , min ((int)s.size() , p - 1));
|
||||
int tmp = match (s , pat , p);
|
||||
ans += (LL)tmp * (a[i].cnt - use + 1);
|
||||
if (p) {
|
||||
s = "";
|
||||
for (int j = 1 ; j < use ; j ++)
|
||||
s += a[i].s;
|
||||
ans += match (s , pat , p);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0 ; i < idx - 1 ; i ++) {
|
||||
s = a[i].suffix (min (a[i].len () , p - 1LL));
|
||||
if (a[i + 1].len () < p - 1) {
|
||||
s += a[i + 1].cat ();
|
||||
if (i + 2 < idx) {
|
||||
s += a[i + 2].prefix (min (a[i + 2].len () , p - 1 - a[i + 2].len ()));
|
||||
}
|
||||
}
|
||||
else {
|
||||
s += a[i + 1].prefix (min (a[i + 1].len () , p - 1LL));
|
||||
}
|
||||
ans += match (s , pat , p);
|
||||
}
|
||||
printf ("%I64d\n" , ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
73
HDOJ/4669_autoAC.cpp
Normal file
73
HDOJ/4669_autoAC.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <queue>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#define lson step << 1
|
||||
#define rson step << 1 | 1
|
||||
#pragma comment(linker,"/STACK:102400000,102400000")
|
||||
using namespace std;
|
||||
typedef long long LL;
|
||||
const int N = 50005;
|
||||
const int M = 205;
|
||||
int n , k , a[N] ,l[N];
|
||||
int dp[2][M] , prefix[N] , fac[N << 2] , suffix[N];
|
||||
int cnt[M];
|
||||
int cal (int x) {
|
||||
int cnt = 0;
|
||||
while (x) x /= 10 , cnt ++;
|
||||
return cnt;
|
||||
}
|
||||
int main () {
|
||||
while (scanf ("%d %d" , &n , &k) != EOF) {
|
||||
fac[0] = 1;
|
||||
for (int i = 1 ; i <= (n << 2) ; i ++)
|
||||
fac[i] = fac[i - 1] * 10 % k;
|
||||
for (int i = 1 ; i <= n ; i ++) {
|
||||
scanf ("%d" , &a[i]);
|
||||
l[i] = cal (a[i]);
|
||||
}
|
||||
for (int i = 0 ; i < 2 ; i ++) {
|
||||
for (int j = 0 ; j < k ; j ++)
|
||||
dp[i][j] = 0;
|
||||
}
|
||||
dp[1][a[1] % k] = 1;
|
||||
LL ans = dp[1][0];
|
||||
for (int i = 2 ; i <= n ; i ++) {
|
||||
for (int j = 0 ; j < k ; j ++)
|
||||
dp[i & 1][j] = 0;
|
||||
dp[i & 1][a[i] % k] ++;
|
||||
for (int j = 0 ; j < k ; j ++) {
|
||||
dp[i & 1][(j * fac[l[i]] + a[i]) %k] += dp[(i - 1) & 1][j];
|
||||
}
|
||||
ans += dp[i & 1][0];
|
||||
}
|
||||
prefix[0] = 0;suffix[n + 1] = 0;
|
||||
for (int i = 1 ; i <= n ; i ++) {
|
||||
prefix[i] = (prefix[i - 1] * fac[l[i]] + a[i]) % k;
|
||||
}
|
||||
int len = 0;
|
||||
for (int i = n ; i >= 1 ; i --) {
|
||||
suffix[i] = (a[i] * fac[len] + suffix[i + 1]) % k;
|
||||
len += l[i];
|
||||
}
|
||||
len = 0;
|
||||
for (int i = 0 ; i < k ; i ++)
|
||||
cnt[i] = 0;
|
||||
for (int i = 1 ; i <= n ; i ++) {
|
||||
cnt[suffix[i]] ++;
|
||||
len += l[i];
|
||||
int p = prefix[i];
|
||||
for (int j = 0 ; j < k ; j ++) {
|
||||
if ((j * fac[len] + p) % k) continue;
|
||||
ans += dp[n & 1][j] - cnt[j];
|
||||
}
|
||||
}
|
||||
printf ("%I64d\n" , ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
171
HDOJ/4670_autoAC.cpp
Normal file
171
HDOJ/4670_autoAC.cpp
Normal file
|
@ -0,0 +1,171 @@
|
|||
#pragma comment(linker,"/STACK:102400000,102400000")
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
#define rep(i,s,t) for(int i=s;i<t;i++)
|
||||
#define red(i,s,t) for(int i=s-1;i>=t;i--)
|
||||
#define ree(i,now) for(int i=head[now];i!=-1;i=edge[i].next)
|
||||
#define clr(a,v) memset(a,v,sizeof a)
|
||||
const int N=50005;
|
||||
const int K=33;
|
||||
struct Edge{
|
||||
int v,next;
|
||||
}edge[N*2];
|
||||
int head[N],e;
|
||||
int Num[N][K];
|
||||
int son[N],MaxSize;
|
||||
int root,all;
|
||||
int n,k,a[K],d[K],x,y,cnt;
|
||||
ll v[N],dis[N],three[K],mark[N];
|
||||
int Ans;
|
||||
bool vis[N];
|
||||
map<ll,int>mp,mpp;
|
||||
inline void Init(){
|
||||
three[0]=1;
|
||||
rep(i,1,K) three[i]=three[i-1]*3;
|
||||
}
|
||||
inline int getPos(ll v,int x){
|
||||
return v%three[x+1]/three[x];
|
||||
}
|
||||
inline ll get(ll val,int *x){
|
||||
ll ans=0;
|
||||
rep(i,0,k) ans+=((getPos(val,i)+x[i])%3)*three[i];
|
||||
return ans;
|
||||
}
|
||||
inline void getCh(ll b,int i){
|
||||
bool ok=1;
|
||||
mark[i]=0;
|
||||
if(b==0)return;
|
||||
rep(j,0,k){
|
||||
Num[i][j]=0;
|
||||
while(b>1 && b%a[j]==0){
|
||||
Num[i][j]++;
|
||||
b/=a[j];
|
||||
}
|
||||
Num[i][j]%=3;
|
||||
mark[i]+=three[j]*Num[i][j];
|
||||
if(Num[i][j]!=0) ok=0;
|
||||
}
|
||||
if(ok) Ans++;
|
||||
}
|
||||
inline void addEdge(int u,int v){
|
||||
edge[e].v=v;
|
||||
edge[e].next=head[u];
|
||||
head[u]=e++;
|
||||
}
|
||||
inline void In(){
|
||||
scanf("%d",&k);
|
||||
rep(i,0,k) scanf("%d",&a[i]);
|
||||
rep(i,1,n+1){
|
||||
scanf("%I64d",&v[i]);
|
||||
getCh(v[i],i);
|
||||
}
|
||||
clr(head,-1),e=0;
|
||||
rep(i,1,n){
|
||||
scanf("%d%d",&x,&y);
|
||||
addEdge(x,y);addEdge(y,x);
|
||||
}
|
||||
clr(vis,0);
|
||||
}
|
||||
inline void dfs_Size(int now,int pre){
|
||||
all++;
|
||||
ree(i,now){
|
||||
int nxt=edge[i].v;
|
||||
if(!vis[nxt] && nxt!=pre) dfs_Size(nxt,now);
|
||||
}
|
||||
}
|
||||
inline void dfs_Root(int now,int pre){
|
||||
int Max=0;
|
||||
son[now]=0;
|
||||
ree(i,now){
|
||||
int nxt=edge[i].v;
|
||||
if(!vis[nxt] && pre!=nxt){
|
||||
dfs_Root(nxt,now);
|
||||
son[now]+=son[nxt]+1;
|
||||
if(son[nxt]+1>Max) Max=son[nxt]+1;
|
||||
}
|
||||
}
|
||||
int res=all-son[now]-1;
|
||||
if(Max<res) Max=res;
|
||||
if(Max<MaxSize){
|
||||
MaxSize=Max;root=now;
|
||||
}
|
||||
}
|
||||
inline ll Val(int *c){
|
||||
ll ans=0;
|
||||
rep(j,0,k) ans+=c[j]*three[j];
|
||||
return ans;
|
||||
}
|
||||
inline ll Transform(ll a,ll b){
|
||||
ll ans=0;
|
||||
rep(j,0,k) ans+=(getPos(a,j)+getPos(b,j))%3*three[j];
|
||||
return ans;
|
||||
}
|
||||
inline void dfs_Dis(int now,int pre,ll val){
|
||||
dis[cnt++]=val;
|
||||
ree(i,now){
|
||||
int nxt=edge[i].v;
|
||||
if(!vis[nxt] && nxt!=pre){
|
||||
dfs_Dis(nxt,now,Transform(val,mark[nxt]));
|
||||
}
|
||||
}
|
||||
}
|
||||
inline ll Suit(ll v){
|
||||
ll ans=0;
|
||||
rep(i,0,k){
|
||||
int x=getPos(v,i);
|
||||
int y=(3-x)%3;
|
||||
ans+=three[i]*y;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
inline void Work(int now){
|
||||
all=0;
|
||||
dfs_Size(now,-1);
|
||||
MaxSize=n+10;
|
||||
dfs_Root(now,-1);
|
||||
vis[root]=1;
|
||||
mp.clear();
|
||||
ree(i,root){
|
||||
int nxt=edge[i].v;cnt=0;
|
||||
if(vis[nxt]) continue;
|
||||
dfs_Dis(nxt,root,mark[nxt]);
|
||||
rep(j,0,cnt){
|
||||
int vv=mp[Suit(dis[j])];
|
||||
if(vv) Ans+=vv;
|
||||
}
|
||||
rep(j,0,cnt){
|
||||
ll p=get(dis[j],Num[root]);
|
||||
if(p==0) Ans++;
|
||||
mp[p]++;
|
||||
}
|
||||
}
|
||||
ree(i,root){
|
||||
int nxt=edge[i].v;
|
||||
if(!vis[nxt]){
|
||||
Work(nxt);
|
||||
}
|
||||
}
|
||||
}
|
||||
inline void app(){
|
||||
int a[]={2,3,5,7,11,13,17,19,23,29};
|
||||
rep(j,0,10){
|
||||
printf("3000 10 2 3 5 7 11 13 17 19 23 29\n");
|
||||
rep(i,0,3000) printf("%d ",a[rand()%10]);
|
||||
rep(i,1,3000) printf("%d 1\n",i+1);
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
Init();
|
||||
while(~scanf("%d",&n)){
|
||||
Ans=0;
|
||||
In();
|
||||
Work(1);
|
||||
printf("%d\n",Ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
42
HDOJ/4671_autoAC.cpp
Normal file
42
HDOJ/4671_autoAC.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const int V = 105;
|
||||
int n, m, ans[V][V];
|
||||
bool vis[V][V];
|
||||
int main() {
|
||||
int i, j, k;
|
||||
while(~scanf("%d%d", &n, &m)) {
|
||||
memset(ans, 0, sizeof(ans));
|
||||
memset(vis, false, sizeof(vis));
|
||||
for(i = 0, j = 1; i < m; ++i) {
|
||||
ans[i][0] = j;
|
||||
vis[i][j] = true;
|
||||
j = j == n ? 1 : j + 1;
|
||||
}
|
||||
for(i = 0; i < m; ++i) {
|
||||
if(ans[i][1] != 0)
|
||||
continue;
|
||||
int now = m % n + 1;
|
||||
for(j = i; j < m; j += n) {
|
||||
if(now == ans[j][0])
|
||||
now = now == n ? 1 : now + 1;
|
||||
ans[j][1] = now;
|
||||
vis[j][now] = true;
|
||||
now = now == n ? 1 : now + 1;
|
||||
}
|
||||
}
|
||||
for(i = 0; i < m; ++i)
|
||||
for(j = 2, k = 1; j < n; ++j) {
|
||||
while(vis[i][k])
|
||||
k++;
|
||||
ans[i][j] = k++;
|
||||
}
|
||||
for(i = 0; i < m; ++i) {
|
||||
for(j = 0; j < n - 1; ++j)
|
||||
printf("%d ", ans[i][j]);
|
||||
printf("%d\n", ans[i][n - 1]);
|
||||
}
|
||||
}
|
||||
}
|
41
HDOJ/4672_autoAC.cpp
Normal file
41
HDOJ/4672_autoAC.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include<iostream>
|
||||
#include<stdio.h>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
#include<cstring>
|
||||
#define I(x) scanf("%d",&x)
|
||||
using namespace std;
|
||||
int sg[10001],a[100001];
|
||||
char x[20],y[20];
|
||||
int main(){
|
||||
int n,m,i,j,MIN,b,t,ans;
|
||||
while(scanf("%d%d%s%s",&n,&m,x,y)!=EOF){
|
||||
memset(sg,-1,sizeof(sg));
|
||||
sg[0]=0;MIN=1e9;
|
||||
bool flag=0;
|
||||
for(i=0;i<n;i++) I(a[i]);
|
||||
for(i=0;i<m;i++){
|
||||
I(b);
|
||||
MIN=min(MIN,b);
|
||||
for(j=0;j+b<=10000;j++)
|
||||
if(sg[j]>=0)
|
||||
sg[j+b]=max(sg[b+j],sg[j]+1);
|
||||
}
|
||||
ans=0;
|
||||
for(i=0;i<n;i++){
|
||||
t=a[i];
|
||||
if(t<=10000){
|
||||
if(sg[t]<0) flag=1;
|
||||
else ans^=sg[t];
|
||||
}
|
||||
else{
|
||||
t=(t-10000+MIN)%MIN+10000-MIN;
|
||||
if(sg[t]<0) flag=1;
|
||||
else ans^=sg[t]+(a[i]-t)/MIN;
|
||||
}
|
||||
}
|
||||
if(!flag&&ans) puts(x);
|
||||
else puts(y);
|
||||
}
|
||||
return 0;
|
||||
}
|
153
HDOJ/4674_autoAC.cpp
Normal file
153
HDOJ/4674_autoAC.cpp
Normal file
|
@ -0,0 +1,153 @@
|
|||
#pragma comment(linker, "/STACK:65536000")
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <math.h>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#include <algorithm>
|
||||
#define clr(a,b) memset(a,b,sizeof(a))
|
||||
#define mpr(a,b) make_pair(a,b)
|
||||
#define ll long long
|
||||
#define eps 1e-6
|
||||
using namespace std;
|
||||
const int N=100005,M=300005;
|
||||
int n,m,q,eid,id,now,top;
|
||||
int head[N],ed[M],nxt[M];
|
||||
int dfn[N],low[N],gid[N];
|
||||
int sta[N],block[N];
|
||||
vector<pair<int,int> >gra[N],qu[N];
|
||||
int f[N],vis[N],come[N],out[N],fa[N];
|
||||
int tlca[3*N],pt[3*N][2];
|
||||
int aa[N],bb[N],cc[N];
|
||||
int findfa(int s){return s==fa[s]?s:fa[s]=findfa(fa[s]);}
|
||||
void addedge(int s,int e){
|
||||
ed[eid]=e;nxt[eid]=head[s];head[s]=eid++;
|
||||
}
|
||||
void tarjan(int s,int f,int b){
|
||||
dfn[s]=low[s]=++now;
|
||||
sta[top++]=s;block[s]=b;
|
||||
for(int i=head[s];~i;i=nxt[i]){
|
||||
int e=ed[i];
|
||||
if(i==f||i==(f^1))continue;
|
||||
if(!dfn[e]){
|
||||
tarjan(e,i,b);
|
||||
low[s]=min(low[s],low[e]);
|
||||
}else
|
||||
low[s]=min(low[s],dfn[e]);
|
||||
}
|
||||
if(low[s]==dfn[s]){
|
||||
id++;
|
||||
while(top){
|
||||
int k=sta[--top];
|
||||
gid[k]=id;
|
||||
if(k==s)return ;
|
||||
}
|
||||
}
|
||||
}
|
||||
void lca(int s,int f){
|
||||
fa[s]=s;
|
||||
for(int i=0;i<(int)gra[s].size();i++){
|
||||
int e=gra[s][i].first;
|
||||
if(e==f)continue;
|
||||
lca(e,s);
|
||||
fa[findfa(e)]=s;
|
||||
}
|
||||
vis[s]=1;
|
||||
for(int i=0;i<(int)qu[s].size();i++){
|
||||
int e=qu[s][i].first,d=qu[s][i].second;
|
||||
if(vis[e])tlca[d]=findfa(e);
|
||||
}
|
||||
}
|
||||
void dfs(int s,int f){
|
||||
for(int i=0;i<(int)qu[s].size();i++){
|
||||
int d=qu[s][i].second;
|
||||
int k=(tlca[d]==s)?-1:out[tlca[d]];
|
||||
if(~pt[d][0])pt[d][1]=k;
|
||||
else pt[d][0]=k;
|
||||
}
|
||||
for(int i=0;i<(int)gra[s].size();i++){
|
||||
int e=gra[s][i].first,g=gra[s][i].second;
|
||||
if(e==f){
|
||||
come[s]=g;continue;
|
||||
}
|
||||
out[s]=g;
|
||||
dfs(e,s);
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
while(~scanf("%d%d",&n,&m)){
|
||||
eid=0;clr(head,-1);
|
||||
for(int i=0;i<m;i++){
|
||||
int a,b;scanf("%d%d",&a,&b);
|
||||
addedge(a,b);addedge(b,a);
|
||||
}
|
||||
id=now=top=0;
|
||||
for(int i=1;i<=n;i++)dfn[i]=0;
|
||||
int cnt=0;
|
||||
for(int i=1;i<=n;i++)
|
||||
if(!dfn[i])tarjan(i,-1,++cnt);
|
||||
for(int i=1;i<=id;i++){
|
||||
gra[i].clear();qu[i].clear();
|
||||
}
|
||||
for(int i=1;i<=n;i++)
|
||||
for(int j=head[i];~j;j=nxt[j]){
|
||||
int s=gid[i],e=gid[ed[j]];
|
||||
if(s!=e)gra[s].push_back(mpr(e,i));
|
||||
}
|
||||
clr(f,0);
|
||||
scanf("%d",&q);
|
||||
for(int i=0;i<q;i++){
|
||||
int a,b,c;scanf("%d%d%d",&a,&b,&c);
|
||||
if(block[a]!=block[b]){f[i]=1;continue;}
|
||||
if(block[b]!=block[c]){f[i]=1;continue;}
|
||||
if(block[a]!=block[c]){f[i]=1;continue;}
|
||||
if(a==b&&a!=c){f[i]=1;continue;}
|
||||
int s=gid[a],e=gid[b],k=gid[c];
|
||||
qu[s].push_back(mpr(e,i*3));
|
||||
qu[e].push_back(mpr(s,i*3));
|
||||
qu[s].push_back(mpr(k,i*3+1));
|
||||
qu[k].push_back(mpr(s,i*3+1));
|
||||
qu[e].push_back(mpr(k,i*3+2));
|
||||
qu[k].push_back(mpr(e,i*3+2));
|
||||
aa[i]=a;bb[i]=b;cc[i]=c;
|
||||
}
|
||||
for(int i=1;i<=id;i++)vis[i]=0;
|
||||
for(int i=0;i<q*3;i++)
|
||||
pt[i][0]=pt[i][1]=-1;
|
||||
for(int i=1;i<=id;i++)
|
||||
if(!vis[i]){
|
||||
lca(i,-1);
|
||||
dfs(i,-1);
|
||||
}
|
||||
for(int i=0;i<q;i++){
|
||||
if(f[i]){
|
||||
puts("No");continue;
|
||||
}
|
||||
if(gid[aa[i]]==gid[bb[i]]){
|
||||
if(gid[cc[i]]==gid[aa[i]])puts("Yes");
|
||||
else puts("No");
|
||||
}
|
||||
else if(gid[cc[i]]==tlca[i*3]){
|
||||
if(pt[i*3][1]==-1){
|
||||
int k=(gid[aa[i]]==gid[cc[i]])?aa[i]:bb[i];
|
||||
if(k==pt[i*3][0]&&cc[i]!=k) puts("No");
|
||||
else puts("Yes");
|
||||
}else{
|
||||
if(pt[i*3][0]==pt[i*3][1]&&cc[i]!=pt[i*3][0]) puts("No");
|
||||
else puts("Yes");
|
||||
}
|
||||
}else if(tlca[i*3+1]==gid[cc[i]]&&tlca[i*3+2]==tlca[i*3]){
|
||||
int k=(pt[i*3+1][0]==-1)?aa[i]:pt[i*3+1][0];
|
||||
if(come[gid[cc[i]]]==k&&k!=cc[i])puts("No");
|
||||
else puts("Yes");
|
||||
}else if(tlca[i*3+2]==gid[cc[i]]&&tlca[i*3+1]==tlca[i*3]){
|
||||
int k=(pt[i*3+2][0]==-1)?bb[i]:pt[i*3+2][0];
|
||||
if(come[gid[cc[i]]]==k&&k!=cc[i])puts("No");
|
||||
else puts("Yes");
|
||||
}else puts("No");
|
||||
}
|
||||
}
|
||||
}
|
92
HDOJ/4675_autoAC.cpp
Normal file
92
HDOJ/4675_autoAC.cpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#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>
|
||||
using namespace std;
|
||||
const int MOD = 1e9+7;
|
||||
long long pow_m(long long a,long long n)
|
||||
{
|
||||
long long ret = 1;
|
||||
long long tmp = a%MOD;
|
||||
while(n)
|
||||
{
|
||||
if(n&1)
|
||||
{
|
||||
ret *= tmp;
|
||||
ret %= MOD;
|
||||
}
|
||||
tmp *= tmp;
|
||||
tmp %= MOD;
|
||||
n >>= 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
long long C[300010];
|
||||
long long inv(long long a,long long m)
|
||||
{
|
||||
if(a == 1)return 1;
|
||||
return inv(m%a,m)*(m-m/a)%m;
|
||||
}
|
||||
long long ans[300010];
|
||||
int a[300010];
|
||||
int num[300010];
|
||||
int b[300010];
|
||||
int main()
|
||||
{
|
||||
int N,M,K;
|
||||
while(scanf("%d%d%d",&N,&M,&K) == 3)
|
||||
{
|
||||
memset(num,0,sizeof(num));
|
||||
for(int i = 1;i <= N;i++)
|
||||
{
|
||||
scanf("%d",&a[i]);
|
||||
num[a[i]]++;
|
||||
}
|
||||
C[N-K] = 1;
|
||||
for(int i = N-K+1;i <= N;i++)
|
||||
{
|
||||
C[i] = C[i-1]*i%MOD*inv(i-(N-K),MOD)%MOD;
|
||||
}
|
||||
for(int i = M;i>= 1;i--)
|
||||
{
|
||||
int cnt = 0;
|
||||
long long ss = 0;
|
||||
for(int j = 1; j*i <= M;j++)
|
||||
{
|
||||
cnt += num[i*j];
|
||||
if(j > 1)ss = (ss + ans[i*j])%MOD;
|
||||
}
|
||||
int t = M/i;
|
||||
if(t == 1)
|
||||
{
|
||||
if(cnt == N-K)ans[i] = 1;
|
||||
else ans[i] = 0;
|
||||
continue;
|
||||
}
|
||||
if(cnt < N-K)
|
||||
{
|
||||
ans[i] = 0;
|
||||
continue;
|
||||
}
|
||||
long long tmp = 1;
|
||||
tmp =(tmp*C[cnt])%MOD;
|
||||
tmp = ( tmp * pow_m(t-1,cnt-(N-K)) )%MOD;
|
||||
tmp = (tmp * pow_m(t,N-cnt));
|
||||
ans[i] = (tmp - ss + MOD)%MOD;
|
||||
}
|
||||
for(int i = 1;i <= M;i++)
|
||||
{
|
||||
printf("%I64d",ans[i]);
|
||||
if(i < M)printf(" ");
|
||||
else printf("\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
102
HDOJ/4676_autoAC.cpp
Normal file
102
HDOJ/4676_autoAC.cpp
Normal file
|
@ -0,0 +1,102 @@
|
|||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<climits>
|
||||
#include<string>
|
||||
#include<algorithm>
|
||||
#include<cmath>
|
||||
#include<iostream>
|
||||
#include<queue>
|
||||
#include<vector>
|
||||
#include<stack>
|
||||
#include<map>
|
||||
#include<set>
|
||||
#include<stdlib.h>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
const int MAXN = 20007;
|
||||
vector<int> divisor[MAXN];
|
||||
int f[MAXN], a[MAXN], L[MAXN], R[MAXN], cnt[MAXN], qid[MAXN], M;
|
||||
ll ans[MAXN];
|
||||
void getdivisor() {
|
||||
int i, j;
|
||||
for(i = 1; i < MAXN; i++) for(j = i; j < MAXN; j += i) divisor[j].push_back(i);
|
||||
}
|
||||
void getf() {
|
||||
for(int i = 1; i < MAXN; i++) {
|
||||
int t = i;
|
||||
int j, sz = divisor[i].size();
|
||||
for(j = 0; j < sz; j++) t -= f[divisor[i][j]];
|
||||
f[i] = t;
|
||||
}
|
||||
}
|
||||
int qcmp(int x, int y) {
|
||||
int px = L[x] / M;
|
||||
int py = L[y] / M;
|
||||
if(px != py) return px < py;
|
||||
return R[x] < R[y];
|
||||
}
|
||||
ll erase(int x) {
|
||||
int i, y, sz = divisor[x].size();
|
||||
ll ret = 0;
|
||||
for(i = 0; i < sz; i++) {
|
||||
y = divisor[x][i];
|
||||
ret += 1LL*f[y]*(--cnt[y]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
ll insert(int x) {
|
||||
int i, y, sz = divisor[x].size();
|
||||
ll ret = 0;
|
||||
for(i = 0; i < sz; i++) {
|
||||
y = divisor[x][i];
|
||||
ret += 1LL*f[y]*(cnt[y]++);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
void solve(int n, int q) {
|
||||
int i;
|
||||
for(i = 1; i <= q; i++) qid[i] = i;
|
||||
M = (int)sqrt(n*1.0);
|
||||
sort(qid+1, qid+1+q, qcmp);
|
||||
memset(cnt, 0, sizeof(cnt));
|
||||
int l = 0, r = 0;
|
||||
ll now = 0;
|
||||
for(i = 1; i <= q; i++) {
|
||||
int id = qid[i];
|
||||
int nl = L[id], nr = R[id];
|
||||
while(l < nl) {
|
||||
now -= erase(a[l]);
|
||||
l++;
|
||||
}
|
||||
while(l > nl) {
|
||||
l--;
|
||||
now += insert(a[l]);
|
||||
}
|
||||
while(r < nr) {
|
||||
r++;
|
||||
now += insert(a[r]);
|
||||
}
|
||||
while(r > nr) {
|
||||
now -= erase(a[r]);
|
||||
r--;
|
||||
}
|
||||
ans[id] = now;
|
||||
}
|
||||
}
|
||||
int main() {
|
||||
getdivisor();
|
||||
getf();
|
||||
int T, id = 0;
|
||||
scanf("%d", &T);
|
||||
while(T--) {
|
||||
int i, n, q;
|
||||
scanf("%d", &n);
|
||||
for(i = 1; i <= n; i++) scanf("%d", a+i);
|
||||
scanf("%d", &q);
|
||||
for(i = 1; i <= q; i++) scanf("%d%d", L+i, R+i);
|
||||
solve(n, q);
|
||||
printf("Case #%d:\n", ++id);
|
||||
for(i = 1; i <= q; i++) printf("%I64d\n", ans[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
122
HDOJ/4677_autoAC.cpp
Normal file
122
HDOJ/4677_autoAC.cpp
Normal file
|
@ -0,0 +1,122 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
using namespace std;
|
||||
#define N 30050
|
||||
struct Q
|
||||
{
|
||||
int r,idx;
|
||||
Q(int _r=0,int _idx=0):r(_r),idx(_idx){}
|
||||
};
|
||||
vector<Q>que[N];
|
||||
vector<int>edge[N];
|
||||
int fa[N][200],scc[200],rr[200];
|
||||
int ta[N],first[N],ans[N];
|
||||
int n,m,tot,every;
|
||||
int find(int i,int pos)
|
||||
{
|
||||
return fa[i][pos]==i?i:fa[i][pos]=find(fa[i][pos],pos);
|
||||
}
|
||||
void init()
|
||||
{
|
||||
for(int i=0;i<=n;++i)
|
||||
edge[i].clear(),que[i].clear();
|
||||
memset(scc,0,sizeof(scc));
|
||||
every=tot=sqrt(n*1.0);
|
||||
if(n*n!=tot) tot++;
|
||||
for(int i=0;;++i)
|
||||
{
|
||||
rr[i]=i*every;
|
||||
if(i*every>=n) break;
|
||||
}
|
||||
for(int i=0;i<=tot;++i)
|
||||
for(int j=0;j<=n;++j)
|
||||
fa[j][i]=j;
|
||||
memset(first,-1,sizeof(first));
|
||||
}
|
||||
int main ()
|
||||
{
|
||||
int T;scanf("%d",&T);
|
||||
for(int kk=1;kk<=T;++kk)
|
||||
{
|
||||
scanf("%d%d",&n,&m);
|
||||
init();
|
||||
for(int i=1,u,v;i<=m;++i)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
if(u==v) continue;
|
||||
edge[u].push_back(v);
|
||||
edge[v].push_back(u);
|
||||
}
|
||||
int q;scanf("%d",&q);
|
||||
for(int i=1,u,v;i<=q;++i)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
que[u].push_back(Q(v,i));
|
||||
}
|
||||
int run_clock=0;
|
||||
for(int u=n;u>=1;--u)
|
||||
{
|
||||
for(int j=1;j<=tot;++j)
|
||||
{
|
||||
if(u>rr[j]) continue;
|
||||
scc[j]++;
|
||||
int inc=0;
|
||||
for(int i=0;i<edge[u].size();++i)
|
||||
{
|
||||
int v=edge[u][i];
|
||||
if(u<v&&v<=rr[j])
|
||||
{
|
||||
int u1=find(u,j);
|
||||
int v1=find(v,j);
|
||||
if(u1!=v1)
|
||||
{
|
||||
inc++;
|
||||
fa[v1][j]=u1;
|
||||
}
|
||||
}
|
||||
}
|
||||
scc[j]-=inc;
|
||||
}
|
||||
for(int z=0;z<que[u].size();++z)
|
||||
{
|
||||
run_clock++;
|
||||
int right=que[u][z].r;
|
||||
int pos;int inc=0;
|
||||
for(pos=0;pos<tot;++pos)
|
||||
if(rr[pos]<right&&right<=rr[pos+1]) break;
|
||||
for(int i=max(u+1,rr[pos]+1);i<=right;++i)
|
||||
{
|
||||
if(first[i]!=run_clock)
|
||||
{
|
||||
first[i]=run_clock;
|
||||
fa[i][tot+1]=i;
|
||||
}
|
||||
for(int j=0;j<edge[i].size();++j)
|
||||
if(u<=edge[i][j]&&edge[i][j]<i)
|
||||
{
|
||||
int v1=find(edge[i][j],pos);
|
||||
if(first[v1]!=run_clock)
|
||||
{
|
||||
first[v1]=run_clock;
|
||||
fa[v1][tot+1]=v1;
|
||||
}
|
||||
if(find(i,tot+1)!=find(v1,tot+1))
|
||||
{
|
||||
fa[find(v1,tot+1)][tot+1]=find(i,tot+1);
|
||||
inc++;
|
||||
}
|
||||
}
|
||||
}
|
||||
ans[que[u][z].idx]=scc[pos]+right-max(rr[pos],u-1)-inc;
|
||||
}
|
||||
}
|
||||
printf("Case #%d:\n",kk);
|
||||
for(int i=1;i<=q;++i)
|
||||
printf("%d\n",ans[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
109
HDOJ/4678_autoAC.cpp
Normal file
109
HDOJ/4678_autoAC.cpp
Normal file
|
@ -0,0 +1,109 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include <stdlib.h>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <queue>
|
||||
#include <stack>
|
||||
#define loop(s,i,n) for(i = s;i < n;i++)
|
||||
#define cl(a,b) memset(a,b,sizeof(a))
|
||||
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||
using namespace std;
|
||||
int map[1005][1005];
|
||||
int vis[1005][1005];
|
||||
int n,m,k;
|
||||
int num,odd,uod;
|
||||
int to[8][2] = {{0,1},{0,-1},{1,0},{1,-1},{1,1},{-1,-1},{-1,0,},{-1,1}};
|
||||
int judge(int a,int b)
|
||||
{
|
||||
if(a >= 0 && a < n && b>= 0 &&b < m)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
void paint(int x,int y)
|
||||
{
|
||||
int i,j;
|
||||
for(i = 0;i < 8;i++)
|
||||
{
|
||||
int a,b;
|
||||
a = x+to[i][0];
|
||||
b = y+to[i][1];
|
||||
if(judge(a,b) && !vis[a][b])
|
||||
map[a][b]++;
|
||||
}
|
||||
}
|
||||
void dfs(int x,int y)
|
||||
{
|
||||
if(map[x][y] == -1 || vis[x][y])
|
||||
return;
|
||||
vis[x][y] = 1;
|
||||
int i;
|
||||
for(i = 0;i < 8;i++)
|
||||
{
|
||||
int a,b;
|
||||
a = x+to[i][0];
|
||||
b = y+to[i][1];
|
||||
if(judge(a,b)&&vis[a][b] == 0)
|
||||
{
|
||||
if(map[a][b] > 0)
|
||||
num++,vis[a][b] = 1;
|
||||
else if(map[a][b] == 0)
|
||||
dfs(a,b);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,i,j,x,y;
|
||||
scanf("%d",&t);
|
||||
int icase = 0;
|
||||
while(t--)
|
||||
{
|
||||
scanf("%d %d %d",&n,&m,&k);
|
||||
loop(0,i,n)
|
||||
{
|
||||
loop(0,j,m)
|
||||
map[i][j] = vis[i][j] = 0;
|
||||
}
|
||||
while(k--)
|
||||
{
|
||||
scanf("%d %d",&x,&y);
|
||||
map[x][y] = -1;
|
||||
vis[x][y] = 1;
|
||||
paint(x,y);
|
||||
}
|
||||
odd = uod = 0;
|
||||
loop(0,i,n)
|
||||
{
|
||||
loop(0,j,m)
|
||||
{
|
||||
num = 0;
|
||||
if(map[i][j] == 0 && !vis[i][j])
|
||||
{
|
||||
dfs(i,j);
|
||||
if(num%2)
|
||||
odd++;
|
||||
else
|
||||
uod++;
|
||||
}
|
||||
}
|
||||
}
|
||||
loop(0,i,n)
|
||||
{
|
||||
loop(0,j,m)
|
||||
{
|
||||
if(!vis[i][j] && map[i][j] > 0)
|
||||
uod++;
|
||||
}
|
||||
}
|
||||
printf("Case #%d: ",++icase);
|
||||
if(uod%2 || odd%2)
|
||||
puts("Xiemao");
|
||||
else
|
||||
puts("Fanglaoshi");
|
||||
}
|
||||
return 0;
|
||||
}
|
177
HDOJ/4679_autoAC.cpp
Normal file
177
HDOJ/4679_autoAC.cpp
Normal file
|
@ -0,0 +1,177 @@
|
|||
#include<stdio.h>
|
||||
#include<iostream>
|
||||
#include<string.h>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
#define maxn 100011
|
||||
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||
#define INF 99999999
|
||||
struct list
|
||||
{
|
||||
int u,v,w,number;
|
||||
int next;
|
||||
} node[maxn*4];
|
||||
struct list2
|
||||
{
|
||||
int point;
|
||||
int len;
|
||||
}no[4][maxn],pp;
|
||||
int head[maxn*10];
|
||||
int low[maxn*2];
|
||||
int f[maxn];
|
||||
int ipf[maxn][2];
|
||||
int ips[maxn][2];
|
||||
int h[maxn];
|
||||
int tops,maxx,ipos,n;
|
||||
void add(int u,int v,int w,int number)
|
||||
{
|
||||
node[tops].u=u;
|
||||
node[tops].v=v;
|
||||
node[tops].w=w;
|
||||
node[tops].number=number;
|
||||
node[tops].next=head[u];
|
||||
head[u]=tops++;
|
||||
}
|
||||
void init()
|
||||
{
|
||||
memset(head,-1,sizeof(head));
|
||||
memset(f,0,sizeof(f));
|
||||
memset(h,0,sizeof(h));
|
||||
memset(ipf,0,sizeof(ipf));
|
||||
memset(low,0,sizeof(low));
|
||||
memset(ips,0,sizeof(ips));
|
||||
tops=0;
|
||||
maxx=INF;
|
||||
ipos=maxn+10;
|
||||
scanf("%d",&n);
|
||||
for(int i=0;i<=n;i++)
|
||||
{
|
||||
no[1][i].len=no[2][i].len=no[3][i].len=0;
|
||||
no[1][i].point=no[2][i].point=no[3][i].point=0;
|
||||
}
|
||||
int a,b,c;
|
||||
for(int i=1; i<n; i++)
|
||||
{
|
||||
scanf("%d%d%d",&a,&b,&c);
|
||||
add(a,b,c,i);
|
||||
add(b,a,c,i);
|
||||
}
|
||||
}
|
||||
int dfs(int x,int pre)
|
||||
{
|
||||
int ts,tt;
|
||||
ts=0;
|
||||
f[x]=0;
|
||||
for(int i=head[x]; i!=-1; i=node[i].next)
|
||||
{
|
||||
int y=node[i].v;
|
||||
if(y==pre)continue;
|
||||
tt=dfs(y,x)+1;
|
||||
ts=max(tt,ts);
|
||||
if(f[y]>=ipf[x][0])
|
||||
{
|
||||
ipf[x][1]=ipf[x][0];
|
||||
ipf[x][0]=f[y];
|
||||
ips[x][1]=ips[x][0]=y;
|
||||
}
|
||||
else if(f[y]>=ipf[x][1])
|
||||
{
|
||||
ipf[x][1]=f[y];
|
||||
}
|
||||
f[x]=max(f[x],f[y]);
|
||||
pp.point=y;
|
||||
pp.len=tt;
|
||||
for(int j=1; j<=3; j++)
|
||||
if(no[j][x].len<=tt)
|
||||
{
|
||||
for(int k=3; k>=j+1; k--)
|
||||
{
|
||||
no[k][x]=no[k-1][x];
|
||||
}
|
||||
no[j][x]=pp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
int ds=no[1][x].len+no[2][x].len;
|
||||
f[x]=max(f[x],ds);
|
||||
return ts;
|
||||
}
|
||||
int chu(int pre,int x,int y)
|
||||
{
|
||||
int s1,s2,s3,s4;
|
||||
int leap=0;
|
||||
s1=s2=s3=s4=0;
|
||||
if(ips[x][0]!=y)s1=ipf[x][0];
|
||||
else s1=ipf[x][1];
|
||||
if(no[1][x].point!=y)s2=no[1][x].len,leap++;
|
||||
if(no[2][x].point!=y)s2+=no[2][x].len,leap++;
|
||||
if(no[3][x].point!=y&&leap==1)s2+=no[3][x].len,leap++;
|
||||
s3=h[x];
|
||||
if(no[1][pre].point!=x)s4=no[1][pre].len;
|
||||
else s4=no[2][pre].len;
|
||||
s4=max(s4,low[pre]);
|
||||
if(no[1][x].point!=y)s4+=no[1][x].len;
|
||||
else s4+=no[2][x].len;
|
||||
if(pre!=0)s4++;
|
||||
return max(max(s1,s2),max(s3,s4));
|
||||
}
|
||||
void spfa(int x,int pre)
|
||||
{
|
||||
int visit[maxn];
|
||||
memset(visit,0,sizeof(visit));
|
||||
queue<int>q;
|
||||
queue<int>qp;
|
||||
q.push(x);
|
||||
qp.push(pre);
|
||||
visit[x]=1;
|
||||
while(!q.empty())
|
||||
{
|
||||
x=q.front();
|
||||
q.pop();
|
||||
pre=qp.front();
|
||||
qp.pop();
|
||||
for(int i=head[x]; i!=-1; i=node[i].next)
|
||||
{
|
||||
int y=node[i].v;
|
||||
if(y==pre)continue;
|
||||
h[y]=chu(pre,x,y);
|
||||
int ss=max(h[y],f[y])*node[i].w;
|
||||
if(ss<maxx)
|
||||
{
|
||||
maxx=ss;
|
||||
ipos=node[i].number;
|
||||
}
|
||||
else if(ss==maxx)ipos=min(ipos,node[i].number);
|
||||
q.push(y);
|
||||
qp.push(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
void panlow(int x,int pre)
|
||||
{
|
||||
for(int i=head[x]; i!=-1; i=node[i].next)
|
||||
{
|
||||
int y=node[i].v;
|
||||
if(y==pre)continue;
|
||||
if(y!=no[1][x].point)
|
||||
{
|
||||
low[y]=max(no[1][x].len+1,low[x]+1);
|
||||
}
|
||||
else low[y]=max(no[2][x].len+1,low[x]+1);
|
||||
panlow(y,x);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,T;
|
||||
scanf("%d",&T);
|
||||
for(t=1; t<=T; t++)
|
||||
{
|
||||
init();
|
||||
if(dfs(1,0));
|
||||
panlow(1,0);
|
||||
spfa(1,0);
|
||||
printf("Case #%d: %d\n",t,ipos);
|
||||
}
|
||||
return 0;
|
||||
}
|
336
HDOJ/4680_autoAC.cpp
Normal file
336
HDOJ/4680_autoAC.cpp
Normal file
|
@ -0,0 +1,336 @@
|
|||
#include<cstdio>
|
||||
#include<iostream>
|
||||
#include<cstring>
|
||||
#define L x->c[0]
|
||||
#define R x->c[1]
|
||||
#define KT root->c[1]->c[0]
|
||||
using namespace std;
|
||||
const int maxn = 300010;
|
||||
const int inf = 1000000007;
|
||||
int n,Type;
|
||||
int gcd(int a,int b)
|
||||
{
|
||||
if(a<0||a>=inf) return b;
|
||||
if(b<0||b>=inf) return a;
|
||||
return b == 0?a:gcd(b,a%b);
|
||||
}
|
||||
struct Node
|
||||
{
|
||||
struct Node *c[2],*fa;
|
||||
int id,size,g,val,who;
|
||||
}S[maxn],*null = &S[0];
|
||||
Node* Q[maxn];
|
||||
Node* ID[maxn];
|
||||
int scnt;
|
||||
struct snode
|
||||
{
|
||||
int type;
|
||||
Node*root;
|
||||
inline Node *NewNode(int value,Node *p)
|
||||
{
|
||||
Node *e = S+(++scnt);
|
||||
e->val = value;
|
||||
e->id = scnt;
|
||||
e->size = 1;
|
||||
e->fa = p;
|
||||
e->g = value;
|
||||
e->c[0] = e->c[1] = null;
|
||||
ID[scnt] = e;
|
||||
return e;
|
||||
}
|
||||
inline void Update(Node *p)
|
||||
{
|
||||
p->size = p->c[0]->size+p->c[1]->size+1;
|
||||
p->g = gcd(p->c[0]->g,p->c[1]->g);
|
||||
p->g = gcd(p->val,p->g);
|
||||
}
|
||||
inline void Rotate(Node *x,int k)
|
||||
{
|
||||
Node *y=x->fa;
|
||||
y->c[k]=x->c[!k];
|
||||
y->c[k]->fa=y;
|
||||
x->fa=y->fa;
|
||||
if(y->fa->c[0]==y)
|
||||
y->fa->c[0]=x;
|
||||
else
|
||||
y->fa->c[1]=x;
|
||||
y->fa=x;
|
||||
x->c[!k]=y;
|
||||
Update(y);
|
||||
Update(x);
|
||||
if(root==y) root=x;
|
||||
}
|
||||
inline void Splay(Node *x,Node *y)
|
||||
{
|
||||
while(x->fa!=y)
|
||||
{
|
||||
if(x->fa->fa==y)
|
||||
{
|
||||
if(x->fa->c[0]==x)
|
||||
Rotate(x,0);
|
||||
else
|
||||
Rotate(x,1);
|
||||
}
|
||||
else if(x->fa->fa->c[0]==x->fa)
|
||||
{
|
||||
if(x->fa->c[0]==x)
|
||||
Rotate(x->fa,0),Rotate(x,0);
|
||||
else
|
||||
Rotate(x,1),Rotate(x,0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(x->fa->c[1]==x)
|
||||
Rotate(x->fa,1),Rotate(x,1);
|
||||
else
|
||||
Rotate(x,0),Rotate(x,1);
|
||||
}
|
||||
}
|
||||
Update(x);
|
||||
}
|
||||
inline void Select(int k,Node *y)
|
||||
{
|
||||
Node *x=root;
|
||||
while(k!=x->c[0]->size+1)
|
||||
{
|
||||
if(k<=x->c[0]->size)
|
||||
x=x->c[0];
|
||||
else
|
||||
{
|
||||
k-=x->c[0]->size+1;
|
||||
x=x->c[1];
|
||||
}
|
||||
}
|
||||
Splay(x,y);
|
||||
}
|
||||
inline void Init(int v)
|
||||
{
|
||||
root = NewNode(v,null);
|
||||
type = ++Type;
|
||||
root->who = type;
|
||||
}
|
||||
inline void Delete(Node *x)
|
||||
{
|
||||
Splay(x,null);
|
||||
Node *t = root;
|
||||
if(t->c[1]!=null)
|
||||
{
|
||||
root = t->c[1];
|
||||
Select(1,null);
|
||||
root->c[0] = t->c[0];
|
||||
if(root->c[0]!=null)
|
||||
root->c[0]->fa = root;
|
||||
}
|
||||
else
|
||||
{
|
||||
root = t->c[0];
|
||||
}
|
||||
root->fa = null;
|
||||
if(root!=null)Update(root);
|
||||
}
|
||||
inline void Insert(Node *x)
|
||||
{
|
||||
x->c[0] = x->c[1] = null;
|
||||
insert(root,x);
|
||||
Splay(x,null);
|
||||
x->who = type;
|
||||
}
|
||||
inline void insert(Node* &x,Node* y)
|
||||
{
|
||||
if(x == null)
|
||||
{
|
||||
x = y;
|
||||
return;
|
||||
}
|
||||
if(y->val<=x->val)
|
||||
{
|
||||
insert(x->c[0],y);
|
||||
x->c[0]->fa = x;
|
||||
}
|
||||
else
|
||||
{
|
||||
insert(x->c[1],y);
|
||||
x->c[1]->fa = x;
|
||||
}
|
||||
Update(x);
|
||||
}
|
||||
inline void Change(Node* tmp,int v)
|
||||
{
|
||||
Delete(tmp);
|
||||
tmp->val = v;
|
||||
Insert(tmp);
|
||||
}
|
||||
inline Node *FindSucc(Node *x,int v,int opt)
|
||||
{
|
||||
if(x == null)return x;
|
||||
if(x->val == v&&opt)return x;
|
||||
else if(x->val>v)
|
||||
{
|
||||
Node *tmp = FindSucc(x->c[0],v,opt);
|
||||
return tmp == null?x:tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FindSucc(x->c[1],v,opt);
|
||||
}
|
||||
}
|
||||
inline Node *FindSucc(int v,int opt)
|
||||
{
|
||||
Node *tmp = FindSucc(root,v,opt);
|
||||
Splay(tmp,null);
|
||||
return tmp;
|
||||
}
|
||||
inline Node *FindPre(Node *x,int v)
|
||||
{
|
||||
if(x == null)return x;
|
||||
if(x->val<v)
|
||||
{
|
||||
Node *tmp = FindPre(x->c[1],v);
|
||||
return tmp == null?x:tmp;
|
||||
}
|
||||
else return FindPre(x->c[0],v);
|
||||
}
|
||||
inline Node *FindPre(int v)
|
||||
{
|
||||
Node* tmp = FindPre(root,v);
|
||||
Splay(tmp,null);
|
||||
return tmp;
|
||||
}
|
||||
inline void Merge(snode &tree)
|
||||
{
|
||||
int head,tail;
|
||||
head = tail = 0;
|
||||
tree.Select(1,null);
|
||||
tree.Select(tree.root->size,tree.root);
|
||||
Q[++tail] = tree.KT;
|
||||
while(head<tail)
|
||||
{
|
||||
Node* f = Q[++head];
|
||||
if(f->c[0]!=null)Q[++tail] = f->c[0];
|
||||
if(f->c[1]!=null)Q[++tail] = f->c[1];
|
||||
Insert(f);
|
||||
f->who = type;
|
||||
}
|
||||
tree.KT = null;
|
||||
tree.Update(tree.root->c[1]);
|
||||
tree.Update(tree.root);
|
||||
}
|
||||
inline int SolveTri()
|
||||
{
|
||||
if(root->size<=4)return root->size-2;
|
||||
Select(2,null);
|
||||
int a = root->val;
|
||||
Select(3,null);
|
||||
int b = root->val;
|
||||
int ans = 2;
|
||||
while(true)
|
||||
{
|
||||
if(a+b>=inf)break;
|
||||
int c = FindSucc(a+b,1)->val;
|
||||
if(c>=inf||c == -1)break;
|
||||
a = b;
|
||||
b = c;
|
||||
ans++;
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
inline int SolveGcd(int l,int r)
|
||||
{
|
||||
Node *pre = FindPre(l);
|
||||
Node *succ = FindSucc(r,0);
|
||||
Splay(pre,null);
|
||||
Splay(succ,root);
|
||||
return KT->g;
|
||||
}
|
||||
void vist(Node *x)
|
||||
{
|
||||
if(x != null)
|
||||
{
|
||||
printf("root %2d: left-son: %2d right-son: %2d size:%2d val=%2d gcd: %2d\n",x->id,x->c[0]->id,x->c[1]->id,x->size,x->val,x->g);
|
||||
vist(x->c[0]);
|
||||
vist(x->c[1]);
|
||||
}
|
||||
}
|
||||
}spt[maxn];
|
||||
void prepare()
|
||||
{
|
||||
null->id = 0;
|
||||
null->c[0] = null->c[1] = null->fa = NULL;
|
||||
null->size = null->val = 0;
|
||||
null->g = -1;
|
||||
Type = 0;
|
||||
scnt = 0;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int t,n,m,a,u,v,op,l,r,x,cas = 1;
|
||||
scanf("%d",&t);
|
||||
while(t--)
|
||||
{
|
||||
prepare();
|
||||
printf("Case #%d:\n",cas++);
|
||||
scanf("%d%d",&n,&m);
|
||||
for(int i = 1;i<=n;i++)
|
||||
{
|
||||
spt[i].Init(-1);
|
||||
Node *tmp = spt[i].NewNode(inf,null);
|
||||
spt[i].Insert(tmp);
|
||||
}
|
||||
for(int i = 1;i<=n;i++)
|
||||
{
|
||||
scanf("%d",&a);
|
||||
Node *tmp = spt[i].NewNode(a,null);
|
||||
spt[i].Insert(tmp);
|
||||
}
|
||||
int tot = 0;
|
||||
while(m--)
|
||||
{
|
||||
scanf("%d",&op);
|
||||
if(op == 1)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
Node *t1 = ID[u+2*n];
|
||||
Node *t2 = ID[v+2*n];
|
||||
int tree1 = t1->who;
|
||||
int tree2 = t2->who;
|
||||
if(tree1 == tree2)continue;
|
||||
int size1 = spt[tree1].root->size;
|
||||
int size2 = spt[tree2].root->size;
|
||||
if(size1>size2)spt[tree1].Merge(spt[tree2]);
|
||||
else spt[tree2].Merge(spt[tree1]);
|
||||
}
|
||||
else if(op == 2)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
Node *t1 = ID[u+2*n];
|
||||
Node *t2 = ID[v+2*n];
|
||||
int tree1 = t1->who;
|
||||
int tree2 = t2->who;
|
||||
spt[tree1].Delete(t1);
|
||||
spt[tree2].Insert(t1);
|
||||
}
|
||||
else if(op == 3)
|
||||
{
|
||||
scanf("%d%d",&u,&x);
|
||||
Node *tmp = ID[u+2*n];
|
||||
int tree = tmp->who;
|
||||
spt[tree].Change(tmp,x);
|
||||
}
|
||||
else if(op == 4)
|
||||
{
|
||||
scanf("%d",&u);
|
||||
Node *tmp = ID[u+2*n];
|
||||
int tree = tmp->who;
|
||||
printf("%d\n",spt[tree].SolveTri());
|
||||
}
|
||||
else
|
||||
{
|
||||
scanf("%d%d%d",&u,&l,&r);
|
||||
Node *tmp = ID[u+2*n];
|
||||
int tree = tmp->who;
|
||||
printf("%d\n",spt[tree].SolveGcd(l,r));
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
125
HDOJ/4681_autoAC.cpp
Normal file
125
HDOJ/4681_autoAC.cpp
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include<iostream>
|
||||
#include<stdio.h>
|
||||
#include<vector>
|
||||
#include<algorithm>
|
||||
#include<string.h>
|
||||
using namespace std;
|
||||
char sta[1001];
|
||||
char stb[1001];
|
||||
char stc[1001];
|
||||
int lena,lenb,lenc;
|
||||
int dp[1001][1001];
|
||||
int dpf[1001][1001];
|
||||
struct list
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
}node,n1,n2;
|
||||
vector<list>vec[5];
|
||||
void dps()
|
||||
{
|
||||
int i,j;
|
||||
for(i=0;i<lena;i++)
|
||||
if(sta[i]==stb[0])
|
||||
for(i;i<lena;i++)dp[i][0]=1;
|
||||
for(i=0;i<lenb;i++)
|
||||
if(sta[0]==stb[i])
|
||||
for(i;i<lenb;i++)dp[0][i]=1;
|
||||
for(i=1;i<lena;i++)
|
||||
{
|
||||
for(j=1;j<lenb;j++)
|
||||
{
|
||||
if(sta[i]==stb[j])dp[i][j]=dp[i-1][j-1]+1;
|
||||
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
void dpfs()
|
||||
{
|
||||
int i,j;
|
||||
for(i=lena-1;i>=0;i--)
|
||||
if(sta[i]==stb[lenb-1])
|
||||
for(i;i>=0;i--)dpf[i][lenb-1]=1;
|
||||
for(i=lenb-1;i>=0;i--)
|
||||
if(sta[lena-1]==stb[i])
|
||||
for(i;i>=0;i--)dpf[lena-1][i]=1;
|
||||
for(i=lena-2;i>=0;i--)
|
||||
{
|
||||
for(j=lenb-2;j>=0;j--)
|
||||
{
|
||||
if(sta[i]==stb[j])dpf[i][j]=dpf[i+1][j+1]+1;
|
||||
else dpf[i][j]=max(dpf[i+1][j],dpf[i][j+1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
void init()
|
||||
{
|
||||
memset(dp,0,sizeof(dp));
|
||||
memset(dpf,0,sizeof(dpf));
|
||||
vec[0].clear();
|
||||
vec[1].clear();
|
||||
gets(sta);
|
||||
gets(stb);
|
||||
gets(stc);
|
||||
lena=strlen(sta);
|
||||
lenb=strlen(stb);
|
||||
lenc=strlen(stc);
|
||||
}
|
||||
void sear(char str[],int pos)
|
||||
{
|
||||
int lens=strlen(str);
|
||||
int i,j,k;
|
||||
for(i=0;i<lens;i++)
|
||||
{
|
||||
if(str[i]==stc[0])
|
||||
{
|
||||
for(k=0,j=i;j<lens;j++)
|
||||
{
|
||||
if(str[j]==stc[k])k++;
|
||||
if(k==lenc)break;
|
||||
}
|
||||
if(j<lens)
|
||||
{
|
||||
node.x=i;
|
||||
node.y=j;
|
||||
vec[pos].push_back(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void prin(int cas)
|
||||
{
|
||||
int l1=vec[0].size();
|
||||
int l2=vec[1].size();
|
||||
int maxx=0;
|
||||
int i,j;
|
||||
for(i=0;i<l1;i++)
|
||||
{
|
||||
for(j=0;j<l2;j++)
|
||||
{
|
||||
n1=vec[0][i];
|
||||
n2=vec[1][j];
|
||||
int c1,c2;
|
||||
c1=c2=0;
|
||||
if(n1.x-1>=0&&n2.x-1>=0)c1=dp[n1.x-1][n2.x-1];
|
||||
if(n1.y+1<lena&&n2.y+1<lenb)c2=dpf[n1.y+1][n2.y+1];
|
||||
maxx=max(maxx,c1+c2+lenc);
|
||||
}
|
||||
}
|
||||
printf("Case #%d: %d\n",cas,maxx);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int T,t;
|
||||
scanf("%d%*c",&T);
|
||||
for(t=1;t<=T;t++)
|
||||
{
|
||||
init();
|
||||
dps();
|
||||
dpfs();
|
||||
sear(sta,0);
|
||||
sear(stb,1);
|
||||
prin(t);
|
||||
}
|
||||
return 0;
|
||||
}
|
125
HDOJ/4685_autoAC.cpp
Normal file
125
HDOJ/4685_autoAC.cpp
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<algorithm>
|
||||
#include<stack>
|
||||
#include<vector>
|
||||
using namespace std;
|
||||
#define MAXN 1111
|
||||
int n,m,N,cnt;
|
||||
bool map[MAXN][MAXN];
|
||||
bool mark[MAXN];
|
||||
int ly[MAXN];
|
||||
int lx[MAXN];
|
||||
int dfs(int u,int m)
|
||||
{
|
||||
for(int v=1;v<=m;v++){
|
||||
if(map[u][v]&&!mark[v]){
|
||||
mark[v]=true;
|
||||
if(ly[v]==-1||dfs(ly[v],m)){
|
||||
ly[v]=u;
|
||||
lx[u]=v;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int MaxMatch(int n,int m)
|
||||
{
|
||||
memset(ly,-1,sizeof(ly));
|
||||
memset(lx,-1,sizeof(lx));
|
||||
int ans=0;
|
||||
for(int i=1;i<=n;i++){
|
||||
memset(mark,false,sizeof(mark));
|
||||
ans+=dfs(i,m);
|
||||
}
|
||||
return ans;
|
||||
}
|
||||
vector<vector<int> >g;
|
||||
vector<vector<int> >ans;
|
||||
int dfn[MAXN],low[MAXN];
|
||||
int color[MAXN],_count;
|
||||
stack<int>S;
|
||||
void Tarjan(int u)
|
||||
{
|
||||
low[u]=dfn[u]=++cnt;
|
||||
mark[u]=true;
|
||||
S.push(u);
|
||||
for(int i=0;i<g[u].size();i++){
|
||||
int v=g[u][i];
|
||||
if(dfn[v]==0){
|
||||
Tarjan(v);
|
||||
low[u]=min(low[u],low[v]);
|
||||
}else if(mark[v]){
|
||||
low[u]=min(low[u],dfn[v]);
|
||||
}
|
||||
}
|
||||
if(low[u]==dfn[u]){
|
||||
_count++;
|
||||
int x;
|
||||
do{
|
||||
x=S.top();
|
||||
S.pop();
|
||||
mark[x]=false;
|
||||
color[x]=_count;
|
||||
}while(x!=u);
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int _case,k,x,t=1;
|
||||
scanf("%d",&_case);
|
||||
while(_case--){
|
||||
scanf("%d%d",&n,&m);
|
||||
memset(map,false,sizeof(map));
|
||||
for(int i=1;i<=n;i++){
|
||||
scanf("%d",&k);
|
||||
while(k--){
|
||||
scanf("%d",&x);
|
||||
map[i][x]=true;
|
||||
}
|
||||
}
|
||||
cnt=MaxMatch(n,m);
|
||||
N=n+m-cnt;
|
||||
for(int i=n+1;i<=N;i++)
|
||||
for(int j=1;j<=N;j++)
|
||||
map[i][j]=true;
|
||||
for(int i=m+1;i<=N;i++)
|
||||
for(int j=1;j<=N;j++)
|
||||
map[j][i]=true;
|
||||
MaxMatch(N,N);
|
||||
g.clear();
|
||||
g.resize(N+2);
|
||||
ans.clear();
|
||||
ans.resize(N+2);
|
||||
for(int i=1;i<=N;i++){
|
||||
for(int j=1;j<=N;j++){
|
||||
if(lx[i]!=j&&map[i][j]){
|
||||
g[lx[i]].push_back(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
memset(dfn,0,sizeof(dfn));
|
||||
memset(mark,false,sizeof(mark));
|
||||
_count=cnt=0;
|
||||
for(int i=1;i<=N;i++)
|
||||
if(dfn[i]==0)Tarjan(i);
|
||||
for(int i=1;i<=n;i++){
|
||||
for(int j=1;j<=m;j++){
|
||||
if(map[i][j]&&color[lx[i]]==color[j]){
|
||||
ans[i].push_back(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Case #%d:\n",t++);
|
||||
for(int i=1;i<=n;i++){
|
||||
printf("%d",(int)ans[i].size());
|
||||
for(int j=0;j<ans[i].size();j++){
|
||||
printf(" %d",ans[i][j]);
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
76
HDOJ/4686_autoAC.cpp
Normal file
76
HDOJ/4686_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
|||
#include<stdio.h>
|
||||
#include<string.h>
|
||||
#define LL long long
|
||||
#define M 1000000007
|
||||
struct Matrix
|
||||
{
|
||||
LL a[6][6];
|
||||
}origin,res,tmp,A,ans;
|
||||
int n;
|
||||
Matrix mul(Matrix x,Matrix y)
|
||||
{
|
||||
int i,j,k;
|
||||
memset(tmp.a,0,sizeof(tmp.a));
|
||||
for(i=1;i<=n;i++)
|
||||
for(j=1;j<=n;j++)
|
||||
for(k=1;k<=n;k++)
|
||||
{
|
||||
tmp.a[i][j]+=(x.a[i][k]*y.a[k][j])%M;
|
||||
tmp.a[i][j]%=M;
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
void quickpow(LL k)
|
||||
{
|
||||
int i;
|
||||
memset(res.a,0,sizeof(res.a));
|
||||
for(i=1;i<=n;i++)
|
||||
res.a[i][i]=1;
|
||||
while(k)
|
||||
{
|
||||
if(k&1)
|
||||
res=mul(res,A);
|
||||
A=mul(A,A);
|
||||
k>>=1;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
LL N,a0,ax,ay,b0,bx,by;
|
||||
LL f1,a1,b1,s0;
|
||||
while(scanf("%lld %lld %lld %lld %lld %lld %lld",&N,&a0,&ax,&ay,&b0,&bx,&by)!=EOF)
|
||||
{
|
||||
if(N==0)
|
||||
{
|
||||
printf("0\n");
|
||||
continue;
|
||||
}
|
||||
a1=(a0*ax+ay)%M;
|
||||
b1=(b0*bx+by)%M;
|
||||
f1=(a1*b1)%M;
|
||||
s0=(a0*b0)%M;
|
||||
n=5;
|
||||
memset(origin.a,0,sizeof(origin.a));
|
||||
origin.a[1][1]=f1;
|
||||
origin.a[1][2]=a1;
|
||||
origin.a[1][3]=b1;
|
||||
origin.a[1][4]=1;
|
||||
origin.a[1][5]=s0;
|
||||
memset(A.a,0,sizeof(A.a));
|
||||
A.a[1][1]=(ax*bx)%M;
|
||||
A.a[1][5]=1;
|
||||
A.a[2][1]=(ax*by)%M;
|
||||
A.a[2][2]=ax%M;
|
||||
A.a[3][1]=(ay*bx)%M;
|
||||
A.a[3][3]=bx%M;
|
||||
A.a[4][1]=(ay*by)%M;
|
||||
A.a[4][2]=ay%M;
|
||||
A.a[4][3]=by%M;
|
||||
A.a[4][4]=1;
|
||||
A.a[5][5]=1;
|
||||
quickpow(N-1);
|
||||
ans=mul(origin,res);
|
||||
printf("%lld\n",ans.a[1][5]);
|
||||
}
|
||||
return 0;
|
||||
}
|
187
HDOJ/4687_autoAC.cpp
Normal file
187
HDOJ/4687_autoAC.cpp
Normal file
|
@ -0,0 +1,187 @@
|
|||
#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 = 50;
|
||||
int N;
|
||||
bool Graph[MAXN][MAXN];
|
||||
int Match[MAXN];
|
||||
bool InQueue[MAXN],InPath[MAXN],InBlossom[MAXN];
|
||||
int Head,Tail;
|
||||
int Queue[MAXN];
|
||||
int Start,Finish;
|
||||
int NewBase;
|
||||
int Father[MAXN],Base[MAXN];
|
||||
int Count;
|
||||
void Push(int u)
|
||||
{
|
||||
Queue[Tail] = u;
|
||||
Tail++;
|
||||
InQueue[u] = true;
|
||||
}
|
||||
int Pop()
|
||||
{
|
||||
int res = Queue[Head];
|
||||
Head++;
|
||||
return res;
|
||||
}
|
||||
int FindCommonAncestor(int u,int v)
|
||||
{
|
||||
memset(InPath,false,sizeof(InPath));
|
||||
while(true)
|
||||
{
|
||||
u = Base[u];
|
||||
InPath[u] = true;
|
||||
if(u == Start) break;
|
||||
u = Father[Match[u]];
|
||||
}
|
||||
while(true)
|
||||
{
|
||||
v = Base[v];
|
||||
if(InPath[v])break;
|
||||
v = Father[Match[v]];
|
||||
}
|
||||
return v;
|
||||
}
|
||||
void ResetTrace(int u)
|
||||
{
|
||||
int v;
|
||||
while(Base[u] != NewBase)
|
||||
{
|
||||
v = Match[u];
|
||||
InBlossom[Base[u]] = InBlossom[Base[v]] = true;
|
||||
u = Father[v];
|
||||
if(Base[u] != NewBase) Father[u] = v;
|
||||
}
|
||||
}
|
||||
void BloosomContract(int u,int v)
|
||||
{
|
||||
NewBase = FindCommonAncestor(u,v);
|
||||
memset(InBlossom,false,sizeof(InBlossom));
|
||||
ResetTrace(u);
|
||||
ResetTrace(v);
|
||||
if(Base[u] != NewBase) Father[u] = v;
|
||||
if(Base[v] != NewBase) Father[v] = u;
|
||||
for(int tu = 1; tu <= N; tu++)
|
||||
if(InBlossom[Base[tu]])
|
||||
{
|
||||
Base[tu] = NewBase;
|
||||
if(!InQueue[tu]) Push(tu);
|
||||
}
|
||||
}
|
||||
void FindAugmentingPath()
|
||||
{
|
||||
memset(InQueue,false,sizeof(InQueue));
|
||||
memset(Father,0,sizeof(Father));
|
||||
for(int i = 1;i <= N;i++)
|
||||
Base[i] = i;
|
||||
Head = Tail = 1;
|
||||
Push(Start);
|
||||
Finish = 0;
|
||||
while(Head < Tail)
|
||||
{
|
||||
int u = Pop();
|
||||
for(int v = 1; v <= N; v++)
|
||||
if(Graph[u][v] && (Base[u] != Base[v]) && (Match[u] != v))
|
||||
{
|
||||
if((v == Start) || ((Match[v] > 0) && Father[Match[v]] > 0))
|
||||
BloosomContract(u,v);
|
||||
else if(Father[v] == 0)
|
||||
{
|
||||
Father[v] = u;
|
||||
if(Match[v] > 0)
|
||||
Push(Match[v]);
|
||||
else
|
||||
{
|
||||
Finish = v;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void AugmentPath()
|
||||
{
|
||||
int u,v,w;
|
||||
u = Finish;
|
||||
while(u > 0)
|
||||
{
|
||||
v = Father[u];
|
||||
w = Match[v];
|
||||
Match[v] = u;
|
||||
Match[u] = v;
|
||||
u = w;
|
||||
}
|
||||
}
|
||||
void Edmonds()
|
||||
{
|
||||
memset(Match,0,sizeof(Match));
|
||||
for(int u = 1; u <= N; u++)
|
||||
if(Match[u] == 0)
|
||||
{
|
||||
Start = u;
|
||||
FindAugmentingPath();
|
||||
if(Finish > 0)AugmentPath();
|
||||
}
|
||||
}
|
||||
int getMatch()
|
||||
{
|
||||
Edmonds();
|
||||
Count = 0;
|
||||
for(int u = 1; u <= N;u++)
|
||||
if(Match[u] > 0)
|
||||
Count++;
|
||||
return Count/2;
|
||||
}
|
||||
bool g[MAXN][MAXN];
|
||||
pair<int,int>p[150];
|
||||
int main()
|
||||
{
|
||||
int m;
|
||||
while(scanf("%d%d",&N,&m)==2)
|
||||
{
|
||||
memset(g,false,sizeof(g));
|
||||
memset(Graph,false,sizeof(Graph));
|
||||
int u,v;
|
||||
for(int i = 1;i <= m;i++)
|
||||
{
|
||||
scanf("%d%d",&u,&v);
|
||||
p[i] = make_pair(u,v);
|
||||
g[u][v] = true;
|
||||
g[v][u] = true;
|
||||
Graph[u][v] = true;
|
||||
Graph[v][u] = true;
|
||||
}
|
||||
int cnt0 = getMatch();
|
||||
vector<int>ans;
|
||||
for(int i = 1;i <= m;i++)
|
||||
{
|
||||
u = p[i].first;
|
||||
v = p[i].second;
|
||||
memcpy(Graph,g,sizeof(g));
|
||||
for(int j = 1;j <= N;j++)
|
||||
Graph[j][u] = Graph[u][j] = Graph[j][v] = Graph[v][j] = false;
|
||||
int cnt = getMatch();
|
||||
if(cnt < cnt0-1)
|
||||
ans.push_back(i);
|
||||
}
|
||||
int sz = ans.size();
|
||||
printf("%d\n",sz);
|
||||
for(int i = 0;i < sz;i++)
|
||||
{
|
||||
printf("%d",ans[i]);
|
||||
if(i < sz-1)printf(" ");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
52
HDOJ/4689_autoAC.cpp
Normal file
52
HDOJ/4689_autoAC.cpp
Normal file
|
@ -0,0 +1,52 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
#define ll long long
|
||||
char a[100];
|
||||
ll dp[22][22][22];
|
||||
int main ()
|
||||
{
|
||||
while(scanf("%s",a)!=EOF)
|
||||
{
|
||||
if(a[0]=='-')
|
||||
{
|
||||
printf("0\n");
|
||||
continue;
|
||||
}
|
||||
memset(dp,0,sizeof(dp));
|
||||
dp[1][0][1]=1;
|
||||
int cnt=0;
|
||||
for(int i=1;i<strlen(a);++i)
|
||||
{
|
||||
if(a[i]=='-')
|
||||
{
|
||||
cnt++;
|
||||
for(int j=0;j<i;++j)
|
||||
for(int k=0;k<=i;++k)
|
||||
{
|
||||
if(i-j-k>0)
|
||||
dp[i+1][j+1][k]+=dp[i][j][k]*(i-j-k);
|
||||
if(k)
|
||||
dp[i+1][j+1][k-1]+=dp[i][j][k]*k;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(int j=0;j<=i;++j)
|
||||
for(int k=0;k<=i;++k)
|
||||
{
|
||||
dp[i+1][j][k+1]+=dp[i][j][k];
|
||||
if(i-j-k>0)
|
||||
dp[i+1][j][k+1]+=dp[i][j][k]*(i-j-k);
|
||||
dp[i+1][j][k]+=dp[i][j][k]*k;
|
||||
}
|
||||
}
|
||||
}
|
||||
cout<<dp[strlen(a)][cnt][0]<<endl;
|
||||
}
|
||||
return 0;
|
||||
}
|
105
HDOJ/4690_autoAC.cpp
Normal file
105
HDOJ/4690_autoAC.cpp
Normal file
|
@ -0,0 +1,105 @@
|
|||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <cctype>
|
||||
#include <algorithm>
|
||||
#include <queue>
|
||||
#include <deque>
|
||||
#include <queue>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <utility>
|
||||
#include <functional>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
#include <numeric>
|
||||
#include <cassert>
|
||||
#include <ctime>
|
||||
#include <iterator>
|
||||
const int INF = 0x3f3f3f3f;
|
||||
const int dir[8][2] = {{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
|
||||
using namespace std;
|
||||
string A[16][16] = {
|
||||
"NUL","SOH","STX","ETX","","HT","","DEL","","","","VT","FF","CR","SO","SI",
|
||||
"DLE","DC1","DC2","DC3","","","BS","","CAN","EM","","","IFS","IGS","IRS","IUS ITB",
|
||||
"","","","","","LF","ETB","ESC","","","","","","ENQ","ACK","BEL",
|
||||
"","","SYN","","","","","EOT","","","","","DC4","NAK","","SUB",
|
||||
"SP","","","","","","","","","","",".","<","(","+","|",
|
||||
"&","","","","","","","","","","!","$","*",")",";","",
|
||||
"-","/","","","","","","","","","",",","%","_",">","?",
|
||||
"","","","","","","","","","`",":","#","@","'","=","\"",
|
||||
"","a","b","c","d","e","f","g","h","i","","","","","","",
|
||||
"","j","k","l","m","n","o","p","q","r","","","","","","",
|
||||
"","~","s","t","u","v","w","x","y","z","","","","","","",
|
||||
"^","","","","","","","","","","[","]","","","","",
|
||||
"{","A","B","C","D","E","F","G","H","I","","","","","","",
|
||||
"}","J","K","L","M","N","O","P","Q","R","","","","","","",
|
||||
"\\","","S","T","U","V","W","X","Y","Z","","","","","","",
|
||||
"0","1","2","3","4","5","6","7","8","9","","","","","",""
|
||||
};
|
||||
string B[8][16] = {
|
||||
"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",
|
||||
"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "IFS", "IGS", "IRS", "IUS ITB",
|
||||
"SP", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/",
|
||||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?",
|
||||
"@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
|
||||
"P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\","]","^","_",
|
||||
"`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
|
||||
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "DEL"
|
||||
};
|
||||
map<pair<int,int>, pair<int,int> > coll;
|
||||
int main(void)
|
||||
{
|
||||
string sad;
|
||||
ios::sync_with_stdio(false);
|
||||
cin>>sad; coll.clear();
|
||||
string tmp; pair<int,int> so, to;
|
||||
for (int i = 0; i < 16; ++i)
|
||||
{
|
||||
for (int j = 0; j < 16; ++j)
|
||||
{
|
||||
if (A[i][j]!="")
|
||||
{
|
||||
so.first=i, so.second=j;
|
||||
bool mrk = false;
|
||||
for (int k = 0; k < 8; ++k)
|
||||
{
|
||||
for (int h = 0; h < 16; ++h)
|
||||
{
|
||||
if (A[i][j]==B[k][h])
|
||||
{
|
||||
mrk = true;
|
||||
to.first=k,to.second=h;
|
||||
coll[so] = to; break;
|
||||
}
|
||||
}
|
||||
if (mrk) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < sad.size(); i+=2)
|
||||
{
|
||||
int X, Y; tmp.clear();
|
||||
if (sad[i]>='A'&&sad[i]<='F') X = sad[i]- 'A'+10;
|
||||
else X = sad[i] - '0';
|
||||
if (sad[i+1]>='A'&&sad[i+1]<='F') Y = sad[i+1]- 'A'+10;
|
||||
else Y = sad[i+1] - '0';
|
||||
pair<int,int> hehe, TM;
|
||||
hehe.first = X, hehe.second = Y;
|
||||
TM = coll[hehe];
|
||||
int j = TM.first, k = TM.second;
|
||||
char XX, YY;
|
||||
XX = j+ '0';
|
||||
if (k >= 10) YY = k - 10 + 'A';
|
||||
else YY = k + '0';
|
||||
printf("%c%c", XX, YY);
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
140
HDOJ/4691_autoAC.cpp
Normal file
140
HDOJ/4691_autoAC.cpp
Normal file
|
@ -0,0 +1,140 @@
|
|||
#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=100010;
|
||||
int t1[MAXN],t2[MAXN],c[MAXN];
|
||||
bool cmp(int *r,int a,int b,int l)
|
||||
{
|
||||
return r[a] == r[b] && r[a+l] == r[b+l];
|
||||
}
|
||||
void da(int str[],int sa[],int ran[],int height[],int n,int m)
|
||||
{
|
||||
n++;
|
||||
int i, j, p, *x = t1, *y = t2;
|
||||
for(i = 0;i < m;i++)c[i] = 0;
|
||||
for(i = 0;i < n;i++)c[x[i] = str[i]]++;
|
||||
for(i = 1;i < m;i++)c[i] += c[i-1];
|
||||
for(i = n-1;i >= 0;i--)sa[--c[x[i]]] = i;
|
||||
for(j = 1;j <= n; j <<= 1)
|
||||
{
|
||||
p = 0;
|
||||
for(i = n-j; i < n; i++)y[p++] = i;
|
||||
for(i = 0; i < n; i++)if(sa[i] >= j)y[p++] = sa[i] - j;
|
||||
for(i = 0; i < m; i++)c[i] = 0;
|
||||
for(i = 0; i < n; i++)c[x[y[i]]]++;
|
||||
for(i = 1; i < m;i++)c[i] += c[i-1];
|
||||
for(i = n-1; i >= 0;i--)sa[--c[x[y[i]]]] = y[i];
|
||||
swap(x,y);
|
||||
p = 1; x[sa[0]] = 0;
|
||||
for(i = 1;i < n;i++)
|
||||
x[sa[i]] = cmp(y,sa[i-1],sa[i],j)?p-1:p++;
|
||||
if(p >= n)break;
|
||||
m = p;
|
||||
}
|
||||
int k = 0;
|
||||
n--;
|
||||
for(i = 0;i <= n;i++)ran[sa[i]] = i;
|
||||
for(i = 0;i < n;i++)
|
||||
{
|
||||
if(k)k--;
|
||||
j = sa[ran[i]-1];
|
||||
while(str[i+k] == str[j+k])k++;
|
||||
height[ran[i]] = k;
|
||||
}
|
||||
}
|
||||
int ran[MAXN],height[MAXN];
|
||||
int RMQ[MAXN];
|
||||
int mm[MAXN];
|
||||
int best[20][MAXN];
|
||||
void initRMQ(int n)
|
||||
{
|
||||
mm[0]=-1;
|
||||
for(int i=1;i<=n;i++)
|
||||
mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
|
||||
for(int i=1;i<=n;i++)best[0][i]=i;
|
||||
for(int i=1;i<=mm[n];i++)
|
||||
for(int j=1;j+(1<<i)-1<=n;j++)
|
||||
{
|
||||
int a=best[i-1][j];
|
||||
int b=best[i-1][j+(1<<(i-1))];
|
||||
if(RMQ[a]<RMQ[b])best[i][j]=a;
|
||||
else best[i][j]=b;
|
||||
}
|
||||
}
|
||||
int askRMQ(int a,int b)
|
||||
{
|
||||
int t;
|
||||
t=mm[b-a+1];
|
||||
b-=(1<<t)-1;
|
||||
a=best[t][a];b=best[t][b];
|
||||
return RMQ[a]<RMQ[b]?a:b;
|
||||
}
|
||||
int lcp(int a,int b)
|
||||
{
|
||||
a=ran[a];b=ran[b];
|
||||
if(a>b)swap(a,b);
|
||||
return height[askRMQ(a+1,b)];
|
||||
}
|
||||
char str[MAXN];
|
||||
int r[MAXN];
|
||||
int sa[MAXN];
|
||||
int A[MAXN],B[MAXN];
|
||||
int calc(int n)
|
||||
{
|
||||
if(n == 0)return 1;
|
||||
int ret = 0;
|
||||
while(n)
|
||||
{
|
||||
ret++;
|
||||
n /= 10;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%s",str)==1)
|
||||
{
|
||||
int n = strlen(str);
|
||||
for(int i = 0;i < n;i++)
|
||||
r[i] = str[i];
|
||||
r[n] = 0;
|
||||
da(r,sa,ran,height,n,128);
|
||||
for(int i = 1;i <= n;i++)
|
||||
RMQ[i] = height[i];
|
||||
initRMQ(n);
|
||||
int k,u,v;
|
||||
long long ans1 = 0, ans2 = 0;
|
||||
scanf("%d",&k);
|
||||
for(int i = 0;i < k;i++)
|
||||
{
|
||||
scanf("%d%d",&A[i],&B[i]);
|
||||
if(i == 0)
|
||||
{
|
||||
ans1 += B[i] - A[i] + 1;
|
||||
ans2 += B[i] - A[i] + 3;
|
||||
continue;
|
||||
}
|
||||
int tmp ;
|
||||
if(A[i]!= A[i-1])tmp = lcp(A[i],A[i-1]);
|
||||
else tmp = 10000000;
|
||||
tmp = min(tmp,B[i]-A[i]);
|
||||
tmp = min(tmp,B[i-1]-A[i-1]);
|
||||
ans1 += B[i] - A[i] + 1;
|
||||
ans2 += B[i] - A[i] - tmp + 1;
|
||||
ans2 += 1;
|
||||
ans2 += calc(tmp);
|
||||
}
|
||||
printf("%I64d %I64d\n",ans1,ans2);
|
||||
}
|
||||
return 0;
|
||||
}
|
92
HDOJ/4696_autoAC.cpp
Normal file
92
HDOJ/4696_autoAC.cpp
Normal file
|
@ -0,0 +1,92 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
#define LL __int64
|
||||
#define maxn 100011
|
||||
int t[maxn],c[maxn],n,q,m[maxn],vis[maxn],a[maxn],b[maxn];
|
||||
map<int,map<int,int> >nn;
|
||||
map<int,int>mm;
|
||||
map<int,int>ll;
|
||||
int bb[1001];
|
||||
int flag[maxn],s[maxn],ss[maxn];
|
||||
void find(int x)
|
||||
{
|
||||
ll.clear();
|
||||
int tt=1,i,j,k,y,z,d;
|
||||
s[0]=0;s[1]=c[x];ll[x]=1,ss[1]=x;
|
||||
for(i=2;;i++)
|
||||
{
|
||||
vis[x]=1;
|
||||
x=t[x];
|
||||
ss[i]=x;
|
||||
if(ll[x])
|
||||
break;
|
||||
if(vis[x])
|
||||
{
|
||||
for(j=i-1;j>=1;j--)
|
||||
{
|
||||
a[ss[j]]=s[i-1]-s[j-1]+a[x];
|
||||
b[ss[j]]=b[x];
|
||||
}
|
||||
return;
|
||||
}
|
||||
ll[x]=++tt;
|
||||
s[i]=s[i-1]+c[x];
|
||||
}
|
||||
d=s[i-1]-s[ll[x]-1];
|
||||
for(j=1;j<i;j++)
|
||||
{
|
||||
if(j<=ll[x])
|
||||
a[ss[j]]=s[ll[x]-1]-s[j-1];
|
||||
else
|
||||
a[ss[j]]=s[i-1]-s[j-1];
|
||||
b[ss[j]]=d;
|
||||
}
|
||||
}
|
||||
int main()
|
||||
{
|
||||
while(scanf("%d%d",&n,&q)!=EOF)
|
||||
{
|
||||
int i,j,k;
|
||||
for(i=1;i<=n;i++)
|
||||
scanf("%d",&t[i]);
|
||||
for(i=1;i<=n;i++)
|
||||
scanf("%d",&c[i]);
|
||||
for(i=1;i<=q;i++)
|
||||
scanf("%d",&m[i]);
|
||||
memset(vis,0,sizeof(vis));
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
if(!vis[i])
|
||||
find(i);
|
||||
}
|
||||
mm.clear();
|
||||
nn.clear();
|
||||
int tt=0;
|
||||
for(i=1;i<=n;i++)
|
||||
{
|
||||
if(mm[b[i]]==0)
|
||||
{
|
||||
mm[b[i]]=++tt;
|
||||
bb[tt]=b[i];
|
||||
}
|
||||
nn[tt][a[i]]=1;
|
||||
}
|
||||
memset(flag,0,sizeof(flag));
|
||||
for(j=1;j<=q;j++)
|
||||
{
|
||||
if(m[j]<=0)continue;
|
||||
for(i=1;i<=tt;i++)
|
||||
if(nn[i][m[j]%bb[i]]){flag[j]=1;break;}
|
||||
}
|
||||
for(i=1;i<=q;i++)
|
||||
if(flag[i])printf("YES\n");
|
||||
else printf("NO\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
129
HDOJ/4697_autoAC.cpp
Normal file
129
HDOJ/4697_autoAC.cpp
Normal file
|
@ -0,0 +1,129 @@
|
|||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
const double eps = 1e-9;
|
||||
inline int dcmp(double x) {
|
||||
if (fabs(x) < eps)
|
||||
return 0;
|
||||
return x > eps ? 1 : -1;
|
||||
}
|
||||
struct point {
|
||||
double x, y;
|
||||
int id;
|
||||
inline void in(int i) {
|
||||
scanf("%lf%lf", &x, &y);
|
||||
id = i;
|
||||
}
|
||||
point(double x = 0, double y = 0) :
|
||||
x(x), y(y) {
|
||||
}
|
||||
inline point operator -(const point &t) const {
|
||||
return point(x - t.x, y - t.y);
|
||||
}
|
||||
inline point operator +(const point &t) const {
|
||||
return point(x + t.x, y + t.y);
|
||||
}
|
||||
point operator /(const double &t) const {
|
||||
return point(x / t, y / t);
|
||||
}
|
||||
point operator *(const double &t) const {
|
||||
return point(x * t, y * t);
|
||||
}
|
||||
inline double operator *(const point &t) const {
|
||||
return x*t.y-y*t.x;
|
||||
}
|
||||
bool operator <(const point &t) const {
|
||||
if(y == t.y) return x < t.x;
|
||||
return y < t.y;
|
||||
}
|
||||
}p[55], v[55], tp[55], st[55];
|
||||
double t[55*55*55], T, cur, ans;
|
||||
int sz, n, m;
|
||||
double a, b, c;
|
||||
inline double cross(const point &o, const point &a, const point &b) {
|
||||
return (a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x);
|
||||
}
|
||||
int graham(point *p, int n, point *st) {
|
||||
sort(p, p + n);
|
||||
int top = 0;
|
||||
int i;
|
||||
for (i = 0; i < n; i++) {
|
||||
while (top >= 2 && cross(st[top - 2], st[top - 1], p[i]) < eps)
|
||||
top--;
|
||||
st[top++] = p[i];
|
||||
}
|
||||
int t = top + 1;
|
||||
for (i = n - 2; i >= 0; i--) {
|
||||
while (top >= t && cross(st[top - 2], st[top - 1], p[i]) < eps)
|
||||
top--;
|
||||
st[top++] = p[i];
|
||||
}
|
||||
return top;
|
||||
}
|
||||
inline void gao(int i, int j, int k) {
|
||||
point a1 = p[i]-p[j], a2 = p[i]-p[k];
|
||||
point b1 = v[i]-v[j], b2 = v[i]-v[k];
|
||||
a += b1*b2; b += a1*b2+b1*a2; c += a1*a2;
|
||||
}
|
||||
inline void solve(double a, double b, double c) {
|
||||
double x;
|
||||
if(a == 0) {
|
||||
if(b!= 0) {
|
||||
x = -c/b;
|
||||
if(x >= 0 && x <= T) t[sz++] = x;
|
||||
}
|
||||
return;
|
||||
}
|
||||
double dlt = b*b-4*a*c;
|
||||
if(dlt < 0) return;
|
||||
if(dlt == 0) {
|
||||
x = -b*0.5/a;
|
||||
if(x >= 0 && x <= T) t[sz++] = x;
|
||||
return;
|
||||
}
|
||||
dlt = sqrt(dlt);
|
||||
x = 0.5*(-b+dlt)/a;
|
||||
if(x >= 0 && x <= T) t[sz++] = x;
|
||||
x = 0.5*(-b-dlt)/a;
|
||||
if(x >= 0 && x <= T) t[sz++] = x;
|
||||
}
|
||||
inline double F(double x) {
|
||||
return a*x*x*x/3.0+b*x*x/2.0+c*x;
|
||||
}
|
||||
int main() {
|
||||
int i, j, k;
|
||||
while( ~scanf("%d%lf", &n, &T)) {
|
||||
for(i = 0; i < n; i++) p[i].in(i), v[i].in(i);
|
||||
if(n <= 2) {
|
||||
printf("%.10f\n", 0.0);
|
||||
continue;
|
||||
}
|
||||
t[0] = 0; t[1] = T;
|
||||
sz = 2;
|
||||
for(i = 0; i < n; i++)
|
||||
for(j = i+1; j < n; j++)
|
||||
for(k = j+1; k < n; k++) {
|
||||
a = b = c = 0;
|
||||
gao(i, j, k);
|
||||
solve(a, b, c);
|
||||
}
|
||||
sort(t, t+sz);
|
||||
ans = 0;
|
||||
for(i = 0; i < sz-1; i++) {
|
||||
cur = 0.5*(t[i]+t[i+1]);
|
||||
a = b = c = 0;
|
||||
for(j = 0; j < n; j++) {
|
||||
tp[j] = p[j]+v[j]*cur;
|
||||
tp[j].id = p[j].id;
|
||||
}
|
||||
m = graham(tp, n, st);
|
||||
for(j = 2; j < m; j++)
|
||||
gao(st[0].id, st[j-1].id, st[j].id);
|
||||
ans += F(t[i+1])- F(t[i]);
|
||||
}
|
||||
printf("%.10f\n", fabs(ans*0.5/T));
|
||||
}
|
||||
return 0;
|
||||
}
|
75
HDOJ/4698_autoAC.cpp
Normal file
75
HDOJ/4698_autoAC.cpp
Normal file
|
@ -0,0 +1,75 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#define LL long long
|
||||
#define mod 1000000007
|
||||
#define M 1005
|
||||
#define INF 0x7fffffff
|
||||
using namespace std;
|
||||
struct Point
|
||||
{
|
||||
int x, y;
|
||||
bool operator < (const Point &temp) const
|
||||
{
|
||||
if(x!=temp.x) return x<temp.x;
|
||||
else return y<temp.y;
|
||||
}
|
||||
int readPoint()
|
||||
{
|
||||
return scanf("%d%d", &x, &y);
|
||||
}
|
||||
} p[M];
|
||||
int n, m, k;
|
||||
int val[M];
|
||||
set<int>sset;
|
||||
set<int>::iterator it;
|
||||
int main ()
|
||||
{
|
||||
while(~scanf("%d%d%d", &n, &m, &k))
|
||||
{
|
||||
for(int i = 1; i <= k; ++i)
|
||||
{
|
||||
p[i].readPoint();
|
||||
val[i] = p[i].x;
|
||||
}
|
||||
sort(p+1, p+1+k);
|
||||
sort(val+1, val+1+k);
|
||||
int tot = unique(val+1, val+1+k) - val;
|
||||
val[0] = 0;
|
||||
val[tot] = n+1;
|
||||
LL ans = 0;
|
||||
for(int i = 1; i < tot; ++i)
|
||||
{
|
||||
LL tt = 0;
|
||||
int pre = val[i]-val[i-1];
|
||||
int r;
|
||||
for(r = 1; r <= k && p[r].x < val[i]; ++r);
|
||||
sset.clear();
|
||||
sset.insert(0);
|
||||
sset.insert(m+1);
|
||||
for(int j = i; j < tot; ++j)
|
||||
{
|
||||
int top, bottom;
|
||||
for( ; r <= k && p[r].x == val[j]; ++r)
|
||||
{
|
||||
if(sset.count(p[r].y)) continue;
|
||||
it = sset.lower_bound(p[r].y);
|
||||
top = *it;
|
||||
bottom = *(--it);
|
||||
tt = (tt+(LL)(top-p[r].y)*(p[r].y-bottom)%mod)%mod;
|
||||
sset.insert(p[r].y);
|
||||
}
|
||||
int rear = val[j+1]-val[j];
|
||||
ans = (ans+tt*rear%mod*pre%mod)%mod;
|
||||
}
|
||||
}
|
||||
printf("%I64d\n", ans);
|
||||
}
|
||||
return 0;
|
||||
}
|
91
HDOJ/4699_autoAC.cpp
Normal file
91
HDOJ/4699_autoAC.cpp
Normal file
|
@ -0,0 +1,91 @@
|
|||
#include<iostream>
|
||||
#include<cstdio>
|
||||
#include<vector>
|
||||
using namespace std;
|
||||
#define max(a,b) a>b?a:b
|
||||
#define min(a,b) a<b?a:b
|
||||
struct node
|
||||
{
|
||||
int sum;
|
||||
int m;
|
||||
int v;
|
||||
}ne,cur;
|
||||
vector<node>a,b;
|
||||
int main()
|
||||
{
|
||||
int num,j,n;
|
||||
char k;
|
||||
while(scanf("%d",&num)!=EOF)
|
||||
{
|
||||
a.clear();
|
||||
b.clear();
|
||||
while(num--)
|
||||
{
|
||||
getchar();
|
||||
scanf("%c",&k);
|
||||
if(k=='I')
|
||||
{
|
||||
scanf("%d",&n);
|
||||
ne.m=n;
|
||||
ne.v=n;
|
||||
ne.sum=n;
|
||||
if(a.size()==0)
|
||||
a.push_back(ne);
|
||||
else
|
||||
{
|
||||
int sz=a.size();
|
||||
cur=a[sz-1];
|
||||
ne.sum = cur.sum + ne.v;
|
||||
ne.m = max(ne.sum,cur.m);
|
||||
a.push_back(ne);
|
||||
}
|
||||
}
|
||||
else if(k=='L')
|
||||
{
|
||||
int sz = a.size() ;
|
||||
if(sz)
|
||||
{
|
||||
cur = a[sz-1] ;
|
||||
a.pop_back();
|
||||
b.push_back(cur);
|
||||
}
|
||||
}
|
||||
else if(k=='R')
|
||||
{
|
||||
j = b.size();
|
||||
if(j)
|
||||
{
|
||||
ne=b[j-1];
|
||||
b.pop_back();
|
||||
ne.sum=ne.v;
|
||||
ne.m=ne.v;
|
||||
int sz = a.size();
|
||||
if(sz==0)
|
||||
{
|
||||
ne.sum=ne.v;
|
||||
ne.m=ne.v;
|
||||
a.push_back(ne);
|
||||
}
|
||||
else
|
||||
{
|
||||
cur = a[sz-1];
|
||||
ne.sum = cur.sum + ne.v;
|
||||
ne.m = max(ne.sum,cur.m);
|
||||
a.push_back(ne);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(k=='D')
|
||||
{
|
||||
if(a.size())
|
||||
a.pop_back();
|
||||
}
|
||||
else if(k=='Q')
|
||||
{
|
||||
scanf("%d",&n);
|
||||
printf("%d\n",a[n-1].m);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user