BZOJ3308 九月的咖啡店

Orz PoPoQQQ

话说这题还有要注意的地方。。。

就是。。。不能加SLF优化,千万不能加

n = 40000,不加本机跑出来2sec,加了跑出来40sec。。。【给跪了

  1 /**************************************************************
  2     Problem: 3308
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:27500 ms
  7     Memory:32752 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <algorithm>
 12 #include <bitset>
 13
 14 using namespace std;
 15 const int N = 2e4 + 5;
 16 const int Cnt = N * 10;
 17 const int M = Cnt * 10;
 18 const int inf = 1e9;
 19
 20 struct edges {
 21     int next, to, f, cost;
 22     edges() {}
 23     edges(int _n, int _t, int _f, int _c) : next(_n), to(_t), f(_f), cost(_c) {}
 24 } e[M];
 25
 26 int n, ans, S, T;
 27 int first[N], tot = 1;
 28 bitset <Cnt> not_p;
 29 int pr[N], tot_p, tot_a, tot_b;
 30 int d[N], g[N], v[N];
 31
 32 inline void Add_Edges(int x, int y, int f, int c) {
 33     e[++tot] = edges(first[x], y, f, c), first[x] = tot;
 34     e[++tot] = edges(first[y], x, 0, -c), first[y] = tot;
 35 }
 36
 37 inline void calc() {
 38     static int x;
 39     for (x = g[T]; x; x = g[e[x ^ 1].to])
 40         --e[x].f, ++e[x ^ 1].f;
 41 }
 42
 43 #define y e[x].to
 44 inline bool spfa() {
 45     static int x, now, q[70000];
 46     static unsigned short l, r;
 47     for (x = 1; x <= T; ++x)
 48         d[x] = -inf;
 49     d[S] = 0, v[S] = 1, q[0] = S;
 50     for(l = r = 0; l != r + 1; ) {
 51         now = q[l++];
 52         for (x = first[now]; x; x = e[x].next) {
 53             if (e[x].f && d[now] + e[x].cost > d[y]) {
 54                 d[y] = d[now] + e[x].cost, g[y] = x;
 55                 if (!v[y])
 56                     v[y] = 1, q[++r] = y;
 57             }
 58         }
 59         v[now] = 0;
 60     }
 61     return d[T] >= 0;
 62 }
 63 #undef y
 64
 65 inline int work() {
 66     int res = 0;
 67     while (spfa())
 68         calc(), res += d[T];
 69     return res;
 70 }
 71
 72 void get_prime(int N) {
 73     int i, j, k;
 74     for (i = 2; i <= n; ++i) {
 75         if (!not_p[i]) pr[++tot_p] = i;
 76         for (j = 1; j <= tot_p; ++j) {
 77             if ((k = i * pr[j]) > N) break;
 78             not_p[k] = 1;
 79             if (i % pr[j] == 0) break;
 80         }
 81     }
 82 }
 83
 84 inline int get(int n, int p) {
 85     static int res;
 86     for (res = 1; res * p <= n; res *= p);
 87     return res;
 88 }
 89
 90 int main() {
 91     int i, j, tmp;
 92     scanf("%d", &n);
 93     get_prime(n);
 94     for (i = 1; i <= tot_p && 1ll * pr[i] * pr[i] <= n; ++i) ++tot_a;
 95     for (; i <= tot_p && pr[i] * 2 <= n; ++i) ++tot_b;
 96     for (; i <= tot_p; ++i) ans += pr[i];
 97     S = tot_a + tot_b + 1, T = S + 1;
 98
 99 #define J j + tot_a
100     for (i = 1; i <= tot_a; ++i)
101         Add_Edges(S, i, 1, 0), Add_Edges(i, T, 1, get(n, pr[i]));
102     for (j = 1; j <= tot_b; ++j)
103         Add_Edges(S, J, 1, pr[J]), Add_Edges(J, T, 1, 0);
104     for (i = 1; i <= tot_a; ++i)
105         for (j = 1; j <= tot_b; ++j)
106             if ((tmp = get(n / pr[J], pr[i]) * pr[J]) > get(n, pr[i]) + pr[J])
107                 Add_Edges(i, J, 1, tmp);
108 #undef J
109     printf("%d\n", ans + 1 + work());
110     return 0;
111 }

(p.s. 成功成为最慢的2333)

时间: 2024-10-04 07:55:14

BZOJ3308 九月的咖啡店的相关文章

【BZOJ-3308】九月的咖啡店 最大费用最大流 + 线性筛素数

3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 159  Solved: 56[Submit][Status][Discuss] Description 深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不能同时在一杯中,如果两个编号为i,j的原料,当且仅当i与j互质时,才能兑在同一杯中.现在想知道,如果用这N种原料来调

【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)

3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 244  Solved: 86 Description 深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不能同时在一杯中,如果两个编号为i,j的原料,当且仅当i与j互质时,才能兑在同一杯中.现在想知道,如果用这N种原料来调同一杯咖啡,使用的原料编号之和最大可为多少. In

BZOJ 3308 九月的咖啡店 费用流

题目大意:在[1,n]区间内选择一些数,使得这些数两两互质,求这些数的和的最大值 容易发现对于一个最优解,每个质数存在且仅存在于一个数中.(废话. 但是有可能一个数中存在多个质数 下面是两个结论: 1.一个数中最多存在两个不同的质数 2.这两个质数一个<n√,一个>n√ 我完全不会证明这两个结论,这两个结论都是官方题解里的 然后就好办了,我们对于<n√的质数和>n√的质数建立二分图,求最大费用最大流即可 但是这样会T掉,因为图太大了 因此我们有两个剪枝: 1.对于>n2的质数

bzoj 3308: 九月的咖啡店【最大费用最大流】

费用流里spfa最后的判断要写成dis[t]>=0而不是dis[t]!=-inf否则会WAWAWA-- #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=200005,inf=1e9; int n,tot,s,t,ans,dis[N],h[N],cnt=1,p[N],fr[N]; bool v[N]

-----------------------【有趣の题目】-----------------------

做过的,有意义多次看的,有趣的题目整合包 图论相关: [BZOJ-3308]九月的咖啡店   线性筛素数+有趣的处理+最大费用最大流 [BZOJ-4205]卡牌配对   线性筛素数+最大流+玄学的效率 [BZOJ-2095]Bridge   混合图欧拉回路 [BZOJ-1797]Mincut 最小割    最大流+Tarjan+缩点+分类讨论 [BZOJ-2879]美食节    最小费用最大流+拆点+动态建图 [BZOJ-1061]志愿者招募   线性规划转最小费用最大流 [BZOJ-2118]

蓝懿教育九月八日记录

今天是九月八日,又是一个练习日.今天起得很晚,有些懈怠了.也许和最近休息的有点多有关,人变得有些懒了.又像回到了从前懒散得样子.也许是最近看电脑看的太多总感觉眼睛很涩.懒人永远都是事多,为自己找着各种借口. 但还是要自己想办法解决问题.强制自己继续努力.今天下午近晚上才开始进入状态.复习了下老师前几天将的数组和字符串.越复习越发现自己忘记的越多.希望随着时间推移,我不会跟不上. 最后记录下部分复习的内容: 判断数组中是否包含某个对象 if ([names containsObject:@"赵六&

九月的沧桑,十月的锋芒

九月,整个九月,我都在焦虑中度过.我试图调整,但效果甚微,熬过了九月的最后一天,至此也算是美满的. 在九月里,唯一令自己满意的就是控制.纵然有些刻意的控制,但依然是一种回归的表现.譬如关闭了朋友圈,譬如减少群聊,尽量远离纷扰,尽量避免和姑娘有交集.(女人是复杂体+生化体) 九月,自我的进度需要反省.譬如读书,写字,静思,学习,都没有一一归心.放纵了时间和思想,这实在可耻,可耻成了我九月抹不掉的标签. 九月,是深秋的开始,说到秋,总让人伤感,沧桑遍野欲与天齐. <苏幕遮>[宋]范仲淹 碧云天,黄

九月的尾巴

在Peet's Coffe & Tea自习,昨天一天人都很多,吵得我看不进书,隔壁一桌亚裔的妈妈们一直在聊家长里短,喝咖啡喝了一个下午. 今天却安静了很多,难道是因为周五下午? 日子真是过得特别快,六月份的时候想着,九月结束前一定找到工作了吧,然而转眼九月快要结束了,并没有实现当时的愿望. 现在想着,圣诞节我应该找到工作了吧,每天每天盼望着,找到工作的那一天,好像所有都可以解放了一样,不知道这次会实现吗? 这一个一个节点,串起了我这一段找工的生活,希望自己好好坚持,在它结束的时候能够好好画下句点

百年一遇闰九月

百年一遇闰九月   今年是一个特殊的年份,百年一遇闰九月.这对于农历九月出生的人来说,放佛有了一次重生的机会.       今天是2014年10月10日,农历九月十七日,是辛亥革命的纪念日,同样也是我的25岁生日.        今天这个生日,一个人,在吃着一碗还算好吃的臊子面,加上一块不太好吃的蛋糕下度过,虽说有点凄凉,但最起码也是对自己的一点慰藉.这些年的生日基本上都是一个人在一碗热气腾腾的臊子面(长寿面)下度过.每当在这个日子,我都会想起我的父母,直到今日,我竟然还不知道他们的生日是那一天