自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 第二章 贪心(上)

【代码】第二章 贪心(上)

2024-02-04 22:39:41 382

原创 AcWing 788. 逆序对的数量

题目给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1 <= n <= 100000输入样例:62 3 4 5 6 1输出样例:5题解利用归并排序的时候,两段区间已经分别排好序,

2020-11-14 16:16:12 320 1

原创 Acwing.802. 区间和

题目假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。输入格式第一行包含两个整数n和m。接下来 n 行,每行包含两个整数x和c。再接下里 m 行,每行包含两个整数l和r。输出格式共m行,每行输出一个询问中所求的区间内数字和。数据范围−1e9≤x≤1e9,1≤n,m≤1e5,−1e9≤l≤r≤1e9,−10000≤c≤

2020-11-14 15:33:17 177

原创 AcWing 1068. 环形石子合并 (区间dp,环形处理)

题目将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。请编写一个程序,读入堆数 n 及每堆的石子数,并进行如下计算:选择一种合并石子的方案,使得做 n-1 次合并得分总和最大。选择一种合并石子的方案,使得做 n-1 次合并得分总和最小。输入格式第一行包含整数 n,表示共有 n 堆石子。第二行包含 n 个整数,分别表示每堆石子的数量。输出格式输出共两行:第一行为合并得分总和最小值,第二行为合并得

2020-11-02 17:23:39 245

原创 AcWing 1303. 斐波那契前 n 项和 (矩阵乘法)

题意 大家都知道 Fibonacci 数列吧,$f_1=1,f_2=1,f_3=2,f_4=3,…,f_n=f_{n−1}+f_{n−2}$。现在问题很简单,输入 $n$ 和 $m$,求 ${f_n}$ 的前 $n$ 项和 $S_n \bmod m$。输入格式共一行,包含两个整数 $n$ 和 $m$。输出格式输出前 $n$ 项和 $S_n \bmod m$ 的值。数据范围$1 \le n \le 2000000000$,$1 \le m \le 1000000010$输入样例:5 10

2020-10-29 18:39:52 257

原创 AcWing 1298. 曹冲养猪(中国剩余定理)

题目 自从曹冲搞定了大象以后,曹操就开始琢磨让儿子干些事业,于是派他到中原养猪场养猪,可是曹冲很不高兴,于是在工作中马马虎虎,有一次曹操想知道母猪的数量,于是曹冲想狠狠耍曹操一把。举个例子,假如有 16 头母猪,如果建了 3 个猪圈,剩下 1 头猪就没有地方安家了;如果建造了 5 个猪圈,但是仍然有 1 头猪没有地方去;如果建造了 7 个猪圈,还有 2 头没有地方去。你作为曹总的私人秘书理所当然要将准确的猪数报给曹总,你该怎么办?输入格式第一行包含一个整数 n,表示建立猪圈的次数;接下来 n 行

2020-10-28 19:24:25 276 1

原创 AcWing 202. 最幸运的数字 (欧拉 + 快速幂+快速乘)

题意 8是中国的幸运数字,如果一个数字的每一位都由8构成则该数字被称作是幸运数字。现在给定一个正整数L,请问至少多少个8连在一起组成的正整数(即最小幸运数字)是L的倍数。输入格式输入包含多组测试用例。每组测试用例占一行,包含一个整数L。当输入用例L=0时,表示输入终止,该用例无需处理。输出格式每组测试用例输出结果占一行。结果为“Case 1: ”+ 一个整数N,N代表满足条件的最小幸运数字的位数。如果满足条件的幸运数字不存在,则N=0。数据范围1 < L < 2*10^9

2020-10-28 16:12:17 215

原创 AcWing 222. 青蛙的约会(知识点:同余)

扩展欧几里得模板int exgcd(int a,int b,int &x,int &y){ //ax + by == 1 if(!b){ x = 1,y = 0; return a; } int d = exgcd(b,a%b,y,x); y -= a/b * x; return d;}题意: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘

2020-10-28 01:15:24 159

原创 Acwing1027. 方格取数

题意:设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。输入格式第一行为一个整数N,表示 N×N 的方格图。接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。行和列编号从 $

2020-10-26 23:36:03 284

原创 Acwing196. 质数距离

题目 给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。同时,你还需要找到距离最远的两个相邻质数D1和D2(即D1-D2是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。输入格式每行输入两个整数L和U,其中L和U的差值不会超过1000000。输出格式对于每个L和U ,输出一个结果,结果占一行。结果包括距离最近的相邻质数对和距离最远的相邻质数对。(具体格式参照样例)如果L和U

2020-10-26 01:06:23 128

原创 Acwing1293. 夏洛克和他的女朋友

夏洛克有了一个新女友(这太不像他了!)。情人节到了,他想送给女友一些珠宝当做礼物。他买了 n 件珠宝,第 i 件的价值是 i+1,也就是说,珠宝的价值分别为 2,3...n+1。华生挑战夏洛克,让他给这些珠宝染色,使得一件珠宝的价格是另一件珠宝的价格的质因子时,两件珠宝的颜色不同。并且,华生要求他使用的颜色数尽可能少。请帮助夏洛克完成这个简单的任务。输入格式只有一行一个整数 n,表示珠宝件数。输出格式第一行一个整数 k,表示所使用的颜色数;第二行 n 个整数,表示第 1 到第 n 件珠宝

2020-10-26 00:32:43 372

原创 Acwing1292. 哥德巴赫猜想

哥德巴赫猜想的内容如下:任意一个大于 4 的偶数都可以拆成两个奇素数之和。例如:8 = 3 + 520 = 3 + 17 = 7 + 1342 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23现在,你的任务是验证所有小于一百万的偶数能否满足哥德巴赫猜想。输入格式输入包含多组数据。每组数据占一行,包含一个偶数 n。读入以 0 结束。输出格式对于每组数据,输出形如 n = a + b,其中 $a,b$ 是奇素数。若有多组满足条件的 a,b,输出 b-a 最大

2020-10-26 00:17:29 174

原创 acwing106. 动态中位数

题意依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。输入格式第一行输入一个整数P,代表后面数据集的个数,接下来若干行输入各个数据集。每个数据集的第一行首先输入一个代表数据集的编号的整数。然后输入一个整数M,代表数据集中包含数据的个数,M一定为奇数,数据之间用空格隔开。数据集的剩余行由数据集的数据构成,每行包含10个数据,最后一行数据量可能少于10个,数据之间用空格隔开。输出格式对于每个数据集,第一行输出两个整数,分别代表数据集的编号以及输出中位数的个

2020-10-25 23:42:52 99

原创 html基础(day2)-CSS

CSS把css标签单独写成文件,然后用link标签引入选择器1.id选择器<head> <meta charset="UTF-8"> <title>CSS</title> <link rel="stylesheet" type="text/css" href="1.css"> <style> #id001{ color: red;

2020-10-24 01:41:45 366

原创 html基础(day1)

制作一个简单的注册页面实现了用户名,密码,单选框,复选框,下拉列表,以及简单的排版.<body><form action="" method="post"> <h1 align="center"></h1> <table align="center"> <tr> <td>用户名:</td> <td><inp

2020-10-23 15:44:02 84

原创 一本通基础 - 图论(一)

第一节 图的遍历1.【例题】一笔画问题题意:求无向图欧拉通路打印.通路充要条件:G连通而且G仅有有两个奇点或无奇点.无奇点 -> 必有欧拉回路注意:要后存边,不然死循环.void dfs(int x){ for(int i=1;i<=maxn;i++){ if(g[x][i]){ g[x][i] = g[i][x] = 0; dfs(i); } } ans[t++] = x; }void pri(){ for(int i=0;i<t-1;

2020-10-08 14:47:22 69

原创

【例3-3】医院设置floyed跑一遍就好了…(数据小 //floyed for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int k=1;k<=n;k++){ mp[i][j] = min(mp[i][j],mp[i][k] + mp[k][j]); mp[j][i] = mp[i][j]; } } }【例3-4】求后序遍历已知先序和中序,求后序遍历void solve(int l1,i

2020-10-06 14:55:52 230 1

原创 求表达式的值

const int MAXN = 1e6 + 5;int n,m;bool f;stack<int>st1;stack<char>st2;int qpw(int a,int b){ int ans = 1; while(b){ if(b & 1){ ans*=a; } a = a*a; b >>= 1; } return ans;}int level(char x){ //返回优先级 if(x == '+'

2020-10-03 00:13:45 200

原创 动态规划(二)

二维费用背包//最大scanf("%d%d%d",&n,&V,&M); for(int i=0;i<n;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); for(int j=V;j>=a;j--){ for(int k=M;k>=b;k--){ dp[j][k] = max(dp[j][k],dp[j-a][k-b] + c); } } } printf("%d

2020-09-30 14:08:52 58

原创 1.高精度

加法//两个大数char str1[MAXN],str2[MAXN];int a[MAXN],b[MAXN],c[MAXN];void add(int a[],int b[]){ if(a[0] < b[0])return add(b,a); c[0] = a[0]; for(int i=1;i<=a[0];i++){ c[i] += a[i]; if(i <= b[0])c[i] += b[i]; c[i+1] += c[i]/10; c[i] %= 10;

2020-09-25 00:45:54 62

原创 动态规划(一)背包

背包问题1.01背包每种物品一个for(int i=0;i<n;i++){ cin >> v[i] >> w[i]; } for(int i=0;i<n;i++){ for(int j=V;j>=v[i];j--){ dp[j] = max(dp[j],dp[j-v[i]]+w[i]); } } cout << dp[V] << endl;2.完全背包问题,每种物品无限(优化) for(int i=0;i&

2020-09-17 22:58:03 150 1

原创 23333

//hdoj常用格式1.多组数据, 每组要进行操作例如:多组数据,每组给你两个数a,b,输出大的那个 int main(){ while(~scanf("%d %d",&a,&b)){ // "~"表示只要有输入,只要输入a,b,就输出 printf("%d\n",max(a,b)); } } 2.和第一种类似,但是告诉你什么时候结束例如:多组数据,每组给你两个数a,b,输出大的那个,当输入 0 0 结束int main(){ while(

2020-09-14 01:51:44 284

原创 (2)ac自动机

模板hdu2222//ne[i] = j 表示以i结尾的后缀(不算自己)与某个最长的前缀相等,那个最长的前缀的尾端是j;const int N = 1e4+5,S = 55,M = 1e6+5;int n;int tir[N*S][26],cnt[N*S],idx;char str[M];int q[N*S],ne[N*S];void insert(){ int p=0; for(int i=0;str[i];i++){ int t = str[i] - '

2020-09-10 17:41:23 75

原创 (1)kmp习题

模板const int N = 10010,M = 100010;int n,m;char p[N],s[M]; //p是匹配串,s是原串int ne[N];void get_next(){ //p在s上的匹配数 下标从1开始 ne[1] = 0; for(int i=2,j=0;i<=lenp;i++){ while(j && p[i] != p[j+1])j = ne[j]; if(p[i] == p[j+1])j++; ne[i] =

2020-09-10 10:32:56 147

原创 数论(1)

1.约数个数 cin >> x; unordered_map<int,int>primes; for(int i=2;i*i<=x;i++){ while(x%i == 0){ x/=i; primes[i]++; } } if(x > 1)primes[x]++; ll ans = 0; for(auto p : primes)ans = ans * (p.second + 1)% mod; cout << ans &l

2020-09-04 17:01:58 686

原创 第二章.数据结构(三)

知识点 : 哈希表,STL的使用1.哈希表把一个很大的区间的数映射到一个小区间的数例如 : 实现一个很大区间的数的插入和查询.用桶排序显然不行1.拉链法h(11) = 2,h(23) = 2,那么把11 和 23 放 2 的链上,找的时候遍历一遍.//N 取比数据范围大的一个素数//哈希函数 int h[N],e[N],ne[N],idx;void insert(int x){ int k = (x % MOD + MOD)% MOD; e[idx] = x; ne[idx.

2020-08-31 01:18:38 132

原创 第二章.数据结构(二)

知识点 : Trie树 ,并查集,堆的操作Trie树高效地储存和查找字符串集合的数据结构const int N = 100010;int son[N][26],cnt[N],idx;//插入 void insert(char str[]){ int p = 0; for(int i=0;str[i];i++){ int u = str[i] - 'a'; if(!son[p][u])son[p][u] = ++idx; p = son[p][u]; } cnt[p]+..

2020-08-29 23:06:29 81

原创 第二章.数据结构(一)

知识点 : 链表与邻接表 . 栈与队列 . kmp链表1.单链表*****//head[]表示链表头,e[]表示节点,ne[]表示next指针,idx表示当前点 int head,e[N],ne[N],idx;void init(){ head = -1; idx = 0;}//在头节点插入一个数 void insert(int a){ e[idx] = a;ne[idx] = head;head = idx++;}//删除头节点 void remove(){ he.

2020-08-29 15:15:17 107

原创 dfs 木棒

木棒乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位。然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棍的长度都用大于零的整数表示。dfs(int num , int length, int last)//现在是第几根大木头,这根木头现在的长度,当下枚举第几根小木头剪枝 :1)如果大木头完了,return true;2)如果长度到了,dfs下一根木头

2020-08-27 18:42:28 127

原创 二分

板子int erfen(int l,int r){ while(l < r){ int mid = l + r >> 1; if(check(mid))r = mid; else l = mid + 1; } return l;}while(r - l > 1e-5){ double mid = (l+r)/2; if(check(mid))l = mid; else r = mid;}最佳牛围栏一个数组中找到

2020-08-18 00:06:37 125

原创 前缀和-差分

激光炸弹  题意:地图上有很多个点上有价值,一个炸弹掉落能摧毁R*R的方块,问最大能摧毁多少价值.求一遍二维前缀和然后扫一遍就行了int sum[5050][5050];int n,r;int main(){ cin >> n >> r; memset(sum,0,sizeof(sum)); int nn = r,mm = r; while(n--){ int a,b,c; cin >> a >> b >> c;

2020-08-16 22:23:04 101

原创 0x20 拓扑排序,bitset

164. 可达性统计拓扑排序,链式前向星,bitset给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量。const int N = 30020;int n,m;struct Edge{ int to,next; //to:终点 next:下一条边对应的cnt值 head[]起点 }edge[N];int head[N],cnt; int in[N],seq[N]; //拓扑排序后的序列 bitset<N>f[N];void add(

2020-08-14 22:05:49 81

原创 day1 图论(1)

拓扑排序有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。...

2020-08-12 18:10:31 100

原创 STL板子

______________________________________________//vectorvector<int>a;vector<int>a(100); //a有100个0vector<int>a(100,1);//a有100个1; int main(){ a.push_back(100); //尾部插入以一个100; int size = a.size(); //元素个数 bool

2020-06-30 22:36:49 103

原创 牛客 算法竞赛进阶指南 前五章

例题1 从 1∼n这 n 个整数中随机选取任意多个,输出所有可能的选择方案。//int n;void dfs(int u,int state){ //第几次 , 储存的数字 if(u == n){ for(int i=0;i<n;i++){ if(state >> i & 1)cout<<i+1<<" "; } cout...

2020-05-04 18:52:03 353

原创 贪心 用并查集加速

题目每个作业有期限和价值,求价值最大.const int MAXN=1e6+5;const int MOD=1e9+7;int n;struct node{ int x,y;}p[MAXN];int vis[MAXN];int pre[MAXN];int father(int d){ //压缩寻找路径,下次找能快一点 if(!vis[d])return d; retu...

2020-05-01 01:01:03 122

原创 切蛋糕问题

二维:an2+bn+c 代数据三维:an3+bn2+cn+d 代数据

2020-04-29 13:52:23 281

原创 马拉车专题

例题1. hdu4513给你一个数组,求最长的非降序回文.int N;int s[MAXN],n[MAXN*2+5];int p[MAXN*2+5];int init(int *s){ int lena = N; n[0]=-2; n[1]=-1; int j=2; for(int i=0;i<lena;i++){ n[j++] = s[i]; n[j++] =...

2020-04-29 13:20:20 112

原创 牛客 马拉车

入口  有两个长度均为n的字符串A和B。可以从A中选一个可以为空的子串A[l1…r1],B中选一个可以为空的子串B[l2…r2],满足r1=l2,然后把它们拼起来(A[l1…r1]+B[l2…r2])。求用这样的方法能得到的最长回文串的长度。#include<stdio.h>#include<string.h>#include<iostream>#in...

2020-04-27 18:18:26 155

原创 马拉车板子

char s[MAXN],n[MAXN*2+5];int p[MAXN*2+5]; int init(){ int lena=strlen(s); n[0]='$'; n[1]='#'; int j=2; for(int i=0;i<lena;i++){ n[j++]=s[i]; n[j++]='#'; } n[j]='\0'; return j;}int...

2020-04-27 11:20:22 150

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除