好像所有人都寫的左偏樹 但我不會啊233
首先發現乘的時候 係數不會為負,所以能得到乙個關鍵條件:變化後的戰鬥力隨變化前的戰鬥力大小單調
所以我們考慮倍增
設hp[x][i]是從x開始一路攻克$2^i$個城池所需要最小的初始生命值
設trans[x][i][0/1]是攻克了$2^i$個城池後攻擊力的變化量,0表示乘,1表示加,先乘後加
然後就可以倍增了
1 #include2好好分析空間啊kora!#define pa pair3
#define clr(a,x) memset(a,x,sizeof(a))
4#define mp make_pair
5using
namespace
std;
6 typedef long
long
ll;7
const
int maxn=3e5+5;8
9 inline char
gc()
14inline ll rd()
17while(c>='
0'&&c<='
9') x=(x<<1)+(x<<3)+c-'
0',c=gc();
18return neg?(~x+1
):x;19}
2021
int n,m,fa[maxn][21
];22 ll hp[maxn][21],trans[maxn][21][2
];23
intans1[maxn],ans2[maxn];
2425
intmain()42}
43for(i=1;i<=m;i++)51}
52if(x!=-1) ans1[x]++;
53 ans2[i]=n;54}
55for(i=1;i<=n;i++)
56 printf("
%d\n
",ans1[i]);
57for(i=1;i<=m;i++)
58 printf("
%d\n
",ans2[i]);
5960
return0;
61 }
然而空間大小惡意卡倍增
但是我們這個倍增可以換成三進製的2333
就是把定義裡的$2^i$都換成$3^i$
於是$log_3300000=10$,空間就變成了原來的一半
需要注意的一點是,最後在跳倍增的時候,同乙個長度可以跳兩次(因為是三進製嘛),迴圈的時候稍微注意一下
1 #include2#define pa pair3
#define clr(a,x) memset(a,x,sizeof(a))
4#define mp make_pair
5using
namespace
std;
6 typedef long
long
ll;7
const
int maxn=3e5+5;8
9 inline char
gc()
14inline ll rd()
17while(c>='
0'&&c<='
9') x=(x<<1)+(x<<3)+c-'
0',c=gc();
18return neg?(~x+1
):x;19}
2021
int n,m,fa[maxn][11
];22 ll hp[maxn][11],trans[maxn][11][2
];23
intans1[maxn],ans2[maxn];
24int pw3[11
];25
26int
main()49}
50for(i=1;i<=m;i++)58}
59if(x!=-1) ans1[x]++;
60 ans2[i]=n;61}
62for(i=1;i<=n;i++)
63 printf("
%d\n
",ans1[i]);
64for(i=1;i<=m;i++)
65 printf("
%d\n
",ans2[i]);
6667
return0;
68 }
(36 2)多重繼承之虛基類
class 派生類名 virtual 訪問標號 虛基類名,include using namespace std class a 宣告為基類a void fun private int nv 私有成員 class b1 virtual public a 宣告a為虛基類,派生出b1 private i...
openfire3 6 2整合現有系統使用者
openfire3.6.2整合現有系統使用者 前面寫過一篇openfire整合自己使用者的文章,最近抽空,又開了一下新版本的openfire的功能增強 把原有系統進行了一下增強。整合使用者的配置的地方發生了改變 3.5是在openfire。xml檔案中新增配置。3.6 是在資料庫的ofpropert...
3 6 2儲存某列最大值的行
任務 查詢最昂貴商品的數量,經銷商和 這可以通過子查詢輕鬆完成 from shop where price select max price from shop article dealer price 0004 d 19.95 其他解決方案是使用left join或排序按 降序的所有行,並使用特定...