智力徹底沒有了。。。看來再也拿不到獎金了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 條邊,那麼每種顏色的邊出現次數相等的話,就...