
CCPC比赛练习
spe1437
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
值周(差分+前缀和)
差分+前缀和。原创 2022-07-05 11:05:52 · 198 阅读 · 0 评论 -
[NOIP2005-2006]采药+开心的金明(01背包)
01背包原创 2022-07-08 16:36:32 · 165 阅读 · 0 评论 -
[NOI2001]食物链(扩展域并查集)
扩展域并查集原创 2022-09-02 20:03:19 · 177 阅读 · 0 评论 -
[NOIP2010]关押罪犯(扩展域并查集)
二倍扩展域并查集原创 2022-09-02 20:28:50 · 272 阅读 · 1 评论 -
P3834 【模板】可持久化线段树 2(主席树)
P3834unique函数用法参考、lower_bound函数用法参考输出真的要记得换行(…)#include<bits/stdc++.h>using namespace std;const int maxn=2e5+5;int n,m,tot,ver[maxn],a[maxn],b[maxn];struct treenode{ int l,r,sum;}tree[maxn<<5];int build(int l,int r){ int root=++tot;原创 2021-08-31 09:46:14 · 98 阅读 · 0 评论 -
Mex(可持久化线段树)
有一个长度为n的数组a1,a2,…,an。m次询问,每次询问给出两个数l,r,问al,al+1,…,ar内最小的没有出现过的自然数。第一行一个正整数T(1≤T≤3),表示测试数据的数量。每组数据第一行两个正整数n,m(1≤n,m≤200000)。第二行n个非负整数a1,a2,…,an(0≤ai≤109)。接下来m行,每行两个正整数l,r(1≤l≤r≤n),表示一个询问。每组数据输出m行,每行一个整数,依次表示每个询问的答案。15 52 1 0 2 13 32 32 41.原创 2021-08-31 15:21:16 · 186 阅读 · 0 评论 -
区间k小值【模板题】
可持续化线段树给定一个序列a1,a2,…,an,m次操作,每次给定l,r,k,问al,al+1,…,ar中第k小的值。第一行一个正整数T(1≤T≤3),表示测试数据的数量。每组数据第一行n,m(1≤n,m≤100000)。第二行n个正整数a1,a2,…,an(1≤ai≤n)。接下来m行,每行描述一个操作,其中1≤l≤r≤n,1≤k≤r−l+1。对于每个询问,输出一行一个整数,即第k小的值。15 51 3 5 4 21 3 32 4 21 5 24 4 13 5 1原创 2021-08-29 19:33:31 · 247 阅读 · 0 评论 -
【5443】The Water Problem
5443区域最值,线段树解题#include<bits/stdc++.h> #define max 0x3f3f3f3fusing namespace std;int MAXNUM;int a[1500];struct Tree{ int Max; int r,l;}t[6000];int MAX(int k,int j){ if(k>=j) return k; return j;}void build(int idx,int l原创 2021-08-23 20:39:12 · 119 阅读 · 0 评论 -
【4547】CD操作
4547LCA倍增。LCA算法#include<bits/stdc++.h>using namespace std;const int MAX=100005;const int M=20;int head[MAX],cnt=0;int t,n,m;int up[MAX][M],dis[MAX],deep[MAX];char a[50],b[50];map<string,int>mp;struct Edge{ int next,to,val;}edge[原创 2021-08-25 12:33:30 · 127 阅读 · 0 评论 -
【6954】Minimum spanning tree
6954主要方法是贪心+线性筛求质数。提供两种写法,一种是普通暴力破解,一种在前者的基础上使用前缀和和二分查找提高了一部分效率。①#include<bits/stdc++.h>using namespace std;const int maxn=1e7+2;long long v[maxn],prime[maxn],s[maxn];long long m=0;void zhishu(){ memset(v,0,sizeof(v)); memset(prime,0,siz原创 2021-07-30 09:20:39 · 99 阅读 · 0 评论 -
【6950】Mod, Or and Everything
6950找规律题,注意特殊情况。数据类型使用long long不然容易超时。#include<bits/stdc++.h>using namespace std;int main(){ int t; scanf("%d",&t); while(t--){ long long n; scanf("%lld",&n); if(n==1||n==2){ printf("0\n"); continue; } long long mid=(n原创 2021-07-30 09:35:35 · 147 阅读 · 0 评论 -
最小割(网络流)
给定n个点m条边的有向图,删掉第i条边的代价为c[i]。请删掉代价之和最少的边,使得从1号点出发到达不了n号点。Input第一行包含一个正整数T(1≤T≤10),表示测试数据的组数。每组数据第一行包含两个正整数n,m(1≤n≤50,1≤m≤1000)。接下来m行,每行三个正整数a[i],b[i],ci,表示一条起点是a[i],终点是b[i]的边,删掉它的代价是c[i]。Output对于每组数据输出一行一个整数,即最小代价。26 61 2 122 3 73 6 31 4.原创 2021-09-16 20:53:51 · 175 阅读 · 0 评论 -
【1532】Drainage Ditches
1532网络流,EK算法,模板题。输出最大流。#include<bits/stdc++.h>using namespace std;int n,m,s,t;int mep[205][205];int pre[205],vis[205];bool bfs(){ int cur; queue<int>Q; memset(pre,0,sizeof(pre)); memset(vis,0,sizeof(vis)); vis[s]=1; Q.push(s); whi原创 2021-09-12 21:04:04 · 105 阅读 · 0 评论 -
分房间(网络流)
给定n个人和m个房间,每个房间最多只能住一个人。再给定g[i][j]表示第i个人是否愿意住在第j个房间。问最多能住下多少人。Input第一行包含一个正整数T(1≤T≤10),表示测试数据的组数。每组数据第一行包含两个正整数n,m(1≤n,m≤50)。接下来n行,每行一个长度为m的01串,如果第i行第j个字符为’1’,说明第i个人愿意住在第j个房间,否则说明不愿意。Output对于每组数据输出一行一个整数,即最多能住下的人数。对于每组数据输出一行一个整数,即最多能住下的人数。输.原创 2021-09-16 19:35:53 · 206 阅读 · 0 评论 -
【2586】How far away ?
2586LCA(并查集)+DFS,树链剖分#include<bits/stdc++.h>using namespace std;const int N = 50005;vector<int> v[N],w[N],query[N],num[N];int pre[N],dist[N],ans[N];bool vis[N];int n;void Init(){ for(int i=1; i<=n; i++){ v[i].clear();原创 2021-08-20 22:16:09 · 93 阅读 · 0 评论 -
【3966】Aragorn‘s Story
3966树链剖分。树上每个点都有权值,定义三种操作:I操作表示从a到b节点之间的节点都加上一个值;D操作表示从a到b节点之间的节点的都减去一个权值;Q操作询问a节点当前的值。#include<bits/stdc++.h>#define N 50005using namespace std;int a[N],first[N],q[N],vis[N],pre[N],fa[N],dep[N],size[N],top[N],s[N],w[N],ms[N];int n,m,Q,cnt,原创 2021-08-21 21:00:10 · 81 阅读 · 0 评论 -
【3062】Party
30622-SAT基础题。#include<bits/stdc++.h>#define maxn 1005using namespace std;bool bz;int n,m;int head[maxn<<1],js;struct edge{ int u,v,nxt;}e[maxn*maxn];void addage(int u,int v){ e[++js].u=u; e[js].v=v; e[js].nxt=head[u];head原创 2021-08-17 22:24:46 · 121 阅读 · 0 评论 -
【1824】Let‘s go home
18242-SAT基础题。#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define LL long long#define eps 1e-7#define maxn 3100using namespace std;struct TwoSAT{ int n; vector<int> G[maxn*2]; bool mark[maxn*2]; int S[maxn*2],c; boo原创 2021-08-17 09:33:59 · 105 阅读 · 0 评论 -
【1085】Holding Bin-Laden Captive!
1085母函数。#include<bits/stdc++.h>using namespace std;int c1[6000],c2[6000];int main(){ int i,j; int a,b,c; while(1){ scanf("%d%d%d",&a,&b,&c); int sum=a+2*b+5*c; if(a==0&&b==0&&c==0&&sum==0)break; mem原创 2021-08-01 18:48:27 · 108 阅读 · 0 评论 -
【1028】Ignatius and the Princess III
【1028】Ignatius and the Princess III题目母函数#include<bits/stdc++.h>using namespace std; int main(){ int n,i,j,k; int a[130],b[130];//a数组记录系数,b数组中转 while(scanf("%d",&n)!=EOF) { for (i=0;i<=n;i++)//把第一个式子的系数设为一 { a[i]=1; b[i]=0原创 2021-04-11 20:55:49 · 89 阅读 · 0 评论 -
【1398】Square Coins
1398母函数,与上一题类似,都可以套模板。把k+=i改成k+=i*i即可。#include<bits/stdc++.h>using namespace std;int c1[305],c2[305];int main(){ int n; while(scanf("%d",&n)&&n){ int i; for(i = 0;i <= n; i++){ c1[i] = 1;原创 2021-08-01 15:59:05 · 61 阅读 · 0 评论 -
【1171】Big Event in HDU
1171母函数,套模板,注意数组大小#include<stdio.h>int c1[250001],c2[250001];int a[55][2];int main(){ int i,j,k,n; while(scanf("%d",&n)&&n>0){ int s=0; for(i=0;i<n;i++){ scanf("%d%d",&a[i][0],&a[i][1]); s+=a[i][0]*a[i]原创 2021-08-01 19:26:52 · 88 阅读 · 0 评论 -
【1848】Fibonacci again and again
1848典型尼姆游戏,使用SG函数打表计算#include<bits/stdc++.h>using namespace std;int sg[1005],vis[1005];int feb[15]={1,2,3,5,8,13,21,34,55,89,144,233,377,610,987};void getsg(){ for(int i=0;i<=1000;i++){ sg[i]=i; memset(vis,0,sizeof(vis)); for(int j=0;原创 2021-07-21 18:41:22 · 94 阅读 · 0 评论 -
【1849】Rabbit and Grass
1849非常典型的尼姆博弈可以点开链接参考一下其他例子#include<bits/stdc++.h>using namespace std;int main(){ int m,n,t; while(cin>>m,m) { int ans=0; for(int i=0; i<m; i++) { cin>>n; ans^=n;原创 2021-07-21 19:11:52 · 106 阅读 · 0 评论 -
【1846】Brave Game
1846典型的巴什博弈,太典型了因此没什么好说的,写起来也格外简单…关于组合博弈可以简单参考这篇文#include<bits/stdc++.h>using namespace std;int main(){ int c; scanf("%d",&c); while(c--){ int n,m; scanf("%d%d",&n,&m);//共有石子数,一次最多取走石子数 if(n%(m+1)!=0){ printf("first\n");原创 2021-07-20 19:54:07 · 91 阅读 · 0 评论 -
【1281】棋盘游戏
1281多次运用匈牙利算法即可,求出最大匹配,然后遍历所有可以放车的格子,将这条路删除,再跑一下,如果最大匹配数变小了,说明这个点是重要的点。一开始TLE了,后来发现是xy数组不需要清空的原因,因为每一次都只用到会重新赋值的位置,所以不需要多花时间去做清空处理。所以,以下提供两种思路一致,写法略有不同的代码。#include<bits/stdc++.h>using namespace std;int n,m,k;int mep[105][105];int x[10005],y[1原创 2021-07-20 16:53:48 · 115 阅读 · 0 评论 -
【2188】悼念512汶川大地震遇难同胞——选拔志愿者
2188和上一题类似,非常典型的巴什博弈#include<bits/stdc++.h>using namespace std;int main(){ int c; int n,m; cin>>c; while(c--){ cin>>n>>m; if(n<=m){ cout<<"Grass"<<endl; continue; } if(n%(m+1)){ cout<<"G原创 2021-07-21 19:47:26 · 123 阅读 · 0 评论 -
【2063】过山车
2063匈牙利算法可以直接套模板#include<bits/stdc++.h>using namespace std;int mep[505][505];int vis[505]={0};int boy[505]={0};int k,m,n;//可能的组合数目,女生的人数,男生的人数int find(int t){ for(int i=1;i<=n;i++){ if(mep[t][i]==1&&vis[i]==0){//男女有联系,没被选 vi原创 2021-07-20 11:09:14 · 113 阅读 · 0 评论 -
【2149】Public Sale
2149比较普通的巴什博弈,稍微注意一下输出格式#include<bits/stdc++.h>using namespace std;int main(){ int n,m,t; while(scanf("%d%d",&n,&m)!=EOF){ if(n<=m){//先手必胜了 for(int i=n;i<=m;i++){ if(i==n)printf("%d",i); else printf(" %d",i); }原创 2021-07-21 19:32:03 · 106 阅读 · 0 评论 -
【1847】Good Luck in CET-4 Everybody!
1847运用SG函数解决博弈问题,在套模板的基础上稍微修改一下。#include<bits/stdc++.h>using namespace std;int sg[1005],vis[1005];int a[15];int pos=1;void getsg(){ memset(sg,0,sizeof(sg)); for(int i=1;i<=1000;i++){ memset(vis,0,sizeof(vis)); for(int j=1;a[j]<=i;j原创 2021-07-21 16:58:47 · 86 阅读 · 0 评论 -
【1536】S-Nim
1536和前面有一题类似,都是sg函数+尼姆博弈一不小心容易TLE#include<bits/stdc++.h>using namespace std;int k,m,t;int s[105],vis[105],sg[10005];int dfs(int x){ if(sg[x]!=-1)return sg[x]; memset(vis,0,sizeof(vis)); for(int i=0;i<k;i++){ int temp=x-s[i]; if(temp&原创 2021-07-21 23:15:31 · 96 阅读 · 0 评论 -
7-2 拼题A打卡奖励 (25 分)
输入样例:5 11070 10 20 50 6028 1 6 18 22输出样例:40做题的时候感觉是典型的0/1背包,但是模型太久没打有点遗忘了,所以凭借仅存的记忆不太符合模型地写了写。虽然满分通过了但感觉主要还是题目在数据和时间上卡的都不是很紧的缘故。多余的排序是为弥补思维上的不足。后续找到比较好的题解会重新贴上来。#include<bits/stdc++.h>using namespace std;const int maxn=1e7+5;int a[maxn..原创 2021-10-26 20:23:42 · 870 阅读 · 0 评论 -
7-1 懂的都懂 (20 分)
输入样例:5 34 8 12 20 403 11 16 193 12 16 1910 11 11 11 11 11 11 11 11 11 11输出样例:YesNoYes基于考试时写的代码做了一点小修改,总体而言还是最简单的暴力算法。//注意求平均除4不可取,对所要比较的数进行乘法运算,不然会出现浮点错误 #include<bits/stdc++.h>using namespace std;const int maxn=1e7+5;int a[55],pi..原创 2021-10-13 19:12:56 · 463 阅读 · 1 评论 -
D修建道路
题目签到题。n-1条道路所以每个相邻的点都有连线,费用就是左右比较后大的那个,加在一起就可以得出答案。附上AC代码。#include<bits/stdc++.h>using namespace std;long long a[200005];int main(){ int n; scanf("%d",&n); long long val=0; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); if(i!=1原创 2021-11-02 19:04:46 · 323 阅读 · 0 评论 -
A公交线路
题目签到题。这题的数据和思路都很简单,因为一定是以公司作为起点挨个报站点,所以“Unsure”的情况只需要考虑公司两边的m个数据是否对应完全一致就可以了;“Right”和“Wrong”的情况也是一样,对照数据是不是一样就可以。我们考试的时候在家和公司的相对位置上犯蠢了,一开始没有考虑到家既可以在公司的前边也可以在公司的后边,罚时罚得很难看。做得比较暴力和简单。附上AC代码。#include<bits/stdc++.h>using namespace std;int main(){原创 2021-11-02 18:50:40 · 190 阅读 · 0 评论 -
7-2 芬兰木棋
输入样例:111 2 22 4 33 6 4-1 2 2-2 4 3-3 6 4-1 -2 1-2 -4 1-3 -6 1-4 -8 22 -1 999输出样例:1022 9主要还是理解题意,如果在一条直线上分数为1就击倒一排,如果分数大于1要单独击倒。在筛各种情况的时候遇到了困难,思路有点混乱。贴上老师提供的AC代码。#include<bits/stdc++.h>using namespace std;const int MXN = 1e5+10..原创 2021-10-30 10:35:41 · 847 阅读 · 0 评论 -
【蓝桥云课】回文日期
题目暴力循环+判断#include <iostream>using namespace std;int months[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool check(int y,int m,int d) //判断是否是合法日期{ if (d<=0||m<=0||m>=13) return false; if (m!=2){ if(d>month原创 2021-12-07 20:10:39 · 273 阅读 · 0 评论 -
K 音乐游戏
题目签到题。我们做出来的第一道题,真的很简单,稍微会一点字符串就能做出来。没什么特别要注意的,记得getchar()就行了。#include<bits/stdc++.h>using namespace std;int main(){ int n; scanf("%d",&n); string a; int sum=0; getchar(); for(int i=1;i<=n;i++){ getline(cin,a); for(int j=0;j<原创 2021-11-02 19:15:35 · 2123 阅读 · 0 评论 -
7-1 冒险者分队 (20 分)
输入样例:425 30 3565 10 15100 200 300200 180 220100 100 1000 0 0777 888 999777 888 999输出样例:13-10#include<bits/stdc++.h>using namespace std;int main(){ int t; scanf("%d",&t); while(t--){ long long a1,b1,c1,a0,b0,c0; scanf(..原创 2021-10-30 21:04:53 · 885 阅读 · 0 评论 -
G 3G网络
题目签到题。这题我没有主要参与讨论和打代码,听她们交流好像就是找规律题,规律挺简单的也可以通过样例发现。附上AC代码。#include<bits/stdc++.h>using namespace std;int main(){ int n,x,y; double ans; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&x,&y); } ans=1.0/n; printf("%原创 2021-11-02 19:08:11 · 189 阅读 · 0 评论