(鴨血居然沒想到字首和優化dp,主要是寫的是刷表....,只想到線段樹優化,還要兩棵....)
首先是暴力解法:
f[i][j]+=f[i-1][k] (0<=k<=j/2)
嗯.....這個顯然可以字首和優化.....
然後是正常人dp解法:
令f(i,j)表示長度為i總和為j的合法陣列個數
則f[i][j]=f[i][j-1]+f[i-1][j/2]; (第二項只有j為偶數轉移 2*k總為偶數)
這個轉移相當於是:對於第i個陣列有兩種轉移:第1種是給最後1個數加1,第2種是新加1個數,
因為新加的數最少是前i-1個的和。(然後第二種的狀態,第乙個有可以去累加,常見思路!!!noip2016飛翔的小鳥也有這種思路)
其實這題就水得一匹。
上**:
1 #include2#define maxn 1000005
3using
namespace
std;
4 typedef long
long
ll;5
const ll mod=998244353
; 6 ll dp[25
][maxn];
7int
n,k;
8void
init()
16 printf("
%lld
",dp[k][n]); 17}
18int
main()
首先這道題可以觀察推出ans[i]=2*len-dep[i](滑稽)len為所經過的路徑長度(塗黑的),然後這裡我用的是樹鏈剖分,實際上可以暴力:每次加乙個個ai,暴力列舉ai到根這條路徑上的所
有邊,然後將他們標記為屬於迴路的邊。
只要暴力往上爬時,碰到已經被標記的邊就不繼續爬,這樣所有邊
最多被標記1次,所以是o(n)的。(有點草率...)
上**:
1 #include2#define maxn 100005
3using
namespace
std;
4int n,m,a[maxn],x,y,dep[maxn],son[maxn],sz[maxn],rk[maxn],dfn[maxn],clock_=0,top[maxn];//
rk:回指dfn序所指的原節點編號
5int fa[maxn][18
]; 6
struct
eagee[maxn<<1];9
int np=0
,first[maxn];
10void add(int u,int
v);12 first[u]=np;13}
14void dfs1(int i,int f,int
d)25}26
int lca(int u,int
v)32
if(u==v) return
u;33
for(int i=17;i>=0;i--)
37return fa[u][0
];38}39
void dfs2(int i,int f,int
tp)48}49
int num[maxn<<1],ad[maxn<<1
];50
int lc[maxn<<1],rc[maxn<<1],npp=0,rt=0;51
void upload(int
now)
54void build(int &now,int l,int
r)57
58int m=l+r>>1;59
build(lc[now],l,m);
60 build(rc[now],m+1
,r);
6162
upload(now);63}
64void download(int now,int l,int m,int
r)72}73
void update(int now,int l,int r,int i,int j,int
d) 79
80int m=l+r>>1;81
download(now,l,m,r);
8283
if(j<=m)
86else
if(i>m)
89else
9394
upload(now);95}
96void upd(int u,int
v)103
if(dep[u]104 update(rt,1,n,dfn[v],dfn[u],1
);105
}106
void
init()
113for(int i=1;i<=m;i++) scanf("
%d",&a[i]);
114 dfs1(1,0,0
);115 dfs2(1,0,1
);116
117118 build(rt,1
,n);
119 a[0]=1
;120
for(int i=1;i<=m;i++)
124}
125int
main()
留坑放**...
1 #include2#define maxn 100005
3using
namespace
std;
4 typedef long
long
ll;5
int n,a[maxn*2],b[maxn*2];//
b:替用陣列
6bool vis[65];//
分解t之後哪些位上有
7 ll t,w[65];8
char
s[maxn];
9void
ready()
13void
fj(ll t)17}
18void
init()34}
35 memcpy(a,b,sizeof
(b)); 36}
37}38for(int i=1;i<=n;i++) printf("%d"
,a[i]);39}
40int
main()
正睿2018 9 1提高2
對於二次函式提出乙個x 對於剩下的直線維護乙個 我們需要求出最大值上輪廓 單調棧求上凸殼就好了 include includeinline int read while c 9 c 0 x x 10 c 0 c getchar return x f const int maxn 500007 int...
正睿2020提高組十連測 選做
更新中.目錄題目鏈結 理解題意,打出第乙個暴力 首先需要知道,隨機生成的樹 如果不特別說明隨機方法,就是指在所有 n 棵樹里隨機 最大深度期望是 o sqrt 的。看本題。首先,期望是嚇唬你的,因為期望乘上階乘,其實就是求和。於是我們要求 所有排列下 操作後所有點的權值和 的和 因此暴力做法就是列舉...
2018提高組模擬9
2018提高組模擬9 20181004 woj4036 模擬 數論 描述給定乙個k 2 k 16 進製數a,判斷a是否能被k 1整除。輸入第一行是乙個整數t 1 t 50 表示測試點數量。對於每組資料,第一行乙個整數k,表示進製。第二行乙個k進製數,表示a。保證a是合法的k進製數,沒有前導0,且只由...