几道水题就不写了....

D1T1精妙证明:

把ax+by = z 的z按照模a剩余系分类

由于\((a,b)=1\)所以对于每个\(k\in[0, a)\), \(k\cdot b\)都在不同剩余系内!!(反证法)

那么自然最大的取不到数在(a-1)*b的剩余系内, 也就是\((a-1)*b - a = ab-a-b​\)

D1T3

orz GXZ:https://www.cnblogs.com/GXZlegend/p/7838900.html

(记忆化搜索?) https://blog.csdn.net/enjoy_pascal/article/details/78592786

70分做法显然

100分做法: 思想是把DP转移抽象为DAG

如果不是DAG: 只要可转移到终点的合法状态不在环内就可以正常dp

否则puts("-1")

p.s. 只要在topsort中环加外向树上的点(illegal points) 入度都大于0 , 所以topsort一遍就ok拉!!!

这道题卡常丧心病狂...

这个程序会re(60分)...不敢开longlong... 求dalao debug..

#include<bits/stdc++.h>
using namespace std; typedef pair<int, int> pii;
#define FI first
#define SE second
#define PB push_back
#define rep(_i, _st, _ed) for(register int _i = (_st); _i <= (_ed); ++_i)
#define per(_i, _ed, _st) for(register int _i = (_ed); _i >= (_st); --_i)
inline int read(){int ans = 0, f = 1; char c = getchar();while(c < '0' || c > '9') f = (c == '-') ? -1 : f, c = getchar();while('0' <= c && c <= '9') ans = ans*10 + c - '0', c = getchar();return ans;} const int maxn = 1e5+5, maxm = 3e5+5, mxk = 51; int n, m, p;
//邻接表
struct graph{
int v, w, nxt;
}edge[maxm];
int head[maxn];
void adde(int u, int v, int w){
static int cnt = 0;
edge[++cnt].v = v;
edge[cnt].w = w;
edge[cnt].nxt = head[u];
head[u] = cnt;
} //精简dijstra
priority_queue<pii> pq;
int dis[maxn]; bool vis[maxn];
void dijstra(){
memset(dis, 0x3f, sizeof dis);
memset(vis, 0, sizeof vis);
dis[1] = 0;
pq.push(make_pair(0, 1));
while(!pq.empty()){
int u = pq.top().second; pq.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int e = head[u]; e; e = edge[e].nxt){
int v = edge[e].v, w = edge[e].w;
if(dis[u] + w < dis[v]) {
dis[v] = dis[u] + w;
pq.push(make_pair(-dis[v], v));
}
}
}
} int T, k; const int mxhsh = maxn*mxk;
int f[mxhsh], ind[mxhsh], le[mxhsh], ri[mxhsh], cnt, pt[mxhsh], q[mxhsh];
#define hsh(_k, _u) ((_k)*n + _u)
#define mod(_cur) if(_cur > p) _cur -= p; signed main(){
T = read();
while(T--){
n = read(), m = read(), k = read(), p = read();
memset(head, 0, sizeof head), memset(edge, 0, sizeof edge);
rep(i, 1, m){
int u = read(), v = read(), w = read();
adde(u, v, w);
}
dijstra();
//构建状态转移图 (该题中为一种扩展最短路图)
cnt = 1; memset(ind, 0, sizeof ind);
rep(u, 1, n) rep(x, 0, k){
le[hsh(x, u)] = cnt;
for(int e = head[u]; e; e = edge[e].nxt){
int v = edge[e].v, w = edge[e].w, x2;
x2 = dis[u] + w - dis[v] + x;
if(x2 > k || x2 < 0) continue; ++ind[hsh(x2, v)];
//printf("u=%d v=%d w=%d, fr = %d to = %d, ind = %d\n",u, v, w, hsh(x, u), hsh(x2, v), ind[hsh(x2, v)]); pt[cnt++] = hsh(x2, v);
}
ri[hsh(x, u)] = cnt - 1;
} //拓扑排序 + 状态转移
memset(f, 0, sizeof f);
f[hsh(0, 1)] = 1; int fr = 1, bk = 0;
rep(i, 1, hsh(k, n)) if(!ind[i]) q[++bk] = i;//这句必须有!!常数再大也要加!!! while(bk >= fr){
int u = q[fr++];
rep(i, le[u], ri[u]){
int v = pt[i];
f[v] += f[u]; mod(f[v]); if( (--ind[v]) == 0) q[++bk] = v;
}
} //统计答案
int infini = 0, ans = 0;
rep(x, 0, k){
if(ind[hsh(x, n)]) infini = 1;
ans += f[hsh(x, n)]; mod(ans);
}
if(infini) puts("-1");
else printf("%d\n", ans);
}
return 0;
}

D2T2

正解\(O(3^nn^2)\)....

注释很详细了

//这题卡常!!!
#include<bits/stdc++.h>
using namespace std; typedef pair<int, int> pii;
#define FI first
#define SE second
#define PB push_back
#define rep(_i, _st, _ed) for(register int _i = (_st); _i <= (_ed); ++_i)
#define per(_i, _ed, _st) for(register int _i = (_ed); _i >= (_st); --_i)
inline int read(){int ans = 0, f = 1; char c = getchar();while(c < '0' || c > '9') f = (c == '-') ? -1 : f, c = getchar();while('0' <= c && c <= '9') ans = ans*10 + c - '0', c = getchar();return ans;} #define min(a, b) ((a) < (b)) ? (a) : (b) //注意在这个宏定义中a, b都会算两次
int f[13][10005];
int n, m, mat[15][15], log_2[10005], mincost[15];
signed main(){
n = read(), m = read();
rep(i, 0, n) rep(j, 0, n) mat[i][j] = 1e7;
rep(i, 1, m){
int u = read(), v = read(), w = read();
u--, v--;
mat[v][u] = mat[u][v] = min(mat[u][v], w);
} log_2[0] = 1;
rep(i, 1, n) log_2[(1 << i)] = i; int mxsta = (1 << n) - 1, ans = 1e8;
memset(f, 0x2f, sizeof f);
rep(u, 0, n-1) f[0][(1<<u)] = 0;//这一步非常机智, 使得程序无需枚举起始点 rep(l, 1, n) rep(sta, 0, mxsta){
int rev = mxsta ^ sta; //求补集中每个节点向原图连边的mincost
for(int cur = rev; cur; cur -= cur&(-cur)){
int d = log_2[cur&(-cur)];
mincost[d] = 1e8;
rep(j, 0, n - 1)
//当前集合中存在j
if(sta & (1 << j))
mincost[d] = min(mincost[d], mat[d][j] * l);
}
//不重复枚举补集的子集
for(int sub = rev; sub; sub = (sub-1) & rev){
int cost = 0;//将该子集连入树中的花费(dep == l) //枚举补集的子集中的每一个元素
for(int cur = sub; cur; cur -= cur&(-cur)){
int d = log_2[cur&(-cur)];
//当前元素
cost += mincost[d];
}
//cout<<cost<<endl;
f[l] [sta | sub] = min( f[l] [sta | sub], f[l-1][sta] + cost);
}
} rep(i, 0, n){
ans = min(ans, f[i][mxsta]);
//printf("u=%lld i=%lld ans = %lld\n", u, i, f[i][mxsta]);
}
cout<<ans<<endl;
return 0;
}

NOIP2017 题解(给自己看的) --有坑要填的更多相关文章

  1. [NOIP补坑计划]NOIP2017 题解&做题心得

    终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...

  2. NOIP2017 题解

    QAQ--由于没报上名并没能亲自去,自己切一切题聊以慰藉吧-- 可能等到省选的时候我就没有能力再不看题解自己切省选题了--辣鸡HZ毁我青春 D1T1 小凯的疑惑 地球人都会做,懒得写题解了-- D1T ...

  3. 换一种视角看DNS(采坑篇)

    换一种视角看DNS 我们尽量用精炼的语言,尽可能的规划DNS的全貌(当然笔者水平有限,如有错误请不吝赐教). 通常啊我们在个人PC中能看到DNS的配置身影就是在上网的时候,通常如果你不配置DNS可能找 ...

  4. 廖雪峰js教程笔记6 generator一个坑 看完python在回来填坑

    generator(生成器)是ES6标准引入的新的数据类型.一个generator看上去像一个函数,但可以返回多次. ES6定义generator标准的哥们借鉴了Python的generator的概念 ...

  5. NOIP2017题解

    T1小凯的疑惑 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中, ...

  6. Codeforces Round #364 (Div. 1)(vp) 没什么题解就留坑待填

    我就做了前两题,第一题第一次vp就把我搞自闭跑路了,第二题第二次又把我搞自闭了 A. As Fast As Possible 细节题 #include<cstdio> #include&l ...

  7. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  8. 纯Socket(BIO)长链接编程的常见的坑和填坑套路

    本文章纯属个人经验总结,伪代码也是写文章的时候顺便白板编码的,可能有逻辑问题,请帮忙指正,谢谢. Internet(全球互联网)是无数台机器基于TCP/IP协议族相互通信产生的.TCP/IP协议族分了 ...

  9. 2018牛客暑期ACM多校训练营第二场(有坑未填)

    第二场终于等来学弟 开始(被队友带飞)的开心(被虐)多校之旅 A   run A题是一个递推(dp?)+前缀和 因为看数据量比较大 就直接上前缀和了 一个比较简单的递推 没有太多难点 签到题 需要注意 ...

随机推荐

  1. java Properties (属性集)

    加载Properties Properties downloadLog = new Properties(); try { //加载logFile文件 downloadLog.load(new Fil ...

  2. Linux 编程笔记(三)

    上一章节对文件的基本属性做了一个笔记,续上次笔记对Linux文件的属性和属性组做一笔记 我安装的是虚拟机操作系统的版本还KaliLinux但是系统启动速度拖延,所以刚开始还是配置Centos 1.Li ...

  3. 小学生都看得懂的C语言入门(6): 字符串

    1.字符用 char 表示 #include<stdio.h> int main() { char c; char d; c=; d='; if (c==d){ printf(" ...

  4. Nginx详解十二:Nginx场景实践篇之跨站访问相关

    跨站访问 浏览器请求一个页面的时候,发送了两个域名的请求 此情况不安全,容易出现CSRF攻击,所以浏览器禁止跨域访问 Nginx设置打开跨站访问 配置语法:add_header name value ...

  5. Centos + docker,Ubuntu + docker介绍安装及详细使用

    docker笔记 常用命令 设置docker开机自启:sudo chkconfig docker on 查所有镜像: docker images 删除某个镜像:docker rmi CONTAINER ...

  6. pycharm常用设置和快捷键大全

    pycharm常用快捷键 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性)Ctrl + Alt + Space  快速导入任意类Ctrl + Shift + ...

  7. Python os.walk() 方法遍历文件目录

    概述 os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. os.walk() 方法是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 在Un ...

  8. 关于使用summernote编辑器提示内容无法汉化临时解决办法

    原因:使用汉化summernote-zh-CN.js文件无法汉化 $('#summernote').summernote({ lang: 'zh-CN' }); 解决方法: 打开summernote. ...

  9. epoll函数

    函数epoll 1. 函数epoll_creat: 该函数生成一个epoll专用的文件描述符 int epoll_creae(int size); 分析: size:epoll上能关注的最大描述符数 ...

  10. Win10 配置Tomcat与Java环境变量

    一:下载JKD与Tomcat包 JDK        密码:d9ym Tomcat   密码:z9pa 二:安装JAVA-JDK与配置环境变量 ①:记住安装的地址 ②:配置JAVA-JDK的环境变量, ...