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
5400-5504(END by now)
This commit is contained in:
parent
6d0ead9b6a
commit
b39288d6ef
61
HDOJ/5400_autoAC.cpp
Normal file
61
HDOJ/5400_autoAC.cpp
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int MAXN= 100002;
|
||||||
|
int a[MAXN], m, n, b1, b2, len[MAXN], ch[MAXN];
|
||||||
|
long long ans;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
while(scanf("%d%d%d", &n, &b1, &b2) != -1)
|
||||||
|
{
|
||||||
|
for(i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
}
|
||||||
|
ans = 0;
|
||||||
|
len[1] = 1;
|
||||||
|
for(i = 2; i <= n; i++)
|
||||||
|
{
|
||||||
|
ch[i] = a[i] - a[i-1];
|
||||||
|
if(i == 2)
|
||||||
|
{
|
||||||
|
if(a[2]-a[1] == b1 || a[2] - a[1] == b2)
|
||||||
|
len[i] = 2;
|
||||||
|
else len[i] = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(ch[i] == ch[i-1])
|
||||||
|
{
|
||||||
|
if(ch[i] == b1 || ch[i] == b2)
|
||||||
|
len[i] = len[i-1] + 1;
|
||||||
|
else
|
||||||
|
len[i] = 1;
|
||||||
|
}
|
||||||
|
else if(ch[i] == b2 && ch[i-1] == b1)
|
||||||
|
{
|
||||||
|
len[i] = len[i-1] + 1;
|
||||||
|
}
|
||||||
|
else if(ch[i] == b1 || ch[i] == b2)
|
||||||
|
{
|
||||||
|
len[i] = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
len[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(i = 1; i<= n; i++)
|
||||||
|
{
|
||||||
|
ans += len[i];
|
||||||
|
}
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
51
HDOJ/5401_autoAC.cpp
Normal file
51
HDOJ/5401_autoAC.cpp
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<vector>
|
||||||
|
#include<cmath>
|
||||||
|
#include<string.h>
|
||||||
|
#include<set>
|
||||||
|
#include<map>
|
||||||
|
#include<queue>
|
||||||
|
#include<math.h>
|
||||||
|
#define ll long long
|
||||||
|
#define pi acos(-1)
|
||||||
|
#define PLL pair<ll,ll>
|
||||||
|
#define PLLL pair<PLL,ll>
|
||||||
|
#define MP make_pair
|
||||||
|
using namespace std;
|
||||||
|
const ll mod = 1e9+7;
|
||||||
|
const ll maxn= 1000+10;
|
||||||
|
ll m,a[maxn],b[maxn],c[maxn],d[maxn],l[maxn],ans[maxn],s[maxn],cc[maxn],dd[maxn];
|
||||||
|
map<PLLL,ll> ma;
|
||||||
|
ll calc(ll p,ll x,ll y){
|
||||||
|
if(p==0) return 0;
|
||||||
|
PLLL r=MP(MP(p,x),y);
|
||||||
|
if(ma.find(r)!=ma.end()) return ma[r];
|
||||||
|
if(x<s[a[p]]&&y<s[a[p]]) return ma[r]=(calc(a[p],x,y)%mod);
|
||||||
|
else if(x<s[a[p]]&&y>=s[a[p]]) return ma[r]=(calc(a[p],x,c[p])+calc(b[p],y-s[a[p]],d[p])+l[p])%mod;
|
||||||
|
else if(x>=s[a[p]]&&y<s[a[p]]) return ma[r]=(calc(a[p],y,c[p])+calc(b[p],x-s[a[p]],d[p])+l[p])%mod;
|
||||||
|
else return ma[r]=(calc(b[p],x-s[a[p]],y-s[a[p]])%mod);
|
||||||
|
}
|
||||||
|
ll solve(ll p,ll id){
|
||||||
|
if(p==0) return 0;
|
||||||
|
if(id<s[a[p]])
|
||||||
|
return ((calc(a[p],id,c[p])+l[p])%mod*(s[b[p]]%mod)%mod+(dd[p]+solve(a[p],id))%mod)%mod;
|
||||||
|
else{
|
||||||
|
id=(id-s[a[p]]);
|
||||||
|
return ((calc(b[p],id,d[p])+l[p])%mod*(s[a[p]]%mod)%mod+(cc[p]+solve(b[p],id))%mod)%mod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
while(scanf("%lld",&m)!=EOF){
|
||||||
|
s[0]=1; a[0]=b[0]=c[0]=d[0]=cc[0]=dd[0]=l[0]=0; ma.clear();
|
||||||
|
for(ll i=1;i<=m;i++) s[i]=ans[i]=0;
|
||||||
|
for(ll i=1;i<=m;i++){
|
||||||
|
scanf("%lld%lld%lld%lld%lld",&a[i],&b[i],&c[i],&d[i],&l[i]); s[i]=s[a[i]]+s[b[i]];
|
||||||
|
cc[i]=solve(a[i],c[i])%mod,dd[i]=solve(b[i],d[i])%mod;
|
||||||
|
ans[i]=((cc[i]*(s[b[i]]%mod)%mod)+(dd[i]*(s[a[i]]%mod)%mod)+l[i]%mod*(s[a[i]]%mod)%mod*(s[b[i]]%mod)%mod+(ans[a[i]]+ans[b[i]])%mod)%mod;
|
||||||
|
printf("%lld\n",ans[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
105
HDOJ/5402_autoAC.cpp
Normal file
105
HDOJ/5402_autoAC.cpp
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||||
|
#include<set>
|
||||||
|
#include<map>
|
||||||
|
#include<queue>
|
||||||
|
#include<stack>
|
||||||
|
#include<cmath>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<vector>
|
||||||
|
#include<string>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<functional>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const LL base = 1e9 + 7;
|
||||||
|
const int maxn = 105;
|
||||||
|
LL T, n, m, a[maxn][maxn], sum, x, y;
|
||||||
|
inline void read(int &x)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
while ((ch = getchar())<'0' || ch>'9');
|
||||||
|
x = ch - '0';
|
||||||
|
while ((ch = getchar()) >= '0' && ch <= '9') x = x * 10 + ch - '0';
|
||||||
|
}
|
||||||
|
void get()
|
||||||
|
{
|
||||||
|
x = 1; y = 2;
|
||||||
|
for (int i = 1; i <= n;i++)
|
||||||
|
for (int j = 1; j <= m; j++)
|
||||||
|
if (((i + j) & 1) && a[x][y] > a[i][j]) x = i, y = j;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
while (scanf("%lld%lld", &n, &m) !=EOF)
|
||||||
|
{
|
||||||
|
sum = 0;
|
||||||
|
for (int i = 1; i <= n;i++)
|
||||||
|
for (int j = 1; j <= m; j++)
|
||||||
|
{
|
||||||
|
scanf("%lld", &a[i][j]);
|
||||||
|
sum += a[i][j];
|
||||||
|
}
|
||||||
|
if (n & 1 || m & 1)
|
||||||
|
{
|
||||||
|
printf("%lld\n", sum);
|
||||||
|
if (n & 1)
|
||||||
|
{
|
||||||
|
for (int i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j < m; j++)
|
||||||
|
if (i & 1) printf("R"); else printf("L");
|
||||||
|
if (i < n) printf("D"); else printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 1; i <= m; i++)
|
||||||
|
{
|
||||||
|
for (int j = 1; j < n; j++)
|
||||||
|
if (i & 1) printf("D"); else printf("U");
|
||||||
|
if (i < m) printf("R"); else printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
get();
|
||||||
|
printf("%lld\n", sum - a[x][y]);
|
||||||
|
for (int i = 1; i <= n; i += 2)
|
||||||
|
{
|
||||||
|
if (x == i || x == i + 1)
|
||||||
|
{
|
||||||
|
for (int j = 1; j < y; j++)
|
||||||
|
{
|
||||||
|
if (j & 1) printf("D"); else printf("U");
|
||||||
|
printf("R");
|
||||||
|
}
|
||||||
|
if (y < m) printf("R");
|
||||||
|
for (int j = y + 1; j <= m; j++)
|
||||||
|
{
|
||||||
|
if (j & 1) printf("U"); else printf("D");
|
||||||
|
if (j < m) printf("R");
|
||||||
|
}
|
||||||
|
if (i < n - 1) printf("D");
|
||||||
|
}
|
||||||
|
else if (i < x)
|
||||||
|
{
|
||||||
|
for (int j = 1; j < m; j++) printf("R");
|
||||||
|
printf("D");
|
||||||
|
for (int j = 1; j < m; j++) printf("L");
|
||||||
|
printf("D");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int j = 1; j < m; j++) printf("L");
|
||||||
|
printf("D");
|
||||||
|
for (int j = 1; j < m; j++) printf("R");
|
||||||
|
if (i < n - 1) printf("D");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
182
HDOJ/5405_autoAC.cpp
Normal file
182
HDOJ/5405_autoAC.cpp
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<iostream>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
#define maxn 200007
|
||||||
|
#define inf 1000000000
|
||||||
|
#define ll long long
|
||||||
|
ll mod = 1000000007;
|
||||||
|
struct Node{
|
||||||
|
Node *fa,*ch[2];
|
||||||
|
bool rev,root;
|
||||||
|
ll val,s1,s2,s3,s4;
|
||||||
|
};
|
||||||
|
Node pool[maxn];
|
||||||
|
Node *nil,*tree[maxn];
|
||||||
|
int cnt = 0;
|
||||||
|
void init(){
|
||||||
|
cnt = 1;
|
||||||
|
nil = tree[0] = pool;
|
||||||
|
nil->ch[0] = nil->ch[1] = nil;
|
||||||
|
nil->s1 = nil->s2 = nil->val = nil->s3 = nil->s4 = 0;
|
||||||
|
}
|
||||||
|
Node *newnode(ll val,Node *f){
|
||||||
|
pool[cnt].fa = f;
|
||||||
|
pool[cnt].ch[0]=pool[cnt].ch[1]=nil;
|
||||||
|
pool[cnt].rev = false;
|
||||||
|
pool[cnt].root = true;
|
||||||
|
pool[cnt].val = val;
|
||||||
|
pool[cnt].s1 = 0;
|
||||||
|
pool[cnt].s2 = 0;
|
||||||
|
pool[cnt].s3 = 0;
|
||||||
|
pool[cnt].s4 = 0;
|
||||||
|
return &pool[cnt++];
|
||||||
|
}
|
||||||
|
void update_rev(Node *x){
|
||||||
|
if(x == nil) return ;
|
||||||
|
x->rev = !x->rev;
|
||||||
|
swap(x->ch[0],x->ch[1]);
|
||||||
|
}
|
||||||
|
void update(Node *x){
|
||||||
|
if(x == nil) return ;
|
||||||
|
x->s2 = x->s1 + x->val;
|
||||||
|
x->s4 = x->s3;
|
||||||
|
if(x->ch[0] != nil){
|
||||||
|
x->s2 += x->ch[0]->s2;
|
||||||
|
if(x->s2 >= mod)
|
||||||
|
x->s2 -= mod;
|
||||||
|
x->s4 += x->ch[0]->s4;
|
||||||
|
x->s4 %= mod;
|
||||||
|
}
|
||||||
|
if(x->ch[1] != nil){
|
||||||
|
x->s2 += x->ch[1]->s2;
|
||||||
|
if(x->s2 >= mod)
|
||||||
|
x->s2 -= mod;
|
||||||
|
x->s4 += x->ch[1]->s4;
|
||||||
|
x->s4 %= mod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void pushdown(Node *x){
|
||||||
|
if(x->rev != false){
|
||||||
|
update_rev(x->ch[0]);
|
||||||
|
update_rev(x->ch[1]);
|
||||||
|
x->rev = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void push(Node *x){
|
||||||
|
if(!x->root) push(x->fa);
|
||||||
|
pushdown(x);
|
||||||
|
}
|
||||||
|
void rotate(Node *x){
|
||||||
|
Node *f = x->fa, *ff = f->fa;
|
||||||
|
int t = (f->ch[1] == x);
|
||||||
|
if(f->root)
|
||||||
|
x->root = true, f->root = false;
|
||||||
|
else ff->ch[ff->ch[1] == f] = x;
|
||||||
|
x->fa = ff;
|
||||||
|
f->ch[t] = x->ch[t^1];
|
||||||
|
x->ch[t^1]->fa = f;
|
||||||
|
x->ch[t^1] = f;
|
||||||
|
f->fa = x;
|
||||||
|
update(f);
|
||||||
|
}
|
||||||
|
void splay(Node *x){
|
||||||
|
push(x);
|
||||||
|
Node *f, *ff;
|
||||||
|
while(!x->root){
|
||||||
|
f = x->fa,ff = f->fa;
|
||||||
|
if(!f->root)
|
||||||
|
if((ff->ch[1]==f)&&(f->ch[1] == x)) rotate(f);
|
||||||
|
else rotate(x);
|
||||||
|
rotate(x);
|
||||||
|
}
|
||||||
|
update(x);
|
||||||
|
}
|
||||||
|
Node *access(Node *x){
|
||||||
|
Node *y = nil,*z;
|
||||||
|
while(x != nil){
|
||||||
|
splay(x);
|
||||||
|
z = x->ch[1];
|
||||||
|
x->ch[1]->root = true;
|
||||||
|
(x->ch[1] = y)->root = false;
|
||||||
|
update(z);
|
||||||
|
x->s1 += z->s2;
|
||||||
|
x->s3 += (z->s2*z->s2);
|
||||||
|
x->s1 %= mod;
|
||||||
|
x->s3 %= mod;
|
||||||
|
x->s1 -= y->s2;
|
||||||
|
x->s3 -= y->s2*y->s2;
|
||||||
|
x->s1 %= mod;
|
||||||
|
x->s3 %= mod;
|
||||||
|
update(x);
|
||||||
|
y = x;
|
||||||
|
x = x->fa;
|
||||||
|
}
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
void be_root(Node *x){
|
||||||
|
access(x);
|
||||||
|
splay(x);
|
||||||
|
update_rev(x);
|
||||||
|
}
|
||||||
|
int value[maxn];
|
||||||
|
vector<int> head[maxn];
|
||||||
|
void dfs(int u,int f){
|
||||||
|
tree[u]->fa = tree[f];
|
||||||
|
for(int i = 0;i < head[u].size() ;i++){
|
||||||
|
int v = head[u][i];
|
||||||
|
if(v == f) continue;
|
||||||
|
dfs(v,u);
|
||||||
|
tree[u]->s1 += tree[v]->s2;
|
||||||
|
tree[u]->s1 %= mod;
|
||||||
|
tree[u]->s3 += tree[v]->s2*tree[v]->s2;
|
||||||
|
tree[u]->s3 %= mod;
|
||||||
|
}
|
||||||
|
update(tree[u]);
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int n,m;
|
||||||
|
while(scanf("%d%d",&n,&m)!=EOF){
|
||||||
|
for(int i = 1;i <= n; i++)
|
||||||
|
scanf("%d",&value[i]);
|
||||||
|
for(int i = 0;i <= n; i++)
|
||||||
|
head[i].clear();
|
||||||
|
int u,v;
|
||||||
|
for(int i = 1;i < n; i++){
|
||||||
|
scanf("%d%d",&v,&u);
|
||||||
|
head[v].push_back(u);
|
||||||
|
head[u].push_back(v);
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
for(int i=1;i <= n;i++)
|
||||||
|
tree[i] = newnode(value[i],nil);
|
||||||
|
dfs(1,0);
|
||||||
|
ll total = 0;
|
||||||
|
for(int i = 1;i <= n; i++)
|
||||||
|
total += value[i];
|
||||||
|
total %= mod;
|
||||||
|
int t;
|
||||||
|
for(int i = 0;i < m; i++){
|
||||||
|
scanf("%d%d%d",&t,&u,&v);
|
||||||
|
if(t == 1){
|
||||||
|
be_root(tree[u]);
|
||||||
|
access(tree[u]);
|
||||||
|
total = total + v - tree[u]->val;
|
||||||
|
total %= mod;
|
||||||
|
tree[u]->val = v;
|
||||||
|
update(tree[u]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
be_root(tree[u]);
|
||||||
|
access(tree[v]);
|
||||||
|
splay(tree[v]);
|
||||||
|
ll ans = total*total%mod-tree[v]->s4;
|
||||||
|
ans = (ans%mod+mod)%mod;
|
||||||
|
printf("%I64d\n",ans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
457
HDOJ/5406_autoAC.cpp
Normal file
457
HDOJ/5406_autoAC.cpp
Normal file
|
@ -0,0 +1,457 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
#include <cstring>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <queue>
|
||||||
|
#include <sstream>
|
||||||
|
using namespace std;
|
||||||
|
const int MAXN = 1005;
|
||||||
|
struct A{
|
||||||
|
int H, D;
|
||||||
|
bool operator<(const A rhs)const{
|
||||||
|
if(H != rhs.H)
|
||||||
|
return H > rhs.H;
|
||||||
|
else
|
||||||
|
return D < rhs.D;
|
||||||
|
}
|
||||||
|
}arr[MAXN];
|
||||||
|
int N;
|
||||||
|
int dval[MAXN], dvn;
|
||||||
|
#define MAXP 2010
|
||||||
|
#define MAXQ 1000005
|
||||||
|
#define MAXI 0x7fffffff
|
||||||
|
#define MAXC 0x0fffffff
|
||||||
|
#define BIGM MAXC
|
||||||
|
struct EDGE{
|
||||||
|
int st, ed;
|
||||||
|
int flow;
|
||||||
|
int low;
|
||||||
|
int upf;
|
||||||
|
int cost;
|
||||||
|
int hnext;
|
||||||
|
int tnext;
|
||||||
|
int hprev;
|
||||||
|
int tprev;
|
||||||
|
char set;
|
||||||
|
}edge[MAXQ+MAXP];
|
||||||
|
int ecnt;
|
||||||
|
int ecnt2;
|
||||||
|
int sece;
|
||||||
|
bool search_method;
|
||||||
|
struct NODE{
|
||||||
|
int head;
|
||||||
|
int tail;
|
||||||
|
int d;
|
||||||
|
int pi;
|
||||||
|
int pred;
|
||||||
|
int depth;
|
||||||
|
}node[MAXP];
|
||||||
|
int ncnt;
|
||||||
|
struct LOOP{
|
||||||
|
int e;
|
||||||
|
int prev;
|
||||||
|
int next;
|
||||||
|
}loop[MAXP+3];
|
||||||
|
int lcnt;
|
||||||
|
int addedge(int a, int b, int low, int upf, int cost, int &cnt)
|
||||||
|
{
|
||||||
|
edge[cnt].st = a;
|
||||||
|
edge[cnt].ed = b;
|
||||||
|
edge[cnt].low = low;
|
||||||
|
edge[cnt].upf = upf;
|
||||||
|
edge[cnt].cost = cost;
|
||||||
|
edge[cnt].hnext = -1;
|
||||||
|
edge[cnt].tnext = -1;
|
||||||
|
edge[cnt].hprev = -1;
|
||||||
|
edge[cnt].tprev = -1;
|
||||||
|
cnt++;
|
||||||
|
return (cnt - 1);
|
||||||
|
}
|
||||||
|
void insert_tree(int j)
|
||||||
|
{
|
||||||
|
int a, b;
|
||||||
|
a = edge[j].st;
|
||||||
|
b = edge[j].ed;
|
||||||
|
edge[j].hprev = -1;
|
||||||
|
edge[j].hnext = node[a].head;
|
||||||
|
if(node[a].head >= 0)
|
||||||
|
edge[node[a].head].hprev = j;
|
||||||
|
node[a].head = j;
|
||||||
|
edge[j].tprev = -1;
|
||||||
|
edge[j].tnext = node[b].tail;
|
||||||
|
if(node[b].tail >= 0)
|
||||||
|
edge[node[b].tail].tprev = j;
|
||||||
|
node[b].tail = j;
|
||||||
|
}
|
||||||
|
void delete_tree(int j)
|
||||||
|
{
|
||||||
|
int a, b;
|
||||||
|
a = edge[j].st;
|
||||||
|
b = edge[j].ed;
|
||||||
|
if(edge[j].hprev >= 0)
|
||||||
|
{
|
||||||
|
edge[edge[j].hprev].hnext = edge[j].hnext;
|
||||||
|
}else{
|
||||||
|
node[a].head = edge[j].hnext;
|
||||||
|
}
|
||||||
|
if(edge[j].hnext >= 0)
|
||||||
|
{
|
||||||
|
edge[edge[j].hnext].hprev = edge[j].hprev;
|
||||||
|
}
|
||||||
|
edge[j].hprev = -1;
|
||||||
|
edge[j].hnext = -1;
|
||||||
|
if(edge[j].tprev >= 0)
|
||||||
|
{
|
||||||
|
edge[edge[j].tprev].tnext = edge[j].tnext;
|
||||||
|
}else{
|
||||||
|
node[b].tail = edge[j].tnext;
|
||||||
|
}
|
||||||
|
if(edge[j].tnext >= 0)
|
||||||
|
{
|
||||||
|
edge[edge[j].tnext].tprev = edge[j].tprev;
|
||||||
|
}
|
||||||
|
edge[j].tprev = -1;
|
||||||
|
edge[j].tnext = -1;
|
||||||
|
}
|
||||||
|
void M_init()
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
node[0].d = 0;
|
||||||
|
node[0].head = -1;
|
||||||
|
node[0].tail = -1;
|
||||||
|
for(i=0;i<ecnt;i++)
|
||||||
|
{
|
||||||
|
edge[i].flow = edge[i].low;
|
||||||
|
edge[i].set = 'L';
|
||||||
|
node[edge[i].st].d -= edge[i].low;
|
||||||
|
node[edge[i].ed].d += edge[i].low;
|
||||||
|
}
|
||||||
|
ecnt2 = ecnt;
|
||||||
|
for(i=1;i<=ncnt;i++)
|
||||||
|
{
|
||||||
|
if(node[i].d > 0)
|
||||||
|
{
|
||||||
|
j = addedge(i, 0, 0, MAXC, BIGM, ecnt2);
|
||||||
|
edge[j].flow = node[i].d;
|
||||||
|
}else{
|
||||||
|
j = addedge(0, i, 0, MAXC, BIGM, ecnt2);
|
||||||
|
edge[j].flow = -node[i].d;
|
||||||
|
}
|
||||||
|
edge[j].set = 'T';
|
||||||
|
insert_tree(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void calc_pi(int root, int val, int dep, int pred)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
node[root].pi = val;
|
||||||
|
node[root].depth = dep;
|
||||||
|
node[root].pred = pred;
|
||||||
|
for(j=node[root].head;j!=-1;j=edge[j].hnext)
|
||||||
|
{
|
||||||
|
if(j != pred)
|
||||||
|
{
|
||||||
|
calc_pi(edge[j].ed, val - edge[j].cost, dep + 1, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(j=node[root].tail;j!=-1;j=edge[j].tnext)
|
||||||
|
{
|
||||||
|
if(j != pred)
|
||||||
|
{
|
||||||
|
calc_pi(edge[j].st, val + edge[j].cost, dep + 1, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int calc_dual1()
|
||||||
|
{
|
||||||
|
int i, ret = -1, dual0 = -1, dual;
|
||||||
|
for(i=0;i<ecnt2;i++)
|
||||||
|
{
|
||||||
|
dual = edge[i].cost - node[edge[i].st].pi + node[edge[i].ed].pi;
|
||||||
|
if((edge[i].set == 'L' && dual < 0)||(edge[i].set == 'U' && dual > 0))
|
||||||
|
{
|
||||||
|
dual = labs(dual);
|
||||||
|
if(dual > dual0)
|
||||||
|
{
|
||||||
|
ret = i;
|
||||||
|
dual0 = dual;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int calc_dual2()
|
||||||
|
{
|
||||||
|
int i, dual;
|
||||||
|
for(i=sece;i<ecnt2;i++)
|
||||||
|
{
|
||||||
|
dual = edge[i].cost - node[edge[i].st].pi + node[edge[i].ed].pi;
|
||||||
|
if((edge[i].set == 'L' && dual < 0)||(edge[i].set == 'U' && dual > 0))
|
||||||
|
{
|
||||||
|
sece = i + 1;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(i=0;i<sece;i++)
|
||||||
|
{
|
||||||
|
dual = edge[i].cost - node[edge[i].st].pi + node[edge[i].ed].pi;
|
||||||
|
if((edge[i].set == 'L' && dual < 0)||(edge[i].set == 'U' && dual > 0))
|
||||||
|
{
|
||||||
|
sece = i + 1;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bool augment(int rda)
|
||||||
|
{
|
||||||
|
int p, q;
|
||||||
|
int pl, ql, pp, qp, maxflow;
|
||||||
|
bool flagp, flagq, flag, ret;
|
||||||
|
lcnt = 0;
|
||||||
|
if(edge[rda].set == 'L')
|
||||||
|
{
|
||||||
|
p = edge[rda].st;
|
||||||
|
q = edge[rda].ed;
|
||||||
|
}else{
|
||||||
|
q = edge[rda].st;
|
||||||
|
p = edge[rda].ed;
|
||||||
|
}
|
||||||
|
loop[lcnt].e = rda;
|
||||||
|
loop[lcnt].prev = 1;
|
||||||
|
loop[lcnt].next = 2;
|
||||||
|
pl = 1;
|
||||||
|
ql = 2;
|
||||||
|
loop[pl].e = -1;
|
||||||
|
loop[pl].next = 0;
|
||||||
|
loop[pl].prev = -1;
|
||||||
|
loop[ql].e = -1;
|
||||||
|
loop[ql].next = -1;
|
||||||
|
loop[ql].prev = 0;
|
||||||
|
lcnt = 3;
|
||||||
|
maxflow = edge[rda].upf - edge[rda].low;
|
||||||
|
while(p != q)
|
||||||
|
{
|
||||||
|
if(node[p].depth > node[q].depth)
|
||||||
|
{
|
||||||
|
flagp = true;
|
||||||
|
flagq = false;
|
||||||
|
}else if(node[p].depth < node[q].depth)
|
||||||
|
{
|
||||||
|
flagp = false;
|
||||||
|
flagq = true;
|
||||||
|
}else{
|
||||||
|
flagp = true;
|
||||||
|
flagq = true;
|
||||||
|
}
|
||||||
|
if(flagp)
|
||||||
|
{
|
||||||
|
pp = node[p].pred;
|
||||||
|
if(edge[pp].ed == p)
|
||||||
|
{
|
||||||
|
maxflow = min(maxflow, edge[pp].upf - edge[pp].flow);
|
||||||
|
p = edge[pp].st;
|
||||||
|
}else{
|
||||||
|
maxflow = min(maxflow, edge[pp].flow - edge[pp].low);
|
||||||
|
p = edge[pp].ed;
|
||||||
|
}
|
||||||
|
loop[pl].e = pp;
|
||||||
|
loop[pl].prev = lcnt;
|
||||||
|
loop[lcnt].e = -1;
|
||||||
|
loop[lcnt].next = pl;
|
||||||
|
loop[lcnt].prev = -1;
|
||||||
|
pl = lcnt;
|
||||||
|
lcnt++;
|
||||||
|
}
|
||||||
|
if(flagq)
|
||||||
|
{
|
||||||
|
qp = node[q].pred;
|
||||||
|
if(edge[qp].st == q)
|
||||||
|
{
|
||||||
|
maxflow = min(maxflow, edge[qp].upf - edge[qp].flow);
|
||||||
|
q = edge[qp].ed;
|
||||||
|
}else{
|
||||||
|
maxflow = min(maxflow, edge[qp].flow - edge[qp].low);
|
||||||
|
q = edge[qp].st;
|
||||||
|
}
|
||||||
|
loop[ql].e = qp;
|
||||||
|
loop[ql].next = lcnt;
|
||||||
|
loop[lcnt].e = -1;
|
||||||
|
loop[lcnt].next = -1;
|
||||||
|
loop[lcnt].prev = ql;
|
||||||
|
ql = lcnt;
|
||||||
|
lcnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flag = false;
|
||||||
|
while(loop[pl].next >= 0)
|
||||||
|
{
|
||||||
|
pl = loop[pl].next;
|
||||||
|
ql = loop[pl].e;
|
||||||
|
if(ql == -1)
|
||||||
|
break;
|
||||||
|
if(ql == rda)
|
||||||
|
{
|
||||||
|
ret = (flag == (edge[rda].set == 'L'));
|
||||||
|
}
|
||||||
|
if(edge[ql].st == p)
|
||||||
|
{
|
||||||
|
edge[ql].flow += maxflow;
|
||||||
|
if(!flag && (edge[ql].flow == edge[ql].upf))
|
||||||
|
{
|
||||||
|
edge[ql].set = 'U';
|
||||||
|
flag = true;
|
||||||
|
delete_tree(ql);
|
||||||
|
}else{
|
||||||
|
edge[ql].set = 'T';
|
||||||
|
}
|
||||||
|
p = edge[ql].ed;
|
||||||
|
}else{
|
||||||
|
edge[ql].flow -= maxflow;
|
||||||
|
if(!flag && (edge[ql].flow == edge[ql].low))
|
||||||
|
{
|
||||||
|
edge[ql].set = 'L';
|
||||||
|
flag = true;
|
||||||
|
delete_tree(ql);
|
||||||
|
}else{
|
||||||
|
edge[ql].set = 'T';
|
||||||
|
}
|
||||||
|
p = edge[ql].st;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
bool NSMCalc(int &cost)
|
||||||
|
{
|
||||||
|
int rda, i;
|
||||||
|
M_init();
|
||||||
|
calc_pi(0, 0, 0, -1);
|
||||||
|
rda = (search_ ? calc_dual1() : calc_dual2());
|
||||||
|
while(rda >= 0)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
insert_tree(rda);
|
||||||
|
if(augment(rda))
|
||||||
|
{
|
||||||
|
i = edge[rda].st;
|
||||||
|
j = edge[rda].ed;
|
||||||
|
calc_pi(i, node[j].pi + edge[rda].cost, node[j].depth + 1, rda);
|
||||||
|
}else{
|
||||||
|
i = edge[rda].ed;
|
||||||
|
j = edge[rda].st;
|
||||||
|
calc_pi(i, node[j].pi - edge[rda].cost, node[j].depth + 1, rda);
|
||||||
|
}
|
||||||
|
rda = (search_ ? calc_dual1() : calc_dual2());
|
||||||
|
}
|
||||||
|
for(i=ecnt;i<ecnt2;i++)
|
||||||
|
{
|
||||||
|
if(edge[i].flow > 0)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
cost = 0;
|
||||||
|
for(i=0;i<ecnt;i++)
|
||||||
|
{
|
||||||
|
cost += edge[i].flow * edge[i].cost;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void init_graph(int pointnum, bool method)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
ncnt = pointnum;
|
||||||
|
ecnt = 0;
|
||||||
|
sece = 0;
|
||||||
|
for(i=0;i<=ncnt;i++)
|
||||||
|
{
|
||||||
|
node[i].d = 0;
|
||||||
|
node[i].head = -1;
|
||||||
|
node[i].tail = -1;
|
||||||
|
node[i].pred = -1;
|
||||||
|
node[i].pi = 0;
|
||||||
|
node[i].depth = 0;
|
||||||
|
}
|
||||||
|
search_method = method;
|
||||||
|
}
|
||||||
|
inline char getc(){
|
||||||
|
static const int BUFLEN = 1 << 15;
|
||||||
|
static char B[BUFLEN], *S = B, *T = B;
|
||||||
|
if(S == T){
|
||||||
|
S = B;
|
||||||
|
T = S + fread(B, 1, BUFLEN, stdin);
|
||||||
|
}
|
||||||
|
return (S == T) ? 0 : *(S ++);
|
||||||
|
}
|
||||||
|
int ReadInt(){
|
||||||
|
char ch;
|
||||||
|
do ch = getc(); while(!isdigit(ch));
|
||||||
|
int aa = ch - '0';
|
||||||
|
for(ch = getc(); isdigit(ch); ch = getc())
|
||||||
|
aa = aa * 10 + ch - '0';
|
||||||
|
return aa;
|
||||||
|
}
|
||||||
|
int calc(){
|
||||||
|
int i, j;
|
||||||
|
int ret, mxv;
|
||||||
|
init_graph(N * 2 + 3, false);
|
||||||
|
addedge(0, 1, 0, 2, 0, ecnt);
|
||||||
|
for(i = 1; i <= N; i ++){
|
||||||
|
addedge(1, i + 1, 0, 1, 0, ecnt);
|
||||||
|
addedge(i + N + 1, N * 2 + 2, 0, 1, 0, ecnt);
|
||||||
|
addedge(i + 1, i + N + 1, 0, 1, -1, ecnt);
|
||||||
|
}
|
||||||
|
for(i = 1; i <= N; i ++){
|
||||||
|
mxv = 0x3fffffff;
|
||||||
|
for(j = i + 1; j <= N; j ++){
|
||||||
|
if(arr[j].D < arr[i].D || arr[j].D >= mxv)
|
||||||
|
continue;
|
||||||
|
addedge(i + N + 1, j + 1, 0, 1, 0, ecnt);
|
||||||
|
addedge(i + 1, j + 1, 0, 1, 0, ecnt);
|
||||||
|
mxv = arr[j].D;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node[0].d = 2;
|
||||||
|
node[N * 2 + 2].d = -2;
|
||||||
|
NSMCalc(ret);
|
||||||
|
return - ret;
|
||||||
|
}
|
||||||
|
bool deal1(){
|
||||||
|
int i;
|
||||||
|
for(i = 1; i <= N; i ++){
|
||||||
|
if(arr[i + 1].D < arr[i].D)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
printf("%d\n", N);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void domain(){
|
||||||
|
int i, ans = 0;
|
||||||
|
N = ReadInt();
|
||||||
|
for(i = 1; i <= N; i ++){
|
||||||
|
arr[i].H = ReadInt();
|
||||||
|
arr[i].D = ReadInt();
|
||||||
|
}
|
||||||
|
sort(arr + 1, arr + N + 1);
|
||||||
|
dvn = 0;
|
||||||
|
for(i = 1; i <= N; i ++){
|
||||||
|
dval[dvn ++] = arr[i].D;
|
||||||
|
}
|
||||||
|
sort(dval, dval + dvn);
|
||||||
|
dvn = unique(dval, dval + dvn) - dval;
|
||||||
|
for(i = 1; i <= N; i ++){
|
||||||
|
arr[i].D = lower_bound(dval, dval + dvn, arr[i].D) - dval + 1;
|
||||||
|
}
|
||||||
|
ans = calc();
|
||||||
|
printf("%d\n", ans);
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int T = ReadInt();
|
||||||
|
while(T --){
|
||||||
|
domain();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
47
HDOJ/5407_autoAC.cpp
Normal file
47
HDOJ/5407_autoAC.cpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
#define prt(k) cerr<<#k" = "<<k<<endl
|
||||||
|
typedef long long ll;
|
||||||
|
const int inf = 0x3f3f3f3f;
|
||||||
|
const ll mod = 1e9 + 7;
|
||||||
|
const int N = 1000100;
|
||||||
|
ll p[N];
|
||||||
|
ll a[N];
|
||||||
|
bool ok(ll n)
|
||||||
|
{
|
||||||
|
int t = p[n];
|
||||||
|
while (n % t==0 && n > 1) n /= t;
|
||||||
|
return n==1;
|
||||||
|
}
|
||||||
|
ll pmod(ll a, ll n)
|
||||||
|
{
|
||||||
|
ll ret = 1;
|
||||||
|
for (; n; n>>=1, a=a*a%mod) if (n & 1)
|
||||||
|
ret = ret * a % mod;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ll inv(ll a)
|
||||||
|
{
|
||||||
|
return pmod(a, mod - 2);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
for (int i=1;i<N;i++) p[i]=i;
|
||||||
|
for (int i=2;i<N;i++) if (p[i]==i) {
|
||||||
|
for (int j=i+i;j<N;j+=i) p[j] = i;
|
||||||
|
}
|
||||||
|
a[0] = 1;
|
||||||
|
for (int i=1;i<N;i++) {
|
||||||
|
if (ok(i))
|
||||||
|
a[i] = a[i-1] * p[i] % mod;
|
||||||
|
else
|
||||||
|
a[i] = a[i-1];
|
||||||
|
}
|
||||||
|
int n; int re; cin>>re;
|
||||||
|
while (re--) {
|
||||||
|
scanf("%d", &n);
|
||||||
|
n++;
|
||||||
|
ll ans = a[n] * inv(n) % mod;
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
}
|
77
HDOJ/5409_autoAC.cpp
Normal file
77
HDOJ/5409_autoAC.cpp
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int MAXN = 100005;
|
||||||
|
struct NODE;
|
||||||
|
struct EDGE{
|
||||||
|
NODE *a, *b;
|
||||||
|
EDGE *next;
|
||||||
|
int u;
|
||||||
|
bool bridge;
|
||||||
|
}edge[MAXN << 1];
|
||||||
|
struct NODE{
|
||||||
|
EDGE *head;
|
||||||
|
NODE *par;
|
||||||
|
int DFN, low;
|
||||||
|
int mv;
|
||||||
|
}node[MAXN];
|
||||||
|
int ecnt, dep, n, m;
|
||||||
|
void Tarjan(NODE *x){
|
||||||
|
x->DFN = x->low = ++ dep;
|
||||||
|
for(EDGE *j = x->head; j; j = j->next){
|
||||||
|
NODE *p = j->b;
|
||||||
|
if(p == x->par)
|
||||||
|
continue;
|
||||||
|
if(!p->DFN){
|
||||||
|
p->par = x;
|
||||||
|
Tarjan(p);
|
||||||
|
}
|
||||||
|
j->bridge = p->low > x->DFN;
|
||||||
|
x->low = min(x->low, p->low);
|
||||||
|
x->mv = max(x->mv, p->mv);
|
||||||
|
j->u = j->b->mv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void addedge(NODE *a, NODE *b, int& ecnt){
|
||||||
|
EDGE *j = &edge[ecnt ++];
|
||||||
|
j->a = a;
|
||||||
|
j->b = b;
|
||||||
|
j->next = a->head;
|
||||||
|
a->head = j;
|
||||||
|
j->bridge = false;
|
||||||
|
}
|
||||||
|
void domain(){
|
||||||
|
int i, u, v;
|
||||||
|
scanf("%d%d", &n, &m);
|
||||||
|
ecnt = 0;
|
||||||
|
for(i = 0; i <= n; i ++){
|
||||||
|
node[i].mv = i;
|
||||||
|
node[i].par = nullptr;
|
||||||
|
node[i].DFN = 0;
|
||||||
|
node[i].head = nullptr;
|
||||||
|
}
|
||||||
|
for(i = 0; i < m; i ++){
|
||||||
|
scanf("%d%d", &u, &v);
|
||||||
|
addedge(node + u, node + v, ecnt);
|
||||||
|
addedge(node + v, node + u, ecnt);
|
||||||
|
}
|
||||||
|
dep = 0;
|
||||||
|
Tarjan(node + n);
|
||||||
|
for(i = 0; i < ecnt; ){
|
||||||
|
u = 0;
|
||||||
|
if(edge[i].bridge)
|
||||||
|
u = edge[i].u;
|
||||||
|
i ++;
|
||||||
|
if(edge[i].bridge)
|
||||||
|
u = edge[i].u;
|
||||||
|
i ++;
|
||||||
|
printf("%d %d\n", u, u > 0 ? u + 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int T;
|
||||||
|
scanf("%d", &T);
|
||||||
|
while(T --)
|
||||||
|
domain();
|
||||||
|
return 0;
|
||||||
|
}
|
30
HDOJ/5410_autoAC.cpp
Normal file
30
HDOJ/5410_autoAC.cpp
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int N = 1005;
|
||||||
|
int w[N], a[N], b[N];
|
||||||
|
int dp[N][2005][2];
|
||||||
|
int main(){
|
||||||
|
int t; scanf("%d", &t);
|
||||||
|
while (t--){
|
||||||
|
int m, n; scanf("%d %d", &m, &n);
|
||||||
|
for (int i = 1; i <= n; i++){
|
||||||
|
scanf("%d %d %d", w + i, a + i, b + i);
|
||||||
|
}
|
||||||
|
memset(dp, 0, sizeof dp);
|
||||||
|
for (int i = 1; i <= n; i++){
|
||||||
|
for (int j = 0; j < w[i]; j++){
|
||||||
|
dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1]);
|
||||||
|
dp[i][j][1] = 0;
|
||||||
|
}
|
||||||
|
for (int j = w[i]; j <= m; j++){
|
||||||
|
dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1]);
|
||||||
|
dp[i][j][1] = max(dp[i][j - w[i]][0] + a[i] + b[i], dp[i][j - w[i]][1] + a[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int ans = max(dp[n][m][0], dp[n][m][1]);
|
||||||
|
printf("%d\n", ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
62
HDOJ/5411_autoAC.cpp
Normal file
62
HDOJ/5411_autoAC.cpp
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstring>
|
||||||
|
#include<string>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<ctime>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
const int base = 2015;
|
||||||
|
const int maxn = 100005;
|
||||||
|
int T, n, m, k, kk;
|
||||||
|
struct Matrix
|
||||||
|
{
|
||||||
|
#define size 55
|
||||||
|
int m[size][size];
|
||||||
|
Matrix() { memset(m, 0, sizeof(m)); }
|
||||||
|
void operator =(const Matrix&b) { memcpy(m, b.m, sizeof(m)); }
|
||||||
|
Matrix operator *(const Matrix&b) {
|
||||||
|
Matrix c;
|
||||||
|
for (int i = 0; i < size; i++)
|
||||||
|
for (int j = 0; j < size; j++)
|
||||||
|
for (int k = 0; k < size; k++)
|
||||||
|
c.m[i][k] = (c.m[i][k] + m[i][j] * b.m[j][k]) % base;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
Matrix get(int x)
|
||||||
|
{
|
||||||
|
Matrix a, b = *this;
|
||||||
|
for (int f = 0; x; x >>= 1)
|
||||||
|
{
|
||||||
|
if (x & 1)
|
||||||
|
if (f) a = a * b; else a = b, f = 1;
|
||||||
|
b = b * b;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d", &T);
|
||||||
|
while (T--)
|
||||||
|
{
|
||||||
|
scanf("%d%d", &n, &m);
|
||||||
|
Matrix a, b;
|
||||||
|
for (int i = 1; i <= n + 1; i++) a.m[i][n + 1] = 1;
|
||||||
|
for (int i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
scanf("%d", &k);
|
||||||
|
for (int j = 1; j <= k; j++)
|
||||||
|
{
|
||||||
|
scanf("%d", &kk);
|
||||||
|
a.m[i][kk] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 1; i <= n + 1; i++) b.m[1][i] = 1;
|
||||||
|
a = a.get(m);
|
||||||
|
b = b * a;
|
||||||
|
if (m == 1) printf("%d\n", n + 1);
|
||||||
|
else printf("%d\n", b.m[1][n + 1]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
192
HDOJ/5412_autoAC.cpp
Normal file
192
HDOJ/5412_autoAC.cpp
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
#include <string>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <climits>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <queue>
|
||||||
|
#include <stack>
|
||||||
|
#include <vector>
|
||||||
|
#include <utility>
|
||||||
|
#include <deque>
|
||||||
|
#include <set>
|
||||||
|
#include <map>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const double eps = 1e-9;
|
||||||
|
const double PI = acos(-1.00);
|
||||||
|
const double e = exp(1.0);
|
||||||
|
#define INF 0x3f3f3f3f
|
||||||
|
#define N 600010
|
||||||
|
#define M 100010
|
||||||
|
struct treap
|
||||||
|
{
|
||||||
|
int key,wht,count,sz,ch[2];
|
||||||
|
} tp[N*15];
|
||||||
|
int tree[N<<1];
|
||||||
|
int nodecount,root;
|
||||||
|
int IDX(int l,int r)
|
||||||
|
{
|
||||||
|
return l+r | l!=r;
|
||||||
|
}
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
tp[0].sz=0;
|
||||||
|
tp[0].wht=-INF;
|
||||||
|
nodecount=0;
|
||||||
|
root=0;
|
||||||
|
}
|
||||||
|
void update(int x)
|
||||||
|
{
|
||||||
|
tp[x].sz=tp[tp[x].ch[0]].sz+tp[x].count+tp[tp[x].ch[1]].sz;
|
||||||
|
}
|
||||||
|
void rotate(int &x,int t)
|
||||||
|
{
|
||||||
|
int y=tp[x].ch[t];
|
||||||
|
tp[x].ch[t]=tp[y].ch[!t];
|
||||||
|
tp[y].ch[!t]=x;
|
||||||
|
update(x);
|
||||||
|
update(y);
|
||||||
|
x=y;
|
||||||
|
}
|
||||||
|
void insert(int &x,int t)
|
||||||
|
{
|
||||||
|
if(! x)
|
||||||
|
{
|
||||||
|
x=++nodecount;
|
||||||
|
tp[x].key=t;
|
||||||
|
tp[x].wht=rand();
|
||||||
|
tp[x].count=1;
|
||||||
|
tp[x].ch[0]=tp[x].ch[1]=0;
|
||||||
|
}
|
||||||
|
else if(tp[x].key==t) tp[x].count++;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int k=tp[x].key<t;
|
||||||
|
insert(tp[x].ch[k],t);
|
||||||
|
if(tp[x].wht<tp[tp[x].ch[k]].wht) rotate(x,k);
|
||||||
|
}
|
||||||
|
update(x);
|
||||||
|
}
|
||||||
|
void erase(int &x,int t)
|
||||||
|
{
|
||||||
|
if(tp[x].key==t)
|
||||||
|
{
|
||||||
|
if(tp[x].count==1)
|
||||||
|
{
|
||||||
|
if(! tp[x].ch[0] && ! tp[x].ch[1])
|
||||||
|
{
|
||||||
|
x=0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
rotate(x,tp[tp[x].ch[0]].wht<tp[tp[x].ch[1]].wht);
|
||||||
|
erase(x,t);
|
||||||
|
}
|
||||||
|
else tp[x].count--;
|
||||||
|
}
|
||||||
|
else erase(tp[x].ch[tp[x].key<t],t);
|
||||||
|
update(x);
|
||||||
|
}
|
||||||
|
int select(int x,int t)
|
||||||
|
{
|
||||||
|
if(! x) return 0;
|
||||||
|
if(tp[x].key>t) return select(tp[x].ch[0],t);
|
||||||
|
return tp[x].count+tp[tp[x].ch[0]].sz+select(tp[x].ch[1],t);
|
||||||
|
}
|
||||||
|
int a[N],b[N],ord[M][5],lb;
|
||||||
|
int n,m,tt;
|
||||||
|
int search(int x)
|
||||||
|
{
|
||||||
|
int l=1,r=b[0],mid;
|
||||||
|
while (l<=r)
|
||||||
|
{
|
||||||
|
mid=(l+r)>>1;
|
||||||
|
if(b[mid]==x) return mid;
|
||||||
|
if(b[mid]<x) l=mid+1;
|
||||||
|
else r=mid-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void treeinsert(int l,int r,int i,int x)
|
||||||
|
{
|
||||||
|
insert(tree[IDX(l,r)],x);
|
||||||
|
if(l==r) return;
|
||||||
|
int m=(l+r)>>1;
|
||||||
|
if(i<=m) treeinsert(l,m,i,x);
|
||||||
|
else treeinsert(m+1,r,i,x);
|
||||||
|
}
|
||||||
|
void treedel(int l,int r,int i,int x)
|
||||||
|
{
|
||||||
|
erase(tree[IDX(l,r)],x);
|
||||||
|
if(l==r) return;
|
||||||
|
int m=(l+r)>>1;
|
||||||
|
if(i<=m) treedel(l,m,i,x);
|
||||||
|
else treedel(m+1,r,i,x);
|
||||||
|
}
|
||||||
|
int query(int l,int r,int x,int y,int k)
|
||||||
|
{
|
||||||
|
if(l==r) return l;
|
||||||
|
int m=(l+r)>>1;
|
||||||
|
int ans=select(tree[IDX(l,m)],y)-select(tree[IDX(l,m)],x);
|
||||||
|
if(ans>=k) return query(l,m,x,y,k);
|
||||||
|
return query(m+1,r,x,y,k-ans);
|
||||||
|
}
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
while (~scanf("%d",&n))
|
||||||
|
{
|
||||||
|
b[0]=1;
|
||||||
|
lb=0;
|
||||||
|
memset(tree,0,sizeof(tree));
|
||||||
|
init();
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
{
|
||||||
|
scanf("%d",&a[i]);
|
||||||
|
b[++lb]=a[i];
|
||||||
|
}
|
||||||
|
scanf("%d",&m);
|
||||||
|
for(int i=1; i<=m; i++)
|
||||||
|
{
|
||||||
|
int op;
|
||||||
|
int x,y,c;
|
||||||
|
scanf("%d",&op);
|
||||||
|
if(op == 2)
|
||||||
|
{
|
||||||
|
scanf("%d %d %d",&x,&y,&c);
|
||||||
|
ord[i][1]=1;
|
||||||
|
ord[i][2]=x;
|
||||||
|
ord[i][3]=y;
|
||||||
|
ord[i][4]=c;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scanf("%d %d",&x,&y);
|
||||||
|
ord[i][1]=2;
|
||||||
|
ord[i][2]=x;
|
||||||
|
ord[i][3]=y;
|
||||||
|
b[++lb]=y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort(b+1,b+1+lb);
|
||||||
|
for(int i=1; i<=lb; i++)
|
||||||
|
if(b[i]!=b[b[0]]) b[++b[0]]=b[i];
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
{
|
||||||
|
a[i]=search(a[i]);
|
||||||
|
treeinsert(1,b[0],a[i],i);
|
||||||
|
}
|
||||||
|
for(int i=1; i<=m; i++)
|
||||||
|
{
|
||||||
|
if(ord[i][1]==1)
|
||||||
|
printf("%d\n",b[query(1,b[0],ord[i][2]-1,ord[i][3],ord[i][4])]);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
treedel(1,b[0],a[ord[i][2]],ord[i][2]);
|
||||||
|
a[ord[i][2]]=search(ord[i][3]);
|
||||||
|
treeinsert(1,b[0],a[ord[i][2]],ord[i][2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
97
HDOJ/5413_autoAC.cpp
Normal file
97
HDOJ/5413_autoAC.cpp
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const int MAXN=20000 + 10;
|
||||||
|
const int INF = numeric_limits<int>::max();
|
||||||
|
const LL LL_INF= numeric_limits<LL>::max();
|
||||||
|
int bit[MAXN][MAXN/32+100];
|
||||||
|
struct Edge {
|
||||||
|
int to,next;
|
||||||
|
Edge(){}
|
||||||
|
Edge(int _to,int _next):to(_to),next(_next){}
|
||||||
|
}e[MAXN*10],e2[MAXN*10];
|
||||||
|
int head[MAXN],tot,du[MAXN];
|
||||||
|
int head2[MAXN],tot2;
|
||||||
|
int n,m;
|
||||||
|
void init(){
|
||||||
|
for(int i=1;i<=n;i++)head2[i]=head[i]=-1,du[i]=0;
|
||||||
|
tot2=0;
|
||||||
|
tot=0;
|
||||||
|
}
|
||||||
|
void AddEdge(int u,int v){
|
||||||
|
e[tot]=Edge(v,head[u]);
|
||||||
|
head[u]=tot++;
|
||||||
|
}
|
||||||
|
void AddEdge1(int u,int v){
|
||||||
|
e2[tot2]=Edge(v,head2[u]);
|
||||||
|
head2[u]=tot2++;
|
||||||
|
}
|
||||||
|
int que[MAXN],front,rear;
|
||||||
|
void _or(int posi,int posj){
|
||||||
|
for(int i=0;i<=n/32;i++)bit[posi][i]|=bit[posj][i];
|
||||||
|
}
|
||||||
|
void top_bfs(){
|
||||||
|
front=rear=0;
|
||||||
|
memset(bit,0,sizeof(bit));
|
||||||
|
for(int i=1;i<=n;i++){
|
||||||
|
bit[i][i/32]=(1<<(i%32));
|
||||||
|
if(du[i]==0){
|
||||||
|
que[front++]=i;
|
||||||
|
--du[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(front!=rear){
|
||||||
|
int u=que[rear++];
|
||||||
|
for(int i=head[u];~i;i=e[i].next){
|
||||||
|
int v=e[i].to;
|
||||||
|
AddEdge1(v,u);
|
||||||
|
if(--du[v]==0)que[front++]=v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
void Rd(T &tmp){
|
||||||
|
char ch;
|
||||||
|
while((ch=getchar())&&!isdigit(ch));
|
||||||
|
tmp=0;
|
||||||
|
do {
|
||||||
|
tmp=(tmp<<3)+(tmp<<1)+(ch^48);
|
||||||
|
}while((ch=getchar())&&isdigit(ch));
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T;
|
||||||
|
Rd(T);
|
||||||
|
while(T--){
|
||||||
|
Rd(n),Rd(m);
|
||||||
|
init();
|
||||||
|
for(int i=0,x,y;i<m;i++){
|
||||||
|
Rd(x),Rd(y);
|
||||||
|
AddEdge(x,y);
|
||||||
|
++du[y];
|
||||||
|
}
|
||||||
|
top_bfs();
|
||||||
|
int ans=0;
|
||||||
|
for(int i=0;i<front;i++){
|
||||||
|
int u=que[i];
|
||||||
|
for(int j=head2[u];~j;j=e2[j].next){
|
||||||
|
int v=e2[j].to;
|
||||||
|
if(bit[u][v/32]&(1<<(v%32)))++ans;
|
||||||
|
_or(u,v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
52
HDOJ/5414_autoAC.cpp
Normal file
52
HDOJ/5414_autoAC.cpp
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn=100000+100;
|
||||||
|
char s[maxn];
|
||||||
|
char ts[maxn];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--)
|
||||||
|
{
|
||||||
|
scanf("%s%s",s,ts);
|
||||||
|
int n1=strlen(s);
|
||||||
|
int n2=strlen(ts);
|
||||||
|
int cur=0;
|
||||||
|
for(int i=0;i<n2;i++)
|
||||||
|
{
|
||||||
|
if(ts[i]==s[cur])
|
||||||
|
cur++;
|
||||||
|
if(cur==n1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(cur==n1)
|
||||||
|
{
|
||||||
|
int a1=1,a2=1;
|
||||||
|
for(int j=1;j<n1;j++)
|
||||||
|
{
|
||||||
|
if(s[j]==s[0])
|
||||||
|
a1++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for(int j=1;j<n2;j++)
|
||||||
|
{
|
||||||
|
if(ts[j]==ts[0])
|
||||||
|
a2++;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(a2>a1||s[0]!=ts[0])
|
||||||
|
printf("No\n");
|
||||||
|
else
|
||||||
|
printf("Yes\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("No\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
70
HDOJ/5416_autoAC.cpp
Normal file
70
HDOJ/5416_autoAC.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn = 1e6+10;
|
||||||
|
typedef long long LL;
|
||||||
|
int dp[maxn];
|
||||||
|
int head[maxn],ip;
|
||||||
|
LL cnt[maxn];
|
||||||
|
int n;
|
||||||
|
struct nod{
|
||||||
|
int to,next,w;
|
||||||
|
}edge[maxn];
|
||||||
|
bool vis[maxn];
|
||||||
|
void init(){
|
||||||
|
ip=0;
|
||||||
|
memset(head,-1,sizeof(head));
|
||||||
|
memset(cnt,0,sizeof(cnt));
|
||||||
|
memset(vis,0,sizeof(vis));
|
||||||
|
}
|
||||||
|
void add(int u,int v,int w){
|
||||||
|
edge[ip].to=v;
|
||||||
|
edge[ip].w=w;
|
||||||
|
edge[ip].next=head[u];
|
||||||
|
head[u]=ip++;
|
||||||
|
}
|
||||||
|
int mmax;
|
||||||
|
void dfs(int u,int pre,int val){
|
||||||
|
for(int i=head[u];i!=-1;i=edge[i].next){
|
||||||
|
int v= edge[i].to;
|
||||||
|
if(v==pre) continue;
|
||||||
|
if(edge[i].w^val>mmax)
|
||||||
|
mmax = edge[i].w^val;
|
||||||
|
cnt[edge[i].w^val]++;
|
||||||
|
dfs(v,u,val^edge[i].w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t,m;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--){
|
||||||
|
init();
|
||||||
|
scanf("%d",&n);
|
||||||
|
for(int i=0;i<n-1;i++){
|
||||||
|
int u,v,w;
|
||||||
|
scanf("%d%d%d",&u,&v,&w);
|
||||||
|
add(u,v,w);
|
||||||
|
add(v,u,w);
|
||||||
|
}
|
||||||
|
mmax = 0;
|
||||||
|
dfs(1,1,0);
|
||||||
|
scanf("%d",&m);
|
||||||
|
cnt[0]++;
|
||||||
|
for(int i=0;i<m;i++){
|
||||||
|
int s;
|
||||||
|
scanf("%d",&s);
|
||||||
|
LL ans = 0;
|
||||||
|
for(int j=0;j<maxn;j++){
|
||||||
|
if((s^j)==j) ans=ans+(cnt[j]*(cnt[j]-1));
|
||||||
|
else ans = ans=ans+cnt[j]*cnt[s^j];
|
||||||
|
}
|
||||||
|
ans=ans/2;
|
||||||
|
if(s==0) ans=ans+n;
|
||||||
|
printf("%I64d\n",ans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
21
HDOJ/5417_autoAC.cpp
Normal file
21
HDOJ/5417_autoAC.cpp
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int x, y, w, n;
|
||||||
|
while(cin>>x>>y>>w>>n)
|
||||||
|
{
|
||||||
|
n -= 1;
|
||||||
|
int ans, tmp1, tmp2;
|
||||||
|
if(w > x)
|
||||||
|
ans = (x+y)*n;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp1 = n % ((int)(x/w)+1);
|
||||||
|
tmp2 = n / (x/w+1);
|
||||||
|
ans = tmp2*(x+y)+w*tmp1;
|
||||||
|
}
|
||||||
|
cout<<ans<<endl;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
63
HDOJ/5418_autoAC.cpp
Normal file
63
HDOJ/5418_autoAC.cpp
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const int MAXN=20;
|
||||||
|
const int INF = numeric_limits<int>::max();
|
||||||
|
int dp[1<<MAXN][MAXN];
|
||||||
|
int dis[MAXN][MAXN];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T,n,m;
|
||||||
|
scanf("%d",&T);
|
||||||
|
while(T--){
|
||||||
|
scanf("%d%d",&n,&m);
|
||||||
|
for(int i=0;i<=n;i++)
|
||||||
|
for(int j=0;j<=n;j++)dis[i][j]=INF;
|
||||||
|
for(int i=0,x,y,w;i<m;i++){
|
||||||
|
scanf("%d%d%d",&x,&y,&w);
|
||||||
|
--x;--y;
|
||||||
|
dis[x][y]=dis[y][x]=min(dis[x][y],w);
|
||||||
|
}
|
||||||
|
if(n==1){
|
||||||
|
puts("0");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for(int k=0;k<n;k++)
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
for(int j=0;j<n;j++)
|
||||||
|
{
|
||||||
|
if(dis[i][k]!=INF&&dis[k][j]!=INF)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
|
||||||
|
}
|
||||||
|
--n;
|
||||||
|
int tot=(1<<n);
|
||||||
|
for(int s=0;s<tot;s++){
|
||||||
|
for(int i=0;i<n;i++){
|
||||||
|
if(s&(1<<i)){
|
||||||
|
if(s==(1<<i))dp[s][i]=dis[0][i+1];
|
||||||
|
else {
|
||||||
|
dp[s][i]=INF;
|
||||||
|
for(int j=0;j<n;j++){
|
||||||
|
if(i!=j&&(s&(1<<j))){
|
||||||
|
dp[s][i]=min(dp[s][i],dp[s^(1<<i)][j]+dis[i+1][j+1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int ans=INF;
|
||||||
|
for(int i=0;i<n;i++)ans=min(ans,dp[tot-1][i]+dis[0][i+1]);
|
||||||
|
printf("%d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
46
HDOJ/5419_autoAC.cpp
Normal file
46
HDOJ/5419_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std ;
|
||||||
|
#define LL __int64
|
||||||
|
LL dp[50100] ;
|
||||||
|
int a[50100] ;
|
||||||
|
LL gcd(LL a,LL b) {
|
||||||
|
return b == 0 ? a : gcd(b,a%b) ;
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
int t , n , m ;
|
||||||
|
int i , l , r ;
|
||||||
|
LL x , y , temp ;
|
||||||
|
scanf("%d", &t) ;
|
||||||
|
while( t-- ) {
|
||||||
|
scanf("%d %d", &n, &m) ;
|
||||||
|
memset(dp,0,sizeof(dp)) ;
|
||||||
|
for(i = 1 ; i <= n ; i++)
|
||||||
|
scanf("%d", &a[i]) ;
|
||||||
|
while( m-- ) {
|
||||||
|
scanf("%d %d", &l, &r) ;
|
||||||
|
dp[l]++ ;
|
||||||
|
dp[r+1]-- ;
|
||||||
|
}
|
||||||
|
x = 0 ;
|
||||||
|
y = (LL)n*(n-1)*(n-2)/6 ;
|
||||||
|
for(i = 1 ; i <= n ; i++) {
|
||||||
|
dp[i] += dp[i-1] ;
|
||||||
|
if( dp[i] > 2 )
|
||||||
|
x += dp[i]*(dp[i]-1)*(dp[i]-2)/6*a[i] ;
|
||||||
|
}
|
||||||
|
if( x == 0 || y == 0 ) {
|
||||||
|
printf("0\n") ;
|
||||||
|
continue ;
|
||||||
|
}
|
||||||
|
temp = gcd(x,y) ;
|
||||||
|
x /= temp ;
|
||||||
|
y /= temp ;
|
||||||
|
if( y == 1 )
|
||||||
|
printf("%I64d\n", x ) ;
|
||||||
|
else
|
||||||
|
printf("%I64d/%I64d\n", x, y) ;
|
||||||
|
}
|
||||||
|
return 0 ;
|
||||||
|
}
|
124
HDOJ/5420_autoAC.cpp
Normal file
124
HDOJ/5420_autoAC.cpp
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const int MAXN=100000+1000;
|
||||||
|
const int MAXM=MAXN*20;
|
||||||
|
const int INF = numeric_limits<int>::max();
|
||||||
|
const LL LL_INF= numeric_limits<LL>::max();
|
||||||
|
struct Edge {
|
||||||
|
int to,next;
|
||||||
|
Edge(){}
|
||||||
|
Edge(int _to,int _next):to(_to),next(_next){}
|
||||||
|
}e[MAXM<<3];
|
||||||
|
int head[MAXM],tot;
|
||||||
|
void init(){
|
||||||
|
memset(head,-1,sizeof(head));
|
||||||
|
tot=0;
|
||||||
|
}
|
||||||
|
void AddEdge(int u,int v){
|
||||||
|
e[tot]=Edge(v,head[u]);
|
||||||
|
head[u]=tot++;
|
||||||
|
}
|
||||||
|
typedef pair<int,int> ii;
|
||||||
|
vector <ii> t[MAXN<<2];
|
||||||
|
int d[MAXN],L[MAXN],R[MAXN],dep[MAXN],ncnt,rid[MAXN],n,Begin[MAXN<<2];
|
||||||
|
void dfs(int u,int d){
|
||||||
|
L[u]=++ncnt;
|
||||||
|
rid[ncnt]=u;
|
||||||
|
dep[u]=d;
|
||||||
|
for(int i=head[u];~i;i=e[i].next)
|
||||||
|
dfs(e[i].to,d+1);
|
||||||
|
R[u]=ncnt;
|
||||||
|
}
|
||||||
|
#define lson L,mid,rt<<1
|
||||||
|
#define rson mid+1,R,rt<<1|1
|
||||||
|
void build(int L,int R,int rt){
|
||||||
|
t[rt].resize(R-L+1);
|
||||||
|
if(L==R){
|
||||||
|
Begin[rt]=n+1;
|
||||||
|
t[rt][0]=make_pair(dep[rid[L]],rid[L]);
|
||||||
|
++n;
|
||||||
|
AddEdge(n,rid[L]);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
int mid=(L+R)>>1;
|
||||||
|
build(lson);build(rson);
|
||||||
|
merge(t[rt<<1].begin(),t[rt<<1].end(),t[rt<<1|1].begin(),t[rt<<1|1].end(),t[rt].begin());
|
||||||
|
Begin[rt]=n+1;
|
||||||
|
for(int i=1;i<R-L+1;i++)AddEdge(n+1+i,n+i);
|
||||||
|
for(int i=0;i<R-L+1;i++)AddEdge(n+1+i,t[rt][i].second);
|
||||||
|
n+=R-L+1;
|
||||||
|
}
|
||||||
|
void connect(int L,int R,int rt,int l,int r,int x,int d){
|
||||||
|
if(l<=L&&R<=r){
|
||||||
|
int pos=lower_bound(t[rt].begin(),t[rt].end(),make_pair(d,1<<30))-t[rt].begin()-1;
|
||||||
|
if(~pos)AddEdge(x,Begin[rt]+pos);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
int mid=(L+R)>>1;
|
||||||
|
if(l<=mid)connect(lson,l,r,x,d);
|
||||||
|
if(r>mid)connect(rson,l,r,x,d);
|
||||||
|
}
|
||||||
|
int dfn[MAXM],low[MAXM],sta[MAXM],top,times,bleg[MAXM],cnt[MAXM];
|
||||||
|
void tarjan(int u){
|
||||||
|
low[u]=dfn[u]=++times;
|
||||||
|
sta[++top]=u;
|
||||||
|
for(int i=head[u];~i;i=e[i].next){
|
||||||
|
int v=e[i].to;
|
||||||
|
if(!dfn[v]){
|
||||||
|
tarjan(v);
|
||||||
|
low[u]=min(low[u],low[v]);
|
||||||
|
}
|
||||||
|
else if(!bleg[v])
|
||||||
|
low[u]=min(low[u],dfn[v]);
|
||||||
|
}
|
||||||
|
if(dfn[u]==low[u]){
|
||||||
|
bleg[0]++;
|
||||||
|
cnt[bleg[0]]=0;
|
||||||
|
do{
|
||||||
|
bleg[sta[top]]=bleg[0];
|
||||||
|
cnt[bleg[0]]+=(sta[top]<=ncnt);
|
||||||
|
}while(sta[top--]!=u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T;
|
||||||
|
scanf("%d",&T);
|
||||||
|
while(T--){
|
||||||
|
scanf("%d",&n);
|
||||||
|
init();
|
||||||
|
for(int i=2,x;i<=n;i++){
|
||||||
|
scanf("%d",&x);
|
||||||
|
AddEdge(x,i);
|
||||||
|
}
|
||||||
|
ncnt=0;
|
||||||
|
dfs(1,0);
|
||||||
|
init();
|
||||||
|
build(1,ncnt,1);
|
||||||
|
for(int i=1,x,y;i<=ncnt;i++){
|
||||||
|
scanf("%d%d",&x,&y);
|
||||||
|
connect(1,ncnt,1,L[x],R[x],i,dep[x]+y);
|
||||||
|
}
|
||||||
|
memset(dfn,0,sizeof(dfn));
|
||||||
|
memset(bleg,0,sizeof(bleg));
|
||||||
|
top=times=0;
|
||||||
|
for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);
|
||||||
|
LL ans=0;
|
||||||
|
for(int i=1;i<=bleg[0];i++){
|
||||||
|
ans+=(LL)cnt[i]*(cnt[i]-1)/2;
|
||||||
|
}
|
||||||
|
printf("%I64d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
73
HDOJ/5421_autoAC.cpp
Normal file
73
HDOJ/5421_autoAC.cpp
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std ;
|
||||||
|
typedef long long LL ;
|
||||||
|
#define clr( a , x ) memset ( a , x , sizeof a )
|
||||||
|
const int MAXN = 200005 ;
|
||||||
|
struct Palindromic_Tree {
|
||||||
|
int nxt[MAXN][26] ;
|
||||||
|
int fail[MAXN] ;
|
||||||
|
int len[MAXN] ;
|
||||||
|
int S[MAXN] , L , R ;
|
||||||
|
int num[MAXN] ;
|
||||||
|
int last[2] ;
|
||||||
|
int p ;
|
||||||
|
LL tot ;
|
||||||
|
int newnode ( int l ) {
|
||||||
|
for ( int i = 0 ; i < 26 ; ++ i ) nxt[p][i] = 0 ;
|
||||||
|
num[p] = 0 ;
|
||||||
|
len[p] = l ;
|
||||||
|
return p ++ ;
|
||||||
|
}
|
||||||
|
void init ( int n ) {
|
||||||
|
p = 0 ;
|
||||||
|
newnode ( 0 ) ;
|
||||||
|
newnode ( -1 ) ;
|
||||||
|
clr ( S , -1 ) ;
|
||||||
|
L = n ;
|
||||||
|
R = n - 1 ;
|
||||||
|
last[0] = last[1] = 1 ;
|
||||||
|
fail[0] = 1 ;
|
||||||
|
tot = 0 ;
|
||||||
|
}
|
||||||
|
int get_fail ( int v , bool d ) {
|
||||||
|
if ( d ) while ( S[R - len[v] - 1] != S[R] ) v = fail[v] ;
|
||||||
|
else while ( S[L + len[v] + 1] != S[L] ) v = fail[v] ;
|
||||||
|
return v ;
|
||||||
|
}
|
||||||
|
void add ( int c , bool d ) {
|
||||||
|
if ( d ) S[++ R] = c ;
|
||||||
|
else S[-- L] = c ;
|
||||||
|
int cur = get_fail ( last[d] , d ) ;
|
||||||
|
if ( !nxt[cur][c] ) {
|
||||||
|
int now = newnode ( len[cur] + 2 ) ;
|
||||||
|
fail[now] = nxt[get_fail ( fail[cur] , d )][c] ;
|
||||||
|
nxt[cur][c] = now ;
|
||||||
|
num[now] = num[fail[now]] + 1 ;
|
||||||
|
}
|
||||||
|
last[d] = nxt[cur][c] ;
|
||||||
|
if ( len[last[d]] == R - L + 1 ) last[d ^ 1] = last[d] ;
|
||||||
|
tot += num[last[d]] ;
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
Palindromic_ T ;
|
||||||
|
int n ;
|
||||||
|
void solve () {
|
||||||
|
int op ;
|
||||||
|
char c ;
|
||||||
|
T.init ( n ) ;
|
||||||
|
for ( int i = 0 ; i < n ; ++ i ) {
|
||||||
|
scanf ( "%d" , &op ) ;
|
||||||
|
if ( op <= 2 ) {
|
||||||
|
scanf ( " %c" , &c ) ;
|
||||||
|
T.add ( c - 'a' , op - 1 ) ;
|
||||||
|
}
|
||||||
|
if ( op == 3 ) printf ( "%d\n" , T.p - 2 ) ;
|
||||||
|
if ( op == 4 ) printf ( "%I64d\n" , T.tot ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
while ( ~scanf ( "%d" , &n ) ) solve () ;
|
||||||
|
return 0 ;
|
||||||
|
}
|
19
HDOJ/5422_autoAC.cpp
Normal file
19
HDOJ/5422_autoAC.cpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
int main(){
|
||||||
|
int n,m,a,b,sign;
|
||||||
|
while(cin>>n>>m){
|
||||||
|
sign=0;
|
||||||
|
while(m--){
|
||||||
|
cin>>a>>b;
|
||||||
|
if((a==1&&b==n)||(b==1&&a==n))
|
||||||
|
sign=1;
|
||||||
|
}
|
||||||
|
n=n*(n-1)/2;
|
||||||
|
if(sign)
|
||||||
|
cout<<"1 "<<n<<endl;
|
||||||
|
else
|
||||||
|
cout<<"1 1"<<endl;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
44
HDOJ/5423_autoAC.cpp
Normal file
44
HDOJ/5423_autoAC.cpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
int s[1005][1005],sum[1005],dis[1005];
|
||||||
|
int n;
|
||||||
|
void dfs(int x,int num){
|
||||||
|
int i;
|
||||||
|
dis[x]=num;
|
||||||
|
for(i=1;i<=n;i++)
|
||||||
|
if(s[x][i]&&!dis[i])
|
||||||
|
dfs(i,num+1);
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int i,a,b,ans;
|
||||||
|
while(scanf("%d",&n)!=EOF){
|
||||||
|
memset(s,0,sizeof(s));
|
||||||
|
memset(sum,0,sizeof(sum));
|
||||||
|
memset(dis,0,sizeof(dis));
|
||||||
|
for(i=1;i<=n-1;i++){
|
||||||
|
scanf("%d%d",&a,&b);
|
||||||
|
s[a][b]=s[b][a]=1;
|
||||||
|
}
|
||||||
|
dfs(1,1);
|
||||||
|
for(i=1;i<=n;i++)
|
||||||
|
sum[dis[i]]++;
|
||||||
|
ans=0;
|
||||||
|
for(i=1;i<=n;i++){
|
||||||
|
if(sum[i]==1)
|
||||||
|
ans++;
|
||||||
|
else{
|
||||||
|
if(sum[i+1]==0)
|
||||||
|
ans=n;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ans==n)
|
||||||
|
printf("YES\n");
|
||||||
|
else
|
||||||
|
printf("NO\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
47
HDOJ/5424_autoAC.cpp
Normal file
47
HDOJ/5424_autoAC.cpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include<cstring>
|
||||||
|
#include<cstdio>
|
||||||
|
using namespace std;
|
||||||
|
int n,cnt,x,y,deg[1001];
|
||||||
|
bool flag,vis[1001],Map[1001][1001];
|
||||||
|
void dfs(int u)
|
||||||
|
{
|
||||||
|
if(cnt==n) {flag=1;return;}
|
||||||
|
for(int i=1;i<=n&&!flag;++i)
|
||||||
|
if(!vis[i]&&Map[u][i])
|
||||||
|
{
|
||||||
|
vis[i]=1;
|
||||||
|
++cnt;
|
||||||
|
dfs(i);
|
||||||
|
--cnt;
|
||||||
|
vis[i]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
while(~scanf("%d",&n))
|
||||||
|
{
|
||||||
|
flag=0;
|
||||||
|
cnt=1;
|
||||||
|
memset(deg,0,sizeof(deg));
|
||||||
|
memset(vis,0,sizeof(vis));
|
||||||
|
memset(Map,0,sizeof(Map));
|
||||||
|
for(int i=0;i<n;++i){
|
||||||
|
scanf("%d%d",&x,&y);
|
||||||
|
if(x!=y&&!Map[x][y])
|
||||||
|
{
|
||||||
|
Map[x][y]=Map[y][x]=1;
|
||||||
|
++deg[x],++deg[y];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int s=1,tot=0;
|
||||||
|
for(int i=1;i<=n;++i)
|
||||||
|
if(deg[i]==1) {s=i;++tot;}
|
||||||
|
if(tot>2) {puts("NO");continue;}
|
||||||
|
vis[s]=1;
|
||||||
|
dfs(s);
|
||||||
|
if(flag) puts("YES");
|
||||||
|
else puts("NO");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
53
HDOJ/5425_autoAC.cpp
Normal file
53
HDOJ/5425_autoAC.cpp
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstring>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<vector>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cmath>
|
||||||
|
#include<queue>
|
||||||
|
using namespace std;
|
||||||
|
#define MAXN 100005
|
||||||
|
vector<int>vec[MAXN];
|
||||||
|
queue<int>q;
|
||||||
|
int n,d[MAXN];
|
||||||
|
inline double f(double a,double b)
|
||||||
|
{
|
||||||
|
return a * b / (a + b);
|
||||||
|
}
|
||||||
|
double solve()
|
||||||
|
{
|
||||||
|
double ans = 0;
|
||||||
|
for(int i = n - 1;i >= max(n - 100,0);i--)
|
||||||
|
for(int j = n - 1;j > i;j--)
|
||||||
|
ans += f(d[i],d[j]) / (pow(2.0,n - i) - (n + 1) / pow(2.0,i));
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
while(scanf("%d",&n) != EOF)
|
||||||
|
{
|
||||||
|
for(int i = 0;i <= n;i++)vec[i].clear();
|
||||||
|
for(int i = 1;i < n;i++)
|
||||||
|
{
|
||||||
|
int u;
|
||||||
|
scanf("%d",&u);
|
||||||
|
vec[u - 1].push_back(i);
|
||||||
|
}
|
||||||
|
d[0] = 1;
|
||||||
|
q.push(0);
|
||||||
|
while(!q.empty())
|
||||||
|
{
|
||||||
|
int u = q.front();
|
||||||
|
q.pop();
|
||||||
|
for(int i = 0;i < vec[u].size();i++)
|
||||||
|
{
|
||||||
|
int v = vec[u][i];
|
||||||
|
d[v] = d[u] + 1;
|
||||||
|
q.push(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort(d,d + n);
|
||||||
|
double ans = solve();
|
||||||
|
printf("%.6f\n",ans);
|
||||||
|
}
|
||||||
|
}
|
52
HDOJ/5427_autoAC.cpp
Normal file
52
HDOJ/5427_autoAC.cpp
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<cstdlib>
|
||||||
|
using namespace std;
|
||||||
|
struct node
|
||||||
|
{
|
||||||
|
char s[110];
|
||||||
|
int a;
|
||||||
|
}p[1000],t;
|
||||||
|
int T,n;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
while(~scanf("%d",&T))
|
||||||
|
{
|
||||||
|
while(T--)
|
||||||
|
{
|
||||||
|
scanf("%d",&n);
|
||||||
|
getchar();
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
{
|
||||||
|
gets(p[i].s);
|
||||||
|
}
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
{
|
||||||
|
int sum=0;
|
||||||
|
int len=strlen(p[i].s);
|
||||||
|
for(int j=len-4;j<len;j++)
|
||||||
|
{
|
||||||
|
sum*=10;
|
||||||
|
sum+=p[i].s[j]-'0';
|
||||||
|
}
|
||||||
|
p[i].s[len-5]='\0';
|
||||||
|
p[i].a=sum;
|
||||||
|
}
|
||||||
|
for(int i=0;i<n-1;i++)
|
||||||
|
{
|
||||||
|
for(int j=0;j<n-1-i;j++)
|
||||||
|
{
|
||||||
|
if(p[j].a<p[j+1].a)
|
||||||
|
{
|
||||||
|
t=p[j];
|
||||||
|
p[j]=p[j+1];
|
||||||
|
p[j+1]=t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
printf("%s\n",p[i].s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
HDOJ/5428_autoAC.cpp
Normal file
37
HDOJ/5428_autoAC.cpp
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn=40000;
|
||||||
|
int T;
|
||||||
|
int n;
|
||||||
|
long long a[100],x,cnt;
|
||||||
|
long long vis[maxn];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d",&T);
|
||||||
|
while(T--){
|
||||||
|
memset(vis,0,sizeof(vis));
|
||||||
|
scanf("%d",&n);
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
scanf("%I64d",&a[i]);
|
||||||
|
cnt=0;
|
||||||
|
for(int i=0;i<n;i++){
|
||||||
|
x=a[i];
|
||||||
|
for(long long j=2;j*j<=x;j++){
|
||||||
|
while(x%j==0){
|
||||||
|
x/=j;
|
||||||
|
vis[cnt++]=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(x>1)
|
||||||
|
vis[cnt++]=x;
|
||||||
|
}
|
||||||
|
sort(vis,vis+cnt);
|
||||||
|
if(cnt<2)
|
||||||
|
printf("-1\n");
|
||||||
|
else
|
||||||
|
printf("%I64d\n",vis[0]*vis[1]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
309
HDOJ/5429_autoAC.cpp
Normal file
309
HDOJ/5429_autoAC.cpp
Normal file
|
@ -0,0 +1,309 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <string.h>
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<iostream>
|
||||||
|
using namespace std;
|
||||||
|
#define DIGIT 4
|
||||||
|
#define DEPTH 10000
|
||||||
|
#define MAX 100
|
||||||
|
typedef int bignum_t[MAX+1];
|
||||||
|
int read(bignum_ a,istream& is=cin){
|
||||||
|
char buf[MAX*DIGIT+1],ch;
|
||||||
|
int i,j;
|
||||||
|
memset((void*)a,0,sizeof(bignum_t));
|
||||||
|
if (!(is>>buf)) return 0;
|
||||||
|
for (a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
|
||||||
|
ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch;
|
||||||
|
for (a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
|
||||||
|
for (i=1;i<=a[0];i++)
|
||||||
|
for (a[i]=0,j=0;j<DIGIT;j++)
|
||||||
|
a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0';
|
||||||
|
for (;!a[a[0]]&&a[0]>1;a[0]--);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
void write(const bignum_ a,ostream& os=cout){
|
||||||
|
int i,j;
|
||||||
|
for (os<<a[i=a[0]],i--;i;i--)
|
||||||
|
for (j=DEPTH/10;j;j/=10)
|
||||||
|
os<<a[i]/j%10;
|
||||||
|
}
|
||||||
|
int comp(const bignum_ a,const bignum_ b){
|
||||||
|
int i;
|
||||||
|
if (a[0]!=b[0])
|
||||||
|
return a[0]-b[0];
|
||||||
|
for (i=a[0];i;i--)
|
||||||
|
if (a[i]!=b[i])
|
||||||
|
return a[i]-b[i];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int comp(const bignum_ a,const int b){
|
||||||
|
int c[12]={1};
|
||||||
|
for (c[1]=b;c[c[0]]>=DEPTH;c[c[0]+1]=c[c[0]]/DEPTH,c[c[0]]%=DEPTH,c[0]++);
|
||||||
|
return comp(a,c);
|
||||||
|
}
|
||||||
|
int comp(const bignum_ a,const int c,const int d,const bignum_ b){
|
||||||
|
int i,t=0,O=-DEPTH*2;
|
||||||
|
if (b[0]-a[0]<d&&c)
|
||||||
|
return 1;
|
||||||
|
for (i=b[0];i>d;i--){
|
||||||
|
t=t*DEPTH+a[i-d]*c-b[i];
|
||||||
|
if (t>0) return 1;
|
||||||
|
if (t<O) return 0;
|
||||||
|
}
|
||||||
|
for (i=d;i;i--){
|
||||||
|
t=t*DEPTH-b[i];
|
||||||
|
if (t>0) return 1;
|
||||||
|
if (t<O) return 0;
|
||||||
|
}
|
||||||
|
return t>0;
|
||||||
|
}
|
||||||
|
void add(bignum_ a,const bignum_ b){
|
||||||
|
int i;
|
||||||
|
for (i=1;i<=b[0];i++)
|
||||||
|
if ((a[i]+=b[i])>=DEPTH)
|
||||||
|
a[i]-=DEPTH,a[i+1]++;
|
||||||
|
if (b[0]>=a[0])
|
||||||
|
a[0]=b[0];
|
||||||
|
else
|
||||||
|
for (;a[i]>=DEPTH&&i<a[0];a[i]-=DEPTH,i++,a[i]++);
|
||||||
|
a[0]+=(a[a[0]+1]>0);
|
||||||
|
}
|
||||||
|
void add(bignum_ a,const int b){
|
||||||
|
int i=1;
|
||||||
|
for (a[1]+=b;a[i]>=DEPTH&&i<a[0];a[i+1]+=a[i]/DEPTH,a[i]%=DEPTH,i++);
|
||||||
|
for (;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++);
|
||||||
|
}
|
||||||
|
void sub(bignum_ a,const bignum_ b){
|
||||||
|
int i;
|
||||||
|
for (i=1;i<=b[0];i++)
|
||||||
|
if ((a[i]-=b[i])<0)
|
||||||
|
a[i+1]--,a[i]+=DEPTH;
|
||||||
|
for (;a[i]<0;a[i]+=DEPTH,i++,a[i]--);
|
||||||
|
for (;!a[a[0]]&&a[0]>1;a[0]--);
|
||||||
|
}
|
||||||
|
void sub(bignum_ a,const int b){
|
||||||
|
int i=1;
|
||||||
|
for (a[1]-=b;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
|
||||||
|
for (;!a[a[0]]&&a[0]>1;a[0]--);
|
||||||
|
}
|
||||||
|
void sub(bignum_ a,const bignum_ b,const int c,const int d){
|
||||||
|
int i,O=b[0]+d;
|
||||||
|
for (i=1+d;i<=O;i++)
|
||||||
|
if ((a[i]-=b[i-d]*c)<0)
|
||||||
|
a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH;
|
||||||
|
for (;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
|
||||||
|
for (;!a[a[0]]&&a[0]>1;a[0]--);
|
||||||
|
}
|
||||||
|
void mul(bignum_ c,const bignum_ a,const bignum_ b){
|
||||||
|
int i,j;
|
||||||
|
memset((void*)c,0,sizeof(bignum_t));
|
||||||
|
for (c[0]=a[0]+b[0]-1,i=1;i<=a[0];i++)
|
||||||
|
for (j=1;j<=b[0];j++)
|
||||||
|
if ((c[i+j-1]+=a[i]*b[j])>=DEPTH)
|
||||||
|
c[i+j]+=c[i+j-1]/DEPTH,c[i+j-1]%=DEPTH;
|
||||||
|
for (c[0]+=(c[c[0]+1]>0);!c[c[0]]&&c[0]>1;c[0]--);
|
||||||
|
}
|
||||||
|
void mul(bignum_ a,const int b){
|
||||||
|
int i;
|
||||||
|
for (a[1]*=b,i=2;i<=a[0];i++){
|
||||||
|
a[i]*=b;
|
||||||
|
if (a[i-1]>=DEPTH)
|
||||||
|
a[i]+=a[i-1]/DEPTH,a[i-1]%=DEPTH;
|
||||||
|
}
|
||||||
|
for (;a[a[0]]>=DEPTH;a[a[0]+1]=a[a[0]]/DEPTH,a[a[0]]%=DEPTH,a[0]++);
|
||||||
|
for (;!a[a[0]]&&a[0]>1;a[0]--);
|
||||||
|
}
|
||||||
|
void mul(bignum_ b,const bignum_ a,const int c,const int d){
|
||||||
|
int i;
|
||||||
|
memset((void*)b,0,sizeof(bignum_t));
|
||||||
|
for (b[0]=a[0]+d,i=d+1;i<=b[0];i++)
|
||||||
|
if ((b[i]+=a[i-d]*c)>=DEPTH)
|
||||||
|
b[i+1]+=b[i]/DEPTH,b[i]%=DEPTH;
|
||||||
|
for (;b[b[0]+1];b[0]++,b[b[0]+1]=b[b[0]]/DEPTH,b[b[0]]%=DEPTH);
|
||||||
|
for (;!b[b[0]]&&b[0]>1;b[0]--);
|
||||||
|
}
|
||||||
|
void div(bignum_ c,bignum_ a,const bignum_ b){
|
||||||
|
int h,l,m,i;
|
||||||
|
memset((void*)c,0,sizeof(bignum_t));
|
||||||
|
c[0]=(b[0]<a[0]+1)?(a[0]-b[0]+2):1;
|
||||||
|
for (i=c[0];i;sub(a,b,c[i]=m,i-1),i--)
|
||||||
|
for (h=DEPTH-1,l=0,m=(h+l+1)>>1;h>l;m=(h+l+1)>>1)
|
||||||
|
if (comp(b,m,i-1,a)) h=m-1;
|
||||||
|
else l=m;
|
||||||
|
for (;!c[c[0]]&&c[0]>1;c[0]--);
|
||||||
|
c[0]=c[0]>1?c[0]:1;
|
||||||
|
}
|
||||||
|
void div(bignum_ a,const int b,int& c){
|
||||||
|
int i;
|
||||||
|
for (c=0,i=a[0];i;c=c*DEPTH+a[i],a[i]=c/b,c%=b,i--);
|
||||||
|
for (;!a[a[0]]&&a[0]>1;a[0]--);
|
||||||
|
}
|
||||||
|
void sqrt(bignum_ b,bignum_ a){
|
||||||
|
int h,l,m,i;
|
||||||
|
memset((void*)b,0,sizeof(bignum_t));
|
||||||
|
for (i=b[0]=(a[0]+1)>>1;i;sub(a,b,m,i-1),b[i]+=m,i--)
|
||||||
|
for (h=DEPTH-1,l=0,b[i]=m=(h+l+1)>>1;h>l;b[i]=m=(h+l+1)>>1)
|
||||||
|
if (comp(b,m,i-1,a)) h=m-1;
|
||||||
|
else l=m;
|
||||||
|
for (;!b[b[0]]&&b[0]>1;b[0]--);
|
||||||
|
for (i=1;i<=b[0];b[i++]>>=1);
|
||||||
|
}
|
||||||
|
int length(const bignum_ a){
|
||||||
|
int t,ret;
|
||||||
|
for (ret=(a[0]-1)*DIGIT,t=a[a[0]];t;t/=10,ret++);
|
||||||
|
return ret>0?ret:1;
|
||||||
|
}
|
||||||
|
int digit(const bignum_ a,const int b){
|
||||||
|
int i,ret;
|
||||||
|
for (ret=a[(b-1)/DIGIT+1],i=(b-1)%DIGIT;i;ret/=10,i--);
|
||||||
|
return ret%10;
|
||||||
|
}
|
||||||
|
int zeronum(const bignum_ a){
|
||||||
|
int ret,t;
|
||||||
|
for (ret=0;!a[ret+1];ret++);
|
||||||
|
for (t=a[ret+1],ret*=DIGIT;!(t%10);t/=10,ret++);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
void comp(int* a,const int l,const int h,const int d){
|
||||||
|
int i,j,t;
|
||||||
|
for (i=l;i<=h;i++)
|
||||||
|
for (t=i,j=2;t>1;j++)
|
||||||
|
while (!(t%j))
|
||||||
|
a[j]+=d,t/=j;
|
||||||
|
}
|
||||||
|
void convert(int* a,const int h,bignum_ b){
|
||||||
|
int i,j,t=1;
|
||||||
|
memset(b,0,sizeof(bignum_t));
|
||||||
|
for (b[0]=b[1]=1,i=2;i<=h;i++)
|
||||||
|
if (a[i])
|
||||||
|
for (j=a[i];j;t*=i,j--)
|
||||||
|
if (t*i>DEPTH)
|
||||||
|
mul(b,t),t=1;
|
||||||
|
mul(b,t);
|
||||||
|
}
|
||||||
|
void combination(bignum_ a,int m,int n){
|
||||||
|
int* t=new int[m+1];
|
||||||
|
memset((void*)t,0,sizeof(int)*(m+1));
|
||||||
|
comp(t,n+1,m,1);
|
||||||
|
comp(t,2,m-n,-1);
|
||||||
|
convert(t,m,a);
|
||||||
|
delete []t;
|
||||||
|
}
|
||||||
|
void permutation(bignum_ a,int m,int n){
|
||||||
|
int i,t=1;
|
||||||
|
memset(a,0,sizeof(bignum_t));
|
||||||
|
a[0]=a[1]=1;
|
||||||
|
for (i=m-n+1;i<=m;t*=i++)
|
||||||
|
if (t*i>DEPTH)
|
||||||
|
mul(a,t),t=1;
|
||||||
|
mul(a,t);
|
||||||
|
}
|
||||||
|
#define SGN(x) ((x)>0?1:((x)<0?-1:0))
|
||||||
|
#define ABS(x) ((x)>0?(x):-(x))
|
||||||
|
int read(bignum_ a,int &sgn,istream& is=cin){
|
||||||
|
char str[MAX*DIGIT+2],ch,*buf;
|
||||||
|
int i,j;
|
||||||
|
memset((void*)a,0,sizeof(bignum_t));
|
||||||
|
if (!(is>>str)) return 0;
|
||||||
|
buf=str,sgn=1;
|
||||||
|
if (*buf=='-') sgn=-1,buf++;
|
||||||
|
for (a[0]=strlen(buf),i=a[0]/2-1;i>=0;i--)
|
||||||
|
ch=buf[i],buf[i]=buf[a[0]-1-i],buf[a[0]-1-i]=ch;
|
||||||
|
for (a[0]=(a[0]+DIGIT-1)/DIGIT,j=strlen(buf);j<a[0]*DIGIT;buf[j++]='0');
|
||||||
|
for (i=1;i<=a[0];i++)
|
||||||
|
for (a[i]=0,j=0;j<DIGIT;j++)
|
||||||
|
a[i]=a[i]*10+buf[i*DIGIT-1-j]-'0';
|
||||||
|
for (;!a[a[0]]&&a[0]>1;a[0]--);
|
||||||
|
if (a[0]==1&&!a[1]) sgn=0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
struct bignum{
|
||||||
|
bignum_t num;
|
||||||
|
int sgn;
|
||||||
|
public:
|
||||||
|
inline bignum(){memset(num,0,sizeof(bignum_t));num[0]=1;sgn=0;}
|
||||||
|
inline bignum& operator=(const bignum& a){memcpy(num,a.num,sizeof(bignum_t));sgn=a.sgn;return *this;}
|
||||||
|
inline bignum& operator=(const int a){memset(num,0,sizeof(bignum_t));num[0]=1;sgn=SGN(a);add(num,sgn*a);return *this;};
|
||||||
|
inline bignum& operator+=(const bignum& a){if(sgn==a.sgn)add(num,a.num);else if(sgn&&a.sgn){int ret=comp(num,a.num);if(ret>0)sub(num,a.num);else if(ret<0){bignum_ t;
|
||||||
|
memcpy(t,num,sizeof(bignum_t));memcpy(num,a.num,sizeof(bignum_t));sub(num,t);sgn=a.sgn;}else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0;}else if(!sgn)memcpy(num,a.num,sizeof(bignum_t)),sgn=a.sgn;return *this;}
|
||||||
|
inline bignum& operator+=(const int a){if(sgn*a>0)add(num,ABS(a));else if(sgn&&a){int ret=comp(num,ABS(a));if(ret>0)sub(num,ABS(a));else if(ret<0){bignum_ t;
|
||||||
|
memcpy(t,num,sizeof(bignum_t));memset(num,0,sizeof(bignum_t));num[0]=1;add(num,ABS(a));sgn=-sgn;sub(num,t);}else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0;}else if(!sgn)sgn=SGN(a),add(num,ABS(a));return *this;}
|
||||||
|
inline bignum operator+(const bignum& a){bignum ret;memcpy(ret.num,num,sizeof(bignum_t));ret.sgn=sgn;ret+=a;return ret;}
|
||||||
|
inline bignum operator+(const int a){bignum ret;memcpy(ret.num,num,sizeof(bignum_t));ret.sgn=sgn;ret+=a;return ret;}
|
||||||
|
inline bignum& operator-=(const bignum& a){if(sgn*a.sgn<0)add(num,a.num);else if(sgn&&a.sgn){int ret=comp(num,a.num);if(ret>0)sub(num,a.num);else if(ret<0){bignum_ t;
|
||||||
|
memcpy(t,num,sizeof(bignum_t));memcpy(num,a.num,sizeof(bignum_t));sub(num,t);sgn=-sgn;}else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0;}else if(!sgn)add(num,a.num),sgn=-a.sgn;return *this;}
|
||||||
|
inline bignum& operator-=(const int a){if(sgn*a<0)add(num,ABS(a));else if(sgn&&a){int ret=comp(num,ABS(a));if(ret>0)sub(num,ABS(a));else if(ret<0){bignum_ t;
|
||||||
|
memcpy(t,num,sizeof(bignum_t));memset(num,0,sizeof(bignum_t));num[0]=1;add(num,ABS(a));sub(num,t);sgn=-sgn;}else memset(num,0,sizeof(bignum_t)),num[0]=1,sgn=0;}else if(!sgn)sgn=-SGN(a),add(num,ABS(a));return *this;}
|
||||||
|
inline bignum operator-(const bignum& a){bignum ret;memcpy(ret.num,num,sizeof(bignum_t));ret.sgn=sgn;ret-=a;return ret;}
|
||||||
|
inline bignum operator-(const int a){bignum ret;memcpy(ret.num,num,sizeof(bignum_t));ret.sgn=sgn;ret-=a;return ret;}
|
||||||
|
inline bignum& operator*=(const bignum& a){bignum_ t;mul(t,num,a.num);memcpy(num,t,sizeof(bignum_t));sgn*=a.sgn;return *this;}
|
||||||
|
inline bignum& operator*=(const int a){mul(num,ABS(a));sgn*=SGN(a);return *this;}
|
||||||
|
inline bignum operator*(const bignum& a){bignum ret;mul(ret.num,num,a.num);ret.sgn=sgn*a.sgn;return ret;}
|
||||||
|
inline bignum operator*(const int a){bignum ret;memcpy(ret.num,num,sizeof(bignum_t));mul(ret.num,ABS(a));ret.sgn=sgn*SGN(a);return ret;}
|
||||||
|
inline bignum& operator/=(const bignum& a){bignum_ t;div(t,num,a.num);memcpy(num,t,sizeof(bignum_t));sgn=(num[0]==1&&!num[1])?0:sgn*a.sgn;return *this;}
|
||||||
|
inline bignum& operator/=(const int a){int t;div(num,ABS(a),t);sgn=(num[0]==1&&!num[1])?0:sgn*SGN(a);return *this;}
|
||||||
|
inline bignum operator/(const bignum& a){bignum ret;bignum_ t;memcpy(t,num,sizeof(bignum_t));div(ret.num,t,a.num);ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*a.sgn;return ret;}
|
||||||
|
inline bignum operator/(const int a){bignum ret;int t;memcpy(ret.num,num,sizeof(bignum_t));div(ret.num,ABS(a),t);ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn*SGN(a);return ret;}
|
||||||
|
inline bignum& operator%=(const bignum& a){bignum_ t;div(t,num,a.num);if (num[0]==1&&!num[1])sgn=0;return *this;}
|
||||||
|
inline int operator%=(const int a){int t;div(num,ABS(a),t);memset(num,0,sizeof(bignum_t));num[0]=1;add(num,t);return t;}
|
||||||
|
inline bignum operator%(const bignum& a){bignum ret;bignum_ t;memcpy(ret.num,num,sizeof(bignum_t));div(t,ret.num,a.num);ret.sgn=(ret.num[0]==1&&!ret.num[1])?0:sgn;return ret;}
|
||||||
|
inline int operator%(const int a){bignum ret;int t;memcpy(ret.num,num,sizeof(bignum_t));div(ret.num,ABS(a),t);memset(ret.num,0,sizeof(bignum_t));ret.num[0]=1;add(ret.num,t);return t;}
|
||||||
|
inline bignum& operator++(){*this+=1;return *this;}
|
||||||
|
inline bignum& operator--(){*this-=1;return *this;};
|
||||||
|
inline int operator>(const bignum& a){return sgn>0?(a.sgn>0?comp(num,a.num)>0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<0:0):a.sgn<0);}
|
||||||
|
inline int operator>(const int a){return sgn>0?(a>0?comp(num,a)>0:1):(sgn<0?(a<0?comp(num,-a)<0:0):a<0);}
|
||||||
|
inline int operator>=(const bignum& a){return sgn>0?(a.sgn>0?comp(num,a.num)>=0:1):(sgn<0?(a.sgn<0?comp(num,a.num)<=0:0):a.sgn<=0);}
|
||||||
|
inline int operator>=(const int a){return sgn>0?(a>0?comp(num,a)>=0:1):(sgn<0?(a<0?comp(num,-a)<=0:0):a<=0);}
|
||||||
|
inline int operator<(const bignum& a){return sgn<0?(a.sgn<0?comp(num,a.num)>0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<0:0):a.sgn>0);}
|
||||||
|
inline int operator<(const int a){return sgn<0?(a<0?comp(num,-a)>0:1):(sgn>0?(a>0?comp(num,a)<0:0):a>0);}
|
||||||
|
inline int operator<=(const bignum& a){return sgn<0?(a.sgn<0?comp(num,a.num)>=0:1):(sgn>0?(a.sgn>0?comp(num,a.num)<=0:0):a.sgn>=0);}
|
||||||
|
inline int operator<=(const int a){return sgn<0?(a<0?comp(num,-a)>=0:1):(sgn>0?(a>0?comp(num,a)<=0:0):a>=0);}
|
||||||
|
inline int operator==(const bignum& a){return (sgn==a.sgn)?!comp(num,a.num):0;}
|
||||||
|
inline int operator==(const int a){return (sgn*a>=0)?!comp(num,ABS(a)):0;}
|
||||||
|
inline int operator!=(const bignum& a){return (sgn==a.sgn)?comp(num,a.num):1;}
|
||||||
|
inline int operator!=(const int a){return (sgn*a>=0)?comp(num,ABS(a)):1;}
|
||||||
|
inline int operator[](const int a){return digit(num,a);}
|
||||||
|
friend inline istream& operator>>(istream& is,bignum& a){read(a.num,a.sgn,is);return is;}
|
||||||
|
friend inline ostream& operator<<(ostream& os,const bignum& a){if(a.sgn<0)os<<'-';write(a.num,os);return os;}
|
||||||
|
friend inline bignum sqrt(const bignum& a){bignum ret;bignum_ t;memcpy(t,a.num,sizeof(bignum_t));sqrt(ret.num,t);ret.sgn=ret.num[0]!=1||ret.num[1];return ret;}
|
||||||
|
friend inline bignum sqrt(const bignum& a,bignum& b){bignum ret;memcpy(b.num,a.num,sizeof(bignum_t));sqrt(ret.num,b.num);ret.sgn=ret.num[0]!=1||ret.num[1];b.sgn=b.num[0]!=1||ret.num[1];return ret;}
|
||||||
|
inline int length(){return ::length(num);}
|
||||||
|
inline int zeronum(){return ::zeronum(num);}
|
||||||
|
inline bignum C(const int m,const int n){combination(num,m,n);sgn=1;return *this;}
|
||||||
|
inline bignum P(const int m,const int n){permutation(num,m,n);sgn=1;return *this;}
|
||||||
|
};
|
||||||
|
#define N 105
|
||||||
|
bignum s[N];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t,n,i,k;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--)
|
||||||
|
{
|
||||||
|
scanf("%d",&n);
|
||||||
|
for(i=k=0;i<n;i++)
|
||||||
|
{
|
||||||
|
cin>>s[i];
|
||||||
|
if(s[i]==0)
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
if(k>0&&k<n)
|
||||||
|
{
|
||||||
|
puts("No");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(n<3)
|
||||||
|
{
|
||||||
|
puts("Yes");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for(i=1;i<n-1;i++)
|
||||||
|
if(s[i-1]*s[i+1]!=s[i]*s[i])
|
||||||
|
break;
|
||||||
|
if(i<n-1)
|
||||||
|
puts("No");
|
||||||
|
else
|
||||||
|
puts("Yes");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
31
HDOJ/5430_autoAC.cpp
Normal file
31
HDOJ/5430_autoAC.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#include<stdio.h>
|
||||||
|
#define LL long long
|
||||||
|
LL fun(LL m)
|
||||||
|
{
|
||||||
|
LL res=m;
|
||||||
|
for(LL i=2;i*i<=m;i++)
|
||||||
|
{
|
||||||
|
if(m%i==0)
|
||||||
|
{
|
||||||
|
res=(res*(i-1))/i;
|
||||||
|
while(m%i==0)
|
||||||
|
{
|
||||||
|
m/=i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(m>1) res=(res*(m-1))/m;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
LL n;
|
||||||
|
int T;
|
||||||
|
scanf ("%d",&T);
|
||||||
|
while(T--)
|
||||||
|
{
|
||||||
|
scanf("%lld",&n);
|
||||||
|
printf("%lld\n",fun(n+1));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
81
HDOJ/5431_autoAC.cpp
Normal file
81
HDOJ/5431_autoAC.cpp
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
char str[20010];
|
||||||
|
int bits[32];
|
||||||
|
int save[32][20010];
|
||||||
|
int tmp[32];
|
||||||
|
int findindex(int i,int key){
|
||||||
|
int l=1,r=save[i][0];
|
||||||
|
int m,ans=0;
|
||||||
|
while(l<=r){
|
||||||
|
int m=(l+r)/2;
|
||||||
|
if(save[i][m]<=key){
|
||||||
|
ans=m;
|
||||||
|
l=m+1;
|
||||||
|
}
|
||||||
|
else r=m-1;
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int kase,now,T,K;
|
||||||
|
scanf("%d",&kase);
|
||||||
|
for(int i=1;i<32;i++) bits[i]=(1<<i);
|
||||||
|
while(kase--){
|
||||||
|
scanf("%s",str);
|
||||||
|
int len=strlen(str);
|
||||||
|
for(int i=0;i<31;i++) save[i][0]=0;
|
||||||
|
for(int i=0;i<len;i++){
|
||||||
|
now=0;
|
||||||
|
for(int j=i;j<=min(i+29,len-1);j++){
|
||||||
|
now=(now<<1)+(str[j]-'A');
|
||||||
|
save[j-i+1][++save[j-i+1][0]]=now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=1;i<=30;i++) sort(save[i]+1,save[i]+save[i][0]+1);
|
||||||
|
for(int i=1;i<=30;i++) {
|
||||||
|
save[i][0]=unique(save[i]+1,save[i]+save[i][0]+1)-(save[i]+1);
|
||||||
|
}
|
||||||
|
scanf("%d",&T); int ans,ansbit;
|
||||||
|
while(T--){
|
||||||
|
scanf("%d",&K);
|
||||||
|
ans=-1;
|
||||||
|
for(int i=1;i<=30;i++){
|
||||||
|
if(K>bits[i]-save[i][0]){
|
||||||
|
K-=(bits[i]-save[i][0]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int l=0,r=bits[i]-1;
|
||||||
|
while(l<=r){
|
||||||
|
int m=(l+r)>>1;
|
||||||
|
int pos=findindex(i,m);
|
||||||
|
if(K>m+1-pos) l=m+1;
|
||||||
|
else if(K<m+1-pos) r=m-1;
|
||||||
|
else{
|
||||||
|
ans=m;
|
||||||
|
while(ans==save[i][pos]&&pos!=0){
|
||||||
|
ans--; pos--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(ans!=-1){
|
||||||
|
ansbit=i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int cnt=0;
|
||||||
|
while(ansbit--){
|
||||||
|
tmp[cnt++]=ans%2;
|
||||||
|
ans/=2;
|
||||||
|
}
|
||||||
|
while(cnt--)
|
||||||
|
printf("%c",tmp[cnt]+'A');
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
45
HDOJ/5432_autoAC.cpp
Normal file
45
HDOJ/5432_autoAC.cpp
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
#include<map>
|
||||||
|
#include<set>
|
||||||
|
#include<cmath>
|
||||||
|
#include<stack>
|
||||||
|
#include<queue>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cctype>
|
||||||
|
#include<vector>
|
||||||
|
#include<cstring>
|
||||||
|
#include<iostream>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<functional>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
typedef pair<int, int> PII;
|
||||||
|
const int MX = 1e5 + 5;
|
||||||
|
double A[MX], B[MX];
|
||||||
|
int main() {
|
||||||
|
int T, n;
|
||||||
|
scanf("%d", &T);
|
||||||
|
while(T--) {
|
||||||
|
scanf("%d", &n);
|
||||||
|
for(int i = 1; i <= n; i++) {
|
||||||
|
scanf("%lf", &A[i]);
|
||||||
|
}
|
||||||
|
for(int i = 1; i <= n; i++) {
|
||||||
|
scanf("%lf", &B[i]);
|
||||||
|
}
|
||||||
|
double L = 0, R = 1000, m;
|
||||||
|
for(int i = 1; i <= 40; i++) {
|
||||||
|
m = (L + R) / 2;
|
||||||
|
double s, sum1 = 0, sum2 = 0;
|
||||||
|
for(int j = 1; j <= n; j++) {
|
||||||
|
if(A[j] <= m) s = 0;
|
||||||
|
else s = B[j] * B[j] * (A[j] - m) * (A[j] - m) * (A[j] - m) / (3.0 * A[j] * A[j]);
|
||||||
|
sum1 += s;
|
||||||
|
sum2 += B[j] * B[j] * A[j] / 3.0 - s;
|
||||||
|
}
|
||||||
|
if(sum1 < sum2) R = m;
|
||||||
|
else L = m;
|
||||||
|
}
|
||||||
|
printf("%d\n", (int)m);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
69
HDOJ/5433_autoAC.cpp
Normal file
69
HDOJ/5433_autoAC.cpp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <queue>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn = 55;
|
||||||
|
const double eps = 1e-6;
|
||||||
|
const double inf = 1e20;
|
||||||
|
const int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
|
||||||
|
int N, M, K, Sx, Sy, Ex, Ey;
|
||||||
|
bool done[maxn][maxn][maxn];
|
||||||
|
char G[maxn][maxn];
|
||||||
|
double dp[maxn][maxn][maxn];
|
||||||
|
struct State {
|
||||||
|
int x, y, k;
|
||||||
|
double d;
|
||||||
|
State(int x = 0, int y = 0, int k = 0, double d = 0): x(x), y(y), k(k), d(d) {}
|
||||||
|
bool operator < (const State& u) const { return d > u.d; }
|
||||||
|
};
|
||||||
|
void init () {
|
||||||
|
scanf("%d%d%d", &N, &M, &K);
|
||||||
|
for (int i = 1; i <= N; i++)
|
||||||
|
scanf("%s", G[i]+1);
|
||||||
|
scanf("%d%d%d%d", &Sx, &Sy, &Ex, &Ey);
|
||||||
|
}
|
||||||
|
bool Dijkstra () {
|
||||||
|
for (int i = 1; i <= N; i++)
|
||||||
|
for (int j = 1; j <= M; j++)
|
||||||
|
for (int k = 0; k <= K; k++) dp[i][j][k] = inf;
|
||||||
|
memset(done, false, sizeof(done));
|
||||||
|
dp[Sx][Sy][K] = 0;
|
||||||
|
priority_queue<State> Q;
|
||||||
|
Q.push(State(Sx, Sy, K, 0));
|
||||||
|
while (!Q.empty()) {
|
||||||
|
State u = Q.top();
|
||||||
|
Q.pop();
|
||||||
|
int x = u.x, y = u.y, k = u.k;
|
||||||
|
if (done[x][y][k]) continue;
|
||||||
|
done[x][y][k] = true;
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
int p = x + dir[i][0];
|
||||||
|
int q = y + dir[i][1];
|
||||||
|
int t = k - 1;
|
||||||
|
if (p <= 0 || p > N || q <= 0 || q > M || t <= 0 || G[p][q] == '#') continue;
|
||||||
|
double d = 1.0 * abs(G[x][y] - G[p][q]) / k;
|
||||||
|
if (dp[p][q][t] > dp[x][y][k] + d) {
|
||||||
|
dp[p][q][t] = dp[x][y][k] + d;
|
||||||
|
Q.push(State(p, q, t, dp[p][q][t]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
double ans = inf;
|
||||||
|
for (int i = 1; i <= K; i++)
|
||||||
|
ans = min(ans, dp[Ex][Ey][i]);
|
||||||
|
if (fabs(ans-inf) < eps) return false;
|
||||||
|
printf("%.2lf\n", ans);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
int cas;
|
||||||
|
scanf("%d", &cas);
|
||||||
|
while (cas--) {
|
||||||
|
init();
|
||||||
|
if (!Dijkstra()) printf("No Answer\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
101
HDOJ/5434_autoAC.cpp
Normal file
101
HDOJ/5434_autoAC.cpp
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
#include<map>
|
||||||
|
#include<set>
|
||||||
|
#include<cmath>
|
||||||
|
#include<stack>
|
||||||
|
#include<queue>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cctype>
|
||||||
|
#include<vector>
|
||||||
|
#include<cstring>
|
||||||
|
#include<iostream>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<functional>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const int matMX = 128 + 5;
|
||||||
|
const int INF = 0x3f3f3f3f;
|
||||||
|
const LL mod = 1e9 + 7;
|
||||||
|
struct Mat {
|
||||||
|
int m, n;
|
||||||
|
LL S[matMX][matMX];
|
||||||
|
Mat(int a, int b) {
|
||||||
|
m = a;
|
||||||
|
n = b;
|
||||||
|
memset(S, 0, sizeof(S));
|
||||||
|
}
|
||||||
|
Mat(int a, int b, LL w[][matMX]) {
|
||||||
|
m = a;
|
||||||
|
n = b;
|
||||||
|
for(int i = 0; i < m; i++) {
|
||||||
|
for(int j = 0; j < n; j++) {
|
||||||
|
S[i][j] = w[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Mat mat_mul(Mat A, Mat B) {
|
||||||
|
Mat C(A.m, B.n);
|
||||||
|
for(int i = 0; i < A.m; i++) {
|
||||||
|
for(int j = 0; j < B.n; j++) {
|
||||||
|
for(int k = 0; k < A.n; k++) {
|
||||||
|
C.S[i][j] = (C.S[i][j] + A.S[i][k] * B.S[k][j]) % mod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return C;
|
||||||
|
}
|
||||||
|
Mat Blank(int m, int n) {
|
||||||
|
Mat ret(m, n);
|
||||||
|
for(int i = 0; i < m; i++) {
|
||||||
|
ret.S[i][i] = 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
Mat mat_pow(Mat A, LL b) {
|
||||||
|
Mat ret = Blank(A.m, A.n);
|
||||||
|
while(b) {
|
||||||
|
if(b & 1) ret = mat_mul(ret, A);
|
||||||
|
A = mat_mul(A, A);
|
||||||
|
b >>= 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
LL S[matMX][matMX];
|
||||||
|
void DFS(int m, int cnt, int x, int y) {
|
||||||
|
if(cnt == m) {
|
||||||
|
S[x][y] = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DFS(m, cnt + 1, x << 1, y << 1);
|
||||||
|
DFS(m, cnt + 1, x << 1 | 1, y << 1 | 1);
|
||||||
|
if(cnt) {
|
||||||
|
if((x & 1) ^ (y & 1) == 0) {
|
||||||
|
DFS(m, cnt + 1, x << 1, y << 1 | 1);
|
||||||
|
DFS(m, cnt + 1, x << 1 | 1, y << 1);
|
||||||
|
} else if((x & 1) && !(y & 1)) {
|
||||||
|
DFS(m, cnt + 1, x << 1 | 1, y << 1);
|
||||||
|
} else {
|
||||||
|
DFS(m, cnt + 1, x << 1, y << 1 | 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DFS(m, cnt + 1, x << 1 | 1, y << 1);
|
||||||
|
DFS(m, cnt + 1, x << 1, y << 1 | 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
int m, n;
|
||||||
|
while(~scanf("%d%d", &n, &m)) {
|
||||||
|
DFS(m, 0, 0, 0);
|
||||||
|
Mat A(1 << m, 1 << m, S), B(1 << m, 1);
|
||||||
|
memset(B.S, 0, sizeof(B.S));
|
||||||
|
B.S[0][0] = 1;
|
||||||
|
Mat ret = mat_mul(mat_pow(A, n), B);
|
||||||
|
LL ans = 0;
|
||||||
|
for(int i = 0; i < (1 << m); i++) {
|
||||||
|
ans += ret.S[i][0];
|
||||||
|
ans %= mod;
|
||||||
|
}
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
65
HDOJ/5435_autoAC.cpp
Normal file
65
HDOJ/5435_autoAC.cpp
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <ctime>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <stack>
|
||||||
|
#include <queue>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
#define getmid(l,r) ((l) + ((r) - (l)) / 2)
|
||||||
|
#define MEM(a,b) memset(a,b,sizeof(a))
|
||||||
|
#define MP(a,b) make_pair(a,b)
|
||||||
|
#define PB push_back
|
||||||
|
typedef long long ll;
|
||||||
|
typedef pair<int,int> pii;
|
||||||
|
const double eps = 1e-8;
|
||||||
|
const int INF = (1 << 30) - 1;
|
||||||
|
const int MAXN = 100010;
|
||||||
|
const ll mod = 1e9 + 7;
|
||||||
|
int T,LA,LB;
|
||||||
|
char A[MAXN],B[MAXN];
|
||||||
|
int dp[100010][16];
|
||||||
|
int Solve(char *s,int L,int p,int f,int xsum){
|
||||||
|
if(p > L) return xsum;
|
||||||
|
if(f){
|
||||||
|
int len = L - p + 1;
|
||||||
|
int res = 0;
|
||||||
|
for(int i = 0; i < 16; ++i)
|
||||||
|
res = (res + 1ll * (xsum ^ i) * dp[len][i]) % mod;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
int top = s[p] - '0';
|
||||||
|
int res = 0;
|
||||||
|
for(int i = 0; i <= top; ++i)
|
||||||
|
res = (res + 1ll * Solve(s,L,p + 1,f | (i < top),xsum ^ i)) % mod;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
void Pre(){
|
||||||
|
dp[0][0] = 1;
|
||||||
|
for(int i = 1; i < 100010; ++i)
|
||||||
|
for(int j = 0; j < 16; ++j)
|
||||||
|
for(int k = 0; k < 10; ++k)
|
||||||
|
dp[i][j] = (dp[i][j] + 1ll * dp[i - 1][j ^ k]) % mod;
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
Pre();
|
||||||
|
scanf("%d",&T);
|
||||||
|
for(int tt = 1; tt <= T; ++tt){
|
||||||
|
scanf("%s%s",A + 1,B + 1);
|
||||||
|
LA = strlen(A + 1);
|
||||||
|
LB = strlen(B + 1);
|
||||||
|
int tmp = 0;
|
||||||
|
for(int i = 1; i <= LA; ++i) tmp ^= (A[i] - '0');
|
||||||
|
int ansA = Solve(A,LA,1,0,0);
|
||||||
|
int ansB = Solve(B,LB,1,0,0);
|
||||||
|
printf("Case #%d: %d\n",tt,(int)
|
||||||
|
(((1ll * ansB - ansA + tmp) % mod + mod) % mod));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
79
HDOJ/5437_autoAC.cpp
Normal file
79
HDOJ/5437_autoAC.cpp
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
#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>
|
||||||
|
#define maxn 150005
|
||||||
|
using namespace std;
|
||||||
|
struct node
|
||||||
|
{
|
||||||
|
char name[205];
|
||||||
|
int v, tp;
|
||||||
|
friend bool operator <(node a,node b)
|
||||||
|
{
|
||||||
|
if(a.v == b.v) return a.tp > b.tp;
|
||||||
|
return a.v < b.v;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
node fri[maxn];
|
||||||
|
struct node1
|
||||||
|
{
|
||||||
|
int t, r;
|
||||||
|
}ask[maxn];
|
||||||
|
bool cmp(node1 a, node1 b)
|
||||||
|
{
|
||||||
|
return a.t < b.t;
|
||||||
|
}
|
||||||
|
int put[maxn], wen[105];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t, k, m, p, i, j, ok, now;
|
||||||
|
scanf("%d", &t);
|
||||||
|
while(t--)
|
||||||
|
{
|
||||||
|
scanf("%d %d %d", &k, &m, &p);
|
||||||
|
for(i = 0;i < k;i++)
|
||||||
|
{
|
||||||
|
scanf("%s %d",fri[i].name, &fri[i].v);
|
||||||
|
fri[i].tp = i;
|
||||||
|
}
|
||||||
|
ask[0].t = -1;
|
||||||
|
for(i = 0;i < m;i++)
|
||||||
|
scanf("%d %d", &ask[i].t, &ask[i].r);
|
||||||
|
for(i = 0;i < p;i++)
|
||||||
|
scanf("%d", &wen[i]);
|
||||||
|
priority_queue<node>q;
|
||||||
|
sort(ask, ask + m, cmp);
|
||||||
|
now = 0;
|
||||||
|
ok = 0;
|
||||||
|
for(i = 1;i <= k;i++)
|
||||||
|
{
|
||||||
|
q.push(fri[i - 1]);
|
||||||
|
if(i == ask[now].t)
|
||||||
|
{
|
||||||
|
for(j = 1;j <= ask[now].r&&(!q.empty());j++)
|
||||||
|
{
|
||||||
|
node x = q.top();
|
||||||
|
q.pop();
|
||||||
|
put[ok++] = x.tp;
|
||||||
|
}
|
||||||
|
now++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(!q.empty())
|
||||||
|
{
|
||||||
|
node x = q.top();
|
||||||
|
q.pop();
|
||||||
|
put[ok++] = x.tp;
|
||||||
|
}
|
||||||
|
for(i = 0;i < p;i++)
|
||||||
|
printf("%s%c", fri[put[wen[i] - 1]].name, i==p-1?'\n':' ');
|
||||||
|
}
|
||||||
|
}
|
70
HDOJ/5438_autoAC.cpp
Normal file
70
HDOJ/5438_autoAC.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
#define pr(x) cout << #x << " = " << x << " "
|
||||||
|
#define prln(x) cout << #x << " = " << x << endl
|
||||||
|
const int N = 1e4 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
|
||||||
|
const int M = 1e5 + 10;
|
||||||
|
int n, m;
|
||||||
|
int deg[N], val[N];
|
||||||
|
vector<int> G[N];
|
||||||
|
bool vis[N];
|
||||||
|
void dfs(int u, int &cnt, long long& sum) {
|
||||||
|
sum += val[u];
|
||||||
|
++cnt;
|
||||||
|
vis[u] = true;
|
||||||
|
for(int i = 0; i < G[u].size(); ++i) {
|
||||||
|
int v = G[u][i];
|
||||||
|
if(vis[v]) continue;
|
||||||
|
dfs(v, cnt, sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
ios_base::sync_with_stdio(0);
|
||||||
|
int t; scanf("%d", &t);
|
||||||
|
while(t--) {
|
||||||
|
scanf("%d%d", &n, &m);
|
||||||
|
for(int i = 1; i <= n; ++i) {
|
||||||
|
scanf("%d", val + i);
|
||||||
|
G[i].clear();
|
||||||
|
vis[i] = false;
|
||||||
|
deg[i] = 0;
|
||||||
|
}
|
||||||
|
for(int i = 1; i <= m; ++i) {
|
||||||
|
int u, v; scanf("%d%d", &u, &v);
|
||||||
|
G[u].push_back(v);
|
||||||
|
G[v].push_back(u);
|
||||||
|
++deg[u], ++deg[v];
|
||||||
|
}
|
||||||
|
queue<int> q;
|
||||||
|
for(int i = 1; i <= n; ++i)
|
||||||
|
if(deg[i] < 2) q.push(i);
|
||||||
|
while(q.size()) {
|
||||||
|
int u = q.front(); q.pop();
|
||||||
|
deg[u] = 0; vis[u] = true;
|
||||||
|
for(int i = 0; i < G[u].size(); ++i) {
|
||||||
|
int v = G[u][i];
|
||||||
|
if(--deg[v] < 2 && !vis[v]) q.push(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
long long ans = 0;
|
||||||
|
for(int i = 1; i <= n; ++i) {
|
||||||
|
if(vis[i]) continue;
|
||||||
|
int cnt = 0; long long sum = 0;
|
||||||
|
dfs(i, cnt, sum);
|
||||||
|
if(cnt & 1) ans += sum;
|
||||||
|
}
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
77
HDOJ/5439_autoAC.cpp
Normal file
77
HDOJ/5439_autoAC.cpp
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <set>
|
||||||
|
#include <cstring>
|
||||||
|
#include <queue>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
const int MOD = (int)1e9+7;
|
||||||
|
const int INF = (int)1e9;
|
||||||
|
const int MAXN = 438744;
|
||||||
|
int a[MAXN+5];
|
||||||
|
int b[MAXN+5];
|
||||||
|
int sum[MAXN+5];
|
||||||
|
int dp[MAXN+5];
|
||||||
|
int pre[MAXN+5];
|
||||||
|
int sz,val;
|
||||||
|
int add(int x,int y){
|
||||||
|
x+=y;
|
||||||
|
if(x>=MOD)x-=MOD;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
int po(int x,int n){
|
||||||
|
int ans=1;
|
||||||
|
int temp=x;
|
||||||
|
while(n){
|
||||||
|
if(n&1)ans=(ll)ans*temp%MOD;
|
||||||
|
temp=(ll)temp*temp%MOD;
|
||||||
|
n>>=1;
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
val=po(2,MOD-2);
|
||||||
|
a[1]=1;
|
||||||
|
a[2]=2;
|
||||||
|
a[3]=2;
|
||||||
|
int sz=3;
|
||||||
|
for(int i=3;;i++){
|
||||||
|
int cnt=a[i];
|
||||||
|
while(cnt){
|
||||||
|
a[++sz]=i;
|
||||||
|
cnt--;
|
||||||
|
if(sz>=MAXN)break;
|
||||||
|
}
|
||||||
|
if(sz>=MAXN)break;
|
||||||
|
}
|
||||||
|
for(int i=1;i<=MAXN;i++){
|
||||||
|
sum[i]=sum[i-1]+a[i];
|
||||||
|
if(sum[i]>=INF)break;
|
||||||
|
}
|
||||||
|
for(int i=1;i<=MAXN;i++){
|
||||||
|
dp[i]=add(dp[i-1],(ll)( add(add(add(pre[i-1],1),pre[i-1]),a[i]) )*a[i]%MOD*i%MOD*val%MOD);
|
||||||
|
pre[i]=add(pre[i-1],a[i]);
|
||||||
|
}
|
||||||
|
int t;scanf("%d",&t);
|
||||||
|
while(t--){
|
||||||
|
int n;scanf("%d",&n);
|
||||||
|
int l=1,r=MAXN;
|
||||||
|
int pos;
|
||||||
|
while(l<=r){
|
||||||
|
int mid=l+r>>1;
|
||||||
|
if(n<=sum[mid]){
|
||||||
|
pos=mid;
|
||||||
|
r=mid-1;
|
||||||
|
}
|
||||||
|
else l=mid+1;
|
||||||
|
}
|
||||||
|
int x=n-sum[pos-1];
|
||||||
|
int ans=add(dp[pos-1],(ll)( add(add(add(pre[pos-1],1),pre[pos-1]),x) )*x%MOD*pos%MOD*val%MOD);
|
||||||
|
printf("%d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
145
HDOJ/5440_autoAC.cpp
Normal file
145
HDOJ/5440_autoAC.cpp
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <set>
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <queue>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
const int maxn = 1 * 1e5 + 5;
|
||||||
|
ll S;
|
||||||
|
int N, M, L[10], X[10], head, rear, ans;
|
||||||
|
map<ll, int> C;
|
||||||
|
set<ll> T;
|
||||||
|
struct State {
|
||||||
|
ll s;
|
||||||
|
int f, c;
|
||||||
|
State(ll s = 0, int f = 0, int c = 0): s(s), f(f), c(c) {}
|
||||||
|
}Q[maxn], cur;
|
||||||
|
inline ll idx(int* c) {
|
||||||
|
ll ret = 0;
|
||||||
|
for (int i = 0; i < 12; i++)
|
||||||
|
ret = ret * (N+1) + c[i];
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
inline void reidx(ll s, int* c) {
|
||||||
|
for (int i = 11; i >= 0; i--) {
|
||||||
|
c[i] = s % (N+1);
|
||||||
|
s /= (N+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void init () {
|
||||||
|
C.clear();
|
||||||
|
T.clear();
|
||||||
|
scanf("%d%d", &N, &M);
|
||||||
|
int x, cnt[15];
|
||||||
|
memset(cnt, 0, sizeof(cnt));
|
||||||
|
for (int i = 1; i <= N; i++) {
|
||||||
|
scanf("%d", &x);
|
||||||
|
if (x == 12) x = 0;
|
||||||
|
cnt[x]++;
|
||||||
|
}
|
||||||
|
S = idx(cnt);
|
||||||
|
for (int i = 0; i < M; i++)
|
||||||
|
scanf("%d%d", &L[i], &X[i]);
|
||||||
|
}
|
||||||
|
bool dfs1 (int d, int* c, int* t, int n, int m, int v) {
|
||||||
|
if (d > 12 || n > m) return false;
|
||||||
|
if (n == 0 && m == 0) {
|
||||||
|
ll tmp = idx(t);
|
||||||
|
if (tmp == S) {
|
||||||
|
ans = cur.c + 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!C.count(tmp)) {
|
||||||
|
C[tmp] = cur.c + 1;
|
||||||
|
if (cur.c < 4) Q[rear++] = State(tmp, v, cur.c+1);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = min(c[d], n); i >= 0; i--) {
|
||||||
|
if (n-i > m-c[d]) break;
|
||||||
|
t[(d-X[v]+12)%12] += i;
|
||||||
|
t[d] += (c[d] - i);
|
||||||
|
if (dfs1(d+1, c, t, n-i, m-c[d], v)) return true;
|
||||||
|
t[(d-X[v]+12)%12] -= i;
|
||||||
|
t[d] -= (c[d] - i);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool dfs2 (int d, int* c, int* t, int n, int m, int v) {
|
||||||
|
if (d > 12 || n > m) return false;
|
||||||
|
if (n == 0 && m == 0) {
|
||||||
|
ll tmp = idx(t);
|
||||||
|
if (C.count(tmp)) {
|
||||||
|
ans = C[tmp] + cur.c + 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!T.count(tmp) && cur.c < 2) {
|
||||||
|
T.insert(tmp);
|
||||||
|
Q[rear++] = State(tmp, v, cur.c+1);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i = min(c[d], n); i >= 0; i--) {
|
||||||
|
if (n-i > m-c[d]) break;
|
||||||
|
t[(d+X[v]+12)%12] += i;
|
||||||
|
t[d] += (c[d] - i);
|
||||||
|
if (dfs2(d+1, c, t, n-i, m-c[d], v)) return true;
|
||||||
|
t[(d+X[v]+12)%12] -= i;
|
||||||
|
t[d] -= (c[d] - i);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int bfs() {
|
||||||
|
int cnt[15], pos[15];
|
||||||
|
memset(cnt, 0, sizeof(cnt));
|
||||||
|
cnt[0] = N;
|
||||||
|
ll k = idx(cnt);
|
||||||
|
if (S == k) return 0;
|
||||||
|
C[k] = 0;
|
||||||
|
head = rear = 0;
|
||||||
|
for (int i = 0; i < M; i++) {
|
||||||
|
int x = (-X[i] + 12) % 12;
|
||||||
|
cnt[x] += L[i];
|
||||||
|
cnt[0] -= L[i];
|
||||||
|
ll tmp = idx(cnt);
|
||||||
|
if (!C.count(tmp)) {
|
||||||
|
if (tmp == S) return 1;
|
||||||
|
Q[rear++] = State(tmp, i, 1);
|
||||||
|
C[tmp] = 1;
|
||||||
|
}
|
||||||
|
cnt[x] -= L[i];
|
||||||
|
cnt[0] += L[i];
|
||||||
|
}
|
||||||
|
while (head < rear) {
|
||||||
|
cur = Q[head++];
|
||||||
|
reidx(cur.s, cnt);
|
||||||
|
for (int i = M-1; i >= cur.f; i--) {
|
||||||
|
memset(pos, 0, sizeof(pos));
|
||||||
|
if (dfs1(0, cnt, pos, L[i], N, i))
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
head = rear = 0;
|
||||||
|
Q[rear++] = State(S, 0, 0);
|
||||||
|
while (head < rear) {
|
||||||
|
cur = Q[head++];
|
||||||
|
reidx(cur.s, cnt);
|
||||||
|
for (int i = M-1; i >= cur.f; i--) {
|
||||||
|
memset(pos, 0, sizeof(pos));
|
||||||
|
if (dfs2(0, cnt, pos, L[i], N, i)) return ans;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
int cas;
|
||||||
|
scanf("%d", &cas);
|
||||||
|
while (cas--) {
|
||||||
|
init();
|
||||||
|
printf("%d\n", bfs());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
78
HDOJ/5441_autoAC.cpp
Normal file
78
HDOJ/5441_autoAC.cpp
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#define MAX 20007
|
||||||
|
using namespace std;
|
||||||
|
int fa[MAX],num[MAX],t,n,m,q,pp[MAX];
|
||||||
|
struct Query
|
||||||
|
{
|
||||||
|
int x,id;
|
||||||
|
bool operator < ( const Query& a )const
|
||||||
|
{
|
||||||
|
return x < a.x;
|
||||||
|
}
|
||||||
|
}a[MAX];
|
||||||
|
struct Edge
|
||||||
|
{
|
||||||
|
int u,v,w;
|
||||||
|
bool operator < ( const Edge& a ) const
|
||||||
|
{
|
||||||
|
return w < a.w;
|
||||||
|
}
|
||||||
|
}e[MAX*5];
|
||||||
|
void init ( )
|
||||||
|
{
|
||||||
|
for ( int i = 1 ; i <= n ; i++ )
|
||||||
|
{
|
||||||
|
num[i] = 1;
|
||||||
|
fa[i] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int _find ( int x )
|
||||||
|
{
|
||||||
|
return fa[x] == x? x : fa[x] = _find ( fa[x] );
|
||||||
|
}
|
||||||
|
void _union ( int x , int y )
|
||||||
|
{
|
||||||
|
x = _find ( x );
|
||||||
|
y = _find ( y );
|
||||||
|
if ( y < x ) swap ( x , y );
|
||||||
|
fa[y] = x;
|
||||||
|
num[x] += num[y];
|
||||||
|
}
|
||||||
|
int main ( )
|
||||||
|
{
|
||||||
|
scanf ( "%d" ,&t );
|
||||||
|
while ( t-- )
|
||||||
|
{
|
||||||
|
int ans = 0;
|
||||||
|
scanf ( "%d%d%d" , &n , &m , &q );
|
||||||
|
init ( );
|
||||||
|
for ( int i = 0 ; i < m ; i++ )
|
||||||
|
scanf ( "%d%d%d" , &e[i].u , &e[i].v , &e[i].w );
|
||||||
|
sort ( e , e+m );
|
||||||
|
int j = 0;
|
||||||
|
for ( int i = 0 ; i < q ; i++ )
|
||||||
|
{
|
||||||
|
a[i].id = i;
|
||||||
|
scanf ( "%d" , &a[i].x );
|
||||||
|
}
|
||||||
|
sort ( a , a+q );
|
||||||
|
for ( int i = 0 ; i < q ; i++ )
|
||||||
|
{
|
||||||
|
while ( j < m && e[j].w <= a[i].x )
|
||||||
|
{
|
||||||
|
int u = _find ( e[j].u );
|
||||||
|
int v = _find ( e[j].v );
|
||||||
|
j++;
|
||||||
|
if ( u == v ) continue;
|
||||||
|
ans += (num[u]+num[v])*(num[u]+num[v]-1)-num[u]*(num[u]-1) - num[v]*(num[v]-1);
|
||||||
|
_union ( u , v );
|
||||||
|
}
|
||||||
|
pp[a[i].id] = ans;
|
||||||
|
}
|
||||||
|
for ( int i = 0 ; i < q ; i++ )
|
||||||
|
printf ( "%d\n" , pp[i] );
|
||||||
|
}
|
||||||
|
}
|
90
HDOJ/5442_autoAC.cpp
Normal file
90
HDOJ/5442_autoAC.cpp
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cstdio>
|
||||||
|
using namespace std;
|
||||||
|
#define maxn 200007
|
||||||
|
int wwa[maxn],wwb[maxn],wwv[maxn],wws[maxn];
|
||||||
|
int cmp(int *r,int a,int b,int l){
|
||||||
|
return r[a]==r[b]&&r[a+l]==r[b+l];
|
||||||
|
}
|
||||||
|
void da(int *r,int *sufix,int n,int m){
|
||||||
|
int i,j,p,*x=wwa,*y=wwb,*t;
|
||||||
|
for(i=0;i<m;i++)wws[i]=0;
|
||||||
|
for(i=0;i<n;i++)wws[x[i]=r[i]]++;
|
||||||
|
for(i=1;i<m;i++)wws[i]+=wws[i-1];
|
||||||
|
for(i=n-1;i>=0;i--)sufix[--wws[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(sufix[i]>=j)
|
||||||
|
y[p++]=sufix[i]-j;
|
||||||
|
for(i=0;i<n;i++)wwv[i]=x[y[i]];
|
||||||
|
for(i=0;i<m;i++)wws[i]=0;
|
||||||
|
for(i=0;i<n;i++)wws[wwv[i]]++;
|
||||||
|
for(i=1;i<m;i++)wws[i]+=wws[i-1];
|
||||||
|
for(i=n-1;i>=0;i--)
|
||||||
|
sufix[--wws[wwv[i]]]=y[i];
|
||||||
|
for(t=x,x=y,y=t,p=1,x[sufix[0]]=0,i=1;i<n;i++)
|
||||||
|
x[sufix[i]]=cmp(y,sufix[i-1],sufix[i],j)?p-1:p++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int r[maxn];
|
||||||
|
int rank1[maxn],height[maxn],sufix[maxn];
|
||||||
|
void calheight(int *r,int *sufix,int n){
|
||||||
|
int i,j,k=0;
|
||||||
|
for(i=0;i<=n;i++) rank1[sufix[i]]=i;
|
||||||
|
for(i=0;i<n;height[rank1[i++]]=k)
|
||||||
|
for(k?k--:0,j=sufix[rank1[i]-1];r[i+k]==r[j+k];k++);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
struct Node{
|
||||||
|
int p,c;
|
||||||
|
};
|
||||||
|
int comp(Node a,Node b){
|
||||||
|
if(a.p == b.p) return a.c < b.c;
|
||||||
|
return a.p < b.p;
|
||||||
|
}
|
||||||
|
Node ans[maxn];
|
||||||
|
char word[maxn];
|
||||||
|
int main(){
|
||||||
|
int t,n;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--){
|
||||||
|
scanf("%d",&n);
|
||||||
|
scanf("%s",word);
|
||||||
|
for(int i = 0;i < n; i++){
|
||||||
|
r[i]=r[i+n] = word[i];
|
||||||
|
}
|
||||||
|
int len =n*4+1;
|
||||||
|
r[n*2] = '#';
|
||||||
|
for(int i = 0;i < n; i++){
|
||||||
|
r[i+n*2+1] = r[i+n*3+1] = word[n-i-1];
|
||||||
|
}
|
||||||
|
r[len] = 0;
|
||||||
|
da(r,sufix,len+1,328);
|
||||||
|
calheight(r,sufix,len);
|
||||||
|
int cnt = 0;
|
||||||
|
ans[cnt++].p = sufix[len];
|
||||||
|
for(int i = len-1;i > 1; i--){
|
||||||
|
if(height[i+1] < n) break;
|
||||||
|
if(sufix[i]>=n&&sufix[i]<=n*2) continue;
|
||||||
|
if(sufix[i]>=n*3+1)continue;
|
||||||
|
ans[cnt++].p = sufix[i];
|
||||||
|
}
|
||||||
|
for(int i = 0;i < cnt; i++){
|
||||||
|
if(ans[i].p > 2*n){
|
||||||
|
ans[i].c =1;
|
||||||
|
ans[i].p = n-(ans[i].p-2*n-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ans[i].p++;
|
||||||
|
ans[i].c = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort(ans,ans+cnt,comp);
|
||||||
|
printf("%d %d\n",ans[0].p,ans[0].c);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
46
HDOJ/5443_autoAC.cpp
Normal file
46
HDOJ/5443_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
#define pr(x) cout << #x << " = " << x << " "
|
||||||
|
#define prln(x) cout << #x << " = " << x << endl
|
||||||
|
const int N = 1e3 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
|
||||||
|
int n, q, dp[2][N][20];
|
||||||
|
int RMQ(int l, int r) {
|
||||||
|
int k = 31 - __builtin_clz(r - l + 1);
|
||||||
|
int Max = max(dp[1][l][k], dp[1][r - (1 << k) + 1][k]);
|
||||||
|
return Max;
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
int t; scanf("%d", &t);
|
||||||
|
while(t--) {
|
||||||
|
scanf("%d", &n);
|
||||||
|
for(int i = 1; i <= n; ++i) {
|
||||||
|
scanf("%d", &dp[0][i][0]);
|
||||||
|
dp[1][i][0] = dp[0][i][0];
|
||||||
|
}
|
||||||
|
for(int j = 1; (1 << j) <= n; ++j) {
|
||||||
|
for(int i = 1; i + (1 << j) - 1 <= n; ++i) {
|
||||||
|
dp[0][i][j] = min(dp[0][i][j - 1],
|
||||||
|
dp[0][i + (1 << j - 1)][j - 1]);
|
||||||
|
dp[1][i][j] = max(dp[1][i][j - 1],
|
||||||
|
dp[1][i + (1 << j - 1)][j - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scanf("%d", &q);
|
||||||
|
while(q--) {
|
||||||
|
int x, y; scanf("%d%d", &x, &y);
|
||||||
|
printf("%d\n", RMQ(x, y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
80
HDOJ/5444_autoAC.cpp
Normal file
80
HDOJ/5444_autoAC.cpp
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn = 1100;
|
||||||
|
struct tree{
|
||||||
|
int v, l, r, f;
|
||||||
|
tree(){}
|
||||||
|
tree(int v, int l, int r, int f):v(v), l(l), r(r), f(f){}
|
||||||
|
} t[maxn<<2];
|
||||||
|
int T, n;
|
||||||
|
int pt, sz;
|
||||||
|
int st[maxn];
|
||||||
|
int a[maxn];
|
||||||
|
int ps[maxn];
|
||||||
|
bool v[maxn];
|
||||||
|
void work(int x){
|
||||||
|
int pos = 0, ed = ps[x];
|
||||||
|
while(1){
|
||||||
|
if (pt > ed) break;
|
||||||
|
v[a[pt]] = true;
|
||||||
|
if (t[pos].v > a[pt]){
|
||||||
|
if (t[pos].r == -1){
|
||||||
|
st[a[pt]] = sz;
|
||||||
|
t[sz] = tree(a[pt++], -1, -1, pos);
|
||||||
|
t[pos].r = sz;
|
||||||
|
pos = sz++;
|
||||||
|
}
|
||||||
|
else pos = t[pos].r;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (t[pos].l == -1){
|
||||||
|
st[a[pt]] = sz;
|
||||||
|
t[sz] = tree(a[pt++], -1, -1, pos);
|
||||||
|
t[pos].l = sz;
|
||||||
|
pos = sz++;
|
||||||
|
}
|
||||||
|
else pos = t[pos].l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
char s[1100];
|
||||||
|
void output(int x){
|
||||||
|
int len = 0, px;
|
||||||
|
while(1){
|
||||||
|
px = x;
|
||||||
|
x = t[x].f;
|
||||||
|
if (x == -1) break;
|
||||||
|
if (t[x].l == px) s[len++] = 'W';
|
||||||
|
else s[len++] = 'E';
|
||||||
|
}
|
||||||
|
for (int i = 0, j = len-1; i < j; i++, j--)
|
||||||
|
swap(s[i], s[j]);
|
||||||
|
s[len] = 0;
|
||||||
|
printf("%s\n", s);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d", &T);
|
||||||
|
while(T--){
|
||||||
|
scanf("%d", &n);
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
v[i+1] = false;
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
ps[a[i]] = i;
|
||||||
|
}
|
||||||
|
sz = 0, pt = 1;
|
||||||
|
t[sz++] = tree(a[0], -1, -1, -1);
|
||||||
|
v[a[0]] = true;
|
||||||
|
for (int i = 1; i <= n; i++)
|
||||||
|
if (!v[i]){ work(i); }
|
||||||
|
int q, qq;
|
||||||
|
scanf("%d", &q);
|
||||||
|
for (int i = 0; i < q; i++){
|
||||||
|
scanf("%d", &qq);
|
||||||
|
output(st[qq]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
90
HDOJ/5445_autoAC.cpp
Normal file
90
HDOJ/5445_autoAC.cpp
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <set>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <vector>
|
||||||
|
#include <functional>
|
||||||
|
#include <cassert>
|
||||||
|
#include <bitset>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
typedef unsigned long long ull;
|
||||||
|
#define ff(i, n) for(int i=0,END=(n);i<END;i++)
|
||||||
|
#define fff(i, n, m) for(int i=(n),END=(m);i<=END;i++)
|
||||||
|
#define dff(i, n, m) for(int i=(n),END=(m);i>=END;i--)
|
||||||
|
#define travel(e, u) for(int e=first[u], v=vv[first[u]]; ~e; e=nxt[e])
|
||||||
|
#define mid ((l+r)/2)
|
||||||
|
#define bit(n) (1ll<<(n))
|
||||||
|
#define clr(a, b) memset(a, b, sizeof(a))
|
||||||
|
#define debug(x) cout << #x << " = " << x << endl;
|
||||||
|
#define ls (rt << 1)
|
||||||
|
#define rs (ls | 1)
|
||||||
|
#define lson l, m, ls
|
||||||
|
#define rson m + 1, r, rs
|
||||||
|
void work();
|
||||||
|
int main() {
|
||||||
|
work();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
const int maxn = 222;
|
||||||
|
const int maxv = 5e4 + 5 + maxn;
|
||||||
|
const int inf = 0x3f3f3f3f;
|
||||||
|
int n, m, p;
|
||||||
|
int dp[maxv];
|
||||||
|
void zero_one_pack(int v, int c, int V) {
|
||||||
|
dff(i, V, v) {
|
||||||
|
dp[i] = min(dp[i], dp[i - v] + c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void zero_one_pack2(int v, int c, int V) {
|
||||||
|
dff(i, V, v) {
|
||||||
|
dp[i] = max(dp[i], dp[i - v] + c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void multi_pack(int v, int c, int num, int V, bool flag = true) {
|
||||||
|
int k = 1;
|
||||||
|
while (num) {
|
||||||
|
if (flag)
|
||||||
|
zero_one_pack(v * k, c * k, V);
|
||||||
|
else
|
||||||
|
zero_one_pack2(v * k, c * k, V);
|
||||||
|
num -= k;
|
||||||
|
k += k;
|
||||||
|
if (k > num) k = num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void input() {
|
||||||
|
scanf("%d%d%d", &n, &m, &p);
|
||||||
|
clr(dp, inf); dp[0] = 0;
|
||||||
|
ff (i, n) {
|
||||||
|
int v, c, num;
|
||||||
|
scanf("%d%d%d", &v, &c, &num);
|
||||||
|
multi_pack(v, c, num, p + 100);
|
||||||
|
}
|
||||||
|
int V = *min_element(dp + p, dp + p + 100);
|
||||||
|
clr(dp, 0);
|
||||||
|
ff (i, m) {
|
||||||
|
int v, c, num;
|
||||||
|
scanf("%d%d%d", &v, &c, &num);
|
||||||
|
multi_pack(c, v, num, 50000, false);
|
||||||
|
}
|
||||||
|
int ans = inf;
|
||||||
|
dff(i, 50000, 0) if (dp[i] >= V) {
|
||||||
|
ans = min(ans, i);
|
||||||
|
}
|
||||||
|
if (ans == inf) {
|
||||||
|
puts("TAT");
|
||||||
|
} else {
|
||||||
|
printf("%d\n", ans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void work() {
|
||||||
|
int T; scanf("%d", &T);
|
||||||
|
fff(cas, 1, T) {
|
||||||
|
input();
|
||||||
|
}
|
||||||
|
}
|
81
HDOJ/5446_autoAC.cpp
Normal file
81
HDOJ/5446_autoAC.cpp
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cassert>
|
||||||
|
using namespace std;
|
||||||
|
#define debug 0
|
||||||
|
const int maxn = 101000;
|
||||||
|
typedef long long ll;
|
||||||
|
ll A[maxn], inv[maxn];
|
||||||
|
int res[20];
|
||||||
|
int p[20];
|
||||||
|
void gcd(ll a, ll b, ll d, ll& x, ll& y){
|
||||||
|
if (!b) { d = a; x = 1; y = 0; }
|
||||||
|
else{ gcd(b, a%b, d, y, x); y -= x*(a/b); }
|
||||||
|
}
|
||||||
|
int cal(long long n, long long m, int p){
|
||||||
|
A[0] = A[1] = 1;
|
||||||
|
inv[0] = inv[1] = 1;
|
||||||
|
for (int i = 2; i <= p; i++){
|
||||||
|
inv[i] = (long long)(p - p/i) * inv[p % i] % p;
|
||||||
|
A[i] = A[i-1] * i % p;
|
||||||
|
}
|
||||||
|
for (int i = 2; i < p; i++){
|
||||||
|
inv[i] = inv[i] * inv[i-1] % p;
|
||||||
|
}
|
||||||
|
if (debug){
|
||||||
|
for (int i = 0; i < p; i++){
|
||||||
|
assert(inv[i] * A[i] % p == 1);
|
||||||
|
printf("%lld %lld\n", inv[i], A[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int ret = 1;
|
||||||
|
while(n&&m){
|
||||||
|
int a = n % p, b = m % p;
|
||||||
|
if (a < b) return 0;
|
||||||
|
n /= p, m /= p;
|
||||||
|
ret = (long long)ret * A[a] % p * inv[b] % p * inv[a-b] % p;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ll mul(ll a, ll b, ll p){
|
||||||
|
ll ret = 0;
|
||||||
|
for (; a; a>>=1){
|
||||||
|
if (a&1){
|
||||||
|
ret += b;
|
||||||
|
if (ret >= p) ret -= p;
|
||||||
|
}
|
||||||
|
b <<= 1;
|
||||||
|
if (b >= p) b -= p;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ll crt(int n, int* a, int *m){
|
||||||
|
ll M = 1, d, y, x = 0;
|
||||||
|
for (int i = 0; i < n; i++) M *= m[i];
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
ll w = M / m[i];
|
||||||
|
gcd(m[i], w, d, d, y);
|
||||||
|
int sign;
|
||||||
|
if (y < 0) sign = -1;
|
||||||
|
else sign = 1;
|
||||||
|
x = (x + mul(y*sign, w*a[i]%M, M) * sign) % M;
|
||||||
|
}
|
||||||
|
return (x + M) % M;
|
||||||
|
}
|
||||||
|
int T;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d", &T);
|
||||||
|
while(T--){
|
||||||
|
ll n, m; int k;
|
||||||
|
scanf("%I64d %I64d %d", &n, &m, &k);
|
||||||
|
for (int i = 0; i < k; i++){
|
||||||
|
scanf("%d", &p[i]);
|
||||||
|
res[i] = cal(n, m, p[i]);
|
||||||
|
}
|
||||||
|
long long ans = crt(k, res, p);
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
49
HDOJ/5448_autoAC.cpp
Normal file
49
HDOJ/5448_autoAC.cpp
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#include <cstdio>
|
||||||
|
typedef long long LL;
|
||||||
|
const int maxn = 100010, mod = 1000000007, inv2 = 500000004;
|
||||||
|
int t, n, pw1[maxn], pw2[maxn], x, y, pre1x, pre1y, pre2x, pre2y, ans;
|
||||||
|
int mod_add(int x, int y)
|
||||||
|
{
|
||||||
|
x += y;
|
||||||
|
if(x >= mod)
|
||||||
|
x -= mod;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
int mod_sub(int x, int y)
|
||||||
|
{
|
||||||
|
x -= y;
|
||||||
|
if(x < 0)
|
||||||
|
x += mod;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
int det(int x1, int y1, int x2, int y2)
|
||||||
|
{
|
||||||
|
return mod_sub((LL)x1 * y2 % mod, (LL)x2 * y1 % mod);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d", &t);
|
||||||
|
pw1[0] = 1;
|
||||||
|
for(int i = 1; i < maxn; ++i)
|
||||||
|
pw1[i] = (LL)pw1[i - 1] * 2 % mod;
|
||||||
|
pw2[0] = 1;
|
||||||
|
for(int i = 1; i < maxn; ++i)
|
||||||
|
pw2[i] = (LL)pw2[i - 1] * inv2 % mod;
|
||||||
|
while(t--)
|
||||||
|
{
|
||||||
|
scanf("%d", &n);
|
||||||
|
pre1x = pre1y = pre2x = pre2y = ans = 0;
|
||||||
|
for(int i = 1; i <= n; ++i)
|
||||||
|
{
|
||||||
|
scanf("%d%d", &x, &y);
|
||||||
|
ans = mod_add(ans, (LL)pw1[i - 1] * det(x, y, pre2x, pre2y) % mod);
|
||||||
|
ans = mod_add(ans, (LL)(i == n ? inv2 : pw1[n - i - 1]) * det(pre1x, pre1y, x, y) % mod);
|
||||||
|
pre1x = mod_add(pre1x, (LL)x * pw1[i] % mod);
|
||||||
|
pre1y = mod_add(pre1y, (LL)y * pw1[i] % mod);
|
||||||
|
pre2x = mod_add(pre2x, (LL)x * pw2[i] % mod);
|
||||||
|
pre2y = mod_add(pre2y, (LL)y * pw2[i] % mod);
|
||||||
|
}
|
||||||
|
printf("%d\n", ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
95
HDOJ/5449_autoAC.cpp
Normal file
95
HDOJ/5449_autoAC.cpp
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
const int maxn = 50005;
|
||||||
|
int N, E, first[maxn], jump[maxn<<1], linker[maxn<<1];
|
||||||
|
ll sz[maxn], up[maxn], dn[maxn], f[20][maxn], dep[maxn];
|
||||||
|
void addEdge(int u, int v) {
|
||||||
|
jump[E] = first[u];
|
||||||
|
linker[E] = v;
|
||||||
|
first[u] = E++;
|
||||||
|
}
|
||||||
|
void dfs (int u, int far, int d) {
|
||||||
|
sz[u] = 1;
|
||||||
|
dep[u] = d;
|
||||||
|
f[0][u] = far;
|
||||||
|
for (int i = first[u]; i + 1; i = jump[i]) {
|
||||||
|
int v = linker[i];
|
||||||
|
if (v == far) continue;
|
||||||
|
dfs(v, u, d + 1);
|
||||||
|
sz[u] += sz[v];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void dfs (int u) {
|
||||||
|
if (f[0][u] != -1) {
|
||||||
|
up[u] = up[f[0][u]] + 2 * sz[u] - 1;
|
||||||
|
dn[u] = dn[f[0][u]] + 2 * (N-sz[u]) - 1;
|
||||||
|
} else
|
||||||
|
up[u] = dn[u] = 0;
|
||||||
|
for (int i = first[u]; i + 1; i = jump[i]) {
|
||||||
|
int v = linker[i];
|
||||||
|
if (v == f[0][u]) continue;
|
||||||
|
dfs(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int lca(int u, int v) {
|
||||||
|
if (dep[u] < dep[v]) swap(u, v);
|
||||||
|
int d = dep[u] - dep[v];
|
||||||
|
for (int i = 0; i < 20; i++) if ((1<<i)&d)
|
||||||
|
u = f[i][u];
|
||||||
|
if (u == v) return u;
|
||||||
|
for (int i = 19; i >= 0; i--) {
|
||||||
|
if (f[i][u] != f[i][v]) {
|
||||||
|
u = f[i][u];
|
||||||
|
v = f[i][v];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return f[0][u];
|
||||||
|
}
|
||||||
|
void init () {
|
||||||
|
E = 0;
|
||||||
|
memset(first, -1, sizeof(first));
|
||||||
|
int u, v;
|
||||||
|
scanf("%d", &N);
|
||||||
|
for (int i = 1; i < N; i++) {
|
||||||
|
scanf("%d%d", &u, &v);
|
||||||
|
addEdge(u, v);
|
||||||
|
addEdge(v, u);
|
||||||
|
}
|
||||||
|
dfs(0, -1, 0);
|
||||||
|
dfs(0);
|
||||||
|
for (int k = 1; k < 20; k++) {
|
||||||
|
for (int i = 0; i < N; i++)
|
||||||
|
f[k][i] = f[k-1][f[k-1][i]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ll get (int u, int v) {
|
||||||
|
int l = lca(u, v);
|
||||||
|
return up[u] - up[l] + dn[v] - dn[l];
|
||||||
|
}
|
||||||
|
void solve () {
|
||||||
|
int q, p, u, v;
|
||||||
|
scanf("%d", &q);
|
||||||
|
while (q--) {
|
||||||
|
ll ans = 0;
|
||||||
|
scanf("%d%d", &p, &u);
|
||||||
|
while (p--) {
|
||||||
|
scanf("%d", &v);
|
||||||
|
ans += get(u, v);
|
||||||
|
u = v;
|
||||||
|
}
|
||||||
|
printf("%lld.0000\n", ans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
int cas;
|
||||||
|
scanf("%d", &cas);
|
||||||
|
while (cas--) {
|
||||||
|
init();
|
||||||
|
solve();
|
||||||
|
if (cas) printf("\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
91
HDOJ/5450_autoAC.cpp
Normal file
91
HDOJ/5450_autoAC.cpp
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn = 105;
|
||||||
|
const int maxm = 15;
|
||||||
|
const int maxs = 200000;
|
||||||
|
const int mod = 10007;
|
||||||
|
int N, P, dp[maxn][maxs];
|
||||||
|
bool exist[maxn];
|
||||||
|
int encode (int* c, int n) {
|
||||||
|
int ret = 0;
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
ret = ret * 3 + c[i];
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
void decode(int* c, int n, int s) {
|
||||||
|
for (int i = n-1; i >= 0; i--) {
|
||||||
|
c[i] = s % 3;
|
||||||
|
s /= 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void move(int* c, int n) {
|
||||||
|
for (int i = n; i > 0; i--)
|
||||||
|
c[i] = c[i-1];
|
||||||
|
c[0] = 0;
|
||||||
|
}
|
||||||
|
void init () {
|
||||||
|
scanf("%d%d", &N, &P);
|
||||||
|
memset(exist, false, sizeof(exist));
|
||||||
|
int k, x;
|
||||||
|
scanf("%d", &k);
|
||||||
|
for (int i = 0; i < k; i++) {
|
||||||
|
scanf("%d", &x);
|
||||||
|
exist[x] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void add(int& u, int v) { u = (u + v) % mod; }
|
||||||
|
int solve () {
|
||||||
|
int n = P + 2, cur[maxm], nxt[maxm], idx[3];
|
||||||
|
idx[0] = 1, idx[1] = P, idx[2] = P + 2;
|
||||||
|
memset(dp, 0, sizeof(dp));
|
||||||
|
for (int i = 0; i < n; i++) cur[i] = 2;
|
||||||
|
int e = encode(cur, n);
|
||||||
|
dp[0][e] = 1;
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
for (int s = 0; s <= e; s++) {
|
||||||
|
if (dp[i][s] == 0) continue;
|
||||||
|
decode(cur, n, s);
|
||||||
|
memcpy(nxt, cur, sizeof(cur));
|
||||||
|
move(nxt, n);
|
||||||
|
if (exist[i+1]) {
|
||||||
|
nxt[0] = 2;
|
||||||
|
if (nxt[n] == 2) add(dp[i+1][encode(nxt, n)], dp[i][s]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (nxt[n] == 2) add(dp[i+1][encode(nxt, n)], dp[i][s]);
|
||||||
|
nxt[0] = 1;
|
||||||
|
for (int j = 0; j < 3; j++) {
|
||||||
|
int& v = nxt[idx[j]];
|
||||||
|
if (v < 2) {
|
||||||
|
v++;
|
||||||
|
if (nxt[n] == 2) add(dp[i+1][encode(nxt, n)], dp[i][s]);
|
||||||
|
v--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nxt[0] = 2;
|
||||||
|
for (int j = 0; j < 3; j++) {
|
||||||
|
for (int k = j+1; k < 3; k++) {
|
||||||
|
int& u = nxt[idx[j]];
|
||||||
|
int& v = nxt[idx[k]];
|
||||||
|
if (u < 2 && v < 2) {
|
||||||
|
u++, v++;
|
||||||
|
if (nxt[n] == 2) add(dp[i+1][encode(nxt, n)], dp[i][s]);
|
||||||
|
u--, v--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dp[N][e];
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
int cas;
|
||||||
|
scanf("%d", &cas);
|
||||||
|
for (int kcas = 1; kcas <= cas; kcas++) {
|
||||||
|
init();
|
||||||
|
printf("Case #%d: %d\n", kcas, solve());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
74
HDOJ/5451_autoAC.cpp
Normal file
74
HDOJ/5451_autoAC.cpp
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#define LL long long
|
||||||
|
#define FOR(i,x,y) for(int i = x;i < y;i ++)
|
||||||
|
#define IFOR(i,x,y) for(int i = x;i > y;i --)
|
||||||
|
#define N 2
|
||||||
|
int MOD;
|
||||||
|
LL p;
|
||||||
|
struct Matrix{
|
||||||
|
LL mat[N][N];
|
||||||
|
Matrix operator *(const Matrix& a) const{
|
||||||
|
Matrix c;
|
||||||
|
memset(c.mat,0,sizeof(c.mat));
|
||||||
|
for(int i=0;i<N;i++){
|
||||||
|
for(int j=0;j<N;j++){
|
||||||
|
for(int k=0;k<N;k++){
|
||||||
|
LL ssss = ((mat[i][k]*a.mat[k][j])%MOD+MOD)%MOD;
|
||||||
|
c.mat[i][j] = ((c.mat[i][j]+ssss)%MOD+MOD)%MOD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
Matrix operator ^(LL n) const{
|
||||||
|
Matrix c;
|
||||||
|
for(int i=0;i<N;i++){
|
||||||
|
for(int j=0;j<N;j++){
|
||||||
|
c.mat[i][j]=(i==j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Matrix a = *this;
|
||||||
|
while(n)
|
||||||
|
{
|
||||||
|
if(n%2) c=c*a;
|
||||||
|
a=a*a;
|
||||||
|
n=n>>1;
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Matrix ss;
|
||||||
|
LL quickpow(LL a,LL n,int m){
|
||||||
|
LL ret = 1;
|
||||||
|
while(n){
|
||||||
|
if(n&1) ret = (ret*a)%m;
|
||||||
|
a = (a*a)%m;
|
||||||
|
n >>= 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int T,tCase = 0;
|
||||||
|
scanf("%d",&T);
|
||||||
|
ss.mat[0][0] = 10; ss.mat[0][1] = -1; ss.mat[1][0] = 1; ss.mat[1][1] = 0;
|
||||||
|
while(T--){
|
||||||
|
printf("Case #%d: ",++tCase);
|
||||||
|
LL x;
|
||||||
|
scanf("%I64d%d",&x,&MOD);
|
||||||
|
p = (MOD-1)*(MOD+1);
|
||||||
|
LL r = quickpow(2,x,p);
|
||||||
|
Matrix st;
|
||||||
|
st.mat[0][0] = 10; st.mat[0][1] = -1; st.mat[1][0] = 1; st.mat[1][1] = 0;
|
||||||
|
st = st^r;
|
||||||
|
LL aaaa = (((st.mat[0][0]*10)%MOD+MOD)%MOD + ((st.mat[0][1]*2)%MOD+MOD)%MOD)%MOD;
|
||||||
|
if(!aaaa){
|
||||||
|
printf("%d\n",MOD-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
printf("%I64d\n",aaaa-1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
123
HDOJ/5452_autoAC.cpp
Normal file
123
HDOJ/5452_autoAC.cpp
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
#define INF 0x3f3f3f3f
|
||||||
|
const int maxn = 80010;
|
||||||
|
const int maxm = 26;
|
||||||
|
int dp[2*maxn][maxm];
|
||||||
|
bool vis[maxn];
|
||||||
|
struct edge
|
||||||
|
{
|
||||||
|
int from, to;
|
||||||
|
int next;
|
||||||
|
} e[2*maxn];
|
||||||
|
int tot,head[maxn];
|
||||||
|
int cnt;
|
||||||
|
int num[maxn];
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
memset(head,-1,sizeof(head));
|
||||||
|
memset(vis,false,sizeof(vis));
|
||||||
|
memset(num,0,sizeof(num));
|
||||||
|
cnt = 0;
|
||||||
|
}
|
||||||
|
void addedge(int u, int v)
|
||||||
|
{
|
||||||
|
e[cnt].from = u;
|
||||||
|
e[cnt].to = v;
|
||||||
|
e[cnt].next = head[u];
|
||||||
|
head[u] = cnt++;
|
||||||
|
}
|
||||||
|
int ver[2*maxn], R[2*maxn], first[maxn];
|
||||||
|
void dfs(int u ,int dep)
|
||||||
|
{
|
||||||
|
vis[u] = true;
|
||||||
|
ver[++tot] = u;
|
||||||
|
first[u] = tot;
|
||||||
|
R[tot] = dep;
|
||||||
|
for(int k=head[u]; k!=-1; k=e[k].next)
|
||||||
|
if( !vis[e[k].to] )
|
||||||
|
{
|
||||||
|
int v = e[k].to;
|
||||||
|
dfs(v, dep+1);
|
||||||
|
ver[++tot] = u;
|
||||||
|
R[tot] = dep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void ST(int n)
|
||||||
|
{
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
dp[i][0] = i;
|
||||||
|
for(int j=1; (1<<j)<=n; j++)
|
||||||
|
{
|
||||||
|
for(int i=1; i+(1<<j)-1<=n; i++)
|
||||||
|
{
|
||||||
|
int a = dp[i][j-1] , b = dp[i+(1<<(j-1))][j-1];
|
||||||
|
dp[i][j] = R[a]<R[b]?a:b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int RMQ(int l,int r)
|
||||||
|
{
|
||||||
|
int k=0;
|
||||||
|
while((1<<(k+1))<=r-l+1)
|
||||||
|
k++;
|
||||||
|
int a = dp[l][k], b = dp[r-(1<<k)+1][k];
|
||||||
|
return R[a]<R[b]?a:b;
|
||||||
|
}
|
||||||
|
int LCA(int u ,int v)
|
||||||
|
{
|
||||||
|
int x = first[u] , y = first[v];
|
||||||
|
if(x > y) swap(x,y);
|
||||||
|
int res = RMQ(x,y);
|
||||||
|
return ver[res];
|
||||||
|
}
|
||||||
|
int DFS(int u,int fa)
|
||||||
|
{
|
||||||
|
for(int i = head[u]; ~i; i = e[i].next)
|
||||||
|
{
|
||||||
|
int v = e[i].to;
|
||||||
|
if(v == fa)
|
||||||
|
continue;
|
||||||
|
DFS(v, u);
|
||||||
|
num[u]+=num[v];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t;
|
||||||
|
int cas = 0;
|
||||||
|
int n, m;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--)
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
scanf("%d%d",&n,&m);
|
||||||
|
int u, v;
|
||||||
|
for(int i = 0; i < n-1; i++)
|
||||||
|
{
|
||||||
|
scanf("%d%d",&u,&v);
|
||||||
|
addedge(u, v);
|
||||||
|
addedge(v, u);
|
||||||
|
}
|
||||||
|
for(int i = n; i <= m; i++)
|
||||||
|
{
|
||||||
|
scanf("%d%d",&u,&v);
|
||||||
|
int tt = LCA(u, v);
|
||||||
|
num[u]++;
|
||||||
|
num[v]++;
|
||||||
|
num[tt]-=2;
|
||||||
|
}
|
||||||
|
DFS(1, 1);
|
||||||
|
int ans = INF;
|
||||||
|
for(int i = 2; i <= n; i++)
|
||||||
|
{
|
||||||
|
ans = min(ans, num[i]+1);
|
||||||
|
}
|
||||||
|
printf("Case #%d: %d\n",++cas,ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
157
HDOJ/5454_autoAC.cpp
Normal file
157
HDOJ/5454_autoAC.cpp
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cstring>
|
||||||
|
using namespace std;
|
||||||
|
typedef __int64 LL;
|
||||||
|
const int maxn = 300005;
|
||||||
|
struct tree
|
||||||
|
{
|
||||||
|
LL suml[maxn << 2], sumr[maxn << 2], sum[maxn << 2];
|
||||||
|
LL add[maxn << 2];
|
||||||
|
inline void pushup(int id, int L, int R)
|
||||||
|
{
|
||||||
|
LL mid = L + R >> 1;
|
||||||
|
sum[id] = sum[id << 1] + sum[id << 1 | 1];
|
||||||
|
suml[id] = suml[id << 1] + (mid - L + 1)*sum[id << 1 | 1] + suml[id << 1 | 1];
|
||||||
|
sumr[id] = sumr[id << 1 | 1] + sumr[id << 1] + (R - mid)*sum[id << 1];
|
||||||
|
}
|
||||||
|
inline void pushdown(int id, int L, int R)
|
||||||
|
{
|
||||||
|
int mid = L + R >> 1;
|
||||||
|
if (add[id])
|
||||||
|
{
|
||||||
|
LL ln = mid - L + 1;
|
||||||
|
LL rn = R - mid;
|
||||||
|
add[id << 1] += add[id];
|
||||||
|
add[id << 1 | 1] += add[id];
|
||||||
|
sum[id << 1] += add[id] * ln;
|
||||||
|
sum[id << 1 | 1] += add[id] * rn;
|
||||||
|
suml[id << 1] += add[id] * (1 + ln)*ln >> 1;
|
||||||
|
suml[id << 1 | 1] += add[id] * (1 + rn)*rn >> 1;
|
||||||
|
sumr[id << 1] += add[id] * (1 + ln)*ln >> 1;
|
||||||
|
sumr[id << 1 | 1] += add[id] * (1 + rn)*rn >> 1;
|
||||||
|
add[id] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void build()
|
||||||
|
{
|
||||||
|
memset(sum, 0, sizeof(sum));
|
||||||
|
memset(suml, 0, sizeof(suml));
|
||||||
|
memset(sumr, 0, sizeof(sumr));
|
||||||
|
memset(add, 0, sizeof(add));
|
||||||
|
}
|
||||||
|
LL queL(int id, int L, int R, int l, int r)
|
||||||
|
{
|
||||||
|
if (l <= L&&R <= r) return (L - l)*sum[id] + suml[id];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pushdown(id, L, R);
|
||||||
|
int mid = L + R >> 1;
|
||||||
|
LL res = 0;
|
||||||
|
if (l <= mid) res += queL(id << 1, L, mid, l, r);
|
||||||
|
if (mid<r) res += queL(id << 1 | 1, mid + 1, R, l, r);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LL queR(int id, int L, int R, int l, int r)
|
||||||
|
{
|
||||||
|
if (l <= L&&R <= r) return (r - R)*sum[id] + sumr[id];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pushdown(id, L, R);
|
||||||
|
int mid = L + R >> 1;
|
||||||
|
LL res = 0;
|
||||||
|
if (l <= mid) res += queR(id << 1, L, mid, l, r);
|
||||||
|
if (mid<r) res += queR(id << 1 | 1, mid + 1, R, l, r);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LL que(int id, int L, int R, int l, int r)
|
||||||
|
{
|
||||||
|
if (l <= L&&R <= r) return sum[id];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pushdown(id, L, R);
|
||||||
|
int mid = L + R >> 1;
|
||||||
|
LL res = 0;
|
||||||
|
if (l <= mid) res += que(id << 1, L, mid, l, r);
|
||||||
|
if (mid<r) res += que(id << 1 | 1, mid + 1, R, l, r);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void op(int id, int L, int R, int l, int r)
|
||||||
|
{
|
||||||
|
if (l <= L&&R <= r)
|
||||||
|
{
|
||||||
|
LL sn = R - L + 1;
|
||||||
|
add[id]++;
|
||||||
|
sum[id] += sn;
|
||||||
|
suml[id] += (1 + sn)*sn >> 1;
|
||||||
|
sumr[id] += (1 + sn)*sn >> 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pushdown(id, L, R);
|
||||||
|
int mid = L + R >> 1;
|
||||||
|
if (l <= mid) op(id << 1, L, mid, l, r);
|
||||||
|
if (mid<r) op(id << 1 | 1, mid + 1, R, l, r);
|
||||||
|
pushup(id, L, R);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}tz, tf;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T;
|
||||||
|
scanf("%d", &T);
|
||||||
|
int ks = 0;
|
||||||
|
while (T--)
|
||||||
|
{
|
||||||
|
printf("Case #%d:\n", ++ks);
|
||||||
|
tz.build();
|
||||||
|
tf.build();
|
||||||
|
int n, m;
|
||||||
|
scanf("%d %d", &n, &m);
|
||||||
|
while (m--)
|
||||||
|
{
|
||||||
|
int op;
|
||||||
|
scanf("%d", &op);
|
||||||
|
if (op == 1)
|
||||||
|
{
|
||||||
|
int l, r;
|
||||||
|
scanf("%d %d", &l, &r);
|
||||||
|
tf.op(1, 1, n << 1, l, r);
|
||||||
|
}
|
||||||
|
else if (op == 2)
|
||||||
|
{
|
||||||
|
int l, r;
|
||||||
|
scanf("%d %d", &l, &r);
|
||||||
|
l += n;
|
||||||
|
r += n;
|
||||||
|
tz.op(1, 1, n << 1, l, r);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int x1, y1, x2, y2;
|
||||||
|
scanf("%d %d %d %d", &x1, &x2, &y1, &y2);
|
||||||
|
LL ans = 0;
|
||||||
|
int A, B, C, D;
|
||||||
|
A = x1 - y1 + n;
|
||||||
|
B = x1 - y2 + n;
|
||||||
|
C = x2 - y2 + n;
|
||||||
|
D = x2 - y1 + n;
|
||||||
|
if (D >= max(A, C) + 1) ans += tz.queR(1, 1, n << 1, max(A, C) + 1, D);
|
||||||
|
if (B <= min(A, C) - 1) ans += tz.queL(1, 1, n << 1, B, min(A, C) - 1);
|
||||||
|
ans += tz.que(1, 1, n << 1, min(A, C), max(A, C))*(min(y2 - y1, x2 - x1) + 1);
|
||||||
|
A = x1 + y1;
|
||||||
|
B = x1 + y2;
|
||||||
|
C = x2 + y2;
|
||||||
|
D = x2 + y1;
|
||||||
|
if (A <= min(B, D) - 1) ans += tf.queL(1, 1, n << 1, A, min(B, D) - 1);
|
||||||
|
if (C >= max(B, D) + 1) ans += tf.queR(1, 1, n << 1, max(B, D) + 1, C);
|
||||||
|
ans += tf.que(1, 1, n << 1, min(B, D), max(B, D))*(min(y2 - y1, x2 - x1) + 1);
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
92
HDOJ/5455_autoAC.cpp
Normal file
92
HDOJ/5455_autoAC.cpp
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cstring>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cmath>
|
||||||
|
#include<queue>
|
||||||
|
#include<vector>
|
||||||
|
#define LL long long
|
||||||
|
#define MAXN 100010
|
||||||
|
using namespace std;
|
||||||
|
string s1;
|
||||||
|
int len,k,fg,cnt,ans,fg2;
|
||||||
|
int main(){
|
||||||
|
int T,cas,i;
|
||||||
|
scanf("%d",&T);
|
||||||
|
getchar();
|
||||||
|
for(cas=1;cas<=T;cas++)
|
||||||
|
{
|
||||||
|
char s2[MAXN];
|
||||||
|
getline(cin,s1);
|
||||||
|
len=s1.length();
|
||||||
|
fg=0;
|
||||||
|
for(i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
if(s1[i]=='c')
|
||||||
|
{
|
||||||
|
fg=1;
|
||||||
|
k=i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(fg)
|
||||||
|
{
|
||||||
|
cnt=0;
|
||||||
|
for(i=k;i<len;i++)
|
||||||
|
{
|
||||||
|
s2[cnt++]=s1[i];
|
||||||
|
}
|
||||||
|
for(i=0;i<k;i++)
|
||||||
|
{
|
||||||
|
s2[cnt++]=s1[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ans=(len+1)/2;
|
||||||
|
printf("Case #%d: %d\n",cas,ans);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ans=1;
|
||||||
|
fg2=1;
|
||||||
|
int shuf=0;
|
||||||
|
for(i=1;i<len;i++)
|
||||||
|
{
|
||||||
|
if(s2[i]=='f')
|
||||||
|
{
|
||||||
|
shuf++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(s2[i]=='c')
|
||||||
|
{
|
||||||
|
if(shuf<2)
|
||||||
|
{
|
||||||
|
printf("Case #%d: -1\n",cas);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ans++;
|
||||||
|
shuf=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Case #%d: -1\n",cas);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(i==len&&shuf<2)
|
||||||
|
{
|
||||||
|
printf("Case #%d: -1\n",cas);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(i==len)
|
||||||
|
{
|
||||||
|
printf("Case #%d: %d\n",cas,ans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
77
HDOJ/5456_autoAC.cpp
Normal file
77
HDOJ/5456_autoAC.cpp
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
#include <set>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
#include <list>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <queue>
|
||||||
|
#include <stack>
|
||||||
|
#include <cmath>
|
||||||
|
#include <bitset>
|
||||||
|
#include <cassert>
|
||||||
|
#define ALL(a) a.begin(), a.end()
|
||||||
|
#define clr(a, x) memset(a, x, sizeof a)
|
||||||
|
#define X first
|
||||||
|
#define Y second
|
||||||
|
#define pb push_back
|
||||||
|
#define lowbit(x) (x&(-x))
|
||||||
|
#define lson l,m,rt<<1
|
||||||
|
#define rson m+1,r,rt<<1|1
|
||||||
|
#define rep1(i,x,y) for(int i=x;i<=y;i++)
|
||||||
|
#define rep(i,n) for(int i=0;i<(int)n;i++)
|
||||||
|
using namespace std;
|
||||||
|
const double eps = 1e-6;
|
||||||
|
typedef long long LL;
|
||||||
|
typedef long long ll;
|
||||||
|
typedef pair<int, int> pii;
|
||||||
|
const int oo =0x3f3f3f3f;
|
||||||
|
const int N = 510;
|
||||||
|
const int cnt[]= {6,2,5,5,4,5,6,3,7,6};
|
||||||
|
ll d[N][2][8];
|
||||||
|
int M,n;
|
||||||
|
bool vis[N][2][8];
|
||||||
|
ll dp(int i,int j,int s)
|
||||||
|
{
|
||||||
|
if(vis[i][j][s]) return d[i][j][s];
|
||||||
|
vis[i][j][s] = 1;
|
||||||
|
d[i][j][s] = 0;
|
||||||
|
if(i == 0)
|
||||||
|
{
|
||||||
|
return d[i][j][s] = (j==0 && s==7);
|
||||||
|
}
|
||||||
|
rep(p,10) rep(q,10)
|
||||||
|
{
|
||||||
|
int nj = (p-j >= q ? 0 : 1);
|
||||||
|
int a = p, b = q , c = nj*10+p-j-q;
|
||||||
|
if((s&1) && c!=0) continue;
|
||||||
|
if((s&2) && b!=0) continue;
|
||||||
|
int nee = cnt[a]+((s&2) ? 0:cnt[b])+((s&1) ? 0 : cnt[c]);
|
||||||
|
if(nee > i) continue;
|
||||||
|
int vv[8]= {0};
|
||||||
|
rep(t,8)
|
||||||
|
{
|
||||||
|
int ts = 0;
|
||||||
|
if((t&1) && (c>0)) ts|=1;
|
||||||
|
if((t&2) && (b>0)) ts|=2;
|
||||||
|
if((t&4) && (a>0) && nj==0 && i==nee) ts|=4;
|
||||||
|
if(!vv[ts]) d[i][j][s] = (d[i][j][s]+dp(i-nee,nj,s|ts))%M,vv[ts]=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return d[i][j][s];
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T,kase=1;
|
||||||
|
scanf("%d",&T);
|
||||||
|
while(T--)
|
||||||
|
{
|
||||||
|
scanf("%d %d",&n,&M);
|
||||||
|
memset(vis,false,sizeof(vis));
|
||||||
|
printf("Case #%d: %I64d\n",kase++,dp(n-3,0,0));
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
340
HDOJ/5457_autoAC.cpp
Normal file
340
HDOJ/5457_autoAC.cpp
Normal file
|
@ -0,0 +1,340 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <cstring>
|
||||||
|
#include <climits>
|
||||||
|
#include <complex>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <bitset>
|
||||||
|
#include <vector>
|
||||||
|
#include <deque>
|
||||||
|
#include <queue>
|
||||||
|
#include <stack>
|
||||||
|
#include <ctime>
|
||||||
|
#include <set>
|
||||||
|
#include <map>
|
||||||
|
#include <cmath>
|
||||||
|
#include <functional>
|
||||||
|
#include <numeric>
|
||||||
|
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||||
|
using namespace std;
|
||||||
|
#define eps 1e-9
|
||||||
|
#define PI acos(-1.0)
|
||||||
|
#define INF 0x3f3f3f3f
|
||||||
|
#define LLINF 1LL<<60
|
||||||
|
#define speed std::ios::sync_with_stdio(false);
|
||||||
|
typedef long long ll;
|
||||||
|
typedef unsigned long long ull;
|
||||||
|
typedef long double ld;
|
||||||
|
typedef pair<ll, ll> pll;
|
||||||
|
typedef complex<ld> point;
|
||||||
|
typedef pair<int, int> pii;
|
||||||
|
typedef pair<pii, int> piii;
|
||||||
|
typedef vector<int> vi;
|
||||||
|
#define CLR(x,y) memset(x,y,sizeof(x))
|
||||||
|
#define CPY(x,y) memcpy(x,y,sizeof(x))
|
||||||
|
#define clr(a,x,size) memset(a,x,sizeof(a[0])*(size))
|
||||||
|
#define cpy(a,x,size) memcpy(a,x,sizeof(a[0])*(size))
|
||||||
|
#define debug(a) cout << #a" = " << (a) << endl;
|
||||||
|
#define debugarry(a, n) for (int i = 0; i < (n); i++) { cout << #a"[" << i << "] = " << (a)[i] << endl; }
|
||||||
|
#define mp(x,y) make_pair(x,y)
|
||||||
|
#define pb(x) push_back(x)
|
||||||
|
#define lowbit(x) (x&(-x))
|
||||||
|
#define MID(x,y) (x+((y-x)>>1))
|
||||||
|
#define ls (idx<<1)
|
||||||
|
#define rs (idx<<1|1)
|
||||||
|
#define lson ls,l,mid
|
||||||
|
#define rson rs,mid+1,r
|
||||||
|
template<class T>
|
||||||
|
inline bool read(T &n)
|
||||||
|
{
|
||||||
|
T x = 0, tmp = 1;
|
||||||
|
char c = getchar();
|
||||||
|
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
|
||||||
|
if(c == EOF) return false;
|
||||||
|
if(c == '-') c = getchar(), tmp = -1;
|
||||||
|
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
|
||||||
|
n = x*tmp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
inline void write(T n)
|
||||||
|
{
|
||||||
|
if(n < 0)
|
||||||
|
{
|
||||||
|
putchar('-');
|
||||||
|
n = -n;
|
||||||
|
}
|
||||||
|
int len = 0,data[20];
|
||||||
|
while(n)
|
||||||
|
{
|
||||||
|
data[len++] = n%10;
|
||||||
|
n /= 10;
|
||||||
|
}
|
||||||
|
if(!len) data[len++] = 0;
|
||||||
|
while(len--) putchar(data[len]+48);
|
||||||
|
}
|
||||||
|
const int MAXN=10240;
|
||||||
|
const int MAXM=40000;
|
||||||
|
struct ISAP
|
||||||
|
{
|
||||||
|
struct nedge
|
||||||
|
{
|
||||||
|
int u,v,next;
|
||||||
|
ll c;
|
||||||
|
} e[MAXM*2];
|
||||||
|
int head[MAXN],tot,n;
|
||||||
|
int ss,tt;
|
||||||
|
void Resize(int n)
|
||||||
|
{
|
||||||
|
this->n=n;
|
||||||
|
}
|
||||||
|
void Clearall()
|
||||||
|
{
|
||||||
|
tot=1;
|
||||||
|
CLR(head,0);
|
||||||
|
}
|
||||||
|
void addedge(int u,int v,ll w)
|
||||||
|
{
|
||||||
|
e[++tot].v=v;
|
||||||
|
e[tot].u=u;
|
||||||
|
e[tot].c=w;
|
||||||
|
e[tot].next=head[u];
|
||||||
|
head[u]=tot;
|
||||||
|
e[++tot].v=u;
|
||||||
|
e[tot].u=v;
|
||||||
|
e[tot].c=0;
|
||||||
|
e[tot].next=head[v];
|
||||||
|
head[v]=tot;
|
||||||
|
}
|
||||||
|
int dep[MAXN],gap[MAXN];
|
||||||
|
void bfs()
|
||||||
|
{
|
||||||
|
CLR(dep,-1);
|
||||||
|
CLR(gap,0);
|
||||||
|
queue<int> que;
|
||||||
|
gap[0]=1;
|
||||||
|
dep[tt]=0;
|
||||||
|
que.push(tt);
|
||||||
|
while(!que.empty())
|
||||||
|
{
|
||||||
|
int u=que.front();
|
||||||
|
que.pop();
|
||||||
|
for(int i=head[u]; i; i=e[i].next)
|
||||||
|
if(dep[e[i].v]==-1)
|
||||||
|
{
|
||||||
|
que.push(e[i].v);
|
||||||
|
dep[e[i].v]=dep[u]+1;
|
||||||
|
++gap[dep[e[i].v]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int res,cur[MAXN],num[MAXN];
|
||||||
|
int top;
|
||||||
|
int MaxFlow(int s,int t)
|
||||||
|
{
|
||||||
|
this->ss=s;
|
||||||
|
this->tt=t;
|
||||||
|
bfs();
|
||||||
|
top=res=0;
|
||||||
|
memcpy(cur,head,sizeof(head));
|
||||||
|
int u=ss,i;
|
||||||
|
while(dep[ss]<n)
|
||||||
|
{
|
||||||
|
if(u==tt)
|
||||||
|
{
|
||||||
|
int temp=INF;
|
||||||
|
int inser;
|
||||||
|
for(i=0; i<top; i++)
|
||||||
|
if(temp>e[num[i]].c)
|
||||||
|
{
|
||||||
|
temp=e[num[i]].c;
|
||||||
|
inser=i;
|
||||||
|
}
|
||||||
|
for(i=0; i<top; i++)
|
||||||
|
{
|
||||||
|
e[num[i]].c-=temp;
|
||||||
|
e[num[i]^1].c+=temp;
|
||||||
|
}
|
||||||
|
res+=temp;
|
||||||
|
top=inser;
|
||||||
|
u=e[num[top]].u;
|
||||||
|
}
|
||||||
|
if(u!=tt && gap[dep[u]-1]==0)
|
||||||
|
break;
|
||||||
|
for(i=cur[u]; i; i=e[i].next)
|
||||||
|
if(e[i].c != 0 && dep[u]==dep[e[i].v]+1)
|
||||||
|
break;
|
||||||
|
if(i)
|
||||||
|
{
|
||||||
|
cur[u]=i;
|
||||||
|
num[top++]=i;
|
||||||
|
u=e[i].v;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int mi=n;
|
||||||
|
for(i=head[u]; i; i=e[i].next)
|
||||||
|
if(e[i].c>0 && mi>dep[e[i].v])
|
||||||
|
{
|
||||||
|
mi=dep[e[i].v];
|
||||||
|
cur[u]=i;
|
||||||
|
}
|
||||||
|
--gap[dep[u]];
|
||||||
|
dep[u]=mi+1;
|
||||||
|
++gap[dep[u]];
|
||||||
|
if(u!=ss)
|
||||||
|
u=e[num[--top]].u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
void print()
|
||||||
|
{
|
||||||
|
puts("GRAPH:");
|
||||||
|
for(int i=0; i<=n; i++)
|
||||||
|
{
|
||||||
|
if(!head[i])
|
||||||
|
continue;
|
||||||
|
printf("%d ->",i);
|
||||||
|
for(int j=head[i]; j; j=e[j].next)
|
||||||
|
printf("%d(%I64d) ",e[j].v,e[j].c);
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}g;
|
||||||
|
static int tim;
|
||||||
|
struct Node
|
||||||
|
{
|
||||||
|
Node *ln[2];
|
||||||
|
int cost[2],idx;
|
||||||
|
bool f;
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
f=0;
|
||||||
|
idx=tim++;
|
||||||
|
memset(ln,0,sizeof ln);
|
||||||
|
memset(cost,INF,sizeof cost);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
struct Trie
|
||||||
|
{
|
||||||
|
Node T[MAXN];
|
||||||
|
int cnt,pos[MAXN];
|
||||||
|
Node *rt;
|
||||||
|
Node* get()
|
||||||
|
{
|
||||||
|
T[cnt].init();
|
||||||
|
return &T[cnt++];
|
||||||
|
}
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
cnt=0;
|
||||||
|
rt=get();
|
||||||
|
}
|
||||||
|
void insert(int *s,int j)
|
||||||
|
{
|
||||||
|
Node *p=rt;
|
||||||
|
for(int i=0; i<8; i++)
|
||||||
|
{
|
||||||
|
int v=s[i];
|
||||||
|
if(p->ln[v]==NULL) p->ln[v]=get();
|
||||||
|
p=p->ln[v];
|
||||||
|
}
|
||||||
|
p->f=1;
|
||||||
|
pos[j]=p->idx;
|
||||||
|
}
|
||||||
|
void find(char *s,int cost)
|
||||||
|
{
|
||||||
|
Node *p=rt;
|
||||||
|
for(int i=0; s[i]; i++)
|
||||||
|
{
|
||||||
|
int v=s[i]-'0';
|
||||||
|
if(p->ln[v]==NULL) return;
|
||||||
|
if(s[i+1]==0) p->cost[v]=min(p->cost[v],cost);
|
||||||
|
else p=p->ln[v];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} pre,su;
|
||||||
|
int n,m,ss,tt;
|
||||||
|
int a[9];
|
||||||
|
char str[9],x[9];
|
||||||
|
void dfs(Node *p,int flag)
|
||||||
|
{
|
||||||
|
if(flag)
|
||||||
|
{
|
||||||
|
if(p->ln[0])
|
||||||
|
{
|
||||||
|
g.addedge(p->ln[0]->idx,p->idx,p->cost[0]);
|
||||||
|
dfs(p->ln[0],1);
|
||||||
|
}
|
||||||
|
if(p->ln[1])
|
||||||
|
{
|
||||||
|
g.addedge(p->ln[1]->idx,p->idx,p->cost[1]);
|
||||||
|
dfs(p->ln[1],1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(p->ln[0])
|
||||||
|
{
|
||||||
|
g.addedge(p->idx,p->ln[0]->idx,p->cost[0]);
|
||||||
|
dfs(p->ln[0],0);
|
||||||
|
}
|
||||||
|
if(p->ln[1])
|
||||||
|
{
|
||||||
|
g.addedge(p->idx,p->ln[1]->idx,p->cost[1]);
|
||||||
|
dfs(p->ln[1],0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void build()
|
||||||
|
{
|
||||||
|
for(int i=1; i<=n; i++)
|
||||||
|
g.addedge(pre.pos[i],su.pos[i],INF);
|
||||||
|
dfs(pre.rt,0);
|
||||||
|
dfs(su.rt ,1);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T,cas=1;
|
||||||
|
read(T);
|
||||||
|
while(T--)
|
||||||
|
{
|
||||||
|
scanf("%d %d",&n,&m);
|
||||||
|
tim=0;
|
||||||
|
pre.init();su.init();g.Clearall();
|
||||||
|
for(int i=1,x; i<=n; i++)
|
||||||
|
{
|
||||||
|
scanf("%d",&x);
|
||||||
|
for(int j=0; j<8; j++)
|
||||||
|
if(x&(1<<7-j)) a[j]=1;
|
||||||
|
else a[j]=0;
|
||||||
|
pre.insert(a,i);
|
||||||
|
for(int j=0; j<8; j++)
|
||||||
|
if(x&(1<<j)) a[j]=1;
|
||||||
|
else a[j]=0;
|
||||||
|
su.insert(a,i);
|
||||||
|
}
|
||||||
|
g.Resize(tim);
|
||||||
|
ss=0;
|
||||||
|
tt=su.rt->idx;
|
||||||
|
for(int i=1,cost; i<=m; i++)
|
||||||
|
{
|
||||||
|
scanf("%s %s %d",str,x,&cost);
|
||||||
|
if(str[0]=='P') pre.find(x,cost);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int len=strlen(x);
|
||||||
|
reverse(x,x+len);
|
||||||
|
su.find(x,cost);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
build();
|
||||||
|
ll ans=g.MaxFlow(ss,tt);
|
||||||
|
printf("Case #%d: %lld\n",cas++,ans>=INF?-1:ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
310
HDOJ/5458_autoAC.cpp
Normal file
310
HDOJ/5458_autoAC.cpp
Normal file
|
@ -0,0 +1,310 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <cstring>
|
||||||
|
#include <climits>
|
||||||
|
#include <complex>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <bitset>
|
||||||
|
#include <vector>
|
||||||
|
#include <deque>
|
||||||
|
#include <queue>
|
||||||
|
#include <stack>
|
||||||
|
#include <ctime>
|
||||||
|
#include <set>
|
||||||
|
#include <map>
|
||||||
|
#include <cmath>
|
||||||
|
#include <functional>
|
||||||
|
#include <numeric>
|
||||||
|
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||||
|
using namespace std;
|
||||||
|
#define eps 1e-9
|
||||||
|
#define PI acos(-1.0)
|
||||||
|
#define INF 0x3f3f3f3f
|
||||||
|
#define LLINF 1LL<<62
|
||||||
|
#define speed std::ios::sync_with_stdio(false);
|
||||||
|
typedef long long ll;
|
||||||
|
typedef unsigned long long ull;
|
||||||
|
typedef long double ld;
|
||||||
|
typedef pair<ll, ll> pll;
|
||||||
|
typedef complex<ld> point;
|
||||||
|
typedef pair<int, int> pii;
|
||||||
|
typedef pair<pii, int> piii;
|
||||||
|
typedef vector<int> vi;
|
||||||
|
#define CLR(x,y) memset(x,y,sizeof(x))
|
||||||
|
#define CPY(x,y) memcpy(x,y,sizeof(x))
|
||||||
|
#define clr(a,x,size) memset(a,x,sizeof(a[0])*(size))
|
||||||
|
#define cpy(a,x,size) memcpy(a,x,sizeof(a[0])*(size))
|
||||||
|
#define mp(x,y) make_pair(x,y)
|
||||||
|
#define pb(x) push_back(x)
|
||||||
|
#define lowbit(x) (x&(-x))
|
||||||
|
#define MID(x,y) (x+((y-x)>>1))
|
||||||
|
#define getidx(l,r) (l+r | l!=r)
|
||||||
|
#define ls getidx(l,mid)
|
||||||
|
#define rs getidx(mid+1,r)
|
||||||
|
#define lson l,mid
|
||||||
|
#define rson mid+1,r
|
||||||
|
#define root 1,n
|
||||||
|
template<class T>
|
||||||
|
inline bool read(T &n)
|
||||||
|
{
|
||||||
|
T x = 0, tmp = 1;
|
||||||
|
char c = getchar();
|
||||||
|
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
|
||||||
|
if(c == EOF) return false;
|
||||||
|
if(c == '-') c = getchar(), tmp = -1;
|
||||||
|
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
|
||||||
|
n = x*tmp;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
template <class T>
|
||||||
|
inline void write(T n)
|
||||||
|
{
|
||||||
|
if(n < 0)
|
||||||
|
{
|
||||||
|
putchar('-');
|
||||||
|
n = -n;
|
||||||
|
}
|
||||||
|
int len = 0,data[20];
|
||||||
|
while(n)
|
||||||
|
{
|
||||||
|
data[len++] = n%10;
|
||||||
|
n /= 10;
|
||||||
|
}
|
||||||
|
if(!len) data[len++] = 0;
|
||||||
|
while(len--) putchar(data[len]+48);
|
||||||
|
}
|
||||||
|
const int MAXN=30005;
|
||||||
|
const int MAXM=100005;
|
||||||
|
const int MAXQ=100005;
|
||||||
|
int t,n,m,q;
|
||||||
|
struct edge
|
||||||
|
{
|
||||||
|
int a,b;
|
||||||
|
edge(){}
|
||||||
|
edge(int aa,int bb):a(aa),b(bb){}
|
||||||
|
bool operator < (const edge &o) const
|
||||||
|
{
|
||||||
|
if(a == o.a)
|
||||||
|
{
|
||||||
|
return b < o.b;
|
||||||
|
}
|
||||||
|
return a < o.a;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
multiset<edge> S;
|
||||||
|
multiset<edge> V;
|
||||||
|
struct Ans
|
||||||
|
{
|
||||||
|
int kind;
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
int val;
|
||||||
|
}ans[MAXQ];
|
||||||
|
struct Edge
|
||||||
|
{
|
||||||
|
int u,v,w;
|
||||||
|
int next;
|
||||||
|
}e[MAXN<<1];
|
||||||
|
int head[MAXN],tot;
|
||||||
|
int siz[MAXN],p[MAXN],son[MAXN],dep[MAXN];
|
||||||
|
int dfn[MAXN],top[MAXN],tim;
|
||||||
|
int sum[MAXN<<1],la[MAXN<<1];
|
||||||
|
int bingchafa[MAXN];
|
||||||
|
int getfather(int x)
|
||||||
|
{
|
||||||
|
if(bingchafa[x] == x) return x;
|
||||||
|
return bingchafa[x] = getfather(bingchafa[x]);
|
||||||
|
}
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
CLR(head,-1);CLR(sum,0);
|
||||||
|
tot=tim=0;
|
||||||
|
for(int i=1;i<=n;i++) bingchafa[i] = i;
|
||||||
|
S.clear();
|
||||||
|
V.clear();
|
||||||
|
}
|
||||||
|
void addedge(int u,int v,int w)
|
||||||
|
{
|
||||||
|
e[tot].u=u;e[tot].v=v;e[tot].w=w;
|
||||||
|
e[tot].next=head[u];head[u]=tot++;
|
||||||
|
}
|
||||||
|
void dfs(int u,int fa=0,int depth=0)
|
||||||
|
{
|
||||||
|
siz[u]=1;son[u]=-1;
|
||||||
|
p[u]=fa;dep[u]=depth;
|
||||||
|
for(int i=head[u];~i;i=e[i].next)
|
||||||
|
{
|
||||||
|
int v=e[i].v;
|
||||||
|
if(v==p[u]) continue;
|
||||||
|
dfs(v,u,depth+1);
|
||||||
|
siz[u]+=siz[v];
|
||||||
|
if(son[u]==-1 || siz[v]>siz[son[u]])
|
||||||
|
son[u]=v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void getid(int u,int fa)
|
||||||
|
{
|
||||||
|
dfn[u]=++tim;top[u]=fa;
|
||||||
|
if(son[u]!=-1)
|
||||||
|
getid(son[u],fa);
|
||||||
|
for(int i=head[u];~i;i=e[i].next)
|
||||||
|
{
|
||||||
|
int v=e[i].v;
|
||||||
|
if(v==p[u] || v==son[u]) continue;
|
||||||
|
getid(v,v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void pushup(int l,int r)
|
||||||
|
{
|
||||||
|
int idx=getidx(l,r),mid=MID(l,r);
|
||||||
|
sum[idx]=0;
|
||||||
|
if(!la[ls])
|
||||||
|
sum[idx]+=sum[ls];
|
||||||
|
if(!la[rs])
|
||||||
|
sum[idx]+=sum[rs];
|
||||||
|
}
|
||||||
|
void pushdown(int l,int r)
|
||||||
|
{
|
||||||
|
int idx=getidx(l,r),mid=MID(l,r);
|
||||||
|
if(!la[idx]) return;
|
||||||
|
la[ls]=la[idx];
|
||||||
|
la[rs]=la[idx];
|
||||||
|
}
|
||||||
|
void build(int l,int r)
|
||||||
|
{
|
||||||
|
int idx=getidx(l,r);
|
||||||
|
la[idx]=0;
|
||||||
|
if(l==r)
|
||||||
|
{
|
||||||
|
sum[idx]=1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int mid=MID(l,r);
|
||||||
|
build(l,mid);
|
||||||
|
build(mid+1,r);
|
||||||
|
pushup(l,r);
|
||||||
|
}
|
||||||
|
void update2(int l,int r,int L,int R)
|
||||||
|
{
|
||||||
|
int idx=getidx(l,r);
|
||||||
|
if(L==l && r==R)
|
||||||
|
{
|
||||||
|
la[idx]=1;
|
||||||
|
sum[idx]=0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pushdown(l,r);
|
||||||
|
int mid=MID(l,r);
|
||||||
|
if(R<=mid)
|
||||||
|
update2(l,mid,L,R);
|
||||||
|
else if(L>mid)
|
||||||
|
update2(mid+1,r,L,R);
|
||||||
|
else
|
||||||
|
update2(l,mid,L,mid),update2(mid+1,r,mid+1,R);
|
||||||
|
pushup(l,r);
|
||||||
|
}
|
||||||
|
int query(int l,int r,int L,int R)
|
||||||
|
{
|
||||||
|
int idx=getidx(l,r);
|
||||||
|
if(la[idx]) return 0;
|
||||||
|
if(L==l && r==R)
|
||||||
|
{
|
||||||
|
return sum[idx];
|
||||||
|
}
|
||||||
|
int mid=MID(l,r);
|
||||||
|
if(R<=mid)
|
||||||
|
return query(lson,L,R);
|
||||||
|
if(L>mid)
|
||||||
|
return query(rson,L,R);
|
||||||
|
return query(lson,L,mid)+query(rson,mid+1,R);
|
||||||
|
}
|
||||||
|
void change(int u,int v)
|
||||||
|
{
|
||||||
|
while(top[u]!=top[v])
|
||||||
|
{
|
||||||
|
if(dep[top[u]]>dep[top[v]])
|
||||||
|
swap(u,v);
|
||||||
|
update2(1,tim,dfn[top[v]],dfn[v]);
|
||||||
|
v=p[top[v]];
|
||||||
|
}
|
||||||
|
if(u==v) return;
|
||||||
|
if(dep[u]>dep[v])
|
||||||
|
swap(u,v);
|
||||||
|
update2(1,tim,dfn[son[u]],dfn[v]);
|
||||||
|
}
|
||||||
|
int query(int u,int v)
|
||||||
|
{
|
||||||
|
int ans=0;
|
||||||
|
while(top[u]!=top[v])
|
||||||
|
{
|
||||||
|
if(dep[top[u]]>dep[top[v]])
|
||||||
|
swap(u,v);
|
||||||
|
ans+=query(1,tim,dfn[top[v]],dfn[v]);
|
||||||
|
v=p[top[v]];
|
||||||
|
}
|
||||||
|
if(u==v) return ans;
|
||||||
|
if(dep[u]>dep[v])
|
||||||
|
swap(u,v);
|
||||||
|
ans+=query(1,tim,dfn[u]+1,dfn[v]);
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d",&t);
|
||||||
|
for(int cas = 1;cas <= t;cas++)
|
||||||
|
{
|
||||||
|
scanf("%d%d%d",&n,&m,&q);
|
||||||
|
init();
|
||||||
|
for(int i=1;i<=m;i++)
|
||||||
|
{
|
||||||
|
edge tmp;
|
||||||
|
scanf("%d%d",&tmp.a,&tmp.b);
|
||||||
|
if(tmp.a > tmp.b) swap(tmp.a,tmp.b);
|
||||||
|
S.insert(tmp);
|
||||||
|
}
|
||||||
|
for(int i=1;i<=q;i++)
|
||||||
|
{
|
||||||
|
scanf("%d%d%d",&ans[i].kind,&ans[i].a,&ans[i].b);
|
||||||
|
if(ans[i].a > ans[i].b) swap(ans[i].a,ans[i].b);
|
||||||
|
if(ans[i].kind == 1)
|
||||||
|
{
|
||||||
|
multiset<edge>::iterator Pos = S.find(edge(ans[i].a,ans[i].b));
|
||||||
|
S.erase(Pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(multiset<edge>::iterator It = S.begin();It != S.end();++It)
|
||||||
|
{
|
||||||
|
if(getfather(It->a) != getfather(It->b))
|
||||||
|
{
|
||||||
|
bingchafa[getfather(It->a)] = getfather(It->b);
|
||||||
|
V.insert(*It);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(multiset<edge>::iterator It = V.begin();It != V.end();++It)
|
||||||
|
{
|
||||||
|
addedge(It->a,It->b,1);
|
||||||
|
addedge(It->b,It->a,1);
|
||||||
|
}
|
||||||
|
dfs(1);getid(1,1);
|
||||||
|
build(1,tim);
|
||||||
|
for(multiset<edge>::iterator It = S.begin();It != S.end();++It)
|
||||||
|
if(V.find(*It) == V.end())
|
||||||
|
{
|
||||||
|
change(It->a,It->b);
|
||||||
|
}
|
||||||
|
for(int i=q;i>=1;i--)
|
||||||
|
{
|
||||||
|
if(ans[i].kind == 1)
|
||||||
|
change(ans[i].a,ans[i].b);
|
||||||
|
else if(ans[i].kind == 2)
|
||||||
|
ans[i].val = query(ans[i].a,ans[i].b);
|
||||||
|
}
|
||||||
|
printf("Case #%d:\n",cas);
|
||||||
|
for(int i=1;i<=q;i++)
|
||||||
|
if(ans[i].kind == 2)
|
||||||
|
printf("%d\n",ans[i].val);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
46
HDOJ/5459_autoAC.cpp
Normal file
46
HDOJ/5459_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string>
|
||||||
|
#include <cmath>
|
||||||
|
#include <queue>
|
||||||
|
#include <set>
|
||||||
|
#include <stack>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn = 201315;
|
||||||
|
const int mod = 530600414;
|
||||||
|
typedef long long LL;
|
||||||
|
LL dp[maxn];
|
||||||
|
LL dist[maxn];
|
||||||
|
LL cnt[maxn];
|
||||||
|
LL fibo[maxn];
|
||||||
|
void init() {
|
||||||
|
fibo[1] = 1, fibo[2] = 2;
|
||||||
|
cnt[1] = 1, cnt[2] = 0;
|
||||||
|
for (int i = 3; i < maxn; i ++) {
|
||||||
|
fibo[i] = (fibo[i-1] % mod + fibo[i-2] % mod) % mod;
|
||||||
|
cnt[i] = (cnt[i-1] % mod + cnt[i-2] % mod) % mod;
|
||||||
|
}
|
||||||
|
dist[1] = dist[2] = 0, dist[3] = 2;
|
||||||
|
for (int i = 4; i < maxn; i ++) {
|
||||||
|
dist[i] = (dist[i-1] % mod + dist[i-2] % mod + (fibo[i-1] % mod * cnt[i-2] % mod) % mod) % mod;
|
||||||
|
}
|
||||||
|
dp[4] = dp[1] = dp[2] = dp[3] = 0;
|
||||||
|
for (int i = 5; i < maxn; i ++) {
|
||||||
|
dp[i] = (dp[i-2] % mod + dp[i-1] % mod
|
||||||
|
+ (cnt[i-1] % mod * dist[i-2] % mod) % mod
|
||||||
|
+ (cnt[i-2] % mod * ((fibo[i-1] % mod * cnt[i-1] % mod) % mod - dist[i-1] % mod) % mod) % mod) % mod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
init();
|
||||||
|
int cas = 1, t, n;
|
||||||
|
scanf("%d", &t);
|
||||||
|
while (t --) {
|
||||||
|
scanf("%d", &n);
|
||||||
|
printf("Case #%d: ", cas ++);
|
||||||
|
printf("%I64d\n", dp[n]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
59
HDOJ/5460_autoAC.cpp
Normal file
59
HDOJ/5460_autoAC.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <map>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const int maxn = (1<<8)+5;
|
||||||
|
const int limit = 32 * 13 * 13;
|
||||||
|
typedef long long ll;
|
||||||
|
typedef map<int,ll>::iterator iter;
|
||||||
|
int N, Q, X[20], multi[maxn], ct[maxn];
|
||||||
|
map<int, ll> G[maxn];
|
||||||
|
int bitcount(int s) { return s == 0 ? 0 : bitcount(s>>1) + (s&1); }
|
||||||
|
void add (int u, int s, ll k) {
|
||||||
|
if (s < 0) return;
|
||||||
|
G[u][s] += k;
|
||||||
|
}
|
||||||
|
void merge(int u, int p, int q) {
|
||||||
|
for (iter i = G[p].begin(); i != G[p].end(); i++) {
|
||||||
|
for (iter j = G[q].begin(); j != G[q].end(); j++) {
|
||||||
|
ll k = 1LL * i->second * j->second;
|
||||||
|
add(u, i->first + j->first, k * 2);
|
||||||
|
add(u, i->first * j->first, k * 2);
|
||||||
|
add(u, i->first - j->first, k);
|
||||||
|
add(u, j->first - i->first, k);
|
||||||
|
if (i->first && j->first % i->first == 0)
|
||||||
|
add(u, j->first / i->first, k);
|
||||||
|
if (j->first && i->first % j->first == 0)
|
||||||
|
add(u, i->first / j->first, k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ll solve () {
|
||||||
|
ll ret = 0;
|
||||||
|
for (int i = 1; i < (1<<N); i++) {
|
||||||
|
int cbit = bitcount(i);
|
||||||
|
for (int u = i; u; u = (u-1)&i) {
|
||||||
|
int v = u^i;
|
||||||
|
if (u < v) break;
|
||||||
|
merge(i, u, v);
|
||||||
|
}
|
||||||
|
if (G[i].count(Q))
|
||||||
|
ret += G[i][Q] * cbit * cbit;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
int cas;
|
||||||
|
scanf("%d", &cas);
|
||||||
|
for (int kcas = 1; kcas <= cas; kcas++) {
|
||||||
|
scanf("%d%d", &N, &Q);
|
||||||
|
for (int i = 0; i < (1<<N); i++) G[i].clear();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
scanf("%d", &X[i]);
|
||||||
|
G[1<<i][X[i]] = 1;
|
||||||
|
}
|
||||||
|
printf("Case #%d: %lld\n", kcas, solve());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
47
HDOJ/5461_autoAC.cpp
Normal file
47
HDOJ/5461_autoAC.cpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<utility>
|
||||||
|
#include<algorithm>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
typedef pair<LL,int> PLL;
|
||||||
|
PLL x[5],y[5];
|
||||||
|
bool cmp1(const PLL &x,const PLL &y) {return x.first>y.first;}
|
||||||
|
bool cmp2(const PLL &x,const PLL &y) {return x.first<y.first;}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T;
|
||||||
|
scanf("%d",&T);
|
||||||
|
int n,a,b;
|
||||||
|
LL z;
|
||||||
|
for(int k=1;k<=T;k++)
|
||||||
|
{
|
||||||
|
scanf("%d%d%d",&n,&a,&b);
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
{
|
||||||
|
scanf("%lld",&z);
|
||||||
|
x[4]=make_pair(z*z,i);
|
||||||
|
y[4]=make_pair(z,i);
|
||||||
|
if(i<=4)
|
||||||
|
{
|
||||||
|
x[i]=x[4];
|
||||||
|
y[i]=y[4];
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
if(a>0)
|
||||||
|
sort(x,x+5,cmp1);
|
||||||
|
else sort(x,x+5,cmp2);
|
||||||
|
if(b>0)
|
||||||
|
sort(y,y+5,cmp1);
|
||||||
|
else sort(y,y+5,cmp2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LL ans=-1e20;
|
||||||
|
for(int i=0;i<min(n,2);i++)
|
||||||
|
for(int j=0;j<min(n,2);j++)
|
||||||
|
if(x[i].second!=y[j].second)
|
||||||
|
ans=max(ans,x[i].first*a+b*y[j].first);
|
||||||
|
printf("Case #%d: %lld\n",k,ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
204
HDOJ/5462_autoAC.cpp
Normal file
204
HDOJ/5462_autoAC.cpp
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <math.h>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const int maxn = 1005;
|
||||||
|
const double eps = 1e-7;
|
||||||
|
struct Point
|
||||||
|
{
|
||||||
|
double x, y;
|
||||||
|
Point(double x = 0, double y = 0) : x(x), y(y) { }
|
||||||
|
bool operator < (const Point &a) const {
|
||||||
|
return a.x < x || (a.x == x && a.y < y);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
typedef Point Vector;
|
||||||
|
struct Line
|
||||||
|
{
|
||||||
|
Point P;
|
||||||
|
Vector v;
|
||||||
|
double ang;
|
||||||
|
Line() {}
|
||||||
|
Line(Point P, Vector v) : P(P), v(v) { ang = atan2(v.y, v.x); }
|
||||||
|
bool operator < (const Line &L) const {
|
||||||
|
return ang < L.ang;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Vector operator + (Vector A, Vector B)
|
||||||
|
{
|
||||||
|
return Vector(A.x + B.x, A.y + B.y);
|
||||||
|
}
|
||||||
|
Vector operator - (Vector A, Vector 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);
|
||||||
|
}
|
||||||
|
int dcmp(double x)
|
||||||
|
{
|
||||||
|
if(fabs(x) < eps) return 0;
|
||||||
|
else return x < 0 ? -1 : 1;
|
||||||
|
}
|
||||||
|
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 PolyonArea(Point *p, int n)
|
||||||
|
{
|
||||||
|
double area = 0;
|
||||||
|
for(int i = 1; i < n-1; i++)
|
||||||
|
area += Cross(p[i] - p[0], p[i+1] - p[0]);
|
||||||
|
return area / 2;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
bool OnLeft(Line L, Point p)
|
||||||
|
{
|
||||||
|
return Cross(L.v, p - L.P) > 0;
|
||||||
|
}
|
||||||
|
Point GetIntersection(Line a, Line b)
|
||||||
|
{
|
||||||
|
Vector u = a.P - b.P;
|
||||||
|
double t = Cross(b.v, u) / Cross(a.v, b.v);
|
||||||
|
return a.P + a.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 > 1) m--;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
Point p[maxn];
|
||||||
|
Line q[maxn];
|
||||||
|
int HalfplaneInersection(Line* L, int n, Point* poly)
|
||||||
|
{
|
||||||
|
sort(L, L+n);
|
||||||
|
int first, last;
|
||||||
|
q[first = last = 0] = L[0];
|
||||||
|
for(int i = 1; i < n; i++) {
|
||||||
|
while(first < last && !OnLeft(L[i], p[last - 1])) last--;
|
||||||
|
while(first < last && !OnLeft(L[i], p[first])) first++;
|
||||||
|
q[++last] = L[i];
|
||||||
|
if(fabs(Cross(q[last].v, q[last-1].v)) < eps) {
|
||||||
|
last--;
|
||||||
|
if(OnLeft(q[last], L[i].P)) q[last] = L[i];
|
||||||
|
}
|
||||||
|
if(first < last) p[last-1] = GetIntersection(q[last-1], q[last]);
|
||||||
|
}
|
||||||
|
while(first < last && !OnLeft(q[first], p[last-1])) last--;
|
||||||
|
if(last - first <= 1) return 0;
|
||||||
|
p[last] = GetIntersection(q[last], q[first]);
|
||||||
|
int m = 0;
|
||||||
|
for(int i = first; i <= last; i++) poly[m++] = p[i];
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
double PolygonArea(Point *p, int n) {
|
||||||
|
double area = 0;
|
||||||
|
for(int i = 1; i < n-1; i++)
|
||||||
|
area += Cross(p[i] - p[0], p[i+1] - p[0]);
|
||||||
|
return fabs(area / 2);
|
||||||
|
}
|
||||||
|
Point poly[1005];
|
||||||
|
Point g[105][2005];
|
||||||
|
Point P2[10];
|
||||||
|
Line line[105];
|
||||||
|
double twox[105][2005];
|
||||||
|
double twoy[105][2005];
|
||||||
|
double xx[105][2005];
|
||||||
|
double yy[105][2005];
|
||||||
|
int n, m;
|
||||||
|
void work()
|
||||||
|
{
|
||||||
|
scanf("%d%d", &n, &m);
|
||||||
|
for(int i = 1; i <= n; i++) {
|
||||||
|
twox[i][0] = twoy[i][0] = xx[i][0] = yy[i][0] = 0;
|
||||||
|
for(int j = 1; j <= m; j++) {
|
||||||
|
scanf("%lf%lf", &g[i][j].x, &g[i][j].y);
|
||||||
|
twox[i][j] = g[i][j].x * g[i][j].x;
|
||||||
|
twoy[i][j] = g[i][j].y * g[i][j].y;
|
||||||
|
twox[i][j] += twox[i][j-1];
|
||||||
|
twoy[i][j] += twoy[i][j-1];
|
||||||
|
xx[i][j] = g[i][j].x + xx[i][j-1];
|
||||||
|
yy[i][j] = g[i][j].y + yy[i][j-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i = 1; i <= n; i++) {
|
||||||
|
int cnt = 0;
|
||||||
|
for(int j = 1; j <= n; j++) {
|
||||||
|
if(i == j) continue;
|
||||||
|
double a = 0, b = 0, c = 0;
|
||||||
|
a = 2 * (xx[i][m] - xx[j][m]);
|
||||||
|
b = 2 * (yy[i][m] - yy[j][m]);
|
||||||
|
c += twox[j][m] + twoy[j][m];
|
||||||
|
c -= twox[i][m] + twoy[i][m];
|
||||||
|
Point P;
|
||||||
|
Vector v(b, -a);
|
||||||
|
if(fabs(a) > fabs(b)) P = Point(-c / a, 0);
|
||||||
|
else P = Point(0, -c / b);
|
||||||
|
line[cnt++] = Line(P, v);
|
||||||
|
}
|
||||||
|
for(int j = 0; j < 4; j++) {
|
||||||
|
line[cnt++] = Line(P2[j], P2[(j+1)%4] - P2[j]);
|
||||||
|
}
|
||||||
|
int t = HalfplaneInersection(line, cnt, poly);
|
||||||
|
double area = PolygonArea(poly, t);
|
||||||
|
int ans = area + 0.5;
|
||||||
|
printf("%d%c", ans, i == n ? '\n' : ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
P2[0] = Point(0, 0);
|
||||||
|
P2[1] = Point(4095, 0);
|
||||||
|
P2[2] = Point(4095, 4095);
|
||||||
|
P2[3] = Point(0, 4095);
|
||||||
|
int _;
|
||||||
|
scanf("%d", &_);
|
||||||
|
for(int i = 1; i <= _; i++) {
|
||||||
|
printf("Case #%d: ", i);
|
||||||
|
work();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
34
HDOJ/5463_autoAC.cpp
Normal file
34
HDOJ/5463_autoAC.cpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
const int maxn=1100;
|
||||||
|
int T;
|
||||||
|
int n,m,r;
|
||||||
|
int vis[maxn];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
scanf("%d",&T);
|
||||||
|
while(T--){
|
||||||
|
scanf("%d",&n);
|
||||||
|
memset(vis,0,sizeof(vis));
|
||||||
|
int ans=0;
|
||||||
|
for(int i=0;i<n;i++){
|
||||||
|
scanf("%d %d",&r,&m);
|
||||||
|
vis[r]+=m;
|
||||||
|
}
|
||||||
|
for(int i=0;i<=500;i++){
|
||||||
|
if(vis[i]>0){
|
||||||
|
if(vis[i]%64==0){
|
||||||
|
ans+=vis[i]/64;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
ans+=vis[i]/64+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!ans%36)
|
||||||
|
printf("%d\n",ans/36);
|
||||||
|
else
|
||||||
|
printf("%d\n",ans/36+1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
31
HDOJ/5464_autoAC.cpp
Normal file
31
HDOJ/5464_autoAC.cpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#define ll long long
|
||||||
|
using namespace std;
|
||||||
|
const int N = 1005;
|
||||||
|
const int MOD = 1e9 + 7;
|
||||||
|
const int INF = 0x3f3f3f3f;
|
||||||
|
int n, p, a[N], f[N][N];
|
||||||
|
int main() {
|
||||||
|
int t;
|
||||||
|
scanf("%d", &t);
|
||||||
|
while (t--) {
|
||||||
|
scanf("%d%d", &n, &p);
|
||||||
|
memset(f, 0, sizeof(f));
|
||||||
|
f[0][0] = 1;
|
||||||
|
for (int i = 1; i <= n; i++) {
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
a[i] %= p;
|
||||||
|
a[i] = (a[i] + p) % p;
|
||||||
|
}
|
||||||
|
for (int i = 1; i <= n; i++) {
|
||||||
|
for (int j = 0; j < p; j++) {
|
||||||
|
f[i][j] = (f[i][j] + f[i - 1][j]) % MOD;
|
||||||
|
f[i][(j + a[i]) % p] = (f[i][(j + a[i]) % p] + f[i - 1][j]) % MOD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%d\n", f[n][0]);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
117
HDOJ/5465_autoAC.cpp
Normal file
117
HDOJ/5465_autoAC.cpp
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
#pragma comment(linker, "/STACK:1677721600")
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <cmath>
|
||||||
|
#include <queue>
|
||||||
|
#include <stack>
|
||||||
|
#include <vector>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <climits>
|
||||||
|
#include <cassert>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#define pb push_back
|
||||||
|
#define mp make_pair
|
||||||
|
#define LL long long
|
||||||
|
#define lson lo,mi,rt<<1
|
||||||
|
#define rson mi+1,hi,rt<<1|1
|
||||||
|
#define Min(a,b) ((a)<(b)?(a):(b))
|
||||||
|
#define Max(a,b) ((a)>(b)?(a):(b))
|
||||||
|
#define mem(a,b) memset(a,b,sizeof(a))
|
||||||
|
#define rep(i,a,b) for(int i=(a); i<=(b); i++)
|
||||||
|
#define dec(i,a,b) for(int i=(a); i>=(b); i--)
|
||||||
|
using namespace std;
|
||||||
|
const int mod = 1e9 + 7;
|
||||||
|
const double eps = 1e-8;
|
||||||
|
const double ee = exp(1.0);
|
||||||
|
const int inf = 0x3f3f3f3f;
|
||||||
|
const int maxn = 500 + 10;
|
||||||
|
const double pi = acos(-1.0);
|
||||||
|
const LL iinf = 0x3f3f3f3f3f3f3f3f;
|
||||||
|
int readT()
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
int ret = 0,flg = 0;
|
||||||
|
while(c = getchar(), (c < '0' || c > '9') && c != '-');
|
||||||
|
if(c == '-') flg = 1; else ret = c ^ 48;
|
||||||
|
while( c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c ^ 48);
|
||||||
|
return flg ? - ret : ret;
|
||||||
|
}
|
||||||
|
int c[maxn][maxn];
|
||||||
|
int a[maxn][maxn];
|
||||||
|
int n, m;
|
||||||
|
int lowbit(int x)
|
||||||
|
{
|
||||||
|
return x & -x;
|
||||||
|
}
|
||||||
|
void update(int x, int y, int num)
|
||||||
|
{
|
||||||
|
for (int i = x; i <= n; i += lowbit(i))
|
||||||
|
{
|
||||||
|
for (int j = y; j <= m; j += lowbit(j))
|
||||||
|
{
|
||||||
|
c[i][j] ^= num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int query(int x, int y)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
int t = x;
|
||||||
|
for (int i = x; i > 0; i -= lowbit(i))
|
||||||
|
{
|
||||||
|
for (int j = y; j > 0; j -= lowbit(j))
|
||||||
|
{
|
||||||
|
res ^= c[i][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
int sum(int x0, int y0, int x1, int y1)
|
||||||
|
{
|
||||||
|
x0--, y0--;
|
||||||
|
return query(x1, y1) ^ query(x0, y1) ^ query(x1, y0) ^ query(x0, y0);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int ncase = readT();
|
||||||
|
while (ncase--)
|
||||||
|
{
|
||||||
|
mem(c, 0);
|
||||||
|
n = readT();
|
||||||
|
m = readT();
|
||||||
|
int q = readT();
|
||||||
|
rep(i, 1, n)
|
||||||
|
{
|
||||||
|
rep(j, 1, m)
|
||||||
|
{
|
||||||
|
a[i][j] = readT();
|
||||||
|
update(i, j, a[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (q--)
|
||||||
|
{
|
||||||
|
int op = readT();
|
||||||
|
if (op == 1)
|
||||||
|
{
|
||||||
|
int x1 = readT();
|
||||||
|
int y1 = readT();
|
||||||
|
int x2 = readT();
|
||||||
|
int y2 = readT();
|
||||||
|
int ans = sum(x1, y1, x2, y2);
|
||||||
|
puts(ans ? "Yes" : "No");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int x = readT();
|
||||||
|
int y = readT();
|
||||||
|
int num =readT();
|
||||||
|
update(x, y, num ^ a[x][y]);
|
||||||
|
a[x][y] = num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
236
HDOJ/5467_autoAC.cpp
Normal file
236
HDOJ/5467_autoAC.cpp
Normal file
|
@ -0,0 +1,236 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <math.h>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
#define mp(x, y) make_pair(x, y)
|
||||||
|
const int maxn = 300005;
|
||||||
|
const int maxm = 300005;
|
||||||
|
const int INF = 0x3f3f3f3f;
|
||||||
|
const int mod = 1e9+7;
|
||||||
|
struct node *null;
|
||||||
|
struct node
|
||||||
|
{
|
||||||
|
int size, rev;
|
||||||
|
LL val, sum;
|
||||||
|
node *fa, *ch[2];
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
rev = val = sum = 0;
|
||||||
|
fa = ch[0] = ch[1] = null;
|
||||||
|
}
|
||||||
|
inline bool d()
|
||||||
|
{
|
||||||
|
return fa->ch[1] == this;
|
||||||
|
}
|
||||||
|
inline bool isroot()
|
||||||
|
{
|
||||||
|
return fa == null || fa->ch[0] != this && fa->ch[1] != this;
|
||||||
|
}
|
||||||
|
inline void setc(node *p, int d)
|
||||||
|
{
|
||||||
|
ch[d] = p;
|
||||||
|
p->fa = this;
|
||||||
|
}
|
||||||
|
inline void pushup()
|
||||||
|
{
|
||||||
|
sum = ch[0]->sum * ch[1]->sum % mod * ((val - 1) * val / 2) % mod;
|
||||||
|
}
|
||||||
|
inline void flip()
|
||||||
|
{
|
||||||
|
if(this == null) return;
|
||||||
|
swap(ch[0], ch[1]);
|
||||||
|
rev ^= 1;
|
||||||
|
}
|
||||||
|
inline void pushdown()
|
||||||
|
{
|
||||||
|
if(rev) {
|
||||||
|
ch[0]->flip();
|
||||||
|
ch[1]->flip();
|
||||||
|
rev = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inline void go()
|
||||||
|
{
|
||||||
|
if(!isroot()) fa->go();
|
||||||
|
pushdown();
|
||||||
|
}
|
||||||
|
void rot()
|
||||||
|
{
|
||||||
|
node *f = fa, *ff = fa->fa;
|
||||||
|
int c = d(), cc = fa->d();
|
||||||
|
f->setc(ch[!c], c);
|
||||||
|
this->setc(f, !c);
|
||||||
|
if(ff->ch[cc] == f) ff->setc(this, cc);
|
||||||
|
else this->fa = ff;
|
||||||
|
f->pushup();
|
||||||
|
}
|
||||||
|
node* splay()
|
||||||
|
{
|
||||||
|
go();
|
||||||
|
while(!isroot()) {
|
||||||
|
if(!fa->isroot()) d() == fa->d() ? fa->rot() : rot();
|
||||||
|
rot();
|
||||||
|
}
|
||||||
|
pushup();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
node* access()
|
||||||
|
{
|
||||||
|
for(node *p = this, *q = null; p != null; q = p, p = p->fa) {
|
||||||
|
p->splay()->setc(q, 1);
|
||||||
|
p->pushup();
|
||||||
|
}
|
||||||
|
return splay();
|
||||||
|
}
|
||||||
|
inline void makeroot()
|
||||||
|
{
|
||||||
|
access()->flip();
|
||||||
|
}
|
||||||
|
node* getroot() {
|
||||||
|
node *x;
|
||||||
|
for(x = access(); x->pushdown(), x->ch[0] != null; x = x->ch[0]);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
void cut()
|
||||||
|
{
|
||||||
|
access();
|
||||||
|
ch[0]->fa = null;
|
||||||
|
ch[0] = null;
|
||||||
|
pushup();
|
||||||
|
}
|
||||||
|
void cut(node *o)
|
||||||
|
{
|
||||||
|
makeroot();
|
||||||
|
o->cut();
|
||||||
|
}
|
||||||
|
void link(node *p)
|
||||||
|
{
|
||||||
|
makeroot();
|
||||||
|
fa = p;
|
||||||
|
}
|
||||||
|
}*Node[maxn], pool[maxm], *tail;
|
||||||
|
struct ope
|
||||||
|
{
|
||||||
|
int kk, u, v;
|
||||||
|
ope(int kk = 0, int u = 0, int v = 0) : kk(kk), u(u), v(v) {}
|
||||||
|
}op[maxn];
|
||||||
|
struct Edge
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
Edge *next;
|
||||||
|
}*H[maxn], *edges, E[maxn];
|
||||||
|
vector<int> to[maxn];
|
||||||
|
LL res[maxn];
|
||||||
|
int T[maxn];
|
||||||
|
int a[maxn];
|
||||||
|
int n, m;
|
||||||
|
void addedges(int u, int v)
|
||||||
|
{
|
||||||
|
edges->v = v;
|
||||||
|
edges->next = H[u];
|
||||||
|
H[u] = edges++;
|
||||||
|
}
|
||||||
|
node* newnode(int val)
|
||||||
|
{
|
||||||
|
tail->init();
|
||||||
|
tail->val = val;
|
||||||
|
tail->sum = tail->val * (tail->val - 1) / 2;
|
||||||
|
return tail++;
|
||||||
|
}
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
tail = pool;
|
||||||
|
null = newnode(1);
|
||||||
|
null->sum = 1;
|
||||||
|
edges = E;
|
||||||
|
memset(H, 0, sizeof H);
|
||||||
|
memset(T, 0, sizeof T);
|
||||||
|
memset(res, -1, sizeof res);
|
||||||
|
}
|
||||||
|
bool add(int u, int v)
|
||||||
|
{
|
||||||
|
if(u == v) return 0;
|
||||||
|
if(Node[u]->getroot() == Node[v]->getroot()) return 0;
|
||||||
|
Node[u]->link(Node[v]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool del(int u, int v)
|
||||||
|
{
|
||||||
|
if(u == v) return 0;
|
||||||
|
if(Node[u]->getroot() != Node[v]->getroot()) return 0;
|
||||||
|
Node[u]->makeroot();
|
||||||
|
Node[v]->access();
|
||||||
|
if(Node[v]->ch[0] != Node[u] || Node[u]->ch[1] != null) return 0;
|
||||||
|
else Node[v]->cut(Node[u]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
LL query(node *a, node *b)
|
||||||
|
{
|
||||||
|
a->access();
|
||||||
|
for(a = null; b != null; a = b, b = b->fa) {
|
||||||
|
b->splay();
|
||||||
|
if(b->fa == null) return b->ch[1]->sum * a->sum % mod * (b->val * (b->val - 1) / 2) % mod;
|
||||||
|
b->setc(a, 1);
|
||||||
|
b->pushup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void modify(int u, LL val)
|
||||||
|
{
|
||||||
|
Node[u]->access();
|
||||||
|
Node[u]->val = val;
|
||||||
|
Node[u]->pushup();
|
||||||
|
}
|
||||||
|
void dfs(int ti)
|
||||||
|
{
|
||||||
|
LL tmp = 0;
|
||||||
|
int flag = 0;
|
||||||
|
if(op[ti].kk == 1) flag = add(op[ti].u, op[ti].v);
|
||||||
|
if(op[ti].kk == 2) flag = del(op[ti].u, op[ti].v);
|
||||||
|
if(op[ti].kk == 4) {
|
||||||
|
if(Node[op[ti].u]->getroot() != Node[op[ti].v]->getroot()) res[ti] = 0;
|
||||||
|
else res[ti] = query(Node[op[ti].u], Node[op[ti].v]);
|
||||||
|
}
|
||||||
|
if(op[ti].kk == 5) {
|
||||||
|
tmp = a[op[ti].u];
|
||||||
|
a[op[ti].u] = op[ti].v;
|
||||||
|
modify(op[ti].u, op[ti].v);
|
||||||
|
}
|
||||||
|
for(Edge *e = H[ti]; e; e = e->next) dfs(e->v);
|
||||||
|
if(op[ti].kk == 2 && flag) add(op[ti].u, op[ti].v);
|
||||||
|
if(op[ti].kk == 1 && flag) del(op[ti].u, op[ti].v);
|
||||||
|
if(op[ti].kk == 5) {
|
||||||
|
a[op[ti].u] = tmp;
|
||||||
|
modify(op[ti].u, tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void work()
|
||||||
|
{
|
||||||
|
scanf("%d%d", &n, &m);
|
||||||
|
for(int i = 1; i <= n; i++) to[i].clear();
|
||||||
|
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
|
||||||
|
for(int i = 1; i <= n; i++) Node[i] = newnode(a[i]);
|
||||||
|
for(int i = 1; i <= m; i++) {
|
||||||
|
int kk, u, v;
|
||||||
|
scanf("%d", &kk);
|
||||||
|
if(kk == 3) scanf("%d", &u), T[i] = u;
|
||||||
|
else scanf("%d%d", &u, &v), T[i] = i-1;
|
||||||
|
op[i] = ope(kk, u, v);
|
||||||
|
}
|
||||||
|
for(int i = 1; i <= m; i++) addedges(T[i], i);
|
||||||
|
dfs(0);
|
||||||
|
for(int i = 1; i <= m; i++) if(res[i] != -1) printf("%lld\n", res[i]);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int _;
|
||||||
|
scanf("%d", &_);
|
||||||
|
while(_--) {
|
||||||
|
init();
|
||||||
|
work();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
166
HDOJ/5468_autoAC.cpp
Normal file
166
HDOJ/5468_autoAC.cpp
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<iostream>
|
||||||
|
#include<vector>
|
||||||
|
#include<set>
|
||||||
|
#include<map>
|
||||||
|
#include<queue>
|
||||||
|
#include<sstream>
|
||||||
|
#include<string>
|
||||||
|
#include<bitset>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const LL LINF = (1LL <<63);
|
||||||
|
const int INF = 1 << 31;
|
||||||
|
const int NS = 100010;
|
||||||
|
const int MS = 19;
|
||||||
|
const int MOD = 1000000007;
|
||||||
|
const int EDGE_MAX = NS;
|
||||||
|
struct graphEdge
|
||||||
|
{
|
||||||
|
int pst;
|
||||||
|
int next;
|
||||||
|
};
|
||||||
|
struct ForwardStart
|
||||||
|
{
|
||||||
|
int top;
|
||||||
|
int head[EDGE_MAX];
|
||||||
|
graphEdge edge[EDGE_MAX << 1];
|
||||||
|
void init(int len)
|
||||||
|
{
|
||||||
|
top = 0;
|
||||||
|
memset(head, -1, sizeof(int) * len);
|
||||||
|
}
|
||||||
|
void addEdge(int u, int v)
|
||||||
|
{
|
||||||
|
edge[top].pst = v;
|
||||||
|
edge[top].next = head[u];
|
||||||
|
head[u] = top++;
|
||||||
|
}
|
||||||
|
void printAll()
|
||||||
|
{
|
||||||
|
printf("top = %d\n", top);
|
||||||
|
for(int i = 1; i < EDGE_MAX; i++)
|
||||||
|
{
|
||||||
|
if(-1 != head[i])
|
||||||
|
{
|
||||||
|
printf("head[%2d]'son:%2d", i, edge[head[i]].pst);
|
||||||
|
for(int j = edge[head[i]].next; j != -1; j = edge[j].next)
|
||||||
|
{
|
||||||
|
printf(",%2d", edge[j].pst);
|
||||||
|
}
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}cTree;
|
||||||
|
bitset<NS> isPrime;
|
||||||
|
vector<int> fac[NS];
|
||||||
|
int miu[NS];
|
||||||
|
void prepare()
|
||||||
|
{
|
||||||
|
isPrime.set();
|
||||||
|
isPrime[1] = false;
|
||||||
|
miu[1] = 1;
|
||||||
|
for(int i = 2; i < NS; i++)
|
||||||
|
{
|
||||||
|
if(isPrime[i])
|
||||||
|
{
|
||||||
|
for(int j = i; j < NS; j+=i)
|
||||||
|
{
|
||||||
|
isPrime[j] = false;
|
||||||
|
int k = j / i;
|
||||||
|
if(k % i)
|
||||||
|
{
|
||||||
|
miu[j] = -miu[k];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
miu[j] = 0;
|
||||||
|
}
|
||||||
|
fac[j].push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(miu[i] != 0)
|
||||||
|
{
|
||||||
|
for(int j = i; j < NS; j+=i)
|
||||||
|
{
|
||||||
|
fac[j].push_back(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int n;
|
||||||
|
int val[NS];
|
||||||
|
int ans[NS];
|
||||||
|
int sz[NS];
|
||||||
|
int dp[NS];
|
||||||
|
void dfs(int rt, int fa)
|
||||||
|
{
|
||||||
|
vector<int> temp;
|
||||||
|
sz[rt] = 1;
|
||||||
|
int value = val[rt];
|
||||||
|
int len = fac[value].size();
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
int d = fac[value][i];
|
||||||
|
int cnt = dp[d];
|
||||||
|
temp.push_back(cnt);
|
||||||
|
dp[d] += 1;
|
||||||
|
}
|
||||||
|
for(int i = cTree.head[rt]; i != -1; i = cTree.edge[i].next)
|
||||||
|
{
|
||||||
|
int cson = cTree.edge[i].pst;
|
||||||
|
if(cson == fa) continue;
|
||||||
|
dfs(cson, rt);
|
||||||
|
sz[rt] += sz[cson];
|
||||||
|
}
|
||||||
|
ans[rt] = sz[rt];
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
int d = fac[value][i];
|
||||||
|
int cnt = dp[d] - temp[i];
|
||||||
|
if(cnt > 0)
|
||||||
|
{
|
||||||
|
ans[rt] += miu[d] * cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
int nCase = 1;
|
||||||
|
while(~scanf("%d", &n))
|
||||||
|
{
|
||||||
|
cTree.init(n + n + 2);
|
||||||
|
int u, v;
|
||||||
|
for(int i = 1; i < n; i++)
|
||||||
|
{
|
||||||
|
scanf("%d %d", &u, &v);
|
||||||
|
cTree.addEdge(u, v);
|
||||||
|
cTree.addEdge(v, u);
|
||||||
|
}
|
||||||
|
for(int i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
scanf("%d", &val[i]);
|
||||||
|
if(val[i] < 0)
|
||||||
|
{
|
||||||
|
val[i] = - val[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memset(dp, 0, sizeof(dp));
|
||||||
|
dfs(1, -1);
|
||||||
|
printf("Case #%d:", nCase++);
|
||||||
|
for(int i = 1; i <= n; i++)
|
||||||
|
{
|
||||||
|
printf(" %d", ans[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
77
HDOJ/5469_autoAC.cpp
Normal file
77
HDOJ/5469_autoAC.cpp
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
#define N 10010
|
||||||
|
vector<int>G[N];
|
||||||
|
int n,len;
|
||||||
|
char value[N],an[N];
|
||||||
|
int dis[N];
|
||||||
|
int f[N];
|
||||||
|
bool visit[N];
|
||||||
|
void init() {
|
||||||
|
for(int i = 1; i <= n; i++) G[i].clear();
|
||||||
|
memset(dis,0,sizeof(dis));
|
||||||
|
memset(visit,0,sizeof(visit));
|
||||||
|
}
|
||||||
|
void dfs(int u) {
|
||||||
|
int ma = -10000000;
|
||||||
|
visit[u] = 1;
|
||||||
|
for(int i = 0; i < G[u].size(); i++)
|
||||||
|
if(!visit[G[u][i]]) {
|
||||||
|
dfs(G[u][i]);
|
||||||
|
f[G[u][i]] = u;
|
||||||
|
ma = max(ma,dis[G[u][i]]);
|
||||||
|
}
|
||||||
|
if(ma == -10000000)
|
||||||
|
dis[u] = 1;
|
||||||
|
else
|
||||||
|
dis[u] = ma+1;
|
||||||
|
}
|
||||||
|
bool dfs1(int u,int x,int len1) {
|
||||||
|
visit[u] = 1;
|
||||||
|
if(x > len) return 1;
|
||||||
|
if(dis[u] > len1)
|
||||||
|
for(int i = 0; i < G[u].size(); i++) {
|
||||||
|
if(value[G[u][i]] == an[x] && !visit[G[u][i]]) {
|
||||||
|
if(dfs1(G[u][i],x+1,len1-1)) return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(value[f[u]] == an[x] && !visit[f[u]]) {
|
||||||
|
return dfs1(f[u],x+1,len1-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
int t;scanf("%d",&t);
|
||||||
|
int ca = 1;
|
||||||
|
while(t--) {
|
||||||
|
scanf("%d",&n);
|
||||||
|
init();
|
||||||
|
int x,y;
|
||||||
|
for(int i = 1; i < n; i++) {
|
||||||
|
scanf("%d%d",&x,&y);
|
||||||
|
G[x].push_back(y);
|
||||||
|
G[y].push_back(x);
|
||||||
|
}
|
||||||
|
scanf("%s",value+1);
|
||||||
|
scanf("%s",an+1);
|
||||||
|
dfs(1); bool flag = 0;
|
||||||
|
len = strlen(an+1);
|
||||||
|
for(int i = 1; i <= n; i++)
|
||||||
|
if(value[i] == an[1]) {
|
||||||
|
memset(visit,0,sizeof(visit));
|
||||||
|
if(dfs1(i,2,len-1)) {
|
||||||
|
printf("Case #%d: Find\n",ca++);
|
||||||
|
flag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!flag) printf("Case #%d: Impossible\n",ca++);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
114
HDOJ/5470_autoAC.cpp
Normal file
114
HDOJ/5470_autoAC.cpp
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
const int N = 100000;
|
||||||
|
const int C = 26;
|
||||||
|
char s[N + 1];
|
||||||
|
struct State {
|
||||||
|
int length;
|
||||||
|
int first;
|
||||||
|
State* parent;
|
||||||
|
State* go[C];
|
||||||
|
State* extend(State*, int);
|
||||||
|
};
|
||||||
|
int state_count;
|
||||||
|
State states[N << 1];
|
||||||
|
State* new_state(int length) {
|
||||||
|
State* state = states + (state_count ++);
|
||||||
|
state->length = length;
|
||||||
|
state->first = -1;
|
||||||
|
state->parent = NULL;
|
||||||
|
memset(state->go, 0, sizeof(state->go));
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
State* State::extend(State* start, int token) {
|
||||||
|
State *p = this;
|
||||||
|
State *np = new_state(length + 1);
|
||||||
|
while (p && !p->go[token]) {
|
||||||
|
p->go[token] = np;
|
||||||
|
p = p->parent;
|
||||||
|
}
|
||||||
|
if (!p) {
|
||||||
|
np->parent = start;
|
||||||
|
} else {
|
||||||
|
State *q = p->go[token];
|
||||||
|
if (p->length + 1 == q->length) {
|
||||||
|
np->parent = q;
|
||||||
|
} else {
|
||||||
|
State *nq = new_state(p->length + 1);
|
||||||
|
memcpy(nq->go, q->go, sizeof(q->go));
|
||||||
|
nq->parent = q->parent;
|
||||||
|
np->parent = q->parent = nq;
|
||||||
|
while (p && p->go[token] == q) {
|
||||||
|
p->go[token] = nq;
|
||||||
|
p = p->parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return np;
|
||||||
|
}
|
||||||
|
int cost[C], a, b, match[N + 1], queue[N + 1];
|
||||||
|
State* end[N + 1];
|
||||||
|
long long minimum[N + 1];
|
||||||
|
int main() {
|
||||||
|
int T;
|
||||||
|
scanf("%d", &T);
|
||||||
|
for (int t = 1; t <= T; ++ t) {
|
||||||
|
scanf("%s", s);
|
||||||
|
for (int i = 0; i < C; ++ i) {
|
||||||
|
scanf("%d", cost + i);
|
||||||
|
}
|
||||||
|
scanf("%d%d", &a, &b);
|
||||||
|
int n = strlen(s);
|
||||||
|
state_count = 0;
|
||||||
|
end[0] = new_state(0);
|
||||||
|
for (int i = 0; i < n; ++ i) {
|
||||||
|
end[i + 1] = end[i]->extend(end[0], s[i]- 'a');
|
||||||
|
}
|
||||||
|
for (int i = 0; i < n; ++ i) {
|
||||||
|
for (State* p = end[i + 1]; p && !~p->first; p = p->parent) {
|
||||||
|
p->first = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
State* p = end[0];
|
||||||
|
for (int i = 0, l = 0; i < n; ++ i) {
|
||||||
|
int c = s[i] - 'a';
|
||||||
|
while (!p->go[c]) {
|
||||||
|
p = p->parent;
|
||||||
|
l = std::min(l, p->length);
|
||||||
|
}
|
||||||
|
p = p->go[c];
|
||||||
|
l ++;
|
||||||
|
while (p->first > i - l) {
|
||||||
|
l --;
|
||||||
|
if (p->parent->length == l) {
|
||||||
|
p = p->parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match[i + 1] = l;
|
||||||
|
}
|
||||||
|
minimum[0] = 0;
|
||||||
|
int head = 0;
|
||||||
|
int tail = 0;
|
||||||
|
queue[tail ++] = 0;
|
||||||
|
for (int i = 1; i <= n; ++ i) {
|
||||||
|
minimum[i] = minimum[i - 1] + cost[s[i - 1] - 'a'];
|
||||||
|
while (head < tail && queue[head] < i - match[i]) {
|
||||||
|
head ++;
|
||||||
|
}
|
||||||
|
if (head < tail) {
|
||||||
|
int j = queue[head];
|
||||||
|
minimum[i] = std::min(minimum[i], minimum[j] + (long long)a * (i - j) + b + b);
|
||||||
|
}
|
||||||
|
#define VALUE(i) (minimum[i] - (long long)a * (i))
|
||||||
|
while (head < tail && VALUE(queue[tail - 1]) > VALUE(i)) {
|
||||||
|
tail --;
|
||||||
|
}
|
||||||
|
#undef VALUE
|
||||||
|
queue[tail ++] = i;
|
||||||
|
}
|
||||||
|
std::cout << "Case #" << t << ": " << minimum[n] << std::endl;;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
110
HDOJ/5471_autoAC.cpp
Normal file
110
HDOJ/5471_autoAC.cpp
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
const int maxn = 1024 + 5;
|
||||||
|
const int mod = 1e9 + 7;
|
||||||
|
struct Rectangle {
|
||||||
|
int x1, y1, x2, y2, c;
|
||||||
|
Rectangle (int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0, int c = 0): x1(x1), y1(y1), x2(x2), y2(y2), c(c) {}
|
||||||
|
void read() { scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c); }
|
||||||
|
int size() { return (x2-x1+1)*(y2-y1+1); }
|
||||||
|
bool in(const Rectangle& u) const {
|
||||||
|
return x1 <= u.x1 && u.x2 <= x2 && y1 <= u.y1 && u.y2 <= y2;
|
||||||
|
}
|
||||||
|
}R[15];
|
||||||
|
int N, M, H, W, cc, all, ct[15][maxn], sz[15][maxn];
|
||||||
|
vector<int> X, Y, C, G[15];
|
||||||
|
int bitcount(int x) { return x == 0 ? 0 : bitcount(x>>1) + (x&1); }
|
||||||
|
void init () {
|
||||||
|
scanf("%d%d%d%d", &H, &W, &M, &N);
|
||||||
|
X.clear(), Y.clear(), C.clear();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
R[i].read();
|
||||||
|
X.push_back(R[i].x1-1);
|
||||||
|
X.push_back(R[i].x2);
|
||||||
|
Y.push_back(R[i].y1-1);
|
||||||
|
Y.push_back(R[i].y2);
|
||||||
|
C.push_back(R[i].c);
|
||||||
|
}
|
||||||
|
X.push_back(0);
|
||||||
|
X.push_back(H);
|
||||||
|
Y.push_back(0);
|
||||||
|
Y.push_back(W);
|
||||||
|
sort(X.begin(), X.end());
|
||||||
|
sort(Y.begin(), Y.end());
|
||||||
|
sort(C.begin(), C.end());
|
||||||
|
int cx = unique(X.begin(), X.end()) - X.begin();
|
||||||
|
int cy = unique(Y.begin(), Y.end()) - Y.begin();
|
||||||
|
cc = unique(C.begin(), C.end()) - C.begin();
|
||||||
|
int id[15], rk[15];
|
||||||
|
for (int i = 0; i < cc; i++) G[i].clear();
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
id[i] = lower_bound(C.begin(), C.begin()+cc, R[i].c) - C.begin();
|
||||||
|
rk[i] = G[id[i]].size();
|
||||||
|
G[id[i]].push_back(i);
|
||||||
|
}
|
||||||
|
all = 0;
|
||||||
|
memset(ct, 0, sizeof(ct));
|
||||||
|
memset(sz, 0, sizeof(sz));
|
||||||
|
for (int x = 1; x < cx; x++) {
|
||||||
|
for (int y = 1; y < cy; y++) {
|
||||||
|
int t = cc, s = 0;
|
||||||
|
Rectangle tmp = Rectangle(X[x-1]+1, Y[y-1]+1, X[x], Y[y]);
|
||||||
|
for (int i = 0; i < N; i++) {
|
||||||
|
if (R[i].in(tmp)) {
|
||||||
|
if (id[i] < t)
|
||||||
|
s = 0, t = id[i];
|
||||||
|
if (t == id[i])
|
||||||
|
s |= (1<<rk[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (t == cc) all += tmp.size();
|
||||||
|
else {
|
||||||
|
int add = tmp.size();
|
||||||
|
for (int j = s; j; j = (j-1)&s)
|
||||||
|
ct[t][j] += add;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int c = 0; c < cc; c++) {
|
||||||
|
int s = (1<<G[c].size());
|
||||||
|
for (int i = 0; i < s; i++) {
|
||||||
|
for (int j = i; j; j = (j-1)&i)
|
||||||
|
sz[c][i] += ct[c][j] * (bitcount(j)&1 ? 1 : -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ll pow_mod(ll x, ll n) {
|
||||||
|
ll ret = 1;
|
||||||
|
while (n) {
|
||||||
|
if (n&1) ret = ret * x % mod;
|
||||||
|
x = x * x % mod;
|
||||||
|
n >>= 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int solve () {
|
||||||
|
ll ret = pow_mod(M, all);
|
||||||
|
for (int i = 0; i < cc; i++) {
|
||||||
|
int t = 0, n = (1<<G[i].size());
|
||||||
|
for (int s = 0; s < n; s++) {
|
||||||
|
int si = bitcount(s)&1 ? -1 : 1;
|
||||||
|
t = ((t + si * pow_mod(C[i]-1, sz[i][s]) * pow_mod(C[i], sz[i][n-1]-sz[i][s])) % mod + mod) % mod;
|
||||||
|
}
|
||||||
|
ret = ret * t % mod;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
int cas;
|
||||||
|
scanf("%d", &cas);
|
||||||
|
for (int kcas = 1; kcas <= cas; kcas++) {
|
||||||
|
init();
|
||||||
|
printf("Case #%d: %d\n", kcas, solve());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
93
HDOJ/5473_autoAC.cpp
Normal file
93
HDOJ/5473_autoAC.cpp
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <ctime>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
struct Point {
|
||||||
|
ll x, y;
|
||||||
|
Point(ll x = 0, ll y = 0): x(x), y(y) {}
|
||||||
|
void read() { scanf("%lld%lld", &x, &y); }
|
||||||
|
bool operator < (const Point& u) const { return x < u.x || (x == u.x && y < u.y); }
|
||||||
|
bool operator == (const Point& u) const { return !(*this < u) && !(u < *this); }
|
||||||
|
bool operator != (const Point& u) const { return !(*this == u); }
|
||||||
|
bool operator > (const Point& u) const { return u < *this; }
|
||||||
|
bool operator <= (const Point& u) const { return *this < u || *this == u; }
|
||||||
|
bool operator >= (const Point& u) const { return *this > u || *this == u; }
|
||||||
|
Point operator + (const Point& u) { return Point(x + u.x, y + u.y); }
|
||||||
|
Point operator - (const Point& u) { return Point(x - u.x, y - u.y); }
|
||||||
|
Point operator * (const double u) { return Point(x * u, y * u); }
|
||||||
|
Point operator / (const double u) { return Point(x / u, y / u); }
|
||||||
|
ll operator ^ (const Point& u) { return x*u.y - y*u.x; }
|
||||||
|
};
|
||||||
|
typedef Point Vector;
|
||||||
|
ll Cross(Vector a, Vector b) { return a.x * b.y - a.y * b.x; }
|
||||||
|
ll getArea (Point* p, int n) {
|
||||||
|
ll ret = 0;
|
||||||
|
for (int i = 0; i < n-1; i ++)
|
||||||
|
ret += Cross(p[i]-p[0], p[i+1]-p[0]);
|
||||||
|
return ret < 0 ? -ret : ret;
|
||||||
|
}
|
||||||
|
int getConvexHull (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-1]) <= 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-1]) <= 0) m--;
|
||||||
|
ch[m++] = p[i];
|
||||||
|
}
|
||||||
|
if (n > 1) m--;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
const int maxn = 105;
|
||||||
|
int N, K;
|
||||||
|
ll dp[maxn][maxn];
|
||||||
|
Point P[maxn], Q[maxn];
|
||||||
|
ll solve () {
|
||||||
|
ll allarea = getArea(P, N);
|
||||||
|
if (K >= N) return allarea;
|
||||||
|
ll ret = 0;
|
||||||
|
bool vis[maxn];
|
||||||
|
memset(vis, 0, sizeof(vis));
|
||||||
|
int ti = min(5 * (N / K), N);
|
||||||
|
for (int t = 0; t < ti; t++) {
|
||||||
|
int s = rand() % N;
|
||||||
|
while (vis[s]) s = rand() % N;
|
||||||
|
vis[s] = 1;
|
||||||
|
memset(dp, 0, sizeof(dp));
|
||||||
|
dp[0][0] = allarea;
|
||||||
|
for (int i = 1; i <= N; i++) {
|
||||||
|
int u = (i + s) % N;
|
||||||
|
ll sum = 0;
|
||||||
|
for (int j = i-1; j >= 0; j--) {
|
||||||
|
int v = (j + s) % N;
|
||||||
|
int p = (v + 1) % N;
|
||||||
|
ll tmp = ((P[p]-P[u])^(P[v]-P[u]));
|
||||||
|
if (tmp < 0) tmp = -tmp;
|
||||||
|
sum += tmp;
|
||||||
|
for (int x = K; x > 0; x--)
|
||||||
|
dp[i][x] = max(dp[i][x], dp[j][x-1]-sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = max(ret, dp[N][K]);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int main () {
|
||||||
|
int cas;
|
||||||
|
scanf("%d", &cas);
|
||||||
|
srand((int)time(NULL));
|
||||||
|
for (int kcas = 1; kcas <= cas; kcas++) {
|
||||||
|
scanf("%d%d", &N, &K);
|
||||||
|
for (int i = 0; i < N; i++) Q[i].read();
|
||||||
|
N = getConvexHull(Q, N, P);
|
||||||
|
printf("Case #%d: %lld\n", kcas, solve());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
83
HDOJ/5475_autoAC.cpp
Normal file
83
HDOJ/5475_autoAC.cpp
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
#define lson l,m,rt<<1
|
||||||
|
#define rson m+1,r,rt<<1|1
|
||||||
|
const int maxn=155555;
|
||||||
|
ll sum[maxn*4+4];
|
||||||
|
int add;
|
||||||
|
int a[maxn];
|
||||||
|
int L,R;
|
||||||
|
int MOD;
|
||||||
|
int p;
|
||||||
|
void pushup(int rt){
|
||||||
|
sum[rt]=sum[rt<<1]*sum[rt<<1|1]%MOD;
|
||||||
|
}
|
||||||
|
void build(int l,int r,int rt){
|
||||||
|
if(l==r){
|
||||||
|
sum[rt]=1;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
int m=(l+r)>>1;
|
||||||
|
build(lson);
|
||||||
|
build(rson);
|
||||||
|
pushup(rt);
|
||||||
|
}
|
||||||
|
void update(int l,int r,int rt){
|
||||||
|
if(l==r){
|
||||||
|
sum[rt]=add;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
int m=(l+r)>>1;
|
||||||
|
if(p<=m)
|
||||||
|
update(lson);
|
||||||
|
else
|
||||||
|
update(rson);
|
||||||
|
pushup(rt);
|
||||||
|
}
|
||||||
|
ll query(int l,int r,int rt){
|
||||||
|
ll ret=1;
|
||||||
|
if(L<=l&&R>=r)
|
||||||
|
return sum[rt];
|
||||||
|
int m=(l+r)>>1;
|
||||||
|
if(L<=m)
|
||||||
|
ret*=query(lson)%MOD;
|
||||||
|
if(R>m)
|
||||||
|
ret*=query(rson)%MOD;
|
||||||
|
return ret%MOD;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int n,m;
|
||||||
|
int op,u,q;
|
||||||
|
int t;
|
||||||
|
scanf("%d",&t);
|
||||||
|
for(int case1=1;case1<=t;case1++){
|
||||||
|
printf("Case #%d:\n",case1);
|
||||||
|
scanf("%d%d",&q,&MOD);
|
||||||
|
build(1,q,1);
|
||||||
|
for(int i=1;i<=q;i++){
|
||||||
|
scanf("%d%d",&op,&u);
|
||||||
|
if(op==1){
|
||||||
|
p=i;
|
||||||
|
add=u;
|
||||||
|
update(1,q,1);
|
||||||
|
L=1;
|
||||||
|
R=i;
|
||||||
|
printf("%I64d\n",query(1,q,1)%MOD);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
p=u;
|
||||||
|
add=1;
|
||||||
|
update(1,q,1);
|
||||||
|
L=1;
|
||||||
|
R=i;
|
||||||
|
printf("%I64d\n",query(1,q,1)%MOD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
33
HDOJ/5476_autoAC.cpp
Normal file
33
HDOJ/5476_autoAC.cpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#include<cstdlib>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cstring>
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<vector>
|
||||||
|
#include<cmath>
|
||||||
|
#include<map>
|
||||||
|
#define pi (2*acos(0))
|
||||||
|
#define maxn 1000000
|
||||||
|
using namespace std;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t;
|
||||||
|
scanf("%d", &t);
|
||||||
|
for (int k=1;k<=t;k++)
|
||||||
|
{
|
||||||
|
double ax, ay, bx, by, cx, cy;
|
||||||
|
scanf("%lf%lf%lf%lf%lf%lf", &ax, &ay, &bx, &by, &cx, &cy);
|
||||||
|
double t1 = (ax - bx) * (ax - bx) + (ay - by) * (ay - by);
|
||||||
|
double ab = sqrt(t1);
|
||||||
|
double t2 = (bx - cx) * (bx - cx) + (by - cy) * (by - cy);
|
||||||
|
double bc = sqrt(t2);
|
||||||
|
double h = sqrt(t1 - t2/4);
|
||||||
|
double angle = acos(bc/(2.0*ab));
|
||||||
|
double d = bc / sin(angle);
|
||||||
|
double ans = 0;
|
||||||
|
ans = d * angle;
|
||||||
|
ans = ans + h;
|
||||||
|
printf("Case #%d: %.4f\n", k, ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
51
HDOJ/5479_autoAC.cpp
Normal file
51
HDOJ/5479_autoAC.cpp
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <stack>
|
||||||
|
#include <queue>
|
||||||
|
#include <cmath>
|
||||||
|
#include <ctime>
|
||||||
|
#include <vector>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cctype>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
#define INF 0x3f3f3f3f
|
||||||
|
#define inf -0x3f3f3f3f
|
||||||
|
#define lson l,m,rt<<1
|
||||||
|
#define rson m+1,r,rt<<1|1
|
||||||
|
#define mem0(a) memset(a,0,sizeof(a))
|
||||||
|
#define mem1(a) memset(a,-1,sizeof(a))
|
||||||
|
#define mem(a, b) memset(a, b, sizeof(a))
|
||||||
|
typedef long long ll;
|
||||||
|
char s[1010];
|
||||||
|
int l[1010],r[1010];
|
||||||
|
int main(){
|
||||||
|
int t;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--){
|
||||||
|
scanf("%s",s);
|
||||||
|
mem0(l);
|
||||||
|
mem0(r);
|
||||||
|
int len=strlen(s);
|
||||||
|
for(int i=len-1;i>=0;i--){
|
||||||
|
if(i==len-1)
|
||||||
|
r[i]=(s[i]==')');
|
||||||
|
else
|
||||||
|
r[i]=r[i+1]+(s[i]==')');
|
||||||
|
}
|
||||||
|
for(int i=0;i<len;i++){
|
||||||
|
if(i==0)
|
||||||
|
l[i]=(s[i]=='(');
|
||||||
|
else
|
||||||
|
l[i]=l[i-1]+(s[i]=='(');
|
||||||
|
}
|
||||||
|
int ans=INF;
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
ans=min(ans,l[i]+r[i]-1);
|
||||||
|
printf("%d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
97
HDOJ/5481_autoAC.cpp
Normal file
97
HDOJ/5481_autoAC.cpp
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<string.h>
|
||||||
|
#include<algorithm>
|
||||||
|
#define N 110000
|
||||||
|
#define pr pair<int,int>
|
||||||
|
#define lson l,mid,no<<1
|
||||||
|
#define rson mid+1,r,no<<1|1
|
||||||
|
#define mod 1000000007ll
|
||||||
|
using namespace std;
|
||||||
|
typedef long long ll;
|
||||||
|
int dis[N<<1],len;
|
||||||
|
pr L[N];
|
||||||
|
ll sum[N<<3],cov[N<<3];
|
||||||
|
ll P[N],S[N];
|
||||||
|
void Pushdown(int no,int len)
|
||||||
|
{
|
||||||
|
if(cov[no])
|
||||||
|
{
|
||||||
|
cov[no<<1]+=cov[no];
|
||||||
|
cov[no<<1|1]+=cov[no];
|
||||||
|
sum[no<<1]+=cov[no]*(len-(len>>1));
|
||||||
|
sum[no<<1|1]+=cov[no]*(len>>1);
|
||||||
|
cov[no]=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void Pushup(int no)
|
||||||
|
{
|
||||||
|
sum[no]=sum[no<<1]+sum[no<<1|1];
|
||||||
|
}
|
||||||
|
void update(int l,int r,int no,int st,int en)
|
||||||
|
{
|
||||||
|
if(st<=l&&r<=en)
|
||||||
|
{
|
||||||
|
cov[no]++;
|
||||||
|
sum[no]+=r-l+1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int mid=l+r>>1;
|
||||||
|
Pushdown(no,r-l+1);
|
||||||
|
if(en<=mid) update(lson,st,en);
|
||||||
|
else if(st>mid) update(rson,st,en);
|
||||||
|
else update(lson,st,en),update(rson,st,en);
|
||||||
|
Pushup(no);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int query(int l,int r,int no,int k)
|
||||||
|
{
|
||||||
|
if(l==r)
|
||||||
|
return sum[no];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int mid=l+r>>1;
|
||||||
|
Pushdown(no,r-l+1);
|
||||||
|
if(k<=mid) return query(lson,k);
|
||||||
|
else return query(rson,k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int c,T;
|
||||||
|
int n,i,l,r;
|
||||||
|
scanf("%d",&T);
|
||||||
|
P[1]=1;
|
||||||
|
for(i=2;i<N;i++)
|
||||||
|
P[i]=P[i-1]*2%mod;
|
||||||
|
for(i=1;i<N;i++)
|
||||||
|
S[i]=(S[i-1]+P[i])%mod;
|
||||||
|
for(c=1;c<=T;c++)
|
||||||
|
{
|
||||||
|
memset(sum,0,sizeof(sum));
|
||||||
|
memset(cov,0,sizeof(cov));
|
||||||
|
scanf("%d",&n);
|
||||||
|
for(i=1;i<=n;i++)
|
||||||
|
{
|
||||||
|
scanf("%d%d",&L[i].first,&L[i].second);
|
||||||
|
dis[i+i-1]=L[i].first;
|
||||||
|
dis[i+i]=L[i].second;
|
||||||
|
}
|
||||||
|
sort(dis+1,dis+n+n+1);
|
||||||
|
len=unique(dis+1,dis+n+n+1)-dis-1;
|
||||||
|
for(i=1;i<=n;i++)
|
||||||
|
{
|
||||||
|
l=lower_bound(dis+1,dis+len+1,L[i].first)-dis;
|
||||||
|
r=lower_bound(dis+1,dis+len+1,L[i].second)-dis;
|
||||||
|
if(l<=r-1)
|
||||||
|
update(1,len-1,1,l,r-1);
|
||||||
|
}
|
||||||
|
ll ans=0;
|
||||||
|
for(i=1;i<len;i++)
|
||||||
|
{
|
||||||
|
ans=(ans+(S[n]-S[n-query(1,len-1,1,i)]+mod)%mod*(((ll)dis[i+1]-dis[i]+mod)%mod)%mod)%mod;
|
||||||
|
}
|
||||||
|
printf("%I64d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
138
HDOJ/5483_autoAC.cpp
Normal file
138
HDOJ/5483_autoAC.cpp
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<string.h>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
#define scan(x) scanf("%d",&(x))
|
||||||
|
#define scan2(x,y) scanf("%d%d",&(x),&(y))
|
||||||
|
#define scan3(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))
|
||||||
|
#define scan4(x,y,z,k) scanf("%d%d%d%d",&(x),&(y),&(z),&(k))
|
||||||
|
const int maxn = 3003;
|
||||||
|
const int maxm = maxn * maxn;
|
||||||
|
const int inf = 1000000000;
|
||||||
|
int n, m;
|
||||||
|
__int64 mst;
|
||||||
|
int map[maxn][maxn];
|
||||||
|
int dp[maxn][maxn], best[maxn][maxn];
|
||||||
|
int dis[maxn], pre[maxn];
|
||||||
|
bool vis[maxn];
|
||||||
|
vector<int> edge[maxn];
|
||||||
|
#include<iostream>
|
||||||
|
int minz(int a, int b)
|
||||||
|
{
|
||||||
|
return a < b ? a : b;
|
||||||
|
}
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
for(j = 0; j < n; j++)
|
||||||
|
map[i][j] = dp[i][j] = inf;
|
||||||
|
edge[i].clear();
|
||||||
|
vis[i] = 0;
|
||||||
|
pre[i] = -1;
|
||||||
|
dis[i] = inf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void input()
|
||||||
|
{
|
||||||
|
for(int i=0;i<n;i++){
|
||||||
|
for(int j=i+1;j<n;j++){
|
||||||
|
int w;scan(w);
|
||||||
|
map[i][j] = map[j][i] = w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void prim()
|
||||||
|
{
|
||||||
|
int i, j, k;
|
||||||
|
for(i = 1; i < n; i++)
|
||||||
|
{
|
||||||
|
dis[i] = map[0][i];
|
||||||
|
pre[i] = 0;
|
||||||
|
}
|
||||||
|
dis[0] = inf;
|
||||||
|
vis[0] = 1;
|
||||||
|
pre[0] = -1;
|
||||||
|
mst = 0;
|
||||||
|
for(i = 0; i < n-1; i++)
|
||||||
|
{
|
||||||
|
k = 0;
|
||||||
|
for(j = 1; j < n; j++)
|
||||||
|
if(!vis[j] && dis[k] > dis[j])
|
||||||
|
k = j;
|
||||||
|
vis[k] = 1;
|
||||||
|
mst += dis[k];
|
||||||
|
if(pre[k] != -1)
|
||||||
|
edge[k].push_back(pre[k]),
|
||||||
|
edge[pre[k]].push_back(k);
|
||||||
|
for(j = 1; j < n; j++)
|
||||||
|
if(!vis[j] && dis[j] > map[k][j] )
|
||||||
|
dis[j] = map[k][j], pre[j] = k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int dfs1(int u, int fa, int rt)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < edge[u].size(); i++)
|
||||||
|
{
|
||||||
|
int v = edge[u][i];
|
||||||
|
if(v == fa) continue;
|
||||||
|
dp[rt][u] = minz(dp[rt][u], dfs1(v, u, rt));
|
||||||
|
}
|
||||||
|
if(fa != rt) dp[rt][u] = minz(dp[rt][u], map[rt][u]);
|
||||||
|
return dp[rt][u];
|
||||||
|
}
|
||||||
|
int dfs2(int u, int fa, int rt)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int ans = dp[u][rt];
|
||||||
|
for(i = 0; i < edge[u].size(); i++)
|
||||||
|
{
|
||||||
|
int v = edge[u][i];
|
||||||
|
if(v == fa) continue;
|
||||||
|
ans = minz(ans, dfs2(v, u, rt));
|
||||||
|
}
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
void solve()
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
dfs1(i, -1, i);
|
||||||
|
for(i = 0; i < n; i++)
|
||||||
|
for(j = 0; j < edge[i].size(); j++)
|
||||||
|
{
|
||||||
|
int v = edge[i][j];
|
||||||
|
best[i][v] = best[v][i] = dfs2(v, i, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void query()
|
||||||
|
{
|
||||||
|
int ans =0 ;
|
||||||
|
for(int i=0;i<n;i++){
|
||||||
|
int x=i;
|
||||||
|
for(int j=0;j<edge[i].size() ; j++){
|
||||||
|
int y=edge[i][j];
|
||||||
|
if(x<y) continue;
|
||||||
|
int sum = mst - map[x][y] + best[x][y];
|
||||||
|
if(sum != mst){
|
||||||
|
ans++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%d\n",ans);
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int T;scan(T);
|
||||||
|
while(T--){
|
||||||
|
scan(n);
|
||||||
|
m=n-1;
|
||||||
|
init();
|
||||||
|
input();
|
||||||
|
prim();
|
||||||
|
solve();
|
||||||
|
query();
|
||||||
|
}
|
||||||
|
}
|
144
HDOJ/5486_autoAC.cpp
Normal file
144
HDOJ/5486_autoAC.cpp
Normal file
|
@ -0,0 +1,144 @@
|
||||||
|
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <set>
|
||||||
|
#include <bitset>
|
||||||
|
#include <vector>
|
||||||
|
#include <sstream>
|
||||||
|
#include <queue>
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
#include <stack>
|
||||||
|
typedef long long ll;
|
||||||
|
using namespace std;
|
||||||
|
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
|
||||||
|
#define maxn 1000006
|
||||||
|
#define mod 1000000007
|
||||||
|
#define eps 1e-9
|
||||||
|
#define e exp(1.0)
|
||||||
|
#define PI acos(-1)
|
||||||
|
const double EP = 1E-10 ;
|
||||||
|
int Num;
|
||||||
|
const ll inf=999999999;
|
||||||
|
inline ll read()
|
||||||
|
{
|
||||||
|
ll x=0,f=1;char ch=getchar();
|
||||||
|
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
|
||||||
|
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
|
||||||
|
return x*f;
|
||||||
|
}
|
||||||
|
vector<int> Q;
|
||||||
|
map<int,int> H;
|
||||||
|
struct node
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
};
|
||||||
|
node p[maxn];
|
||||||
|
int b[maxn];
|
||||||
|
vector<int> Q1[maxn];
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t=read();
|
||||||
|
for(int cas=1;cas<=t;cas++)
|
||||||
|
{
|
||||||
|
int n=read();
|
||||||
|
H.clear();
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
{
|
||||||
|
p[i].x=read(),p[i].y=read();
|
||||||
|
Q.push_back(p[i].x);
|
||||||
|
Q.push_back(p[i].y);
|
||||||
|
}
|
||||||
|
sort(Q.begin(),Q.end());
|
||||||
|
Q.erase(unique(Q.begin(),Q.end()),Q.end());
|
||||||
|
int len = Q.size();
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
H[Q[i]]=i;
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
Q1[i].clear(),b[i]=0;
|
||||||
|
Q.clear();
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
{
|
||||||
|
Q1[H[p[i].x]].push_back(H[p[i].y]);
|
||||||
|
}
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
sort(Q1[i].begin(),Q1[i].end());
|
||||||
|
Q1[i].erase(unique(Q1[i].begin(),Q1[i].end()),Q1[i].end());
|
||||||
|
}
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
for(int j=0;j<Q1[i].size();j++)
|
||||||
|
b[Q1[i][j]]++;
|
||||||
|
}
|
||||||
|
int ans1 = 0,ans2 = 0,ans3 = 0;
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
if(Q1[i].size()==0)continue;
|
||||||
|
if(Q1[i].size()==1)
|
||||||
|
{
|
||||||
|
if(b[Q1[i][0]]==1)
|
||||||
|
ans3++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int flag = 1;
|
||||||
|
for(int j=0;j<Q1[i].size();j++)
|
||||||
|
{
|
||||||
|
if(b[Q1[i][j]]!=1)
|
||||||
|
{
|
||||||
|
flag = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(flag)
|
||||||
|
ans1++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
Q1[i].clear(),b[i]=0;
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
{
|
||||||
|
Q1[H[p[i].y]].push_back(H[p[i].x]);
|
||||||
|
}
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
sort(Q1[i].begin(),Q1[i].end());
|
||||||
|
Q1[i].erase(unique(Q1[i].begin(),Q1[i].end()),Q1[i].end());
|
||||||
|
}
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
for(int j=0;j<Q1[i].size();j++)
|
||||||
|
b[Q1[i][j]]++;
|
||||||
|
}
|
||||||
|
for(int i=0;i<len;i++)
|
||||||
|
{
|
||||||
|
if(Q1[i].size()==0)continue;
|
||||||
|
if(Q1[i].size()==1)
|
||||||
|
{
|
||||||
|
if(b[Q1[i][0]]==1)
|
||||||
|
ans3++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int flag = 1;
|
||||||
|
for(int j=0;j<Q1[i].size();j++)
|
||||||
|
{
|
||||||
|
if(b[Q1[i][j]]!=1)
|
||||||
|
{
|
||||||
|
flag = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(flag)
|
||||||
|
ans2++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Case #%d: %d %d %d\n",cas,ans1,ans2,ans3/2);
|
||||||
|
}
|
||||||
|
}
|
104
HDOJ/5487_autoAC.cpp
Normal file
104
HDOJ/5487_autoAC.cpp
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
#pragma warning(disable:4996)
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <queue>
|
||||||
|
using namespace std;
|
||||||
|
#define maxn 1005
|
||||||
|
int n1, m1, k1;
|
||||||
|
int n2, m2, k2;
|
||||||
|
bool tar1[maxn];
|
||||||
|
bool tar2[maxn];
|
||||||
|
int go1[maxn][26];
|
||||||
|
int go2[maxn][26];
|
||||||
|
int prestate[maxn*maxn];
|
||||||
|
char prechar[maxn*maxn];
|
||||||
|
bool vis[maxn*maxn];
|
||||||
|
bool check(int x)
|
||||||
|
{
|
||||||
|
return tar1[x / n2] != tar2[x%n2];
|
||||||
|
}
|
||||||
|
int nextState(int x, int c)
|
||||||
|
{
|
||||||
|
return go1[x / n2][c] * n2 + go2[x%n2][c];
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T; cin >> T; int ca = 0;
|
||||||
|
while (T--)
|
||||||
|
{
|
||||||
|
memset(go1, -1, sizeof(go1));
|
||||||
|
memset(go2, -1, sizeof(go2));
|
||||||
|
memset(tar1, 0, sizeof(tar1));
|
||||||
|
memset(tar2, 0, sizeof(tar2));
|
||||||
|
int accept;
|
||||||
|
int ui, vi;
|
||||||
|
char ci[3];
|
||||||
|
scanf("%d%d%d", &n1, &m1, &k1);
|
||||||
|
for (int i = 0; i < k1; ++i){
|
||||||
|
scanf("%d", &accept);
|
||||||
|
tar1[accept] = true;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < m1; ++i){
|
||||||
|
scanf("%d%d%s", &ui, &vi, ci);
|
||||||
|
go1[ui][ci[0] - 'a'] = vi;
|
||||||
|
}
|
||||||
|
for (int i = 0; i <= n1; ++i){
|
||||||
|
for (int k = 0; k < 26; ++k){
|
||||||
|
if (go1[i][k] == -1) go1[i][k] = n1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scanf("%d%d%d", &n2, &m2, &k2);
|
||||||
|
for (int i = 0; i < k2; ++i){
|
||||||
|
scanf("%d", &accept);
|
||||||
|
tar2[accept] = true;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < m2; ++i){
|
||||||
|
scanf("%d%d%s", &ui, &vi, ci);
|
||||||
|
go2[ui][ci[0] - 'a'] = vi;
|
||||||
|
}
|
||||||
|
for (int i = 0; i <= n2; ++i){
|
||||||
|
for (int k = 0; k < 26; ++k){
|
||||||
|
if (go2[i][k] == -1) go2[i][k] = n2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++n1; ++n2;
|
||||||
|
int ans = -1;
|
||||||
|
memset(vis, 0, sizeof(vis));
|
||||||
|
queue<int> Q;
|
||||||
|
Q.push(0);
|
||||||
|
vis[0] = true;
|
||||||
|
while (!Q.empty())
|
||||||
|
{
|
||||||
|
int state = Q.front(); Q.pop();
|
||||||
|
if (check(state)){
|
||||||
|
ans = state;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (int k = 0; k < 26; ++k){
|
||||||
|
int nstate = nextState(state, k);
|
||||||
|
if (!vis[nstate]){
|
||||||
|
Q.push(nstate);
|
||||||
|
vis[nstate] = true;
|
||||||
|
prestate[nstate] = state;
|
||||||
|
prechar[nstate] = k;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (-1 == ans){
|
||||||
|
printf("Case #%d: 0\n", ++ca);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string ts;
|
||||||
|
while (ans != 0){
|
||||||
|
ts.push_back(char('a' + prechar[ans]));
|
||||||
|
ans = prestate[ans];
|
||||||
|
}
|
||||||
|
reverse(ts.begin(), ts.end());
|
||||||
|
printf("Case #%d: %s\n", ++ca, ts.c_str());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
103
HDOJ/5489_autoAC.cpp
Normal file
103
HDOJ/5489_autoAC.cpp
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<iostream>
|
||||||
|
#include<map>
|
||||||
|
using namespace std ;
|
||||||
|
const int maxn = 1e5+10 ;
|
||||||
|
int a[maxn] , b[maxn] ;
|
||||||
|
int c[maxn] ;
|
||||||
|
pair<int , int> pre[maxn] ;
|
||||||
|
int len_b = 0 ;
|
||||||
|
int len_a = 0 ;
|
||||||
|
int find_b(int l , int r , int v)
|
||||||
|
{
|
||||||
|
while(l<=r)
|
||||||
|
{
|
||||||
|
int mid = (l+r)>> 1 ;
|
||||||
|
if(b[mid]>=v)
|
||||||
|
l = mid+1 ;
|
||||||
|
else r = mid - 1 ;
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
int find_a(int l , int r ,int v)
|
||||||
|
{
|
||||||
|
while(l<=r)
|
||||||
|
{
|
||||||
|
int mid = (l + r) >> 1 ;
|
||||||
|
if(a[mid]<=v)
|
||||||
|
l = mid+1 ;
|
||||||
|
else r = mid - 1 ;
|
||||||
|
}
|
||||||
|
return l ;
|
||||||
|
}
|
||||||
|
int find_ans_a(int l , int r , int v)
|
||||||
|
{
|
||||||
|
while(l<=r)
|
||||||
|
{
|
||||||
|
int mid = (l+r)>>1 ;
|
||||||
|
if(a[mid]<=v)
|
||||||
|
l = mid + 1 ;
|
||||||
|
else r = mid - 1 ;
|
||||||
|
}
|
||||||
|
return r ;
|
||||||
|
}
|
||||||
|
int find_ans_b(int l , int r , int v)
|
||||||
|
{
|
||||||
|
while(l<=r)
|
||||||
|
{
|
||||||
|
int mid = (l+r) >> 1 ;
|
||||||
|
if(b[mid] >= v)
|
||||||
|
l = mid + 1 ;
|
||||||
|
else r = mid - 1 ;
|
||||||
|
}
|
||||||
|
return r ;
|
||||||
|
}
|
||||||
|
void debuga()
|
||||||
|
{
|
||||||
|
for(int i = 1;i <= len_a;i++)
|
||||||
|
printf("%d%c" , a[i] , i == len_ ?'\n' :' ') ;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t ;
|
||||||
|
scanf("%d" , &t) ;
|
||||||
|
int cas = 0 ;
|
||||||
|
while(t--)
|
||||||
|
{
|
||||||
|
int n , l ;
|
||||||
|
scanf("%d%d" , &n , &l) ;
|
||||||
|
for(int i = 1;i <= n;i++)
|
||||||
|
a[i] = b[i] = 0 ;
|
||||||
|
for(int i = 1;i <= n;i++)
|
||||||
|
scanf("%d" , &c[i]) ;
|
||||||
|
len_a = len_b = 0 ;
|
||||||
|
for(int j = n;j > l;j--)
|
||||||
|
{
|
||||||
|
int pos = find_b(1 , len_ , c[j]) ;
|
||||||
|
pre[j] = make_pair(pos , b[pos]) ;
|
||||||
|
if(!b[pos])len_b++ ;
|
||||||
|
b[pos] = c[j] ;
|
||||||
|
}
|
||||||
|
int ans = len_ ;
|
||||||
|
for(int i = 1;i <= n-l;i++)
|
||||||
|
{
|
||||||
|
int pos = find_a(1 , len_ , c[i]) ;
|
||||||
|
if(a[pos] == 0)len_a++ ;
|
||||||
|
a[pos] = c[i] ;
|
||||||
|
pair<int , int> tmp = pre[i+l] ;
|
||||||
|
if(tmp.second == 0)len_b--;
|
||||||
|
else b[tmp.first] = tmp.second ;
|
||||||
|
int pos_1 = find_ans_b(1 , len_ , c[i]) ;
|
||||||
|
ans = max(pos+pos_ , ans) ;
|
||||||
|
if(tmp.second != 0)
|
||||||
|
{
|
||||||
|
int pos_2 = find_ans_a(1 , len_ , tmp.second) ;
|
||||||
|
ans = max(ans , pos_2 + tmp.first) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Case #%d: " , ++cas) ;
|
||||||
|
printf("%d\n" , ans) ;
|
||||||
|
}
|
||||||
|
return 0 ;
|
||||||
|
}
|
85
HDOJ/5490_autoAC.cpp
Normal file
85
HDOJ/5490_autoAC.cpp
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#define LL long long
|
||||||
|
#define MOD 1000000007
|
||||||
|
using namespace std;
|
||||||
|
LL b1, q, a1, d, n, m;
|
||||||
|
LL ans, dis[10005];
|
||||||
|
void input()
|
||||||
|
{
|
||||||
|
ans = 0;
|
||||||
|
scanf("%I64d%I64d%I64d%I64d%I64d%I64d", &b1, &q, &a1, &d, &n, &m);
|
||||||
|
}
|
||||||
|
void exgcd(LL a, LL b, LL &x, LL &y, LL &d)
|
||||||
|
{
|
||||||
|
if (b == 0)
|
||||||
|
{
|
||||||
|
x = 1;
|
||||||
|
y = 0;
|
||||||
|
d = a;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exgcd(b, a%b, y, x, d);
|
||||||
|
y -= a/b*x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LL modDiv(LL a, LL b)
|
||||||
|
{
|
||||||
|
LL x, y, d;
|
||||||
|
exgcd(b, MOD, x, y, d);
|
||||||
|
x = (x+MOD) % MOD;
|
||||||
|
x = (x*a/d) % MOD;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
LL quickPow(LL x, LL n)
|
||||||
|
{
|
||||||
|
LL a = 1;
|
||||||
|
while (n)
|
||||||
|
{
|
||||||
|
a *= n&1 ? x : 1;
|
||||||
|
a %= MOD;
|
||||||
|
n >>= 1 ;
|
||||||
|
x *= x;
|
||||||
|
x %= MOD;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
void work()
|
||||||
|
{
|
||||||
|
LL now = b1, tmp;
|
||||||
|
now %= MOD;
|
||||||
|
for (int i = 1; i <= n; ++i)
|
||||||
|
{
|
||||||
|
tmp = modDiv(now, q-1);
|
||||||
|
now = now+tmp;
|
||||||
|
now %= MOD;
|
||||||
|
dis[i] = (a1+(i-1)*d%MOD-tmp)%MOD;
|
||||||
|
dis[i] = (dis[i]+MOD)%MOD;
|
||||||
|
}
|
||||||
|
LL qt = 1;
|
||||||
|
ans += qt*dis[n];
|
||||||
|
for (int i = n-1; i > 0; --i)
|
||||||
|
{
|
||||||
|
qt = modDiv((qt*((n+m-1)-i)%MOD+MOD)%MOD, n-i);
|
||||||
|
ans += (qt*dis[i])%MOD;
|
||||||
|
ans %= MOD;
|
||||||
|
}
|
||||||
|
tmp = quickPow(q, (m-1)%(MOD-1))%MOD;
|
||||||
|
ans += now*tmp%MOD;
|
||||||
|
ans %= MOD;
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T;
|
||||||
|
scanf("%d", &T);
|
||||||
|
for (int times = 1; times <= T; ++times)
|
||||||
|
{
|
||||||
|
printf("Case #%d: ", times);
|
||||||
|
input();
|
||||||
|
work();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
112
HDOJ/5491_autoAC.cpp
Normal file
112
HDOJ/5491_autoAC.cpp
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <set>
|
||||||
|
#include <bitset>
|
||||||
|
#include <vector>
|
||||||
|
#include <sstream>
|
||||||
|
#include <queue>
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
#include <stack>
|
||||||
|
typedef long long ll;
|
||||||
|
using namespace std;
|
||||||
|
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
|
||||||
|
#define maxn 300006
|
||||||
|
#define mod 1000000007
|
||||||
|
#define eps 1e-9
|
||||||
|
#define e exp(1.0)
|
||||||
|
#define PI acos(-1)
|
||||||
|
const double EP = 1E-10 ;
|
||||||
|
int Num;
|
||||||
|
const ll inf=999999999;
|
||||||
|
inline ll read()
|
||||||
|
{
|
||||||
|
ll x=0,f=1;char ch=getchar();
|
||||||
|
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
|
||||||
|
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
|
||||||
|
return x*f;
|
||||||
|
}
|
||||||
|
int get(ll x)
|
||||||
|
{
|
||||||
|
int c =0 ;
|
||||||
|
while (x >0)
|
||||||
|
{
|
||||||
|
if((x &1) ==1)
|
||||||
|
c++; ;
|
||||||
|
x >>=1 ;
|
||||||
|
}
|
||||||
|
return c ;
|
||||||
|
}
|
||||||
|
ll change(ll x,int num)
|
||||||
|
{
|
||||||
|
for(int i=0;i<132;i++)
|
||||||
|
{
|
||||||
|
if((x&(1LL<<i))==0)
|
||||||
|
{
|
||||||
|
x|=(1LL<<i);
|
||||||
|
num--;
|
||||||
|
}
|
||||||
|
if(num==0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
ll change2(ll x,int K,int s1,ll P)
|
||||||
|
{
|
||||||
|
int l =0;
|
||||||
|
for(int i=0;i<132;i++)
|
||||||
|
{
|
||||||
|
if((x&(1LL<<i))==0)
|
||||||
|
{
|
||||||
|
x|=(1LL<<i);
|
||||||
|
l = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int num = K+1;
|
||||||
|
for(int i = l-1;i>=0;i--)
|
||||||
|
{
|
||||||
|
x-=(1LL<<i);
|
||||||
|
num--;
|
||||||
|
if(num==s1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(x>P*2)return P;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t;scanf("%d",&t);
|
||||||
|
for(int cas = 1;cas <= t;cas ++)
|
||||||
|
{
|
||||||
|
ll a=read(),s1=read(),s2=read();
|
||||||
|
ll ans = a+1;
|
||||||
|
printf("Case #%d: ",cas);
|
||||||
|
int len = get(ans);
|
||||||
|
if(len<=s2&&len>=s1)
|
||||||
|
{
|
||||||
|
printf("%I64d\n",ans);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(len<s1)
|
||||||
|
{
|
||||||
|
printf("%I64d\n",change(ans,s1-len));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(len>s2)
|
||||||
|
{
|
||||||
|
while(len>s2)
|
||||||
|
{
|
||||||
|
ans = change2(ans,len,s1,a);
|
||||||
|
len = get(ans);
|
||||||
|
}
|
||||||
|
printf("%I64d\n",ans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
97
HDOJ/5492_autoAC.cpp
Normal file
97
HDOJ/5492_autoAC.cpp
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
#include <stack>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <queue>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <string>
|
||||||
|
#include <ctime>
|
||||||
|
#include <list>
|
||||||
|
#include <bitset>
|
||||||
|
typedef unsigned char byte;
|
||||||
|
#define pb push_back
|
||||||
|
#define input_fast std::ios::sync_with_stdio(false);std::cin.tie(0)
|
||||||
|
#define pi acos(-1)
|
||||||
|
using namespace std;
|
||||||
|
const int maxn = 30 + 10;
|
||||||
|
int dp[maxn][maxn][2000];
|
||||||
|
int g[maxn][maxn] , n , m , px ,dir[2][2] = {0,1,1,0},tans;
|
||||||
|
int cal(int x,int y)
|
||||||
|
{
|
||||||
|
return px*x - y*y;
|
||||||
|
}
|
||||||
|
bool inmap(int x,int y)
|
||||||
|
{
|
||||||
|
return x <= n && x >= 1 && y <= m && y >= 1;
|
||||||
|
}
|
||||||
|
void initiation()
|
||||||
|
{
|
||||||
|
tans = 1 << 29;
|
||||||
|
scanf("%d%d",&n,&m);
|
||||||
|
for(int i = 1 ; i <= n ; ++ i)
|
||||||
|
for(int j = 1 ; j <= m ; ++ j)
|
||||||
|
scanf("%d",&g[i][j]);
|
||||||
|
px = n + m - 1;
|
||||||
|
memset(dp,-1,sizeof(dp));
|
||||||
|
dp[1][1][g[1][1]] = g[1][1]*g[1][1];
|
||||||
|
}
|
||||||
|
void updata(int &x ,int v)
|
||||||
|
{
|
||||||
|
if(x==-1) x=v;
|
||||||
|
else x = min(x,v);
|
||||||
|
}
|
||||||
|
int solve()
|
||||||
|
{
|
||||||
|
for(int i = 1 ; i <= n ; ++ i)
|
||||||
|
for(int j = 1 ; j <= m ; ++ j)
|
||||||
|
{
|
||||||
|
for(int z = 0 ; z <= 1900 ; ++ z)
|
||||||
|
{
|
||||||
|
if(dp[i][j][z] == -1) continue;
|
||||||
|
for(int k = 0 ; k < 2 ; ++ k)
|
||||||
|
{
|
||||||
|
int newx = i + dir[k][0];
|
||||||
|
int newy = j + dir[k][1];
|
||||||
|
if(!inmap(newx,newy)) continue;
|
||||||
|
int newval = dp[i][j][z] + g[newx][newy]*g[newx][newy];
|
||||||
|
updata(dp[newx][newy][z+g[newx][newy]],newval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int ans = 1 << 30;
|
||||||
|
for(int i = 0 ; i <= 1900 ; ++ i) if(dp[n][m][i] != -1) ans = min(ans , px*dp[n][m][i] - i*i);
|
||||||
|
return ans;
|
||||||
|
}
|
||||||
|
void dfs(int x,int y,int s1,int s2)
|
||||||
|
{
|
||||||
|
if(x==n&&y==m)
|
||||||
|
{
|
||||||
|
tans =min(tans,s1*px-s2*s2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int k = 0 ; k < 2 ; ++ k)
|
||||||
|
{
|
||||||
|
int newx = x + dir[k][0];
|
||||||
|
int newy = y + dir[k][1];
|
||||||
|
if(!inmap(newx,newy)) continue;
|
||||||
|
dfs(newx,newy,s1+g[newx][newy]*g[newx][newy],s2+g[newx][newy]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int main(int argc,char *argv[])
|
||||||
|
{
|
||||||
|
int Case,cas=1;
|
||||||
|
scanf("%d",&Case);
|
||||||
|
while(Case--)
|
||||||
|
{
|
||||||
|
initiation();
|
||||||
|
printf("Case #%d: %d\n",cas++,solve());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
132
HDOJ/5493_autoAC.cpp
Normal file
132
HDOJ/5493_autoAC.cpp
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
#pragma comment(linker, "/STACK:1024000000,1024000000")
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
#include <ctime>
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <set>
|
||||||
|
#include <bitset>
|
||||||
|
#include <vector>
|
||||||
|
#include <sstream>
|
||||||
|
#include <queue>
|
||||||
|
#include <typeinfo>
|
||||||
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
#include <stack>
|
||||||
|
typedef long long ll;
|
||||||
|
using namespace std;
|
||||||
|
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
|
||||||
|
#define maxn 200006
|
||||||
|
#define mod 1000000007
|
||||||
|
#define eps 1e-9
|
||||||
|
#define e exp(1.0)
|
||||||
|
#define PI acos(-1)
|
||||||
|
#define lowbit(x) (x)&(-x)
|
||||||
|
const double EP = 1E-10 ;
|
||||||
|
int Num;
|
||||||
|
const ll inf=999999999;
|
||||||
|
inline ll read()
|
||||||
|
{
|
||||||
|
ll x=0,f=1;char ch=getchar();
|
||||||
|
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
|
||||||
|
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
|
||||||
|
return x*f;
|
||||||
|
}
|
||||||
|
int n,val1[maxn],val2[maxn];
|
||||||
|
void add(int * vc,int u ,int v)
|
||||||
|
{
|
||||||
|
while(u <= n )
|
||||||
|
{
|
||||||
|
vc[u] += v;
|
||||||
|
u += lowbit(u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int query(int * vc,int u)
|
||||||
|
{
|
||||||
|
int res=0;
|
||||||
|
while(u)
|
||||||
|
{
|
||||||
|
res += vc[u];
|
||||||
|
u -= lowbit(u);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
int RankGet(int * vc,int k)
|
||||||
|
{
|
||||||
|
int L = 1 , R = n;
|
||||||
|
while(L < R)
|
||||||
|
{
|
||||||
|
int mid = L + ((R-L)>>1);
|
||||||
|
int res = query(vc,mid);
|
||||||
|
if(res == k) R = mid;
|
||||||
|
else if(res < k) L = mid + 1;
|
||||||
|
else R = mid - 1;
|
||||||
|
}
|
||||||
|
return L;
|
||||||
|
}
|
||||||
|
struct kkk
|
||||||
|
{
|
||||||
|
int x,y;
|
||||||
|
};
|
||||||
|
bool cmp(kkk aa,kkk bb)
|
||||||
|
{
|
||||||
|
return aa.x<bb.x;
|
||||||
|
}
|
||||||
|
kkk p[maxn];
|
||||||
|
int ans[maxn];
|
||||||
|
vector<int> v1,v2;
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int t=read();
|
||||||
|
for(int cas=1;cas<=t;cas++)
|
||||||
|
{
|
||||||
|
n=read();
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
{
|
||||||
|
p[i].x=read(),p[i].y=read();
|
||||||
|
p[i].y++;
|
||||||
|
}
|
||||||
|
sort(p+1,p+n+1,cmp);
|
||||||
|
int flag=1;
|
||||||
|
memset(val1,0,4*(n+2));memset(val2,0,4*(n+2));
|
||||||
|
for(int i = 1 ; i <= n ; ++ i)
|
||||||
|
{
|
||||||
|
add(val1,i,1);
|
||||||
|
add(val2,i,1);
|
||||||
|
}
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
{
|
||||||
|
if(p[i].y>n-i+1)
|
||||||
|
{
|
||||||
|
flag=0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
int p1 = RankGet(val1,p[i].y);
|
||||||
|
int p2 = n-RankGet(val2,p[i].y) + 1;
|
||||||
|
if(p1<p2)
|
||||||
|
{
|
||||||
|
ans[p1]=p[i].x;
|
||||||
|
add(val1,p1,-1);
|
||||||
|
add(val2,n-p1+1,-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ans[p2]=p[i].x;
|
||||||
|
add(val1,p2,-1);
|
||||||
|
add(val2,n-p2+1,-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("Case #%d:",cas);
|
||||||
|
if(!flag)
|
||||||
|
{
|
||||||
|
printf(" impossible\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int i=1;i<=n;i++)
|
||||||
|
printf(" %d",ans[i]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
44
HDOJ/5494_autoAC.cpp
Normal file
44
HDOJ/5494_autoAC.cpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <stack>
|
||||||
|
#include <queue>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const double eps = 1e-6;
|
||||||
|
const double pi = acos(-1.0);
|
||||||
|
const int INF = 0x3f3f3f3f;
|
||||||
|
const int MOD = 1000000007;
|
||||||
|
#define ll long long
|
||||||
|
#define CL(a) memset(a,0,sizeof(a))
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
int T,n,m;
|
||||||
|
int a[1111],b[1111];
|
||||||
|
cin>>T;
|
||||||
|
while (T--)
|
||||||
|
{
|
||||||
|
cin>>n>>m;
|
||||||
|
for (int i=0; i<n; i++)
|
||||||
|
cin>>a[i];
|
||||||
|
for (int i=0; i<n; i++)
|
||||||
|
cin>>b[i];
|
||||||
|
sort(a, a+n);
|
||||||
|
sort(b, b+n);
|
||||||
|
int suma=0,sumb=0;
|
||||||
|
for (int i=1; i<=m; i++)
|
||||||
|
{
|
||||||
|
suma+=a[i-1];
|
||||||
|
sumb+=b[n-i];
|
||||||
|
}
|
||||||
|
if (suma>sumb)
|
||||||
|
cout<<"YES"<<endl;
|
||||||
|
else
|
||||||
|
cout<<"NO"<<endl;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
34
HDOJ/5495_autoAC.cpp
Normal file
34
HDOJ/5495_autoAC.cpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cstdio>
|
||||||
|
using namespace std;
|
||||||
|
#define maxn 100007
|
||||||
|
int a[maxn],b[maxn],vis[maxn];
|
||||||
|
int dfs(int x){
|
||||||
|
vis[x] = 1;
|
||||||
|
if(vis[b[a[x]]]) return 1;
|
||||||
|
return dfs(b[a[x]])+1;
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int t,n,u;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--){
|
||||||
|
scanf("%d",&n);
|
||||||
|
for(int i = 1;i <= n; i++){
|
||||||
|
scanf("%d",&u);
|
||||||
|
a[u] = i;
|
||||||
|
}
|
||||||
|
for(int i = 1;i <= n; i++)
|
||||||
|
scanf("%d",&b[i]);
|
||||||
|
memset(vis,0,sizeof(vis));
|
||||||
|
int ans = n;
|
||||||
|
for(int i = 1;i <= n; i++){
|
||||||
|
if(vis[i] == 0) {
|
||||||
|
if(dfs(i) > 1) ans--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("%d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
39
HDOJ/5496_autoAC.cpp
Normal file
39
HDOJ/5496_autoAC.cpp
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstdlib>
|
||||||
|
#include<cstring>
|
||||||
|
#include<iostream>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<vector>
|
||||||
|
using namespace std;
|
||||||
|
typedef long long LL;
|
||||||
|
const LL mod = 1000000007;
|
||||||
|
const int maxn = 100005;
|
||||||
|
int b[maxn],a[maxn];
|
||||||
|
int n,m;
|
||||||
|
LL cnt[maxn];
|
||||||
|
LL B[maxn];
|
||||||
|
int main() {
|
||||||
|
int t;
|
||||||
|
cin >> t;
|
||||||
|
B[0] = 1;
|
||||||
|
for (int i = 1;i < maxn;i++) B[i] = (B[i - 1] * 2) % mod;
|
||||||
|
while (t--) {
|
||||||
|
memset(cnt, 0, sizeof(cnt));
|
||||||
|
cin >> n;
|
||||||
|
for (int i = 0;i < n;i++) {
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
b[i] = a[i];
|
||||||
|
}
|
||||||
|
sort(b, b + n);
|
||||||
|
m = unique(b, b + n) - b;
|
||||||
|
LL ret = 0;
|
||||||
|
for (int i = 0;i < n;i++) {
|
||||||
|
int x = lower_bound(b, b + m, a[i]) - b;
|
||||||
|
ret = ((ret - ((cnt[x] * (LL)a[i]) % mod * B[n - i - 1])%mod)%mod+mod)%mod;
|
||||||
|
ret = (ret + B[n - 1] * (LL)a[i]) % mod;
|
||||||
|
cnt[x] = (cnt[x] + B[i])%mod;
|
||||||
|
}
|
||||||
|
cout << ret << endl;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
60
HDOJ/5497_autoAC.cpp
Normal file
60
HDOJ/5497_autoAC.cpp
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cctype>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
#include <queue>
|
||||||
|
#include <string>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
#define pr(x) cout << #x << " = " << x << " "
|
||||||
|
#define prln(x) cout << #x << " = " << x << endl
|
||||||
|
const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;
|
||||||
|
int n, m, a[N], b[N], c[N];
|
||||||
|
void add(int *b, int i, int v) {
|
||||||
|
for(; i <= n; i += i & -i) b[i] += v;
|
||||||
|
}
|
||||||
|
int sum(int *b, int i) {
|
||||||
|
int ret = 0;
|
||||||
|
for(; i; i -= i & -i) ret += b[i];
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
inline int read() {
|
||||||
|
int c, x;
|
||||||
|
while(c = getchar(), !isdigit(c));
|
||||||
|
x = c - '0';
|
||||||
|
while(c = getchar(), isdigit(c)) x = x * 10 + c - '0';
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
ios_base::sync_with_stdio(0);
|
||||||
|
int t; t = read();
|
||||||
|
while(t--) {
|
||||||
|
n = read(); m = read();
|
||||||
|
for(int i = 1; i <= n; ++i) a[i] = read();
|
||||||
|
memset(b, 0, sizeof b);
|
||||||
|
memset(c, 0, sizeof c);
|
||||||
|
long long tmp = 0;
|
||||||
|
for(int i = m + 1; i <= n; ++i) {
|
||||||
|
tmp += i - m - 1 - sum(c, a[i]);
|
||||||
|
add(c, a[i], 1);
|
||||||
|
}
|
||||||
|
long long ans = tmp;
|
||||||
|
for(int i = m + 1; i <= n; ++i) {
|
||||||
|
tmp -= sum(c, a[i] - 1);
|
||||||
|
tmp -= sum(b, n) - sum(b, a[i]);
|
||||||
|
add(c, a[i], -1);
|
||||||
|
tmp += sum(c, a[i - m] - 1);
|
||||||
|
tmp += sum(b, n) - sum(b, a[i - m]);
|
||||||
|
add(b, a[i - m], 1);
|
||||||
|
ans = min(ans, tmp);
|
||||||
|
}
|
||||||
|
printf("%I64d\n", ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
99
HDOJ/5498_autoAC.cpp
Normal file
99
HDOJ/5498_autoAC.cpp
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
#include<iostream>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<cstdio>
|
||||||
|
#include<math.h>
|
||||||
|
using namespace std;
|
||||||
|
#define ll long long
|
||||||
|
#define maxn 101
|
||||||
|
int p;
|
||||||
|
struct Node{
|
||||||
|
int mat[maxn][maxn];
|
||||||
|
void init(){
|
||||||
|
memset(mat,0,sizeof(mat));
|
||||||
|
}
|
||||||
|
void one(int n){
|
||||||
|
init();
|
||||||
|
for(int i = 0;i < n; i++)
|
||||||
|
mat[i][i] = 1;
|
||||||
|
}
|
||||||
|
int Det(int n, int mod1){
|
||||||
|
int ans = 1;
|
||||||
|
int *p1,*p2,mul;
|
||||||
|
for(int i = 0;i < n; i++){
|
||||||
|
for(int j = i+1;j < n; j++){
|
||||||
|
while(mat[i][i] != 0 && mat[j][i] != 0){
|
||||||
|
if(abs(mat[i][i]) > abs(mat[j][i]))
|
||||||
|
p1=mat[i],p2=mat[j],mul=mat[i][i]/mat[j][i];
|
||||||
|
else
|
||||||
|
p1=mat[j],p2=mat[i],mul=mat[j][i]/mat[i][i];
|
||||||
|
for(int l = i;l < n; l++)
|
||||||
|
p1[l] = (p1[l]-(ll)p2[l]*mul)%mod1;
|
||||||
|
}
|
||||||
|
if(mat[i][i] == 0){
|
||||||
|
ans = -ans;
|
||||||
|
for(int l = i;l < n;l++)
|
||||||
|
swap(mat[i][l],mat[j][l]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ans = (ll)ans*mat[i][i] % mod1;
|
||||||
|
}
|
||||||
|
return (ans+mod1)%mod1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
int matrix[maxn][maxn];
|
||||||
|
void multi(Node& a,Node& b,int n){
|
||||||
|
for(int i = 0;i < n; i++)
|
||||||
|
for(int j = 0;j < n; j++)
|
||||||
|
matrix[i][j] = 0;
|
||||||
|
for(int i = 0;i < n; i++){
|
||||||
|
for(int j = 0;j < n; j++){
|
||||||
|
if(a.mat[i][j] == 0) continue;
|
||||||
|
for(int k = 0;k < n; k++){
|
||||||
|
if(b.mat[j][k] == 0) continue;
|
||||||
|
matrix[i][k] = (matrix[i][k]+(ll)a.mat[i][j]*b.mat[j][k])%p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i = 0;i < n; i++)
|
||||||
|
for(int j = 0;j < n; j++)
|
||||||
|
a.mat[i][j] = matrix[i][j];
|
||||||
|
}
|
||||||
|
int mp[maxn][maxn];
|
||||||
|
int main(){
|
||||||
|
int t,n,m,q,u,v;
|
||||||
|
Node a,b,c;
|
||||||
|
scanf("%d",&t);
|
||||||
|
while(t--){
|
||||||
|
scanf("%d%d%d%d",&n,&m,&p,&q);
|
||||||
|
c.init();
|
||||||
|
for(int i = 0;i < m; i++){
|
||||||
|
scanf("%d%d",&u,&v);
|
||||||
|
u--,v--;
|
||||||
|
c.mat[u][u]++;
|
||||||
|
c.mat[v][v]++;
|
||||||
|
c.mat[u][v] = c.mat[v][u] = -1;
|
||||||
|
}
|
||||||
|
if(q < n-1){
|
||||||
|
printf("0\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int ans = c.Det(n-1,p);
|
||||||
|
if(ans == 0){
|
||||||
|
printf("0\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
a.init();
|
||||||
|
b.one(n);
|
||||||
|
for(int i = 1;i < n; i++)
|
||||||
|
a.mat[i][i] = i,a.mat[i][i-1] = n-i;
|
||||||
|
while(q){
|
||||||
|
if(q&1) multi(b,a,n);
|
||||||
|
multi(a,a,n);
|
||||||
|
q/=2;
|
||||||
|
}
|
||||||
|
ans = (ll)ans*b.mat[n-1][0]%p;
|
||||||
|
printf("%d\n",ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
68
HDOJ/5499_autoAC.cpp
Normal file
68
HDOJ/5499_autoAC.cpp
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
#define maxn 110
|
||||||
|
class node
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
string sex,name;
|
||||||
|
double sum;
|
||||||
|
int r1,r2;
|
||||||
|
void set(string n,string s,int o,int t)
|
||||||
|
{
|
||||||
|
sex=s,name=n;
|
||||||
|
r1=o,r2=t;
|
||||||
|
}
|
||||||
|
}male[maxn],fe[maxn],ans[maxn];
|
||||||
|
bool cmp(node x,node y)
|
||||||
|
{
|
||||||
|
return x.sum>y.sum;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T;
|
||||||
|
cin>>T;
|
||||||
|
while(T--)
|
||||||
|
{
|
||||||
|
int n,m;
|
||||||
|
cin>>n>>m;
|
||||||
|
string name,sex;
|
||||||
|
int r1,r2,rr1=0,rr2=0;
|
||||||
|
int f=0,p=0,top=0;
|
||||||
|
for(int i=0;i<n;i++)
|
||||||
|
{
|
||||||
|
cin>>name>>sex>>r1>>r2;
|
||||||
|
rr1=max(rr1,r1);
|
||||||
|
rr2=max(rr2,r2);
|
||||||
|
if(sex=="male") male[p++].set(name,sex,r1,r2);
|
||||||
|
else fe[f++].set(name,sex,r1,r2);
|
||||||
|
}
|
||||||
|
double m1,m2;
|
||||||
|
m1=300*1.0/rr1,m2=300*1.0/rr2;
|
||||||
|
for(int i=0;i<p;i++)
|
||||||
|
male[i].sum=male[i].r1*(m1)*0.3+male[i].r2*(m2)*0.7;
|
||||||
|
for(int i=0;i<p;i++)
|
||||||
|
fe[i].sum=fe[i].r1*(m1)*0.3+fe[i].r2*(m2)*0.7;
|
||||||
|
sort(male,male+p,cmp);
|
||||||
|
sort(fe,fe+f,cmp);
|
||||||
|
if(f)
|
||||||
|
ans[top++]=fe[0];
|
||||||
|
for(int i=0;i<p;i++)
|
||||||
|
{
|
||||||
|
ans[top++]=male[i];
|
||||||
|
}
|
||||||
|
for(int i=0;i<f;i++)
|
||||||
|
{
|
||||||
|
if(fe[i].name!=ans[0].name)
|
||||||
|
ans[top++]=fe[i];
|
||||||
|
}
|
||||||
|
sort(ans+1,ans+top,cmp);
|
||||||
|
sort(ans,ans+m,cmp);
|
||||||
|
cout<<"The member list of Shandong team is as follows:"<<endl;
|
||||||
|
for(int i=0;i<m;i++) cout<<ans[i].name<<endl;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
40
HDOJ/5500_autoAC.cpp
Normal file
40
HDOJ/5500_autoAC.cpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstdlib>
|
||||||
|
#include<vector>
|
||||||
|
#include<cstring>
|
||||||
|
#include<set>
|
||||||
|
#include<queue>
|
||||||
|
#include<stack>
|
||||||
|
#include<map>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<iostream>
|
||||||
|
#include<ctime>
|
||||||
|
#include<bitset>
|
||||||
|
using namespace std;
|
||||||
|
#define N 300005
|
||||||
|
#define NMAX 2000000000
|
||||||
|
typedef long long ll;
|
||||||
|
int a[22];
|
||||||
|
bool cmp(const int& x, const int& y){
|
||||||
|
return x>y;
|
||||||
|
}
|
||||||
|
int main(){
|
||||||
|
int T, n, m;
|
||||||
|
while ( scanf("%d", &T) != EOF){
|
||||||
|
while ( T > 0 ){
|
||||||
|
T--;
|
||||||
|
scanf("%d", &n);
|
||||||
|
int index = -1;
|
||||||
|
for ( int i = 0 ;i < n; i++ ){
|
||||||
|
scanf("%d", &a[i]);
|
||||||
|
}
|
||||||
|
int ans = 0, t = n - 1, cur = n;
|
||||||
|
while ( t >= 0 ){
|
||||||
|
if ( a[t] == cur ) cur--;
|
||||||
|
t--;
|
||||||
|
}
|
||||||
|
cout << cur << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
76
HDOJ/5501_autoAC.cpp
Normal file
76
HDOJ/5501_autoAC.cpp
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<iostream>
|
||||||
|
#include<string>
|
||||||
|
#include<string.h>
|
||||||
|
#include<algorithm>
|
||||||
|
#include<iomanip>
|
||||||
|
#include<vector>
|
||||||
|
#include<time.h>
|
||||||
|
#include<queue>
|
||||||
|
#include<stack>
|
||||||
|
#include<iterator>
|
||||||
|
#include<math.h>
|
||||||
|
#include<stdlib.h>
|
||||||
|
#include<limits.h>
|
||||||
|
#include<map>
|
||||||
|
#include<set>
|
||||||
|
#include<bitset>
|
||||||
|
#define eps 1e-5
|
||||||
|
#define INF 0x7fffffff
|
||||||
|
#define FOR(i,a) for((i)=0;i<(a);(i)++)
|
||||||
|
#define MEM(a) (memset((a),0,sizeof(a)))
|
||||||
|
#define sfs(a) scanf("%s",a)
|
||||||
|
#define sf(a) scanf("%d",&a)
|
||||||
|
#define sfI(a) scanf("%I64d",&a)
|
||||||
|
#define pf(a) printf("%d\n",a)
|
||||||
|
#define pfI(a) printf("%I64d\n",a)
|
||||||
|
#define pfs(a) printf("%s\n",a)
|
||||||
|
#define sfd(a,b) scanf("%d%d",&a,&b)
|
||||||
|
#define sft(a,b,num) scanf("%d%d%d",&a,&b,&num)
|
||||||
|
#define for1(i,a,b) for(int i=(a);i<b;i++)
|
||||||
|
#define for2(i,a,b) for(int i=(a);i<=b;i++)
|
||||||
|
#define for3(i,a,b)for(int i=(b);i>=a;i--)
|
||||||
|
#define MEM1(a) memset(a,0,sizeof(a))
|
||||||
|
#define MEM2(a) memset(a,-1,sizeof(a))
|
||||||
|
#define ll long long
|
||||||
|
const double PI=acos(-1.0);
|
||||||
|
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
|
||||||
|
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
|
||||||
|
template<class T> inline T Min(T a,T b){return a<b?a:b;}
|
||||||
|
template<class T> inline T Max(T a,T b){return a>b?a:b;}
|
||||||
|
using namespace std;
|
||||||
|
int n,m,L;
|
||||||
|
#define N 50005
|
||||||
|
#define M 1000100
|
||||||
|
#define Mod 1000000007
|
||||||
|
#define p(x,y) make_pair(x,y)
|
||||||
|
int dp[5010];
|
||||||
|
struct Node{
|
||||||
|
int a,b,c;
|
||||||
|
bool operator <(const Node &x) const{
|
||||||
|
return (ll)b*x.c>(ll)x.b*c;
|
||||||
|
}
|
||||||
|
}e[1010];
|
||||||
|
int main(){
|
||||||
|
int T;
|
||||||
|
sf(T);
|
||||||
|
while(T--){
|
||||||
|
int t;
|
||||||
|
sfd(n,t);
|
||||||
|
for(int i=1;i<=n;i++){
|
||||||
|
scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
|
||||||
|
}
|
||||||
|
sort(e+1,e+n+1);
|
||||||
|
memset(dp,0,sizeof dp);
|
||||||
|
for(int i=1;i<=n;i++){
|
||||||
|
for(int j=t;j>=e[i].c;j--){
|
||||||
|
dp[j] = Max(dp[j],dp[j-e[i].c]+Max(0,e[i].a-j*e[i].b));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int ans=-INF;
|
||||||
|
for(int i=0;i<=t;i++)
|
||||||
|
ans = Max(ans,dp[i]);
|
||||||
|
pf(ans);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
42
HDOJ/5502_autoAC.cpp
Normal file
42
HDOJ/5502_autoAC.cpp
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
double dp[1550];
|
||||||
|
double power[1550];
|
||||||
|
double ans[1550];
|
||||||
|
double pre[1550];
|
||||||
|
int main(){
|
||||||
|
int T,n;
|
||||||
|
double p,q;
|
||||||
|
scanf("%d",&T);
|
||||||
|
while(T--){
|
||||||
|
scanf("%d%lf%lf",&n,&p,&q);
|
||||||
|
power[0]=1;
|
||||||
|
double pro0=q/p;
|
||||||
|
double pro1=(p-q)/p;
|
||||||
|
for(int i=1;i<=n+1;i++){
|
||||||
|
power[i]=power[i-1]*pro0;
|
||||||
|
}
|
||||||
|
ans[0]=0;
|
||||||
|
n++;
|
||||||
|
for(int i=1;i<=n;i++){
|
||||||
|
dp[0]=pre[0]=1;
|
||||||
|
for(int j=1;j<=n;j++){
|
||||||
|
double now=pre[j-1];
|
||||||
|
if(j-1-i>=0) now-=pre[j-1-i]*power[i];
|
||||||
|
dp[j]=now*pro1;
|
||||||
|
pre[j]=pre[j-1]*pro0+dp[j];
|
||||||
|
}
|
||||||
|
ans[i]=dp[n];
|
||||||
|
}
|
||||||
|
double e=0;
|
||||||
|
for(int i=n;i>=1;i--){
|
||||||
|
e+=(ans[i]-ans[i-1])*i;
|
||||||
|
}
|
||||||
|
e/=pro1;
|
||||||
|
printf("%.3lf\n",e);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
51
HDOJ/5503_autoAC.cpp
Normal file
51
HDOJ/5503_autoAC.cpp
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include<cstdio>
|
||||||
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
using namespace std;
|
||||||
|
#define LL long long
|
||||||
|
#define N 50007
|
||||||
|
LL c[N], s[N];
|
||||||
|
void init() {
|
||||||
|
for (LL i = 1; i < N; ++i)
|
||||||
|
c[i] = i * (i - 1) >> 1;
|
||||||
|
}
|
||||||
|
inline int read() {
|
||||||
|
int ret = 0;
|
||||||
|
char ch = getchar();
|
||||||
|
while (!('0' <= ch && ch <= '9'))
|
||||||
|
ch = getchar();
|
||||||
|
while ('0' <= ch && ch <= '9') {
|
||||||
|
ret = ret * 10 + ch - '0';
|
||||||
|
ch = getchar();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
init();
|
||||||
|
int T = read();
|
||||||
|
int n, i;
|
||||||
|
LL sum;
|
||||||
|
bool flag;
|
||||||
|
while (T--) {
|
||||||
|
n = read();
|
||||||
|
for (i = 0; i < n; ++i)
|
||||||
|
s[i] = read();
|
||||||
|
sort(s, s + n);
|
||||||
|
sum = 0;
|
||||||
|
flag = true;
|
||||||
|
for (i = 1; i <= n; ++i) {
|
||||||
|
sum = sum + s[i - 1];
|
||||||
|
if (sum < c[i]) {
|
||||||
|
flag = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sum != c[n])
|
||||||
|
flag = false;
|
||||||
|
if (flag)
|
||||||
|
puts("It seems to have no problem.");
|
||||||
|
else
|
||||||
|
puts("The data have been tampered with!");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
46
HDOJ/5504_autoAC.cpp
Normal file
46
HDOJ/5504_autoAC.cpp
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstring>
|
||||||
|
#include <stack>
|
||||||
|
#include <queue>
|
||||||
|
#include <map>
|
||||||
|
#include <set>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
using namespace std;
|
||||||
|
const double eps = 1e-6;
|
||||||
|
const double pi = acos(-1.0);
|
||||||
|
const int INF = 0x3f3f3f3f;
|
||||||
|
const int MOD = 1000000007;
|
||||||
|
#define ll long long
|
||||||
|
#define CL(a) memset(a,0,sizeof(a))
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int T;
|
||||||
|
ll n,x,sum;
|
||||||
|
cin>>T;
|
||||||
|
while(T--)
|
||||||
|
{
|
||||||
|
cin>>n;
|
||||||
|
sum = 0;
|
||||||
|
int k=0,re=0;
|
||||||
|
ll maxx = -INF;
|
||||||
|
for(int i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
cin>>x;
|
||||||
|
if(x == 0) {re++; continue;}
|
||||||
|
if(x < 0)
|
||||||
|
{
|
||||||
|
k++;
|
||||||
|
maxx = max(maxx, x);
|
||||||
|
}
|
||||||
|
if(i == re) sum = x;
|
||||||
|
else sum *= x;
|
||||||
|
}
|
||||||
|
if(k%2&&n!=1&&!(k==1&&re+k==n)) sum /= maxx;
|
||||||
|
if(re>0&&(sum<0||n==1)) sum = 0;
|
||||||
|
cout<<sum<<endl;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user