<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[YuZKQ的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/YuZKQ</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; YuZKQ]]></copyright><item><title><![CDATA[[SDOI2011]拦截导弹]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/122901622</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/122901622</guid><author>YuZKQ</author><pubDate>Sat, 12 Feb 2022 20:47:05 +0800</pubDate><description><![CDATA[对于第一问：暴力 dpdpdp 不行，用 CDQCDQCDQ 优化，左右区间合并时确保左边区间已更新好，然后把右区间排序更新左区间对右区间的影响，还原后再递归右区间。
对于第二问：概率等于选择当前导弹的方案数除以总方案数，分别求出以这个i结尾和开始的最长上升子序列的长度，当长度相加 −1-1−1 等于最长长度时计算答案，所以再跑一边 CDQCDQCDQ。
#include&lt;bits/stdc++.h&gt;
#define maxn 200005
#define db double
#define i]]></description><category></category></item><item><title><![CDATA[【题解】 P1594 护卫队]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/112341088</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/112341088</guid><author>YuZKQ</author><pubDate>Thu, 07 Jan 2021 22:05:52 +0800</pubDate><description><![CDATA[首先因为处理完前面的车队之后后面的车队不会影响前面的车队，所以无后效性可以用动态规划。
设 dp[i]dp[i]dp[i] 表示前 iii 个车的最小时间，转移时就枚举 jjj 把车队分成之前的和 jjj 到 iii 两段，把两段加起来。取枚举所有 jjj 所对应的值的最小值，注意判断区间内总重不能超过桥。
dp[i]=min(dp[j−1]+L/st)dp[i] = min(dp[j-1] + L / st)dp[i]=min(dp[j−1]+L/st)
其中 LLL 为桥长， ststst 为 jjj ]]></description><category></category></item><item><title><![CDATA[【题解】 UVA306 Cipher]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/112341067</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/112341067</guid><author>YuZKQ</author><pubDate>Thu, 07 Jan 2021 22:04:52 +0800</pubDate><description><![CDATA[题目相当于是求一个串按某种指定方式换位多次后形成的串。
因为 kkk 很大，所以不能直接模拟。
我们考虑样例，对于一个以 4 5 3 7 2 8 1 6 10 9 为标准的转移，我们若转移两次，就相当于进行一次以 7 5 3 1 2 8 4 6 10 为标准的转移，并且每次换的方式是固定的，所以满足结合律，可以用快速幂来解决。
时间复杂度为 O(nlogk)O(nlogk)O(nlogk)
#include&lt;bits/stdc++.h&gt;
using namespace std;
const in]]></description><category></category></item><item><title><![CDATA[【模板】后缀自动机SAM]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/112125139</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/112125139</guid><author>YuZKQ</author><pubDate>Sat, 02 Jan 2021 22:27:18 +0800</pubDate><description><![CDATA[详细讲解
例题
有点难懂，关于复杂度的证明见链接。
#include&lt;bits/stdc++.h&gt;
using namespace std;
const int M=2e6+5;
struct node{
	int ch[26];
	int len,fa;
	node(){memset(ch,0,sizeof(ch));len=0;}
}dian[M];
vector&lt;int&gt; G[M];
int las=1,tot=1;//指向一个空状态
long long sum[M],ans;]]></description><category></category></item><item><title><![CDATA[【模板】后缀数组SA]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/112124664</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/112124664</guid><author>YuZKQ</author><pubDate>Sat, 02 Jan 2021 22:12:14 +0800</pubDate><description><![CDATA[详细讲解
例题
模板题：
用后缀数组计算出 sasasa 和 heightheightheight 后，用一个单调栈就解决了。
#include&lt;cstdio&gt;
#include&lt;algorithm&gt;
#include&lt;cstring&gt;
#include&lt;stack&gt;
using namespace std;
const int M=5e5+5; 
void write(int x){
    if(x&lt;=9){
        putchar(x+'0]]></description><category></category></item><item><title><![CDATA[【模板】莫队]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/112123181</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/112123181</guid><author>YuZKQ</author><pubDate>Sat, 02 Jan 2021 22:00:58 +0800</pubDate><description><![CDATA[普通莫队
例题
#include&lt;bits/stdc++.h&gt;
using namespace std;
const int M=5e4+5;
long long e,ans;
void read(long long &amp;x) {
	int f=1;x=0;char c=getchar();
	while(c&lt;'0'||c&gt;'9') {if(c=='-') f=-1;c=getchar();}
	while(c&gt;='0'&amp;&amp;c&lt;='9') {x=(x]]></description><category></category></item><item><title><![CDATA[【题解】「THUPC 2017」体育成绩统计 / Score]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/110248935</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/110248935</guid><author>YuZKQ</author><pubDate>Fri, 27 Nov 2020 22:36:51 +0800</pubDate><description><![CDATA[题目
题目
题解
首先输入并处理，用一个结构体将每个人的信息存好，然后把阳光跑步的信息按人分类，每个人单独处理，具体细节见注释。
#include &lt;bits/stdc++.h&gt;
//#define int long long
using namespace std;
const int M = 5e3 + 5, N = 1e4 + 5;
int n, m;
int tianshu[100] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 3]]></description><category></category></item><item><title><![CDATA[【题解】CF514E Darth Vader and Tree]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/109878475</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/109878475</guid><author>YuZKQ</author><pubDate>Fri, 20 Nov 2020 23:26:26 +0800</pubDate><description><![CDATA[题意翻译
有一个无限大的有根树，树上的每一个节点都有n个子节点 (1≤n≤105)( 1 \leq n \leq 10^5 )(1≤n≤105)，任意一个节点它的第iii个子节点之间的距离为di(1≤di≤109)d_i( 1 \leq d_i \leq 10^9 )di​(1≤di​≤109)。
给出一个数x(0≤x≤10)x(0 \leq x \leq 10)x(0≤x≤10)，求有多少个节点到根节点的距离小于等于xxx ( 答案模1e9+71e9+71e9+7 )。
题解
首先可以想到一个很简单的DP]]></description><category></category></item><item><title><![CDATA[【题解】儒略日]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/109866380</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/109866380</guid><author>YuZKQ</author><pubDate>Fri, 20 Nov 2020 21:46:22 +0800</pubDate><description><![CDATA[P7075 儒略日
由于题目太长就不放这里了。
就是这道题让我考试时自闭了。
题解
首先把时间抽分段，公元前[4713,1]一段，公元后[1,1582)一段，[1582,1583)，[1583,1600]，(1600, ∞\infty∞]。
儒略历就4年一段，格里高利历就400年一段。
然后就是许多细节，什么加一减一，反正面向数据编程。
问候出题人
#include&lt;cstdio&gt;
#define int long long
using namespace std;
int D[13]={0,3]]></description><category></category></item><item><title><![CDATA[区间DP总结]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/109683086</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/109683086</guid><author>YuZKQ</author><pubDate>Fri, 13 Nov 2020 21:46:39 +0800</pubDate><description><![CDATA[2.1.3 区间DP
2.1.3.1 基本概念
​		区间DP，顾名思义是在区间上DP，它以“区间长度”作为DP的“阶段”，使用两个坐标(区间的左、右端点)描述每个维度。它的主要思想就是先在小区间进行DP得到最优解，然后再利用小区间的最优解合并求大区间的最优解。
2.1.3.2 核心思路
​		既然让我求解在一个区间上的最优解，那么我把这个区间分割成一个个小区间，求解每个小区间的最优解，再合并小区间得到大区间即可。所以在代码实现上，我可以枚举区间长度 lenlenlen 为每次分割成的小区间长度(((由短到]]></description><category></category></item><item><title><![CDATA[【题解】石子合并]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/109682508</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/109682508</guid><author>YuZKQ</author><pubDate>Fri, 13 Nov 2020 21:03:54 +0800</pubDate><description><![CDATA[有nnn堆石子排成一条直线，每堆石子有一定的重量。现在要合并这些石子成为一堆石子，但是每次只能合并相邻的两堆。每次合并需要消耗一定的体力，该体力为所合并的两堆石子的重量之和。问最少需要多少体力才能将n堆石子合并成一堆石子？
假设只有2堆石子，显然只有1种合并方案。

不管怎么合并，总之最后总会归结为2堆，如果我们把最后两堆分开，左边和右边无论怎么合并，都必须满足最优合并方案，整个问题才能得到最优解。
m[i][j]={0i=jmin⁡(m[i][k]+m[k+1][j])+w[i][j]i&lt;jm[i]]]></description><category></category></item><item><title><![CDATA[【题解】戳西瓜]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/109682494</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/109682494</guid><author>YuZKQ</author><pubDate>Fri, 13 Nov 2020 21:01:16 +0800</pubDate><description><![CDATA[有 n 个西瓜，编号为 000 到 n−1n-1n−1 ，每个西瓜上都标有一个数字，这些数字存在数组 numsnumsnums 中。现在要求你戳破所有的西瓜。每当你戳破一个西瓜iii时，你可以获得 nums[left]∗nums[i]∗nums[right]nums[left]*nums[i]*nums[right]nums[left]∗nums[i]∗nums[right] 个硬币。这里的 leftleftleft 和 rightrightright 代表和 iii 相邻的两个西瓜的序号。注意当你戳破了西]]></description><category></category></item><item><title><![CDATA[【模板】主席树]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/109409758</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/109409758</guid><author>YuZKQ</author><pubDate>Sat, 31 Oct 2020 23:45:21 +0800</pubDate><description><![CDATA[#include&lt;bits/stdc++.h&gt;
#define M 200005
using namespace std;

int n,T;
int tot,cnt,it;
int a[M],lsh[M],rx[M],ly[M&lt;&lt;5],ry[M&lt;&lt;5],sum[M&lt;&lt;5];

void read(int &amp;x) {
	int f=1;x=0;char c=getchar();
	while(c&lt;'0'||c&gt;'9') {if(c=='-']]></description><category></category></item><item><title><![CDATA[逆元学习笔记]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/108927379</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/108927379</guid><author>YuZKQ</author><pubDate>Mon, 05 Oct 2020 14:04:54 +0800</pubDate><description><![CDATA[定义

若在mod p意义下，对于一个整数a，有a*b≡1(mod p)，那么这个整数b即为a的 乘法逆元，同时a也为b的乘法逆元， 一个数有逆元的充分必要条件是gcd(a,p)=1，此时a才有对p的乘法逆元

运用
主要是用于取模。
模板
费马小定理
long long qkpow(long long x,long long y,long long p){
	long long ans=1;
	while(y){
		if(y&amp;1) ans=ans*x%p;
		x=x*x%p;
		y&gt;&]]></description><category></category></item><item><title><![CDATA[【题解】CF489E Hiking]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/108922927</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/108922927</guid><author>YuZKQ</author><pubDate>Mon, 05 Oct 2020 08:11:08 +0800</pubDate><description><![CDATA[题目描述
一个旅行者正在计划沿着河水进行一场水上远足。经过探测，他已经探明了这条河上适合晚上休息的n个地点，记录了这些地点与出发点的距离。
上述的每一个地点都有一个美丽度。也就是说，对于第i个地点，它和起点的距离为xix_ixi​，它的美丽度为bib_ibi​​。
上述的每一个地点都在出发点的下游，且这个旅行者在旅行的时候只会顺流而下。
简言之，我们可以把河流看成一个数轴，出发点的坐标是0，第i个地点的坐标是xix_ixi​​。旅行者只会沿正方向前进。
这个旅行者对他一天的前进距离，设定了一个基准值lll，]]></description><category></category></item><item><title><![CDATA[【模板】LCA]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/108762214</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/108762214</guid><author>YuZKQ</author><pubDate>Wed, 23 Sep 2020 21:29:27 +0800</pubDate><description><![CDATA[tarjan
#include&lt;bits/stdc++.h&gt;
using namespace std;
const int M=1e5*2+5;
int n,m,fa[M],ans[M];
int vis[M];
vector&lt;int&gt; G[M];
vector&lt;int&gt; q[M];
vector&lt;int&gt; q_[M];
void add(int x,int y){
    G[x].push_back(y);
    G[y].push_back(x);
}]]></description><category></category></item><item><title><![CDATA[考试前三题题解]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/108550484</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/108550484</guid><author>YuZKQ</author><pubDate>Sat, 12 Sep 2020 16:30:04 +0800</pubDate><description><![CDATA[T1 数你太美【第一周】
答案肯定不是一位就是两位，先扫描看是否有相同的数，没有就排序取最小的。
#include&lt;bits/stdc++.h&gt;
using namespace std;
const int M=15;
int a[M],b[M],n,m;
bool vis[M],_vis[M];
int main(){
	scanf("%d %d",&amp;n,&amp;m);
	for(int i=1;i&lt;=n;i++){
		scanf("%d",&amp;a[i]);
		vis]]></description><category></category></item><item><title><![CDATA[【模版】拓扑排序]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/108159624</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/108159624</guid><author>YuZKQ</author><pubDate>Fri, 21 Aug 2020 22:24:59 +0800</pubDate><description><![CDATA[概念
拓扑序代表了元素之间的条件关系，拓扑排序就是用有向图无环来存储关系并求出序列。
实现
直接邻接表存图，当某个点入度为0，就记录并删掉与它相连的边。
优先队列确保字典序最小。
#include &lt;bits/stdc++.h&gt;
using namespace std;
const int M=1e6*5+5;
vector&lt;int&gt; G[M];
priority_queue&lt;int,vector&lt;int&gt;,greater&lt;int&gt; &gt; q;
in]]></description><category></category></item><item><title><![CDATA[【模版】欧拉路]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/108158970</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/108158970</guid><author>YuZKQ</author><pubDate>Fri, 21 Aug 2020 22:13:15 +0800</pubDate><description><![CDATA[定义

判定

实现
采用栈+邻接表
#include &lt;bits/stdc++.h&gt;
using namespace std;
const int M=1e6*5+5;
int Stack[M],_Stack[M],Head[M],Next[M],ans[M],ver[M],per[M],top,cnt,tot,_tot,t;
int size[M],in[M],out[M];
int fa[M],vis[M],_vis[M];
int T,len,S;
void makeset(int n)]]></description><category></category></item><item><title><![CDATA[野餐规划（最小度限制生成树）]]></title><link>https://blog.youkuaiyun.com/YuZKQ/article/details/108062746</link><guid>https://blog.youkuaiyun.com/YuZKQ/article/details/108062746</guid><author>YuZKQ</author><pubDate>Mon, 17 Aug 2020 20:36:27 +0800</pubDate><description><![CDATA[题目
题目描述
一群小丑演员，以其出色的柔术表演，可以无限量的钻进同一辆汽车中，而闻名世界。
现在他们想要去公园玩耍，但是他们的经费非常紧缺。
他们将乘车前往公园，为了减少花费，他们决定选择一种合理的乘车方式，可以使得他们去往公园需要的所有汽车行驶的总公里数最少。
为此，他们愿意通过很多人挤在同一辆车的方式，来减少汽车行驶的总花销。
由此，他们可以很多人驾车到某一个兄弟的家里，然后所有人都钻进一辆车里，再继续前进。
公园的停车场能停放的车的数量有限，而且因为公园有入场费，所以一旦一辆车子进入到公园内，就必须]]></description><category></category></item></channel></rss>