[关闭]
@M1saki 2017-07-27T15:13:46.000000Z 字数 2304 阅读 1191

2017 Multi-University Training Contest - Team 1

acm 2017年7月 hdu 多校 组队训练


入口:2017 Multi-University Training Contest - Team 1

rank ac/all A B C D E F G H I J K L
249/766 8/12 O O Ø . . Ø . Ø Ø . O Ø
. 尚未通过 O 当场通过 Ø 赛后通过



1001. Add More Zero


1002. Balala Power!


1003. Colorful Tree


1006. Function


1008. Hints of sd0061


1009. I Curse Myself


由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉。所以问题就变为有个集合,每个集合里面都有一堆数字,要从每个集合中选择一个恰好一个数加起来。求所有的这样的和中,前大的是哪些。这就是一个经典问题了。

对所有集合两个两个进行合并,设当前合并的集合是,合并的过程中用堆来求出当前的前大值是哪些。这样的复杂度看起来为,但如果合并的时候保证堆内的元素个数是新集合里的元素个数,设每个集合的大小分别为,则复杂度为。当都相等时取得最大值,所以实际复杂度为



1011. KazaQ's Socks


1012. Limited Permutation


  1. namespace IO {
  2. const int MX = 4e7;
  3. char buf[MX]; int c, sz;
  4. void begin()
  5. {
  6. c = 0;
  7. sz = fread(buf, 1, MX, stdin);
  8. }
  9. inline bool read(int &t)
  10. {
  11. while(c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++;
  12. if(c >= sz) return false;
  13. bool flag = 0; if(buf[c] == '-') flag = 1, c++;
  14. for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0';
  15. if(flag) t = -t;
  16. return true;
  17. }
  18. }
  1. void init()
  2. {
  3. fac[0] = 1; rep(i, 1, N) fac[i] = fac[i - 1] * i % p;
  4. inv[0] = inv[1] = 1;
  5. rep(i, 2, N) inv[i] = inv[p % i] * (p - p / i) % p;
  6. rep(i, 3, N) inv[i] = inv[i - 1] * inv[i] % p;
  7. }
  8. LL C(int x, int y){ return fac[x] * inv[x - y] % p * inv[y] % p; }



添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注