题目链接:P1115 最大子段和 告诉你,这个我调了一天的题是橙题...... 线性容易得到,放篇题解: #include<bits/stdc++.h> using namespace std; int main() { int n[200001],p,ans[200001]={0}; int sum=-9999999;//|x|<=10000 QWQ cin>>p; for(int i=1;i<=p;i++) { cin>>n[i];//输入 ans[i]…
Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.有向图的极大强连通子图,称为强连通分量(strongly connected components). 来源于百度百科 我本人的理解:有向图内的一个不能再拓展得更大的强连通子图叫做这个有向图的一个强连通…
题目链接:P3387 [模板]缩点 缩点板子,所谓\(dp\)就是拓扑排序(毕竟可以重走边),像\(SPFA\)一样松弛就好,就是重边极其烦人,还加了排序(绝对自己想的,然鹅拓扑的思路不是). 下面上代码: (为了突出惨烈性,我把调试语句留了下来......) \(Code\): #include<iostream> #include<cstdio> #include<cstring> #include<stack> #include<queue>…
题目链接:P3385 [模板]负环 缩点板子. 看日报上说\(DFS\)会炸(我确实打炸了),就根据他的说明\(yy\)了\(BFS\),多一个记录步数的数组即可(我用的\(len[]\)),若\(len_i>n\),就说明遁入无限的负环中了,返回即可,跑得比我那一页快人均\(200ms\)的样子(没有卡常)(其实一堆Unshown). \(Code\): #include<iostream> #include<cstdio> #include<cstring>…
题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站在了\(j\)点. 那什么是状态呢? 我们用一个\(01\)串表示每一点有无被走过(\(0\)是没走过,\(1\)是已走过),那么转移方程就是: \[dp[i][j]=min(dp[i][j],dp[i\&((1<<n)-1-(1<<(j-1)))][k]+dis[j][k])…
题目链接:P2299 Mzc和体委的争夺战 单源最短路板子题吗,体面晦涩难懂(语文不好),以为是有向图,只有\(30pts\),其实是无向的,我使用了刚学来的\(SPFA\),通过了此题: \(Code\): #include<iostream> #include<cstdio> #include<queue> using namespace std; const int inf=2147483647; queue<int> q; struct node {…
指挥使走后一脸懵逼,然后想起了一道水\(SB\)的省选题. 这是毒瘤乘法分配率的应用,似乎还有一篇,算是入门题. 对了,这题连接:P2220 [HAOI2012]容易题 然而蒟蒻还是先自闭了一会...... 大力代值可知,是一道裸的条件概率. 先处理出\(sum=\sum_{i=1}^{n}\)与\(sum^n\)(这是用分配率推导的,我这里不用了,就是无限制条件下的最大值),在处理每个被影响的区块就好了,就是乘上 \[\dfrac{{sum-\sum_{i=\text{被限制的数}}i}}{s…
由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[],num[]\),就好了,不过为什么要引进\(num[]\)呢? 真无奈. 不过++此题就很简单了,注意\(getf()\)有两句不要写反,否则就\(10\;pts\)了.一会代码里有标注. 复杂度是\(O(n\alpha(n))\)(其实我也不知道是这个吗,差不多就行了) \(Code\): #…
题目链接:P5543 [USACO19FEB]The Great Revegetation S 好坑啊,都身败名裂了. 思路一: 考虑染色法,跑一遍搜所就好了,不给代码了. 思路二: 考虑并查集,我想到一个\(O(n\alpha(n)+n\log n)\)的做法,首先维护多少不能联系的集合,根据简单的排列组合知识就知道是\(2^n(n\text{是集合数})\). 再开一个来判断是否矛盾就好了,这里用了一个并查集,中间清空一下就好了. 思考:何时不合法?(搜索也要注意呀) 显然要判断S与D的排斥…
题目链接:P5745 [深基附B例]数列求和 现在想说:\(O(N)\)的题要不怎么也想不出来,要不灵光乍现,就像这道题. 我们维护一个类似单调队列的加法单调队列: 若相加大于此数,就将队尾元素弹出,直至满足条件,顺便更新下\(maxn\)值即可. 然后遇见了烦人的头尾双指针,多了个等号就只有\(30\;pts\)了. \(Code\): #include<iostream> #include<cstdio> using namespace std; long long sum=0…