hzwer出題,因為有兩道我們之前做過所以很快都a完了。
a.dispatching
題目大意:給定一棵n個點的數和費用上限m,每個點有費用ci和權值li,要求選出若干個費用和不超過m的點和這些點的乙個公共祖先,求選出的點數乘上這個公共祖先的權值的最大值。(n<=100,000)
思路:對每個子樹統計答案,求出子樹內費用和不超過m的費用前k小,用k*li統計答案。隨便打個啟發式合併平衡樹就可以了,複雜度o(nlogn^2)(或者主席樹o(nlogn))。
#include#includeusing
namespace
std;
#define ll long longinline
intread()
#define mn 100000
int fa[mn+5],w[mn+5],l[mn+5
];namespace
treap
inline
void up(int
x)
int query(int
x,ll k)
void rotate(int
x)
void ins(int x,int
k)
void dfs(int
x)
void merge(int x,int
y)
};int
main()
printf(
"%lld
",ans);
}
d.超級鋼琴
題目大意:給定乙個長度為n的序列,求前k大的長度在[l,r]之間的子串和的和。(n,k<=500,000,1<=l<=r<=n)
思路:字首和後對每個右端點用可持久化堆建出可用的左端點的小根堆,開個優先佇列存下選各右端點時當前的最優答案,每次取出最優的那個右端點計入答案後把對應的堆頂彈掉。總複雜度o((n+k)logn)。
#include#include#include
using
namespace
std;
inline
intread()
#define mn 500000
#define nd 30000000
#define inf 0x3fffffff
struct nodet[nd+5
];int rt[mn+5],a[mn+5
],tn;
class cmp};
priority_queue
,cmp>pq;
int build(int l,int
r)int change(int x,int l,int r,int k,int
z)int del(int x,int l,int
r)int
main()
while(k--)
printf(
"%lld
",ans);
}
e.元素
題目大意:給定n個數,每個數有乙個權值,要求選出若干個數,使其中不存在異或和為0的非空子集,求出選出的數的最大權值和。(n<=1000,數字<=10^18)
思路:線性基入門題。我比較菜沒學過,現場學的,易知線性基滿足不存在異或和為0的非空子集,而n個相同的數不管加入順序,選出的線性基個數是相同的,我們把數字按權值從大到小排序後每個考慮能否加入當前線性基中即可,複雜度o(nlog10^18)。
#include#includeusing
namespace
std;
#define ll long longinline ll read()
#define mn 1000
#define mk 60
struct nodea[mn+5
];bool cmp(node a,node b)
ll z[mk+5
];int
main()
printf("%d
",ans);
}
20161104校內訓練
一道類似模擬的題,就根據所寫的東西來做就可以了。include define rep i l r for int i l i r i define per i r l for int i r i l i define erep i u for int i head u i i e i nxt usi...
2017 4 14校內訓練
hzwer拿了幾道noi中比較簡單的給我們做 a.noi2009 植物大戰殭屍 思路 考慮最小割,如果乙個植物的權值x是正的,我們先預設吃掉它,使答案加上x並讓s向這個點連x,割這條邊相當於不吃這個植物,否則讓這個點向t連 x,割這條邊相當於吃這個植物,每個植物讓它能攻擊到的格仔和它的前一格向它連i...
2017 4 7校內訓練
喪病hzwer的ctsc訓練賽 my ac 3 4 a.ctsc2014 企鵝qq 思路 亂hash,我比較菜,寫的醜 各種wa tle,好久才a掉。include include using namespace std define ll long long define mn 200 defin...