#include <bits/stdc++.h> using namespace std; char c[505][505]; int n,m,t,a[505][505],s[505][505],ans=0; int main() { scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%s",c…
对于排列 \(p\),它的单调栈 \(f\) 定义为,\(f_i\) 是以 \(p_i\) 结尾的最长上升子序列的长度 先给定 \(f\) 中一些位置的值,求字典序最小的 \(p\) 使得它满足这些值 Solution 显然 \(f[1]=1\),考虑所有满足 \(f[x]=1\) 的位置 \(b_1,\dots,b_k\),一定有 \(p_{b_1}>p_{b_2}>\dots >p_{b_k}\) 由于 \(b_1=1\),我们要最小化 \(p_1\),所以填入 \(p_{b_i}=…
有一个猜奖者和一个主持人,一共有 \(n\) 扇门,只有一扇门后面有奖,主持人事先知道哪扇门后有奖,而猜奖者不知道.每一轮,猜奖者选择它认为的有奖概率最大(如果有多个最大,随机选一个)的一扇门,主持人从剩下的且门后没有奖的门中随机打开一扇.直到剩两扇门时,猜奖者做出的选择就是他最后的选择. 现在由你来安排主持人每次打开哪一扇门,猜奖者不知道有内幕,他还认为主持人是从可以打开的门中随机一扇打开.你要使猜奖者获奖概率最低,求这个概率. (Discover Probability,你的快乐老家 ) S…
有 \(n\) 个数构成的序列 \({a_i}\),要将它划分为 \(k\) 段,定义每一段的权值为这段中 \((i,j) \ s.t. \ i<j,\ a_i=a_j\) 的个数,求一种划分方案,使得各段的权值和最小. \(n \leq 10^5, k \leq min(n,20), a_i \leq n\) 设 \(f[i][j]\) 表示将 \(a_{1..j}\) 分为 \(i\) 段的最小价值,则很容易得到转移方程 \[ f[i][j]=\min (f[i-1][k]+cost(k+1…
杜教筛求 \(\phi(n)\), \[ S(n)=n(n+1)/2-\sum_{d=2}^n S(\frac{n}{d}) \] 答案为 \[ \sum_{d=1}^n \phi(d) h(\frac{n}{d}) \] 其中 \(h(n)=\sum_{i=1}^n i^2\) 顺便学习了一波 unordered_map #include <bits/stdc++.h> #include <unordered_map> using namespace std; #define i…
给定 \(n\) 个数 \(m_i\),求 \((x_1,x_2,...,x_n)\) 的个数,使得 \(x_1 \ xor\ x_2\ xor\ ...\ xor\ x_n = k\),且 \(0 \leq x_i \leq m_i\) Solution 从最高位开始看起,毫无疑问,如果 \(m_i\) 的某一位是 \(0\),那么 \(x_i\) 的这一位只能填 \(0\),所以只有那些 \(m_i\) 最高位是 \(1\) 的才具有选择权. 考虑从最高位数起,哪一位 \(pos\) 开始,…
动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这个点的 maxlen 那么在这里,当增量添加的时候,如果一个节点有了儿子,那么它就可能成为一个新的 LCP 于是我们在操作父子关系的时候暴力修改一个 bool 数组即可,答案的维护是均摊 \(O(n)\) 的 注意需要对输出 \(0\) 的情况做特判,比如这个例子 aaaabbbbab 输出的结果应…
给出两幅 \(n(\leq 400)\) 个点的无向图 \(G_1 ,G_2\),对于 \(G_1\) 的每一颗生成树,它的权值定义为有多少条边在 \(G_2\) 中出现.求 \(G_1\) 所有生成树的权值和. Solution 很容易想到,设 \(G_1\) 中每条边的权值,这条边在 \(G_2\) 中出现则权值为 \(1\),否则权值为 \(0\). 现在就真的是求所有生成树的边权和的权值和了. 然而标准的 Matrix-Tree Theorem 求的是生成树的边权积的和. 现在我们定义每…
感谢这道题告诉我KM求的是 完备 最大权匹配 :( #include <bits/stdc++.h> using namespace std; #define reset(x) memset(x,0,sizeof x) #define int long long // Init: init() !!!!! // Input: make(u,v,cap,cost) // Solver: solve(s,t) // Output: ans, cost namespace flow { const…
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; cout<<n<<endl; for(int i=1;i<n;i++) cout<<-i<<" "<<i+1<<endl; cout<<-n<<" "<<-n<<endl;…
如果暴力维护,每次询问时需要对所有孩子做计算 考虑通过树剖来平衡修改与询问的时间,询问时计算重链和父树,轻链的贡献预先维护好,修改时则需要修改可能影响的轻链贡献,因为某个点到根的路径上轻重交替只有 \(O(\log n)\) 个,所以只需要修改这么多次,于是复杂度有保证,树状数组维护子树即可 我真是个憨憨,打错树剖调一晚,地上蛙血一大摊 #include <bits/stdc++.h> using namespace std; #define int long long const int N…
给定字典和文章,每个单词有价值,求写文章的最小价值 标准的 AC 自动机 dp,设 \(f[i]\) 表示写 \(s[1..i]\) 的最小价值,建立AC自动机后根据 trans 边暴力转移即可 建了个中间图结果被卡内存了,被迫删掉 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 5e5+5; vector <pair<signed,signed> > g…
转化为完全图的欧拉遍历 如果 n 是奇数,则欧拉遍历长度为 \(n(n-1)/2\) 条边 如果 n 是偶数,则欧拉遍历长度为 \(n*n/2-1\) 条边 (即将(n-1)/2对点配对,剩下的一对当起点终点) 点数则 +1 答案是单调的所以二分 至于输出,暴力跑欧拉回路即可 眼瞎不开ll #include <bits/stdc++.h> using namespace std; #define int long long int n,m; const int N = 4005; vector…
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 1000005; vector <int> g[N]; int f[N],dis[N],fa[N][20],vis[N],n,m,t1,t2,t3,t4,ps[N],pt[N],lc[N],ans; int a[N],d[N]; void dfs1(int p) { vis[p] = 1; for (int i = 0;…
给你一个长度为\(n\)序列\(A\),有\(m\)个操作,操作分为两种: 输入\(x,y,c\),表示对\(i\in[x,y]\),令\(A_{i}=min(A_{i},c)\) 输入\(x,y,k\),表示询问区间 \([x,y]\) 中的第\(k\)小数 Solution 考虑分块,块内排序,同时记录这一块被整体取过的 \(min\) 的最小值 对于修改,对不完整的块,我们直接暴力在原序列上修改然后重建块,标记不动 对完整的块,只修改标记 这样修改的时间复杂度为 \(O(k \log k)…
定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任何一条边 (u,v),都有 f(u)≠f(v). 定义函数 g(n,k) 的值为所有包含 n 个点的无自环.无重边的 k 可染色无向图中的边数最大值.举例来说,g(3,1)=0,g(3,2)=2,g(3,3)=3. 现在给出三个整数 n,l,r,你需要求解:(\sum_{i=l}^rg(n,i))mod998244354 Solution 把 \(n\) 个点分成 \(m\) 份,尽…
按照样例那样排列即可 #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; if(n&1) { for(int i=1;i<=n/2+1;i++) cout<<i*2-1<<" "; for(int i=n/2;i;--i) cout<<i*2<<" "; } else { for(int…
暴力BFS即可 #include <bits/stdc++.h> using namespace std; int n,m,f[105][105]; char s[105][105]; struct pt {int x,y;}; bool check(int i,int j) { if(i<=0 || i>n || j<=0 || j>m) return false; if(s[i][j]=='X') return false; return true; } int m…
按题意模拟,又乱又烦,没什么可说的 #include <bits/stdc++.h> using namespace std; #define int long long int n,m,w,x[5005],y[5005],c[5005]; int ac[15]; signed main() { cin>>n>>m>>w; for(int i=1;i<=w;i++) cin>>x[i]>>y[i]>>c[i]; fo…
忘记特判 \(1\) ,血了一地 听说 \(O(n^2 \log n)\) 能过? #include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 5005; bool isNotPrime[MAXN + 1]; int mu[MAXN + 1], phi[MAXN + 1], primes[MAXN + 1], cnt; inline void euler() { isNotPrime[…
把黑边视为无边,那么答案之和每个点的度数有关 #include <bits/stdc++.h> using namespace std; #define int long long int n,a,b,c,p,d,tot,cnt,deg[5005]; signed main() { cin>>n>>a>>b>>c>>p>>d; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n…
搞了半天才发现TMD是个模拟 #include <bits/stdc++.h> using namespace std; #define int long long int x,y,p,q,ans; signed main() { int n; cin>>p>>q>>n; ans=1e+9; for(int i=1;i<=n;i++) { cin>>x>>y; int v1=0,v2=0,tmp=0,u=p,v=q; while…
#include <bits/stdc++.h> using namespace std; int n,a[2005]; int main() { long long ans=0; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { ans+=a[i]*a[j]; } } cout<<ans<<endl;…
#include <bits/stdc++.h> using namespace std; int a[1005][1005],n,x[1005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } for(int i=1;i<=100000;i++) { x[1]=…
#include <bits/stdc++.h> using namespace std; const int N = 1000005; int n; char str[N]; int a[N]; int main() { scanf("%s",str+1); n=strlen(str+1); for(int i=1;i<=n;i++) { if(str[i]=='a' || str[i]=='e' || str[i]=='i' || str[i]=='o' || s…
搞一波启发式合并即可 #include <bits/stdc++.h> using namespace std; #define int long long #define iter set<long long>::iterator const int N = 100005; struct myset { set <int> s; int ans = 0; void insert(int x) { iter p = s.insert(x).first; iter rb…
There are n different accounts on the website, and some of them competed in the recent k contests. However, Mike suspects that there are lots of alternative accounts. There are axioms believed by everyone that nobody can use two different in one cont…
把每个质因子扒出来乱搞一下 #include <bits/stdc++.h> using namespace std; int g[505][505]; int isp[505]; struct Biguint { int a[10005], len; Biguint() { memset(a, 0, sizeof a); len = 0; } void read() { string str; cin >> str; memset(a, 0, sizeof a); len = s…
一开始想根据单调性双指针 后来血了才想起来负负得正 于是暴力二分答案即可 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 1000005; int n,m,k,a[N],b[N]; int calc(int x) { int r=0; for(int i=1;i<=n;i++) { if(a[i]>0) r+=lower_bound(b+1,b+m+1,(double…
分类讨论即可 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 5005; const int mod = 998244353; int i2; int qpow(int p,int q) { int b=p,r=1; while(q>0) { if(q&1) r*=b; b*=b; r%=mod; b%=mod; q>>=1; } return r; }…