迟到+机房WIFI坏掉+位子被占。。。
太久没写CF的题,手速也慢了。最痛苦的是卡格式卡了一个小时T_T
搞定第三题回头 第二题写完比赛结束,啥都没得只好明天继续战
题目1 : 焦距
水水的模拟题
读字符串,转成同一单位,乘的时候注意精度问题。
代码就不用贴了吧
题目2 : 树
又是我最讨厌的线段树/树状数组题
处理下记录每个节点的儿子,套用模版成段更新就行
struct nod{
int l, r, del;
};
int n, m;
vi son[maxn];
int64 sum[maxn], ans[maxn];
vector<nod> an[maxn];
int Lowbit(int x){
return x & (-x);
}
void Update(int pos, int val){
while (pos > 0){
sum[pos] += val;
sum[pos] %= mod;
pos -= Lowbit(pos);
}
}
int64 Query(int pos){
int64 ret = 0;
while (pos <= n) {
ret = (ret + sum[pos]) % mod;
pos += Lowbit(pos);
}
return ret;
}
void Add(int l, int r, int val){
Update(r, val);
Update(l - 1, -val);
}
void dfs (int p, int len){
repf (i, 0, sz(an[p])-1){
nod tmp = an[p][i];
Add (tmp.l, tmp.r, tmp.del);
}
ans[p] = Query (len);
repf (i, 0, sz(son[p])-1) dfs (son[p][i], len+1);
repf (i, 0, sz(an[p])-1){
nod tmp = an[p][i];
Add (tmp.l, tmp.r, -tmp.del);
}
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
// std::ios::sync_with_stdio(false);
int T, cas = 0;
scanf ("%d", &T);
while (T--){
scanf ("%d", &n);
repf (i, 1, n) son[i].clear(), an[i].clear();
int t;
repf (i, 2, n) scanf ("%d", &t), son[t].pb (i);
int q, u;
nod nod_tmp;
scanf ("%d", &q);
while (q--){
scanf ("%d%d%d%d", &u, &nod_tmp.l, &nod_tmp.r, &nod_tmp.del);
an[u].pb (nod_tmp);
}
clr (sum, 0); clr (ans, 0);
dfs (1, 1);
int64 MOD = mod; // 10^9 + 7
int64 MAGIC = 12347;
int64 Hash = 0;
repf (i, 1, n){
Hash = (Hash * MAGIC + ans[i]) % MOD;
}
Hash = ( Hash + MOD ) % MOD;
printf ("Case %d: %d\n", ++ cas, (int)Hash);
}
return 0;
}
据说暴搜加剪枝也能过大数据。。。
题目3 : 活动中心
三分法的题,也是可以直接套模板的题
百度一下就懂了
double l,r,m,mm;
l=ml,r=mr;
while( fabs(r-l)>1e-8)
{
m=(l+r)/2;
mm=(m+l)/2;
if( ch(m)>ch(mm) )
{
r=m;
}
else
l=mm;
}
printf("%.6lf\n",m);
本文分享了一次参加CF编程挑战赛的经历,详细介绍了三道题目的解题思路:第一题利用简单模拟解决焦距问题;第二题通过线段树实现高效区间更新;第三题采用三分法解决活动中心定位问题。
688

被折叠的 条评论
为什么被折叠?



