摘要:
枚举分母,然后离他最近的分子只有两个,分别判断一下能不能用来更新答案即可 cpp include include include using namespace std; int a,b,aa,ab; double mx=10; void wk(int x,int y) { if(x b==y a) 阅读全文
摘要:
就是区间dp啦f[i][j]表示以i开头的长为j+1的一段的答案,转移是f[i][j]=s[i+l] s[i 1]+min(f[i][j 1],f[i+1][j 1]),初始是f[i][1]=a[i] 于是可以把j维推掉 cpp include include using namespace std 阅读全文
摘要:
本来是冲着搜索去的……其实可以贪心 因为能改变第一位的只有第一位和第二位,然后改完之后后面的同理,也就是说只要贪心的推一遍就可以 但是注意要在翻第一个和不翻第一个之间取个min cpp include include include using namespace std; const int N= 阅读全文
摘要:
欸我一直以为双向bfs是搜完一半再搜另一半呢,妹想到是两个一起搜 然后队列里放的结构体里不能直接存答案,所以做一个邻接表一样的东西,直接指向需要的字符即可 记录状态用康托展开来hash 以及居然是多组数据啊?! cpp include include include include using na 阅读全文
摘要:
A. Infinity Gauntlet 模拟就行了(不过这个题面啊……) cpp include include include include using namespace std; int n; string s[10]; maphas; mapv; int main() { has["pu 阅读全文
摘要:
A. Antipalindrome 还以为是什么神dp结果就是分情况讨论啊 原串是一串一样的字符的话输出0,是回文串的话输出n 1,否则直接输出原串长度 cpp include include using namespace std; const int N=200005; int n,d[N],s 阅读全文
摘要:
这个可以用异或高斯消元,但是~~我不会呀~~我用的暴搜 2的m次方枚举第一行的翻转情况,然后后面的就定了,因为对于一个j位置,如果i 1的j位置需要翻,那么一定要翻i的j,因为这是i 1的j最后翻的机会 按字典序搜索然后取次数min即可 cpp include include include inc 阅读全文
摘要:
最大流生动形象的板子,注意数组开大点 cpp include include include include using namespace std; const int N=100,inf=1e9; int n=26,m,h[N],cnt=1,s=1,t=26,le[N],x; char s1[5 阅读全文
摘要:
首先O(n^3)的贪心很好想,就是枚举k然后从前往后扫,扫到反就翻转区间 然后考虑优化掉翻转区间维,就是搞成差分的形式,在翻转区间的尾部打上标记,再用一个变量维护当前的翻转次数,加到当前状态上来判断是否需要翻转即可 cpp include include include using namespac 阅读全文
摘要:
算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v] (1 p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可(记得输出大难的时候除以总概率和) cpp include include using namespa 阅读全文
摘要:
其实是可以斜率优化的但是没啥必要 设st为花费时间的前缀和,sf为Fi的前缀和,f[i]为分组到i的最小花费 然后枚举j转移,考虑每次转移都是把j到i分为一组这样意味着j及之后的都要增加s的时间,同时增加这段的结束时间/ F,取min即可 cpp include include using name 阅读全文
摘要:
几乎是板子,求有几个size 1的scc 直接tarjan即可 cpp include include include using namespace std; const int N=10005; int n,m,h[N],cnt,ans,tmp,dfn[N],low[N],s[N],top; b 阅读全文
摘要:
按左端点排序,贪心的选即可 cpp include include include using namespace std; const int N=10005; int n,l,p,ans; struct qwe { int x,y; }a[N]; bool cmp(const qwe &a,co 阅读全文
摘要:
用单调递减的栈从后往前扫一遍即可 cpp include include using namespace std; const int N=1000005; int n,s[N],top,a[N],ans[N]; int read() { int r=0,f=1; char p=getchar(); 阅读全文
摘要:
裸的区间dp,设f[i][j]为区间(i,j)的答案,转移是f[i][j]=max(f[i+1][j]+a[i]\(n j+i),f[i][j 1]+a[j]\ (n j+i)); cpp include include using namespace std; const int N=2005; 阅读全文
摘要:
首先来分析一下,这是一张无向图,要求没有两条路联通的点对个数 有两条路连通,无向图,也就是说,问题转化为不在一个点双连通分量里的点对个数 tarjan即可,和求scc还不太一样…… cpp include include using namespace std; const int N=5005; 阅读全文
摘要:
居然要用高精度! 懒得operator了,转移是裸的完全背包 cpp include include using namespace std; int n,k,f[1005][45]; int read() { int r=0,f=1; char p=getchar(); while(p '9'|| 阅读全文
摘要:
这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 cpp include include include include using namespace std; const 阅读全文
摘要:
好久没写kmp都不会写了…… 开两个栈,s存当前串,c存匹配位置 用t串在栈s上匹配,栈每次入栈一个原串字符,用t串匹配一下,如果栈s末尾匹配了t则弹栈 cpp include include include using namespace std; const int N=1000005; int 阅读全文
摘要:
参考:https://blog.csdn.net/mars_ch/article/details/53011234 我背包真是好不熟练啊…… 第一天买了第三天卖相当于第一天买了第二天卖第二天再买第三天再卖。所以问题转化成完全背包,每天转移即可 cpp include include include 阅读全文
摘要:
洛谷的数据毒啊 把(i,j,k)作为一个点spfa,表示点(i,j)朝向k方向,然后向四个方向转移即可 cpp include include include using namespace std; const int N=105,inf=1e9,dx[]={ 1,1,0,0},dy[]={0,0 阅读全文