51nod演算法馬拉松15

2022-05-03 22:54:13 字數 2987 閱讀 1098

智力徹底沒有了。。。看來再也拿不到獎金了qaq。。。

a b君的遊戲

因為資料是9b1l,所以我們可以hash試一下資料。。。

#include#include#include#include#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

using namespace std;

inline int read()

typedef unsigned long long ll;

int main()

if((ans&1)&&(!(ans&2))&&(ans&4)&&(ans2&1)&&(!(ans2&2))) puts("l");

else puts("b");

return 0;

}

b 完美消除

這道數字dp題應該還是不錯的,我們先考慮給定乙個數消成0的最小步數如何計算。

從高位到低位依次考慮每一位,設當前數字為x,將棧裡所有大於x的數字刪除,如果此時棧裡沒有數字x則加入,並且答案+1。

我們把這個想法套到數字dp中,設f[len][s][k][c]表示前len位,棧中集合為s,當前已經進行過k次操作,當前的數與給定數的大小關係。

轉移時列舉下一位填什麼數字即可。

#include#include#include#include#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

using namespace std;

inline int read()

typedef long long ll;

int k,bit[20];

ll f[20][1050][20][2];

//f[len][s][sumv][<?=]

ll solve(ll n) ,然後再容斥一下就能計算出每次詢問的答案了。

所以我們預處理出來所有數的因數和mu函式,然後就能每次o(sqrt(n))實現了。

#include#include#include#include#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

using namespace std;

inline int read()

const int maxn=100010;

const int maxm=2000010;

typedef long long ll;

int first[maxn],next[maxm],to[maxm],cnt,e;

void addpri(int u,int v)

int vis[maxn],mu[maxn],pri[maxn];

void init(int n)

mu[i*pri[j]]=-mu[i];

} }}int b[maxn],sum;

int n,m,a[maxn];

void add(int x,int v)

int query(int x)

int main()

} return 0;

}

e danganronpa

我的做法是基於ac自動機的。

考慮先將證言串和言彈串放在一棵ac自動機上,則乙個言彈對乙個證言的傷害即為證言有多少字首在言彈對應fail樹的子樹。

考慮對每個詢問以證言出現時間為第一關鍵字、以詢問時間為第二關鍵字、ac自動機上位置為第三關鍵字,然後直接跑樹上莫隊即可。

時間複雜度為o(n^(5/3)logn)。但因為常數較小所以還可以跑過。

#include#include#include#include#include#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

using namespace std;

inline int read()

typedef long long ll;

const int maxn=200010;

int size,ch[maxn][26],pa[maxn],cnt;

int insert(int p,int c)

int f[maxn],que[maxn],first1[maxn],first2[maxn],e1,e2;

struct edge edges1[maxn],edges2[maxn];

void addedge1(int u,int v) ;first1[u]=e1;}

void addedge2(int u,int v) ;first2[u]=e2;}

int dep[maxn],sta[maxn],cur[maxn],blo[maxn],top,tmp;

void dfs1(int x)

} sta[++top]=x;

}int st[maxn],en[maxn];

void dfs2(int x)

void getfail()

} rep(i,1,cnt) addedge1(pa[i],i);

dfs1(0);while(top) blo[sta[top--]]=tmp;

rep(i,1,cnt) addedge2(f[i],i);

tmp=0;dfs2(0);

}int posa[maxn],tima[maxn],posb[maxn],ca,cb;

int n,m,q,t[maxn],p[maxn],blt[maxn];

struct query

rep(i,1,n) if(ans[i]>=0) printf("%lld\n",ans[i]);

return 0;

}

51nod演算法馬拉松32

比賽鏈結 馬拉松是真的難 應該是我太菜了tnt 同bzoj1534 題解戳這裡 n個有標號的點,其中m個是葉子節點。問有多少數的形態。include include include include include using namespace std typedef long long ll co...

51nod演算法馬拉松13

a 取餘最長路 不難發現路徑可以拆成三條線段,只要知道兩個轉折點的位置就能計算出答案。設sum i,l,r 表示第i行從l到r元素的和,則答案可以表示為sum 1,1,x sum 2,x,y sum 3,y,n p。字首和一下轉化成 s3 n s3 y 1 s2 y s1 x s2 x 1 p,從小...

51nod 演算法馬拉松18 總結

第一次打馬拉松。a 一看題。什麼鬼。n 4竟然是無解,第乙個點給了乙個n 5的,好像是構造的挺有規律的樣子。那就偶數無解,奇數照著他的構造方法寫一發吧。怎麼a了?不管了。既然結束了還是要回來好好想一下是什麼情況的。偶數肯定是無解的,因為一共有n n 1 2 條邊,那麼每種顏色的邊出現次數相等的話,就...