2018.08.20 NOIp模拟赛

GKK大佬出的毒瘤题,烧脑。全是原题就不要密码保护了。

第一题

T1链接

​ 一张图,每条边有代价也有限制,遍历过的点可以解锁这些限制,求最短路。这是一道套路题,平时根本没见过,考场上因为一个状态或错了调了好久好久。对每个点状压记个状态判断能不能走这条边就行了。

code

#include<bits/stdc++.h>
#define Set(a, b) memset(a, b, sizeof (a))
#define fir first
#define sec second
#define mp make_pair
#define For(i, j, k) for(int i = j; i <= k; ++i)
#define Travel(i, u) for(int i = beg[u], v = to[i]; i; i = nex[i], v = to[i])
using namespace std;inline int read() {int x = 0, p = 1; char c = getchar();for(; !isdigit(c); c = getchar()) if(c == '-') p = -1;for(; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x *= p;
}template<typename T> inline bool chkmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }inline void File() {freopen("dalao.in", "r", stdin);freopen("dalao.out", "w", stdout);
}typedef pair<int, int> PII;
const int N = 200 + 10, M = 6e3 + 10;
const int maxp = (1 << 13) + 10, inf = 0x7f7f7f7f;
int e = 1, beg[N], nex[M], to[M], w[M], stt[M];
int vis[N][maxp], dis[N][maxp], st[N];
int n, m, p, k;inline void add(int x, int y, int z) {to[++ e] = y, nex[e] = beg[x], beg[x] = e, w[e] = z;
}inline void spfa() {Set(vis, 0), Set(dis, 127);queue<PII> Q; Q.push(mp(st[1], 1)), vis[1][st[1]] = 1, dis[1][st[1]] = 0; while (!Q.empty()) {PII u = Q.front(); Q.pop(), vis[u.sec][u.fir] = 0;Travel(i, u.sec) {int nst = u.fir | st[v];if (dis[v][nst] > dis[u.sec][u.fir] + w[i] && (stt[i] | u.fir) == u.fir) {dis[v][nst] = dis[u.sec][u.fir] + w[i]; if (!vis[v][nst]) vis[v][nst] = 1, Q.push(mp(nst, v));}} }
}int main() {File();cin >> n >> m >> p >> k;For(i, 1, k) {int pos = read(), num = read(), x;For(i, 1, num) x = read(), st[pos] |= (1 << (x - 1));}For(i, 1, m) {int x = read(), y = read(), z = read(), num = read(), a, s = 0;For(i, 1, num) a = read(), s |= (1 << (a - 1));add(x, y, z), stt[e] = s;add(y, x, z), stt[e] = s;}spfa();int ans = inf;For(i, 0, (1 << p) - 1) chkmin(ans, dis[n][i]);printf("%d\n", ans == inf ? -1 : ans);return 0;
}

第二题

T2链接

​ 用\(~n~\)个数去匹配\(~m~\)个数对,可以选择匹配与否,\(\sum ~[a_i > b_j] \times (a_i - b_j + c_j)~\)的最大值。我考场上想了一个贪心,把数对按\(~c_i - b_i~\)从大到小排序,每次二分一个满足条件的最小的\(~a~\)去匹配,当\(~(a_i - b_j + c_j) > 0~\)是计入答案,最后计算可以通过更换剩余的\(~a~\)而产生的更大的贡献。

其实这个离正解贪心差不多了,但我太菜了没想到一个细节:就算一个\(~(a_i - b_j + c_j)~\)的贡献是负的,之后也可以通过更换\(~a~\)来产生更大的贡献。我那样打就导致大样例答案总是小一点,于是就滚去打阶乘的\(~20pts~\)的暴力了。所以正解贪心就是:先把数对按\(~c_i - b_i~\)从大到小排序, 每次二分\(~a~\)看这个数对是否满足条件,满足就记下来,最后再一起算答案,每次用最大的\(~a~\)去匹配先前记下来的数对。我好菜啊。。。

code

#include<bits/stdc++.h>
#define For(i, j, k) for(int i = j; i <= k; ++i)
#define Forr(i, j, k) for(int i = j; i >= k; --i)
using namespace std;inline int read() {int x = 0, p = 1; char c = getchar();for(; !isdigit(c); c = getchar()) if(c == '-') p = -1;for(; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x *= p;
}inline void File() {freopen("winner.in", "r", stdin);freopen("winner.out", "w", stdout);
}typedef long long ll;
const int N = 1e5 + 10;
int a[N], n, m, b[N], c[N], val[N], cnt;
struct node { int b, c; } P[N];
multiset<ll> S;
inline bool cmp(const node &a, const node &b) { return a.c - a.b > b.c - b.b; }
inline bool cmpa(const int &a, const int &b) { return a > b; }int main() {File();n = read(), m = read();For(i, 1, n) S.insert(a[i] = read());For(i, 1, m) b[i] = read(), c[i] = read(), P[i] = (node) {b[i], c[i]};sort(P + 1, P + 1 + m, cmp);For(i, 1, m) {auto it = S.upper_bound(P[i].b);if (it == S.end()) continue;else val[++ cnt] = P[i].c - P[i].b, S.erase(it);}sort(a + 1, a + 1 + n, cmpa);ll ans = 0;For(i, 1, cnt) if (val[i] + a[i] > 0) ans += val[i] + a[i];printf("%lld\n", ans);return 0;
}

第三题

T3链接

​ 先%%%HYJ大佬!给出\(~m, ~a, ~b, ~c~\), \(~a, ~b, ~c~\)两两互质,求解\(~x ^ a + y ^ b \equiv z^c ~(mod ~m)~\). 可以构造使\(~x = 2 ^ {kb}, ~ y = 2 ^ {ka}, z = 2 ^ p~\), 那么原式化为\(~2 ^ {kab + 1} \equiv 2 ^ {pc}~\), 则特判掉\(~m~\)是\(~2 ^ k~\)次幂,\(~k \in N^{+}\)的情况。剩余则有\(~kab + 1 = pc~\), 转化一下就是扩欧了。膜烂hyj考场上火速ak并教会我!

code

#include<bits/stdc++.h>
#define For(i, j, k) for(int i = j; i <= k; ++i)
#define Forr(i, j, k) for(int i = j; i >= k; --i)
using namespace std;inline int read() {int x = 0, p = 1; char c = getchar();for(; !isdigit(c); c = getchar()) if(c == '-') p = -1;for(; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x *= p;
}inline void File() {freopen("guess.in", "r", stdin);freopen("guess.out", "w", stdout);
}typedef long long ll;
int mod, a, b, c;inline ll qpow(ll a, ll b) {ll res = 1;if (b < 0) b = -b;for (res = 1; b; a = a * a % mod, b >>= 1) if (b & 1) res = res * a % mod;return res;
}inline void BF_Solve() {int flag = 0;For(x, 1, mod - 1) {For(y, 1, mod - 1) {For(z, 1, mod - 1) {if ((qpow(x, a) + qpow(y, b)) % mod == qpow(z, c) % mod) {printf("%d %d %d\n", x, y, z);flag = 1; break;}   }   if (flag) break;}if (flag) break;}
}ll exgcd(ll a, ll b, ll &x, ll &y) {if (b == 0) return x = 1, y = 0, a;ll d = exgcd(b, a % b, x, y), tmp;tmp = x, x = y, y = tmp - a / b * y;return d;
}int main() {File();for (int Case = read(); Case --; ) {mod = read(), a = read(), b = read(), c = read();int tt = mod, x, y, z;while (!(tt & 1)) tt /= 2;if (tt != 1) {ll A = 1ll * a * b, B = c, X, Y, d;d = exgcd(B, A, X, Y);while (X < 0 || Y > 0) X += A, Y -= B;x = qpow(2, 1ll * Y * b), y = qpow(2, 1ll * Y * a), z = qpow(2, X);                 } else {int res = mod >> 1;if (a > 1) x = res, y = z = 1;if (a == 1 && b > 1) y = res, x = z = 1;if (a == 1 && b == 1 && c > 1) x = y = z = res;if (a == 1 && b == 1 && c == 1) x = 1, y = 2, z = 3;    }printf("%d %d %d\n", x, y, z);}return 0;
}

​ 今天整个神游,第一题十点才调出来,大概是昨天晚上改AGC005F到一点的还没调出来的后遗症,以后考试要保持好精力,不然得不偿失。GKK不愧是gay, 只是题面少了谁,美中不足。

转载于:https://www.cnblogs.com/LSTete/p/9508375.html

2018.08.20高二互测相关推荐

  1. Ubuntu16安装CUDA9.0+Anaconda+Tensorflow1.8GPU(2018.08.20最新)

    最近装了好多次环境了,踩了N多坑,记录一下,尽量安装的先后顺序也不要换,因为一般情况下,驱动安装不好的话,重装系统作为解决方法的概率比较大,所以尽量先装驱动比较好. 最好是刚刚重装好的崭新的ubunt ...

  2. 2018.3.15校内互测总结-点分治-线段树

    这是曾来过咱们学校集训的一位大神出的~ T1 题目大意 给出一棵带边权的无根树,求树上前$k$大的路径的长度. $1 \leq n \leq 200000$ 题解 想了一上午点分治,却发现只会$O(n ...

  3. UOJ#191. 【集训队互测2016】Unknown

    UOJ#191. [集训队互测2016]Unknown 题目描述 Solution 二进制分组. 每一个组内维护一个斜率单调减的凸包. 因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的 ...

  4. 2017.10.24队内互测——压轴出场的互测终曲|(*_-)

    出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...

  5. 贝壳找房 2019校招 研发类试卷C++ 编程题 2018.08.19

    贝壳找房 2019校招 研发类试卷编程题 C++ 2018.08.19 遍历的同时求出最小值min 和 村庄高度和sum,sum-min即可 #include <iostream>usin ...

  6. 新手C#string类常用函数的学习2018.08.04

    ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量. s = s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower ...

  7. P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...

  8. 【跃迁之路】【530天】刻意练习系列289(2018.07.20)

    @(跃迁之路)专栏 叨叨两句 技术的精进不能只是简单的刷题,而应该是不断的"刻意"练习 该系列改版后正式纳入[跃迁之路]专栏,持续更新 一.语言练习 SQL [跃迁之路]SQL语句 ...

  9. Python学习之路—2018/6/20

    Python学习之路-2018/6/20 1.模板语法之变量 views.py def index(request):import datetimes="gyq"l=[1,2,3] ...

最新文章

  1. BZOJ-1005 明明的烦恼
  2. 分布式系统中的限流与熔断
  3. 一个例子理解什么是RPC?
  4. msql 复杂练习
  5. 任务管理平台_jytask一个任务调度统一管理平台
  6. Java基础:int和Integer的区别
  7. 请教哪里有M4A格式解码器
  8. nodejs 更新_NodeJs(一)我对NodeJs的认知
  9. 将浮点数转换为字符串
  10. 第六章节 三层架构(二. 模型层与数据访问层)
  11. Flink窗口-时间窗口
  12. 汇编语言程序设计思维导图
  13. PhpStorm更换主题
  14. AWTK-MVVM 在 STM32H743 上的移植笔记
  15. sql server2008 批量删除发生:查询处理器用尽了内部资源,无法生成查询计划。这种情况很少出现,只有在查询极其复杂或引用了大量表或分区时才会出现。请简化查询
  16. 便利店的选址有什么诀窍吗?需要掌握哪些选址技巧?
  17. 金蝶软件怎么修改服务器地址,金蝶软件服务器地址怎么修改
  18. Python实战 | 爬取当当网 TOP500 畅销书
  19. 试装memcachedb,整理了下安装过程【转】
  20. Hic-Pro的安装

热门文章

  1. 数据挖掘:基于朴素贝叶斯分类算法的文本分类实践
  2. Ubuntu/Fedora 编译内核教程
  3. L2-002 链表去重-团体程序设计天梯赛GPLT
  4. caj文件浏览器_解决CAJ阅读器读取学位论文卡到爆炸的问题
  5. 运维不懂这些面试题拿不到高薪
  6. 【基础】主流web服务器的介绍
  7. 【分享】20道Oracle运维常见面试题
  8. 如何使用 Kubernetes 监测定位慢调用
  9. MATLAB中cfl,ML4835复合PFC/CFL小型荧光灯基于Matlab的电力电子电路仿真方法
  10. linux中setfacl命令,setfacl命令