A:读懂题,乘一下判断大小就行了

#include<bits/stdc++.h>
using namespace std;
int main()
{
int s, v1, v2, t1, t2;
scanf("%d%d%d%d%d", &s, &v1, &v2, &t1, &t2);
int ans1 = v1 * s + t1 * , ans2 = v2 * s + t2 * ;
if(ans1 == ans2) puts("Friendship");
else if(ans1 < ans2) puts("First");
else puts("Second");
return ;
}

B:又是桶。。。cf怎么这么喜欢桶,当然把最小的位换成9是最好的,那么10个数字开10个桶,暴力删除每位改成9就行了,只是while要放在前面枚举pos

#include<bits/stdc++.h>
using namespace std;
int tot[], sum, ans;
char s[];
int main()
{
int k;
scanf("%d%s", &k, s);
int len = strlen(s);
for(int i = ; i < len; ++i) ++tot[s[i] - ''], sum += s[i] - '';
int pos = ;
while(sum < k)
{
while(tot[pos] == ) ++pos;
sum += - pos;
--tot[pos];
++ans;
}
printf("%d\n", ans);
return ;
}

C:很明显不能暴力每次把所有星星+1,这是做不到的,但是看见c很小,那么我们预处理出c+1种情况就行了,可以用二维前缀和或二维bit,注意星星的位置可以重叠,考试的时候脑子坏了重新写了一遍,skip罚时爆炸,30min没了。。。

二维前缀和

#include<bits/stdc++.h>
using namespace std;
int a[][][], mark[][];
vector<int> b[][][];
int main()
{
int n, q, c;
scanf("%d%d%d", &n, &q, &c);
for(int i = ; i <= n; ++i)
{
int x, y, s;
scanf("%d%d%d", &x, &y, &s);
mark[x][y] = ;
b[][x][y].push_back(s);
}
for(int k = ; k <= ; ++k)
for(int i = ; i <= ; ++i)
for(int j = ; j <= ; ++j)
{
int delta = ;
if(k > )
{
for(int l = ; l < b[k - ][i][j].size(); ++l)
{
b[k][i][j].push_back((b[k - ][i][j][l] + ) % (c + ));
delta += b[k][i][j][l];
}
}
else
{
for(int l = ; l < b[k][i][j].size(); ++l)
delta += b[k][i][j][l];
}
a[k][i][j] = a[k][i][j - ] + a[k][i - ][j] - a[k][i - ][j - ] + delta;
}
for(int i = ; i <= q; ++i)
{
int t, x1, y1, x2, y2;
scanf("%d%d%d%d%d", &t, &x1, &y1, &x2, &y2);
int sum = a[t % (c + )][x2][y2] - a[t % (c + )][x2][y1 - ] - a[t % (c + )][x1 - ][y2] + a[t % (c + )][x1 - ][y1 - ];
printf("%d\n", sum);
}
return ;
}

二维bit

#include<bits/stdc++.h>
using namespace std;
int a[][][], mark[][];
int tree[][][], x[], y[], s[][];
int lowbit(int i)
{
return i & (-i);
}
void update(int k, int x, int y, int delta)
{
for(int i = x; i <= ; i += lowbit(i))
for(int j = y; j <= ; j += lowbit(j))
tree[k][i][j] += delta;
}
int query(int k, int x, int y)
{
int ret = ;
for(int i = x; i; i -= lowbit(i))
for(int j = y; j; j -= lowbit(j)) ret += tree[k][i][j];
return ret;
}
int main()
{
int n, q, c;
scanf("%d%d%d", &n, &q, &c);
for(int i = ; i <= n; ++i)
scanf("%d%d%d", &x[i], &y[i], &s[i][]);
for(int k = ; k <= ; ++k)
for(int l = ; l <= n; ++l)
{
if(k == ) update(k, x[l], y[l], s[l][]);
else
{
s[l][k] = (s[l][k - ] + ) % (c + );
update(k, x[l], y[l], s[l][k]);
}
}
for(int i = ; i <= q; ++i)
{
int t, x1, y1, x2, y2;
scanf("%d%d%d%d%d", &t, &x1, &y1, &x2, &y2);
int sum = query(t % (c + ), x2, y2) - query(t % (c + ), x2, y1 - ) - query(t % (c + ), x1 - , y2) + query(t % (c + ), x1 - , y1 - );
printf("%d\n", sum);
}
return ;
}

bit常数真是小,跑的跟前缀和一样快

D:怎么出原题,和7D有什么区别,直接拉板子。。。dp[i]表示第i位结束的串是多少palindrome,如果是回文,dp[i]=dp[i/2]+1,否则是0,判断回文用前后哈希,就是维护一个串正反的哈希,每次O(1)维护,然后枚举起点跑dp就行了。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
char s[N];
int dp[N], ans[N];
int main()
{
scanf("%s", s + );
int n = strlen(s + );
for(int i = ; i <= n; ++i)
{
memset(dp, , sizeof(dp));
ll p = , pre = , bak = ;
for(int j = i; j <= n; ++j)
{
pre = pre * 1234567ll + s[j];
bak = s[j] * p + bak;
p *= 1234567ll;
if(pre == bak) dp[j - i + ] = dp[(j - i + ) / ] + ;
++ans[dp[j - i + ]];
}
}
for(int i = n; i; --i) ans[i] += ans[i + ];
for(int i = ; i <= n; ++i) printf("%d ", ans[i]);
return ;
}

F:比较套路没想出来。。。zz。。。看见基环树,我们就要把环展开,具体方式是cycle存了环上每个点,最后push_back(cycle[0]),这样就首尾相接了,然后对于环上每个点维护max_d,挂在这个点下的最长链,pre_dia,从1->i这段环,包括环上点挂着的链的直径,pre_len,1->i这段环到1的最长路径,bak也一样

具体是这个样子的,然后枚举分割点,把环分割成两段后,mn=min(mn,max(pre_len+bak_len,max(pre_dia,bak_dia)),两段len相加构成了一条完全的链,两个dia分别是这两段的直径。

ans=max(ans,mn) ans先预处理不在环上的最长距离,就是子树内的直径,环上分割不影响这一段,所以和mn取max。注意最后push的cycle[0] max_d要取0,否则可能cycle在第一段和第二段都取了cycle[0],这样就不对了,但是后面一段的dia要加上max_d,因为两段dia是分别互不影响的,这个东西坑了我们长时间,又没办法对拍。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
inline int read()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
struct edge {
int to, w;
edge(int to = , int w = ) : to(to), w(w) {}
};
ll ans = -;
int n, dfn_clock, tar;
vector<edge> G[N];
vector<int> cycle;
int dfn[N], mark[N];
ll w[N], pre_len[N], bak_len[N], pre_dia[N], bak_dia[N], max_d[N];
bool dfs(int u, int last)
{
if(dfn[u])
{
tar = u;
return true;
}
dfn[u] = ++dfn_clock;
for(int i = ; i < G[u].size(); ++i)
{
edge e = G[u][i];
if(e.to == last) continue;
if(dfs(e.to, u))
{
if(dfn[u] >= dfn[tar])
{
cycle.push_back(u);
mark[u] = ;
}
return true;
}
}
return false;
}
ll Dfs(int u, int last)
{
ll max_d = ;
for(int i = ; i < G[u].size(); ++i)
{
edge e = G[u][i];
if(e.to == last || mark[e.to]) continue;
ll dep = Dfs(e.to, u);
ans = max(ans, dep + max_d + (ll)e.w);
max_d = max(max_d, dep + (ll)e.w);
}
return max_d;
}
int main()
{
n = read();
for(int i = ; i <= n; ++i)
{
int u = read(), v = read(), w = read();
G[u].push_back(edge(v, w));
G[v].push_back(edge(u, w));
}
dfs(, );
reverse(cycle.begin(), cycle.end());
cycle.push_back(cycle[]);
for(int i = ; i < cycle.size() - ; ++i)
{
int u = cycle[i], v = cycle[i + ];
for(int j = ; j < G[u].size(); ++j)
{
edge e = G[u][j];
if(e.to == v)
{
w[i] = e.w;
break;
}
}
max_d[i] = Dfs(u, );
}
max_d[cycle.size() - ] = max_d[];
ll cur_len = , cur_dia = max_d[];
pre_len[] = pre_dia[] = max_d[];
for(int i = ; i < cycle.size(); ++i)
{
cur_len += w[i - ];
cur_dia += w[i - ];
pre_len[i] = max(pre_len[i - ], cur_len + max_d[i]);
pre_dia[i] = max(pre_dia[i - ], cur_dia + max_d[i]);
cur_dia = max(cur_dia, max_d[i]);
}
cur_len = ;
cur_dia = max_d[cycle.size() - ];
bak_dia[cycle.size() - ] = max_d[cycle.size() - ];
for(int i = cycle.size() - ; i >= ; --i)
{
cur_len += w[i];
cur_dia += w[i];
bak_len[i] = max(bak_len[i + ], cur_len + max_d[i]);
bak_dia[i] = max(bak_dia[i + ], cur_dia + max_d[i]);
cur_dia = max(cur_dia, max_d[i]);
}
ll mn = 1000000000000000ll;
for(int i = ; i < cycle.size() - ; ++i)
{
mn = min(mn, max(pre_len[i] + bak_len[i + ], max(pre_dia[i], bak_dia[i + ])));
// ans = min(ans, pre_len[i] + bak_len[i + 1]);
}
printf("%lld\n", max(ans, mn));
return ;
}

codeforces round #427 div2的更多相关文章

  1. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  2. 【前行】◇第3站◇ Codeforces Round #512 Div2

    [第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...

  3. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  4. CodeForces 835C - Star sky | Codeforces Round #427 (Div. 2)

    s <= c是最骚的,数组在那一维开了10,第八组样例直接爆了- - /* CodeForces 835C - Star sky [ 前缀和,容斥 ] | Codeforces Round #4 ...

  5. CodeForces 835D - Palindromic characteristics | Codeforces Round #427 (Div. 2)

    证明在Tutorial的评论版里 /* CodeForces 835D - Palindromic characteristics [ 分析,DP ] | Codeforces Round #427 ...

  6. Codeforces Round #564(div2)

    Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...

  7. Codeforces Round #361 div2

    ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...

  8. Codeforces Round #626 Div2 D,E

    比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...

  9. CodeForces Round 192 Div2

    This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...

随机推荐

  1. 数据库——DBUtils和连接池

    第一章 DBUtils如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils.DBUtils就是JDBC的简 ...

  2. Manjaro安装配置美化字体模糊发虚解决记录

    Manjaro安装记录 前言: ​ 记录自己Manjaro18安装的一些坑,避免下次满互联网找解决方法.在此之前试过Manjaro.Ubuntu.Fedora.linux Mint系统的pac.yum ...

  3. 洛谷——P3369 【模板】普通平衡树(splay)(基础splay,维护一些神奇的东东)

    P3369 [模板]普通平衡树 平衡树大法好,蒟蒻(博主)最近正在收集高级数据结构的碎片,企图合成数据结构的元素之力来使自己的RP++... 您需要写一种数据结构(可参考题目标题),来维护一些数,其中 ...

  4. NOIP2016 DAY1 T2天天爱跑步

    传送门 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 ...

  5. Kattis - missinggnomesD Missing Gnomes (思路题)

    题目: 题意: 给出已经去除了几个数的一个序列,任务是将去除的数字插回去补全这个序列,输出字典序排在第一的那个补全的序列. 例如: 样例输入: 5 3 1 4 2 样例输出: 1 3 4 2 5 思路 ...

  6. linux whereis-查找二进制程序、代码等相关文件路径

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 whereis命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径. whereis命令只能用于程序名的搜索,而且 ...

  7. L2-014. 列车调度(带图详解)

    L2-014. 列车调度   火车站的列车调度铁轨的结构如下图所示. Figure 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选 ...

  8. 以位为单位存储标志-共用体-union

    一.程序的结构如下: typedef union _KEYST     {         struct         {             uint8 Key1_Flag :1;//表示第0 ...

  9. 管理Bean的生命周期

    [IOC容器中Bean的生命周期方法] 1.SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2.Spring IOC容器对Bean的生命周 ...

  10. CodeForcesGym 100753F Divisions

    Divisions Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. Or ...