Compare commits

...

17 Commits

Author SHA1 Message Date
1d1598fdc2 refactor(字符串哈希): 重构字符串哈希实现并优化代码结构
将P3370.cpp从src/2移动到src/11/28目录并重构实现
新增P3375.cpp实现字符串匹配和回文前缀查找功能
使用更简洁的代码风格和更高效的哈希算法
2025-11-28 14:05:58 +08:00
4ec66e7a1e feat: 添加P7521.cpp解决算法问题
实现一个算法来计算给定数组中的最大模数结果。对输入数组进行排序、去重和反转处理,然后通过三重循环计算满足条件的最大模数值。
2025-11-27 18:06:31 +08:00
0de21a3bd3 fix(P6627): 修复边界条件处理并优化结果比较逻辑
扩展映射表的键范围以包含更多边界情况,确保正确性
在结果比较时增加绝对值条件,优化最终答案选择
2025-11-27 11:00:06 +08:00
f72db3be3a feat: 添加P6627.cpp实现区间异或查询功能 2025-11-27 10:48:11 +08:00
5f6c040750 feat: 添加P7151.cpp和P7514.cpp解题代码
添加两个编程题目的解答代码文件,分别处理矩阵输入和数组操作问题
2025-11-26 22:38:46 +08:00
569d2ff9bb feat: 添加P1073和P5121题解代码
实现P1073题目的图论解法,计算最大利润
实现P5121题目的模拟解法,处理方块消除逻辑
2025-11-26 17:31:29 +08:00
7c65708ab6 refactor: 移除未使用的set头文件 2025-11-23 13:22:17 +08:00
beb67e3eaa feat: 添加马尔可夫链成语生成器实现
实现基于马尔可夫链的成语生成器,包含核心算法和成语数据文件。程序能够读取成语库并生成新的四字成语组合,同时标记已存在的成语。

新增markov_chain.cpp实现核心逻辑,包含字符串处理、概率模型和随机生成功能。添加markov_chain.txt作为成语数据源,包含200个常用成语及其编号。
2025-11-23 11:25:11 +08:00
62cdfbed7b feat: 添加P1850.cpp和P2827.cpp的初始代码实现
实现两个算法题目的初始代码框架,包括输入处理和基本数据结构初始化
2025-11-22 20:57:30 +08:00
ae6d4da30e feat: 添加P2905.cpp解决牛和草场的位置记录问题 2025-11-20 23:38:06 +08:00
5aba1b0bab perf(P7297): 优化Dijkstra算法实现并添加注释
使用二分查找优化相邻节点的查找过程,提高算法效率
调整Dijkstra逻辑使其更符合标准实现
添加必要注释说明代码意图和优化点
2025-11-20 22:45:27 +08:00
3a44351971 feat: 添加P2943.cpp解决动态规划问题
实现动态规划算法计算最小平方和
2025-11-20 11:59:49 +08:00
0f4b3eef8f feat: 添加P3077题解实现最大权值路径算法 2025-11-19 23:46:05 +08:00
8b39f98492 feat: 添加P1472和P6119题目的动态规划解法实现 2025-11-19 21:11:45 +08:00
273ff90318 fix(P1545.cpp): 修复动态规划计算逻辑并优化循环步长
修复dp数组计算中的逻辑错误,将循环步长改为2以提高效率。同时修正最终结果的输出逻辑,当无解时输出-1。
2025-11-19 11:15:00 +08:00
5e1c92cd26 feat: 添加P1545.cpp解决动态规划问题
实现动态规划算法解决特定区间覆盖问题,计算最小覆盖次数。使用差分数组优化区间标记,并通过双重循环计算最优解。
2025-11-18 21:36:34 +08:00
a43a4849c6 feat: 添加P1559.cpp和P9978.cpp的初始代码实现
P1559.cpp包含一个空的主函数框架
P9978.cpp实现了一个涉及数组处理和计算的算法
2025-11-18 16:18:01 +08:00
22 changed files with 1201 additions and 50 deletions

View File

@ -7,7 +7,10 @@
#include <istream> #include <istream>
#include <queue> #include <queue>
#include <vector> #include <vector>
using ll = int; // 引入这个头文件以使用 abs
#include <cmath>
using ll = int; // 距离不会爆int用int更快一点
const ll maxn=5e4+5,maxk=51,inf=1e9+7; const ll maxn=5e4+5,maxk=51,inf=1e9+7;
ll n,k,b[maxn]; ll n,k,b[maxn];
@ -21,7 +24,7 @@ struct P{
return step>o.step; return step>o.step;
} }
}; };
#define printf
int main(){ int main(){
std::iostream::sync_with_stdio(false); std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr); std::cin.tie(nullptr);
@ -34,6 +37,8 @@ int main(){
classp[b[i]].emplace_back(i); classp[b[i]].emplace_back(i);
vis[i]=inf; vis[i]=inf;
} }
// 注意classp 中的下标天然就是有序的(从小到大),所以不需要额外排序
for(ll i=1;i<=k;i++){ for(ll i=1;i<=k;i++){
for(ll j=1;j<=k;j++){ for(ll j=1;j<=k;j++){
char tmp; char tmp;
@ -43,27 +48,57 @@ int main(){
} }
} }
} }
std::priority_queue<P> pq; std::priority_queue<P> pq;
pq.emplace(1,0); pq.emplace(1,0);
// vis[1] = 0; // 严谨的Dijkstra最好在这里初始化不过你的逻辑在下面判断也可以
while(pq.size()){ while(pq.size()){
auto[now,step]=pq.top(); auto[now,step]=pq.top();
pq.pop(); pq.pop();
// 这里的逻辑稍微调整一下符合标准Dijkstra
if(vis[now]!=inf) continue; if(vis[now]!=inf) continue;
vis[now]=std::min(step,vis[now]); vis[now]=step;
printf("dij now=%lld, step=%lld\n",now,step);
if(now==n){ if(now==n){
std::cout<<step<<"\n"; std::cout<<step<<"\n";
return 0; return 0;
} }
for(ll i:edg[b[now]]){
for(ll p:classp[i]){ // --- 修改开始 ---
if(p==now)continue; for(ll target_breed : edg[b[now]]){
printf("%lld goto %lld\n",b[now],i); // 获取目标品种的所有位置列表
const auto& vec = classp[target_breed];
if(vec.empty()) continue;
// 1. 找右边最近的一个 (第一个 > now 的位置)
auto it = std::upper_bound(vec.begin(), vec.end(), now);
if(it != vec.end()){
ll p = *it;
ll nstep = step + std::abs(p - now); ll nstep = step + std::abs(p - now);
if(nstep>vis[p])continue; // 只有当新路径更短,且该点未被“关闭”(未vis)时才入队
pq.emplace(p,step+std::abs(p-now)); // 注意:你之前的逻辑里 vis[p] 初始化是 inf所以用 nstep < vis[p] 没问题
// 但要注意 vis 在你的代码里既做“已访问标记”又存“最短路”。
// 更安全的写法是只判断是否更优,因为如果 vis[p] 已经是更小的值,这里就不会进
if(vis[p] == inf) {
pq.emplace(p, nstep);
} }
} }
// 2. 找左边最近的一个 (第一个 < now 的位置)
// lower_bound 是 >= now所以它的前一个就是 < now
auto it_l = std::lower_bound(vec.begin(), vec.end(), now);
if(it_l != vec.begin()){
it_l--; // 往前移一位
ll p = *it_l;
ll nstep = step + std::abs(p - now);
if(vis[p] == inf) {
pq.emplace(p, nstep);
}
}
}
// --- 修改结束 ---
} }
std::cout<<"-1\n"; std::cout<<"-1\n";
} }

3
src/11/17/P1559.cpp Normal file
View File

@ -0,0 +1,3 @@
int main(){
}

55
src/11/17/P9978.cpp Normal file
View File

@ -0,0 +1,55 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <istream>
#include <set>
#include <unordered_map>
#include <vector>
using ll = int64_t;
ll n,k,ans;
std::vector<ll> ap,bp,cnt;
std::unordered_map<ll, ll> ans1,ans2;
std::set<ll> vis;
#define printf
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>k;
ap.resize(n+1),bp.resize(n+1),cnt.resize(n+1);
for(ll i=1;i<=k;i++){
ll tmp;
std::cin>>tmp;
ap[tmp]=i;
cnt[tmp]++;
vis.emplace(tmp);
}
for(ll i=1;i<=k;i++){
ll tmp;
std::cin>>tmp;
cnt[tmp]++;
bp[tmp]=i;
if(cnt[tmp]==2){
printf("cnt[%lld]=%lld\n",tmp,cnt[tmp]);
ll diff=ap[tmp]-bp[tmp];
if(diff<0)diff+=k;
printf("diffa=%lld\n",diff);
ans1[diff]++;
ans=std::max({ans1[diff],ans});
diff=ap[tmp]-(k-bp[tmp]+1);
if (diff<0) {
diff+=k;
}
printf("diffb=%lld\n",diff);
ans2[diff]++;
ans=std::max({ans2[diff],ans});
}
vis.emplace(tmp);
}
printf("ans=%lld, vis.size()=%lld\n",ans,vis.size());
std::cout<<n-vis.size()+ans<<"\n";
}

40
src/11/18/P1545.cpp Normal file
View File

@ -0,0 +1,40 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
#define printf
const ll inf=1e9+7;
ll n,l,a,b;
std::vector<ll> v,dp,diff;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>l>>a>>b;
v.resize(l+1);dp.resize(l+1,inf);diff.resize(l+2);
for(ll i=1;i<=n;i++){
ll s,e;
std::cin>>s>>e;
v[s]++,v[e]--;
diff[e]++;
}
dp[0]=0;
for(int i=2;i<=l;i+=2){
v[i-1]+=v[i-2];
v[i]+=v[i-1];
for(int j=a;j<=b&&i-j*2>=0;j++){
if(!v[i-j*2] || diff[i-j*2]==v[i-j*2-1]){
dp[i]=std::min(dp[i],dp[i-j*2]+1);
}
}
printf("now[%lld]=%lld\n",i,v[i]);
printf("dp[%lld]=%lld\n",i,dp[i]);
printf("diff[%lld]=%lld\n",i,diff[i]);
printf("\n");
}
std::cout<<(dp[l]>=inf?-1:dp[l])<<"\n";
}

30
src/11/19/P1472.cpp Normal file
View File

@ -0,0 +1,30 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
#define printf
const ll p=9901;
ll n,k;
std::vector<std::vector<ll>> dp;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>k;
dp.resize(n+1,std::vector<ll>(k+1));
for(ll i=1;i<=k;i++)dp[1][i]=1;
for(ll i=3;i<=n;i+=2){
for(ll j=2;j<=k;j++){
for(ll k=1;k<i;k+=2){
dp[i][j]+=dp[i-k-1][j-1]*dp[k][j-1]%p;
dp[i][j]%=p;
}
printf("dp[%lld][%lld]=%lld\n",i,j,dp[i][j]);
}
}
std::cout<<(dp[n][k]-dp[n][k-1]+p)%p<<"\n";
}

32
src/11/19/P2943.cpp Normal file
View File

@ -0,0 +1,32 @@
#include <algorithm>
#include <iostream>
#include <istream>
#include <vector>
const int inf=1e9+7;
int n,m;
std::vector<int> a,dp,s;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m;
a.resize(n+1);
dp.resize(n+1,inf);
s.resize(m+1);
for(int i=1;i<=n;i++)std::cin>>a[i];
dp[0]=0;
for(int i=1;i<=n;i++){
int size=0;
for(int j=i;j>=1&&size*size<=n;j--){
if(s[a[j]]!=i){
size++;
s[a[j]]=i;
}
dp[i]=std::min(dp[i],dp[j-1]+size*size);
}
}
std::cout<<dp[n]<<"\n";
}

70
src/11/19/P3077.cpp Normal file
View File

@ -0,0 +1,70 @@
#include <algorithm>
#include <iostream>
#include <vector>
using ll = int64_t;
ll n, m, r, ans;
std::vector<ll> a, b;
std::vector<std::vector<ll>> ea; // 只保留左到右的邻接表即可
std::vector<ll> dpa, dpb; // 不需要二维数组,一维即可
int main() {
// 优化输入输出
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> n >> m >> r;
// 调整大小
a.resize(n + 1);
b.resize(m + 1);
ea.resize(n + 1);
dpa.resize(n + 1);
dpb.resize(m + 1);
// 读入左岸权值并初始化 DP 和 ans
for (ll i = 1; i <= n; i++) {
std::cin >> a[i];
dpa[i] = a[i]; // 路径可以只包含这一个点
ans = std::max(ans, a[i]);
}
// 读入右岸权值并初始化 DP 和 ans
for (ll i = 1; i <= m; i++) {
std::cin >> b[i];
dpb[i] = b[i]; // 路径可以只包含这一个点
ans = std::max(ans, b[i]);
}
// 读入边,只存单向即可(左->右),后续通过排序处理顺序
for (ll i = 1; i <= r; i++) {
ll u, v;
std::cin >> u >> v;
ea[u].push_back(v);
}
// 核心逻辑:按照左岸点 u 从小到大,右岸点 v 从小到大的顺序处理每一条边
// 这等同于正解中的 sort(e+1, e+r+1)
for (ll i = 1; i <= n; i++) {
// 对当前左岸点 i 连接的所有右岸点进行排序
std::sort(ea[i].begin(), ea[i].end());
for (ll j : ea[i]) {
// 暂存数值,避免更新顺序影响(同正解中的 t1, t2
// 从右岸 j 走到 左岸 i
ll val_to_left = dpb[j] + a[i];
// 从左岸 i 走到 右岸 j
ll val_to_right = dpa[i] + b[j];
// 更新 DP 表
dpa[i] = std::max(dpa[i], val_to_left);
dpb[j] = std::max(dpb[j], val_to_right);
// 更新全局答案
ans = std::max({ans, dpa[i], dpb[j]});
}
}
std::cout << ans << "\n";
}

33
src/11/19/P6119.cpp Normal file
View File

@ -0,0 +1,33 @@
#include <algorithm>
#include <cstdint>
#include <cstdlib>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
ll n;
std::vector<ll> a,b;
std::vector<std::vector<ll>> dp;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n;
a.resize(n+1),b.resize(n+1),dp.resize(n+1,std::vector<ll>(n+1));
for(ll i=1;i<=n;i++)std::cin>>a[i];
for(ll i=1;i<=n;i++)std::cin>>b[i];
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
if(std::abs(a[i]-b[j])<=4){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=std::max(dp[i-1][j],dp[i][j-1]);
}
}
}
std::cout<<dp[n][n]<<"\n";
}

26
src/11/20/P2905.cpp Normal file
View File

@ -0,0 +1,26 @@
#include <cstdint>
#include <iostream>
#include <istream>
using ll = int64_t;
ll n,m,k;
const ll maxn=1000+7;
bool cow[maxn][maxn],g[maxn][maxn];
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m>>k;
for(ll i=1;i<=n;i++){
ll x,y;
std::cin>>x>>y;
cow[x][y]=true;
}
for(ll i=1;i<=m;i++){
ll x,y;
std::cin>>x>>y;
g[x][y]=true;
}
}

26
src/11/22/P1850.cpp Normal file
View File

@ -0,0 +1,26 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
ll n,m,v,e;
std::vector<std::vector<ll>> mp;
std::vector<ll> c,d;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m>>v>>e;
mp.resize(v+1,std::vector<ll>(v+1));
c.resize(n+1);
d.resize(n+1);
for(ll i=1;i<=n;i++){
std::cin>>c[i];
}
for(ll i=1;i<=n;i++){
std::cin>>d[i];
}
}

52
src/11/22/P2827.cpp Normal file
View File

@ -0,0 +1,52 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <queue>
#include <vector>
using ll = int;
#define printf
#define pv(v)do{printf("[DEBUG] %s= %lld\n",#v,(v));}while(0)
ll n,m,q,u,v,t;
double p;
std::vector<ll> a;
std::priority_queue<ll> pq;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m>>q>>u>>v>>t;
p=double(u)/double(v);
a.resize(n+1);
for(ll i=1;i<=n;i++){
std::cin>>a[i];
pq.emplace(a[i]);
}
for(ll i=0;i<m;i++){ // 7e6*log(m)
pv(i);
ll qi=q*i,top=pq.top()+qi;
pv(pq.top());
pq.pop();
pv(top);
pv(qi);
ll a=p*top,b=top-a;
pq.emplace(a-qi-q);
pq.emplace(b-qi-q);
if((i+1)%t==0){
std::cout<<top<<" ";
}
}
std::cout<<"\n";
ll idx=1;
const ll qm=q*m;
while(pq.size()){
if(idx%t==0){
std::cout<<pq.top()+qm<<" ";
}
pq.pop();
idx++;
}
std::cout<<"\n";
}

View File

@ -0,0 +1,66 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <map>
#include <random>
#include <string>
#include <unordered_set>
#include <vector>
using ll = int64_t;
#define sl static inline
const int cnsize=3;
ll ltmp;
std::map<std::string, std::vector<std::string>> m;
std::vector<std::string> startw;
std::random_device rd;
std::mt19937 mt(rd());
std::unordered_set<std::string> old;
sl std::vector<std::string> stovs(const std::string &s){
std::vector<std::string> ret;
for(int i=0;i<s.size();i+=3){
std::string ns;
for(int j=0;j<cnsize&&i+j<s.size();j++){
ns=ns+s[i+j];
}
ret.emplace_back(ns);
}
return ret;
}
int main(){
while(std::cin>>ltmp){
std::string b;
std::cin>>b;
std::vector<std::string> strs=stovs(b);
// for(auto &i:strs){
// std::cout<<i<<"\n";
// }
old.emplace(b);
startw.push_back(strs[0]);
for(int i=1;i<strs.size();i++){
m[strs[i-1]].push_back(strs[i]);
}
}
std::uniform_int_distribution<int> uv(0,startw.size()-1);
for(int i=1;i<=20;i++){
// std::cout<<"i="<<i<<"\n";
std::string now=startw[uv(mt)];
std::string all;
for(int j=1;j<=4;j++){
all+=now;
// std::cout<<now;
if(m[now].size()==0)break;
std::uniform_int_distribution<int> uvm(0,m[now].size()-1);
now=m[now][uvm(mt)];
}
std::cout<<all;
if(old.count(all)){
std::cout<<" "<<"[is old]";
}
std::cout<<"\n";
}
}

219
src/11/23/markov_chain.txt Normal file
View File

@ -0,0 +1,219 @@
1 一帆風順
2 一見如故
3 一清二楚
4 一塵不染
5 一落千丈
6 一成不變
7 一箭雙雕
8 一言難盡
9 一暴十寒
10 一絲不苟
11 九牛一毛
12 人山人海
13 人聲鼎沸
14 人跡罕至
15 人心難測
16 人才輩出
17 人定勝天
18 人浮於事
19 人情世故
20 人傑地靈
21 大公無私
22 大驚小怪
23 大材小用
24 大器晚成
25 大同小異
26 大張旗鼓
27 大言不慚
28 大快朵頤
29 大有可為
30 大惑不解
31 天南地北
32 天經地義
33 天馬行空
34 天衣無縫
35 天翻地覆
36 天長地久
37 天涯比鄰
38 天道酬勤
39 天人交戰
40 天花亂墜
41 心猿意馬
42 心神不寧
43 心滿意足
44 心急如焚
45 心安理得
46 心領神會
47 心血來潮
48 心花怒放
49 心甘情願
50 心驚膽戰
51 水落石出
52 水深火熱
53 水乳交融
54 水泄不通
55 水到渠成
56 水天一色
57 水中撈月
58 水火不容
59 水泛銀光
60 水光瀲灩
61 火冒三丈
62 火樹銀花
63 火上加油
64 火眼金睛
65 火急火燎
66 火燒眉毛
67 火中取栗
68 火光沖天
69 火傘高張
70 火爆脾氣
71 虎頭蛇尾
72 虎視眈眈
73 虎背熊腰
74 虎口拔牙
75 虎虎生風
76 虎落平陽
77 虎踞龍盤
78 虎將雄兵
79 虎穴龍潭
80 虎嘯風生
81 雪上加霜
82 雪中送炭
83 雪恥報仇
84 雪落無痕
85 雪泥鴻爪
86 雪擁藍關
87 雪山飛狐
88 雪過天晴
89 雪兆豐年
90 雪白晶瑩
91 風平浪靜
92 風雨如晦
93 風吹草動
94 風調雨順
95 風捲殘雲
96 風花雪月
97 風華絶代
98 風光旖旎
99 風馳電掣
100 風起雲湧
101 雲淡風輕
102 雲霧繚繞
103 雲消雲散
104 雲蒸霞蔚
105 雲集四方
106 雲開日出
107 雲程發軔
108 雲躍龍驤
109 雲深不知
110 雲飛雨散
111 明察秋毫
112 明爭暗鬥
113 明目張膽
114 明察暗訪
115 明心見性
116 明亮耀眼
117 明哲保身
118 明火執仗
119 明辨是非
120 明鏡高懸
121 虛懷若谷
122 虛與委蛇
123 虛張聲勢
124 虛實相生
125 虛名虛利
126 虛心學習
127 虛席以待
128 虛誇浮誇
129 虛堂懸鏡
130 虛言詐語
131 高瞻遠矚
132 高山流水
133 高談闊論
134 高風亮節
135 高朋滿座
136 高不可攀
137 高官厚祿
138 高屋建瓴
139 高視闊步
140 高枕無憂
141 安然無恙
142 安居樂業
143 安步當車
144 安然度日
145 安貧樂道
146 安身立命
147 安之若素
148 安土重遷
149 安然自得
150 安分守己
151 白日做夢
152 白璧無瑕
153 白駒過隙
154 白紙黑字
155 白雪皚皚
156 白頭偕老
157 白雲蒼狗
158 白衣天使
159 白手起家
160 白話連篇
161 金玉滿堂
162 金枝玉葉
163 金石為開
164 金榜題名
165 金聲玉振
166 金戈鐵馬
167 金光閃閃
168 金玉其外
169 金鼓齊鳴
170 金碧輝煌
171 石破天驚
172 石沉大海
173 石火電光
174 石破驚天
175 石壓草枯
176 石室金匱
177 石心鐵腸
178 石泉清冽
179 石橋流水
180 石室藏書
181 夜深人靜
182 夜闌人靜
183 夜以繼日
184 夜色迷離
185 夜幕降臨
186 夜雨對床
187 夜光如晝
188 夜半鐘聲
189 夜色朦朧
190 夜寂無聲
191 龍飛鳳舞
192 龍爭虎鬥
193 龍盤虎踞
194 龍馬精神
195 龍鳳呈祥
196 龍吟虎嘯
197 龍躍鳳鳴
198 龍行虎步
199 龍驤虎步
200 龍章鳳彩

67
src/11/24/P1073.cpp Normal file
View File

@ -0,0 +1,67 @@
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <queue>
#include <vector>
using ll = int64_t;
#define sl static inline
const ll maxn = 100000+7, maxm=500000+7,inf=1e9+7;
ll n,m,p[maxn],maxp[maxn],minp[maxn],ans=-inf;
std::vector<std::vector<ll>> edg,redg;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m;
edg.resize(n+1);
redg=edg;
std::fill(maxp+1,maxp+1+n,-inf);
std::fill(minp+1,minp+1+n,inf);
for(ll i=1;i<=n;i++){
std::cin>>p[i];
}
for(ll i=1;i<=m;i++){
ll x,y,z;
std::cin>>x>>y>>z;
if(z==1){
edg[x].emplace_back(y);
redg[y].emplace_back(x);
}else{
edg[x].emplace_back(y);
edg[y].emplace_back(x);
redg[x].emplace_back(y);
redg[y].emplace_back(x);
}
}
std::queue<ll> q;
q.emplace(n);
maxp[n]=p[n];
while(q.size()){
ll u=q.front();
q.pop();
for(ll v:redg[u]){
if(maxp[u]<=maxp[v]){
continue;
}
maxp[v]=std::max(p[v],maxp[u]);
q.emplace(v);
}
}
minp[1]=p[1];
q.emplace(1);
while(q.size()){
ll u=q.front();
q.pop();
ans=std::max(maxp[u]-minp[u],ans);
for(ll v:edg[u]){
if(minp[u]>=minp[v]){
continue;
}
minp[v]=std::min(p[v],minp[u]);
q.emplace(v);
}
}
std::cout<<ans<<"\n";
}

116
src/11/24/P5121.cpp Normal file
View File

@ -0,0 +1,116 @@
#include <bitset>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <queue>
#include <utility>
#include <vector>
using ll = int64_t;
#define sl static inline
#define printf
const ll m=10;
ll n,k;
std::vector<std::vector<char>> v;
std::vector<std::bitset<m+1>> vis;
const ll dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
std::vector<std::pair<ll, ll>> mb;
sl bool find(ll i,ll j){
printf("--START i=%lld, j=%lld\n",i,j);
mb.clear();
ll num=1;
std::queue<std::pair<ll, ll>> q;
q.emplace(i,j);
vis[i][j]=true;
char c=v[i][j];
while(q.size()){
auto[x,y]=q.front();
q.pop();
for(ll k=0;k<4;k++){
ll nx=x+dir[k][0],ny=y+dir[k][1];
if(nx<1||nx>n||ny<1||ny>m||c!=v[nx][ny]||vis[nx][ny])continue;
vis[nx][ny]=true;
num++;
q.emplace(nx,ny);
}
if(num>=k){
v[x][y]='0';
printf("find x=%lld, y=%lld\n",x,y);
}else{
mb.emplace_back(x,y);
}
}
if(num>=k){
for(auto[x,y]:mb){
v[x][y]='0';
printf("find x=%lld, y=%lld\n",x,y);
}
mb.clear();
}
return num>=k;
}
sl void pm(){
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
printf("%c",v[i][j]);
}
printf("\n");
}
printf("---\n");
}
sl void move(){
for(ll j=1;j<=m;j++){
ll l=-1;
for(ll i=n;i>=1;i--){
if(v[i][j]=='0'&&l==-1)l=i;
else if(l!=-1&&v[i][j]!='0'){
v[l][j]=v[i][j];
v[i][j]='0';
l--;
}
}
}
}
sl bool check(){
vis.clear();
vis.resize(n+1);
bool ret=false;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(v[i][j]!='0'){
if(find(i,j)){
pm();
pm();
ret=true;
}
}
}
}
move();
return ret;
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>k;
v.resize(n+1,std::vector<char>(m+1));
vis.resize(n+1);
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
std::cin>>v[i][j];
}
}
while (check());
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
std::cout<<v[i][j];
}
std::cout<<"\n";
}
}

22
src/11/26/P7151.cpp Normal file
View File

@ -0,0 +1,22 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
ll n,d;
std::vector<std::vector<ll>> m;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>d;
m.resize(n+1,std::vector<ll>(n+1));
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
std::cin>>m[i][j];
}
}
}

69
src/11/26/P7514.cpp Normal file
View File

@ -0,0 +1,69 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
#define printf
const ll inf=1e9+7;
ll n,m,ans=inf;
std::vector<ll> a,b,aa,bb,mm,lmax,rmin;
#define pa(a)do {\
printf(#a"[]: ");\
for(ll i=1;i<=n;i++){\
printf("%lld ",a[i]);\
}\
printf("\n");\
}while(0)
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m;
a.resize(n+1);
aa.resize(n+1);
b.resize(n+1);
bb.resize(n+2);
mm.resize(n+2,inf);
lmax.resize(n+2);
rmin.resize(n+2,inf);
for(ll i=1;i<=n;i++)std::cin>>a[i];
for(ll i=1;i<=n;i++)std::cin>>b[i];
for(ll i=n;i>=1;i--){
mm[i]=std::min(mm[i+1],a[i]);
}
for(ll i=1;i<=n;i++){
lmax[i]=std::max(lmax[i-1],b[i]);
}
for(ll i=n;i>=1;i--){
rmin[i]=std::min(rmin[i+1],b[i]);
}
ll nmin=inf;
for(ll i=1;i<=n;i++){
nmin=std::min(nmin,b[i]);
aa[i]=std::min(nmin,mm[i+1]);
}
mm.assign(n+2,-inf);
for(ll i=1;i<=n;i++){
mm[i]=std::max(mm[i-1],a[i]);
}
ll nmax=-inf;
for(ll i=n;i>=1;i--){
nmax=std::max(nmax,b[i]);
bb[i]=std::max(nmax,mm[i-1]);
}
for(ll i=0;i<=m;i++){
ans=std::min(ans,std::max(bb[n-(m-i)+1],lmax[i])-std::min(aa[i],rmin[n-(m-i)+1]));
}
pa(aa);
pa(bb);
pa(lmax);
pa(rmin);
std::cout<<ans<<"\n";
}

77
src/11/27/P6627.cpp Normal file
View File

@ -0,0 +1,77 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <istream>
#include <map>
#include <vector>
using ll = int64_t;
#define printf
const ll inf=1e9+7;
ll n,anq,ans=-inf,ansi;
std::map<ll,ll> m;
std::vector<ll> l,r,w,a,b,t,xr,eq,nq;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n;
l.resize(n+1);r.resize(n+1);w.resize(n+1);a.resize(n+1);b.resize(n+1);t.resize(n+1);
m[0]=0;
for(ll i=1;i<=n;i++){
std::cin>>t[i];
if(t[i]==1){
std::cin>>l[i]>>r[i]>>w[i];
m[l[i]-1]=m[l[i]]=m[l[i]+1]=m[r[i]-1]=m[r[i]]=m[r[i]+1]=m[r[i]+2]=0;
}else if(t[i]==2){
std::cin>>a[i]>>w[i];
m[a[i]-1]=m[a[i]]=m[a[i]+1]=0;
}else{
std::cin>>b[i]>>w[i];
m[b[i]-1]=m[b[i]]=m[b[i]+1]=0;
}
}
ll idx=1;
for(auto&[k,v]:m){
v=idx++;
printf("k=%lld, v=%lld\n",k,v);
}
xr.resize(idx+1);
eq.resize(idx+1);nq.resize(idx+1);
for(ll i=1;i<=n;i++){
if(t[i]==1){
ll nl=m[l[i]],nr=m[r[i]];
xr[nl]^=w[i];
xr[nr+1]^=w[i];
}else if(t[i]==2){
ll na=m[a[i]];
eq[na]^=w[i];
}else{
ll nb=m[b[i]];
nq[nb]^=w[i];
anq^=w[i];
}
}
for(ll i=1;i<=idx;i++){
xr[i]^=xr[i-1];
}
auto rp=m.begin();
for(ll i=1;i<idx;i++){
ll nans=0;
nans^=eq[i];
nans^=xr[i];
nans^=anq^nq[i];
if(nans==ans && std::abs(rp->first)<std::abs(ansi)){
ansi=rp->first;
ans=nans;
}
if(nans>ans){
ansi=rp->first;
ans=nans;
}
rp++;
}
std::cout<<ans<<" "<<ansi<<"\n";
}

43
src/11/27/P7521.cpp Normal file
View File

@ -0,0 +1,43 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
#define printf
ll n,ans;
std::vector<ll> a;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n;
a.resize(n);
for(ll i=0;i<n;i++)std::cin>>a[i];
std::sort(a.begin(),a.end());
a.erase(std::unique(a.begin(),a.end()),a.end());
n=a.end()-a.begin();
std::reverse(a.begin(),a.end());
for(auto i:a){
printf("%lld ",i);
}
printf("\n");
for(ll k=0;k<n;k++){
if(a[k]<=ans)break;
for(ll i=0;i<n;i++){
for(ll j=0;j<n;j++){
if(i==j||i==k||j==k)continue;
if(a[i]+a[j]<a[k])break;
if(ll nxt=(a[i]+a[j])%a[k];nxt>=ans){
ans=nxt;
}
}
}
}
out:;
std::cout<<ans<<"\n";
}

32
src/11/28/P3370.cpp Normal file
View File

@ -0,0 +1,32 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <set>
#include <string>
using ll = int64_t;
const ll b=233,p=1e9+7;
ll n;
std::string tmp;
std::set<ll> s;
static inline ll strhash(std::string &s){
ll res=0;
for(ll i=0;i<s.size();i++){
res=(res*b+s[i]-'0')%p;
}
return res;
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n;
for(ll i=1;i<=n;i++){
std::cin>>tmp;
s.emplace(strhash(tmp));
}
std::cout<<s.size()<<"\n";
}

76
src/11/28/P3375.cpp Normal file
View File

@ -0,0 +1,76 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <string>
#include <vector>
using ll = int64_t;
#define printf
#define sl static inline
const ll b=233,p=1e9+7;
std::string s1,s2;
ll n1,n2,h2;
std::vector<ll> v1,bp,v2,v2r;
sl ll strhash(std::string&s){
ll res=0;
for(ll i=0;i<s.size();i++){
res=(res*b+s[i])%p;
}
return res;
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>s1>>s2;
h2=strhash(s2);
n1=s1.size(),n2=s2.size();
s1=' '+s1;s2=' '+s2;
v1.resize(s1.size());
v2.resize(s2.size());
v2r.resize(s2.size()+1);
bp.resize(std::max(s1.size(),s2.size()));
bp[0]=1;
for(ll i=1;i<bp.size();i++){
bp[i]=(bp[i-1]*b)%p;
}
for(ll i=1;i<=n1;i++){
v1[i]=(v1[i-1]*b+s1[i])%p;
if(ll s=i-n2+1;s>=1){
ll h1=(v1[i]-v1[s-1]*bp[n2]%p+p)%p;
printf("v1=%lld, h1=%lld, h2=%lld\n",v1[i],h1,h2);
if(h1==h2){
std::cout<<s<<"\n";
}
}
}
for(ll i=1;i<=n2;i++){
v2[i]=(v2[i-1]*b+s2[i])%p;
}
for(ll i=n2;i>=1;i--){
v2r[i]=(v2r[i+1]*b+s2[i])%p;
}
for(ll i=1;i<=n2;i++){
ll l=1,r=i/2,ans=0,mid;
while(l<=r){
mid=(l+r)/2;
ll h1=v2[mid];
// ll h2=(v2[i]-v2[i-mid]*bp[mid]%p+p)%p;
ll h2=(v2r[i-mid+1]-v2r[i+1]*bp[mid]%p+p)%p;
printf("i=%lld, l=%lld, r=%lld, mid=%lld, h1=%lld, h2=%lld\n",i,l,r,mid,h1,h2);
if(h1==h2){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
std::cout<<ans<<" ";
}
std::cout<<"\n";
}

View File

@ -1,38 +0,0 @@
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <istream>
using namespace std;
using ull= unsigned long long;
ull base = 131;
ull a[10010];
char s[10010];
int n, ans = 1;
int prime = 233317;
const ull mod = 212370440130137957ll;
ull mhash(char *s) {
int len = strlen(s);
ull ans = 0;
for (int i = 0; i < len; i++)
ans = (ans * base + (ull)s[i]) % mod + prime;
return ans;
}
int main() {
iostream::sync_with_stdio(false);cin.tie(nullptr),cout.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s;
a[i] = mhash(s);
}
sort(a + 1, a + n + 1);
for (int i = 1; i < n; i++) {
if (a[i] != a[i + 1])
ans++;
}
cout << ans << '\n';
}