![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
POJ
穷源溯流
路很长,尽管走便是。
展开
-
POJ 2796 Feel Good(单调栈)
const int N=1e5+5; int n,m; int i,j,k; int a[N]; ll sum[N];int main(){ while(~sd(n)){ forn(i,1,n) sd(a[i]); forn(i,1,n) sum[i]=sum[i-1]+a[i]; stack<int> s; int l=1,r=1; ll ans=-1;...原创 2021-03-27 09:33:43 · 144 阅读 · 0 评论 -
POJ 3494 Largest Submatrix of All 1’s(思维+单调栈)
建议解决完blog这个问题后在尝试const int N=5e5+5; int n,m; int i,j,k; int a[N]; int d[N];int main(){ while(~sdd(n,m)){ int ans=0; for(int j=1;j<=n;j++){ for(int i=1;i<=m;i++){ in...原创 2021-03-22 18:16:10 · 157 阅读 · 0 评论 -
POJ 2559 Largest Rectangle in a Histogram(单调栈)
const int N=5e5+5; int n,m; int i,j,k; int a[N];int main(){ while(~sd(n),n){ stack<int> s; for(int i=1;i<=n;i++) sd(a[i]); a[++n]=-1; ll ans=0; for(int i=1;i<=n;i++){ ...原创 2021-03-22 17:39:56 · 80 阅读 · 0 评论 -
POJ 2774 Long Long Message(后缀数组)
求两个字符串的最长公共序列将两个字符连接起来,求 height 数组,如果排名为i 的后缀与排名为 i-1 的后缀不属于同一个字符串即为答案,求答案的最大值const int N=2e5+5; int n,m; int i,j,k; char s[N],a[N]; int tp[N],tax[N],rk[N],sa[N]; int ht[N];bool cmp(int rk[],int x,int y,int w){ re...原创 2021-03-17 21:15:23 · 144 阅读 · 0 评论 -
POJ 1816 Wild Words(Trie+DFS)
题目比较毒瘤给出 n 个模式串,m 个单词,查询每一个单词与哪一个模式串匹配,其中 ?可以表示任意一个单词,* 可以表示为 空或者任意多个单词一看到这个题不应该向 AC 自动机考虑吗?发现题目中单词的数目不多,且单词的长度很小,故在查询的时候采用暴力的方式,先利用模式串建好字典树在查询过程中利用 dfs 的方式,但是要注意的是遇到 * 之后,由于其可以为空,所以单词的长度可以不再增加,当然也可以表示剩余的所有字母但是这样还是不对,在 dfs 过程中不可以 return:...原创 2021-02-19 16:02:12 · 163 阅读 · 0 评论 -
POJ 2408 Anagram Groups(Trie+思维)
给出多个单词,每个单词的长度没说(差评),每个单词只要所有的字母相同可以认为是同一个单词,将所有的同一个单词放入集合中,输出前 5 个集合数量最大的集合注意:若一个集合中只有一个单词 word,不能说明 word 只出现过一次题目不难,但是处理起来有几个坑点题目可以用 map+set 过,但是常数较大,我们采用字典树,将每一个单词在树上的标记作为桶 将不同的字符串转化为字典序最小的,可以采用快排,这里采用基数排序 可能是 set 里面有 const 修饰的形参,所以 cmp 函数...原创 2021-02-16 16:43:55 · 327 阅读 · 0 评论 -
POJ 1451 T9(Trie+思维)
DescriptionBackgroundA while ago it was quite cumbersome to create a message for the Short Message Service (SMS) on a mobile phone. This was because you only have nine keys and the alphabet has more than nine letters, so most characters could only be en原创 2021-02-15 14:36:52 · 218 阅读 · 0 评论 -
POJ 3630 Phone List(Trie)
有 t 组测试,每组测试有 n 个 01 字符串,查询每个字符串是否是其他字符串的前缀题目利用字典树应该是可以在插入过程中得出答案const int N=1e5+5; int n,m; int i,j,k; char s[N][15]; int t[N][10]; int sum[N],tot=0;int idx(char ch){ return ch-'0'; }void insert(char *s,int rt){ ...原创 2021-02-15 10:48:51 · 154 阅读 · 0 评论 -
POJ 2001 Shortest Prefixes(Trie)
给出多组字符串,求每一个字符串可以唯一表示的前缀利用字典树,对于每一个前缀标记出现的次数,遇到前缀出现次数为 1 时返回const int N=2e4+5; int n,m; int i,j,k; char s[N][25]; int t[N][26]; int sum[N],tot=0;int idx(char ch){ return ch-'a'; }void insert(char *s,int rt){ for(...原创 2021-02-15 10:13:28 · 145 阅读 · 0 评论 -
POJ 1113 && HDU 1348 Wall(凸包周长)
给出 n 个点,以及数 L,要求修一面城墙花费最少的资源,使得每个点到达城墙的距离全都大于 L求出这 n 各点所形成的凸包的周长+以 L 为半径的圆的周长即可const int N=1e4+5; int i,j,k; int n,m,t; struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y){} }p[N],ch[N]; ...原创 2020-11-24 14:19:59 · 166 阅读 · 0 评论 -
POJ 3348 Cows(凸包面积)
const int N=1e4+5; int i,j,k; int n,m,t; struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y){} }p[N],ch[N]; typedef Point Vector; Vector operator+(Vector a,Vector b){ return Vector(a.x-b.x,a.y-...原创 2020-11-24 13:51:04 · 201 阅读 · 0 评论 -
UVALive 3263 && POJ 2284 That Nice Euler Circuit (欧拉定理+计算几何)
给出 n 个点,将其连成一个回路,问这些线段将平面分成几部分根据欧拉定理,平面数 ans=边数-顶点数+2所以只需要利用计算机和基础计算顶点数和边数即可因为所连的线是由给定的顺序产生的,所以可以从前面按照顺序枚举,两两相邻的点作为一条边,判断是否产生交点由于可能产生多线共点的情况,再进行去重。最后判断每一个点再几条边上,这样线段内的一个点将一条线段分为两条线段const int N=300+5; int i,j,k; int n,m,t; ...原创 2020-11-22 11:54:06 · 156 阅读 · 0 评论 -
POJ 3904 Sky Code(gcd=1 的容斥原理)
给出 n 个数,选出 4 个数,要求他们的 gcd =1,问有几种选择这个题不大好想,想对了也不一定码对了这个题一看就不能按照题意来硬求,我们考虑一下反面,从这 n 个数任意选出 4 然后减去 gcd!=1 的情况但是计算选出 4 个数 gcd!=1 的情况好像也不是那么简单可以发现任意四个数的 gcd 为其中的这四个数的因数 而且每个数都不超过 1e4 ,所以我们对其进行质因数分解 在利用容斥原理枚举每个 a[] 出现的因数 x,记录每个因数 x 出现的次数( 任选 4...原创 2020-11-09 23:06:50 · 478 阅读 · 0 评论 -
POJ 1091 跳蚤(质因数分解+容斥原理+思维)
这个题挺考验思维的这个题目需要转化一下题意,假设有 n 张卡片由于向左向右并没有什么区别,所以题目可以转化为: a[1]*x[1]+a[2]*x[2]+……a[n]*x[n]+m*x[n+1]=1那么需要 gcd(a[1],a[2],……a[n],m) =1 才能满足题意,……(可能很多大佬一眼就能看出来,但是还是证明一下吧)证:当 gcd(a[1],a[2],……a[n],m) != 1 时, 方程两边可以同时除以 gcd,即方程变为: a[1]/gcd*x[1]+a[2]/gc...原创 2020-11-07 12:05:38 · 278 阅读 · 0 评论 -
POJ 1704 Georgia and Bob(Nim 博弈)
有 n 颗棋子,给出 n 颗棋子位于数轴上的坐标,G 先走,判断谁赢Nim 博弈的变形,如果 n 为偶数,那么每两个棋子之间网格可以看作一堆硬币,如果 n 为奇数,则将第一个棋子与之前的网格看作第一堆硬币const int N=1e4+5; int i,j,k; int n,m,t; int a[N]; int p[N];int main(){ //IOS; rush(){ sd(n); for...原创 2020-11-04 23:35:40 · 168 阅读 · 0 评论 -
POJ 2348 Euclid‘s Game(博弈论)
给出两个整数 a,b,每次用较小的数去减较大的数,例如 ,当 a>b 时,a=a-k*b完成运算之后 a保持大于等于 0,问当某一数字变为 0 时,另一方输默认a>b ,a=a-k*b有余数 res=a-k*b,因为在其中的状态实在是太多了,特殊考虑当 a-b<b时,这一步没有任何余地,也就是 k 只能取 1,那么我们只能通过递减的方法判断谁赢但是当 k>1 时,此时 a 可以减去多个 b,此时一定可以赢,因为当减去 k*b 会输的时候,这样只需要减...原创 2020-11-04 13:00:48 · 232 阅读 · 0 评论 -
POJ 2603 Brave balloonists(质因子分解)
给出 10 个数,输出这 10 个数乘积的因子个数% 10 的结果这 10 个数 a[1]*a[2]*……a[10] 分解因子后,记fact(a[i])为将 a[i] 进行分解后的算术表达式, fact(a[1])*factor(a[2])*……fact(a[10])所以统计其中质因子 p[i] 总的个数及其幂次 c[i] ,答案为 (1+c[1])*(1+c[2])*(1+c[3])*…… int i,j,k; int n,m,t; int a[10];...原创 2020-11-02 22:25:29 · 182 阅读 · 0 评论 -
POJ 2484 A Funny Game(博弈论)
有 n 个硬币,每次可以将 1 枚硬币翻面,或者将相邻的两个翻面,问最后谁无法翻面谁输?只要存在 2个以上的硬币 后手赢,因为后手可以将环分成两个相等的段,然后重复先手的动作,使两边的段一直保持相等的状态,所以后手会拿到最后的硬币 int i,j,k; int n,m,t; int main(){ //IOS; while(~sd(n),n){ if(n<=2) puts("Alice"); else pu...原创 2020-11-02 20:53:44 · 194 阅读 · 0 评论 -
POJ 1845 &&AcWing 97. 约数之和(费马小定理求逆元)
根据约数和的推论知道:A 分解质因数后为,那么可以分解成如下的形式对于每一个括号内的式子,我们可以利用等比数列求和公式来完成例如第一个括号可以等价为由于 mod=9901 为质数,所以很容易想到利用 费马小定理 去求解逆元,但是由于 p-1 可能会大于 mod ,所以 p-1 可能为 mod 的倍数关系,所以需要进行特判根据公式:其实也很好想,对于每一个括号内的 p ,对其求余数,都为 1,所以累计求和为 1*Ci+1最后不要忘记是求解就好,最后加个特判...原创 2020-10-29 16:06:53 · 204 阅读 · 0 评论 -
POJ 3070 Fibonacci(矩阵快速幂)
矩阵快速幂入门题F[n] 为第 n 个斐波那契数,F[n]=F[n-1]*1+F[n-2]*1,F[n-1]=F[n-1]*1+F[n-2]*0所以,利用矩阵可化简为其中转移矩阵的个数有 n-2 个,而且 F[2]=F[1]=1所以只需要计算转移矩阵的 n 次方,再将第一行的两个数相加即可#include <iostream>#include <cstdio>#include <cstring>#define N 2+5#de...原创 2020-10-25 11:02:50 · 143 阅读 · 0 评论 -
POJ 2417 Discrete Logging(Baby-Step,Giant-Step)
给出 p,b,n,p 为质数,求中 x 的最小解,如果没有输出 no solution int n,m,t; int i,j,k; //int a[N];ll mul_mod(ll a,ll x,ll mod){ a%=mod; ll ans=0; while(x){ if(x&1) ans=(ans+a)%mod; x>>=1; a=(a+a)%mod; }...原创 2020-10-24 09:41:48 · 145 阅读 · 0 评论 -
POJ 2115 C Looooops(一元线性同余方程)
输入 A,B,C,k,判断 for (variable = A; variable != B; variable += C) 循环执行几次题目转化为 (ans*C+A)=B(mod 2^k),求解一元线性同余方程裸题ll ex_gcd(ll a,ll b,ll &x,ll &y) //ax+by=gcd(a,b){ ll gcd=a; if(!b) x=1,y=0; else { gcd=ex_gcd(b,a%b,y,x...原创 2020-10-20 17:01:21 · 145 阅读 · 0 评论 -
POJ 2891 Strange Way to Express Integers(中国剩余定理)
题意:题目给定多个式子,xai(mod mi),因为不确定其中 ai,mi 的关系,也就是说不清楚是否互质,所以,例如有两个式子x=r1+k1*a1 -----(1)x=r2+k2*a2 -----(2)求 x ,根据扩展欧几里得原理,两式相等得:k1*a1-k2*a2=r2-r1,其中要满足r2-r1=k*gcd(a1,a2)所以利用函数 ex_gcd 求解 x 的答案,进而求得 k1 的值,这样 (1) 式就有了答案,因为 (1)式中的 x 的值同样要...原创 2020-10-18 12:14:09 · 590 阅读 · 1 评论 -
POJ 1006 Biorhythms(中国剩余定理)
根据题意,在同一天出现,满足 3 个 a[i]%xb[i] 的关系所以利用中国剩余定理,因为 23,28,33 互质,所以直接求解逆元即可。ll mod=21252; int n,m,t; int i,j,k; //ll a[N],b[N];ll ex_gcd(ll a,ll b,ll &x,ll &y) //ax+by=gcd{ ll gcd=a; if(!b) x=1,y=0; else { ...原创 2020-10-17 20:36:08 · 253 阅读 · 0 评论 -
POJ 1061 青蛙的约会(扩展欧几里得)
x+nt-(y+mt)=kL -> kL+t(n-m)=x-y这样就变成了我们熟悉的 ax+by=c 的形式,其中 k,t 为未知量利用扩展欧几里得求解之后,因为 ax+by=k*gcd两边同时除以 gcd 所以变为 a' x+b' y=k此时 a,b 互质,相比于真正的欧几里得 ax+by=1 得到的答案 x 的值应扩大 k 倍最后求解最小的正数 x 的解即可ll ex_gcd(ll a,ll b,ll &x,ll &...原创 2020-10-17 18:30:34 · 184 阅读 · 0 评论 -
POJ 3370 && HDU 1808 Halloween treats (鸽巢原理)
有 m 个小孩,n 个数,每个数代表糖果的数量,是否能够拿任意数量的糖果 sum,使得 sum%m==0 ,如果有输出下标 i(可能有多组输出样例,输出任意一种),不能的话输出 no sweetsconst int N=1e5+5; int n,m,t; int i,j,k; int a[N]; int sum[N] , pos[N]; void init(){ ms(sum,0); ms(pos,-1); sum[0...原创 2020-10-15 10:30:48 · 170 阅读 · 0 评论 -
POJ 2356 Find a multiple(鸽巢原理)
有 n 个数,现在让你从中取 m 个数,(m 可以自己任意给定),要求 m 个数的和为 n 的倍数,最后输出 m ,再按照数的大小,升序输出这 m 个数对初始数组排序后,求其前缀和对 n 取余,这样前缀和有 n 个数,根据鸽巢原理, 前缀和数组 sum[] 下标范围从 [0,n]这样一定有两个前缀和 sum[i] ,sum[j] 相等,这样这 m 个数就是 a[i+1,j] , 这 m 个数恰好可以被 n 整除const int N=1e4+5; int n,m...原创 2020-10-15 10:10:09 · 171 阅读 · 0 评论 -
POJ 3237 Tree(边树剖)
这个题比较难是因为,有一个区间取反操作,(好吧,还是我菜)求一个区间的最大值,若区间内所有的数都变成原来的负数形式,那么其最小值就成为了最大值还有一点就是在树剖中的点权变为了边权,因为这样,在单边修改的时候,要找对应边上深度较大的点(代码中的注释 1),在区间修改时,要忽略掉他们的 LCA ,因为在退出 while 循环后,x,y 两点跳到同一条重链上,深度最小的那个点就是 LCAconst int N=1e5+5; int n,m,t; int i,j,k;...原创 2020-10-11 10:20:31 · 218 阅读 · 0 评论 -
POJ 2528 Mayor‘s posters(线段树+离散化)
有 n 张海报,每张海报覆盖一段区间,后面的海报会覆盖前面的海报,求最后有多少张海报可以在墙上被看见(看见一点也算)const int N=1e5+5; int n,m,t; int i,j,k; //int a[N]; Pair p[N<<2]; vector<int> v; struct Node { int l,r; int flag;//被第几张海报覆盖 ...原创 2020-10-11 07:53:35 · 193 阅读 · 0 评论 -
POJ 2449 Remmarguts‘ Date(A* 第 k 短路)
题意:有 m 条有向边,给出终点 e,起点 s求从 s 出发到达 e 的第 k 条最短路径这是我第一次写启发式搜索的题目,大体思路应该是,先用 dij+队列优化 跑一边,将 e 作为起点,若 从 e 到达 s 的距离为 inf ,那么说明存在环,这样就不需要向下找了若可以在有限的距离内到达,再继续寻找就好const int N=1e3+5; int n,m,t; int i,j,k; int a[N]; struct edge ...原创 2020-10-10 11:20:33 · 182 阅读 · 0 评论 -
POJ 2104 K-th Number(主席树)
求任意区间第 k 大的元素const int N=1e5+5; int n,m,t; int i,j,k; int a[N]; vector<int> v; int root[N],cnt=0; struct Node { int l,r; int sum; }T[N*40];int get_id(int x){ return lower_bound(v.begin...原创 2020-10-02 23:11:42 · 199 阅读 · 0 评论 -
POJ 2752 && 1458:Seek the Name, Seek the Fame
const int N=1e6+5; int n,m,t; int i,j,k; //int a[N]; char s[N]; ull power[N]; ull h[N]; const int b=131;bool C(int x,ull val){ int p=n-x; if( h[n]-h[p]*power[x]==val ) return true; return false;}int main(...原创 2020-09-14 17:02:25 · 227 阅读 · 0 评论 -
POJ 3176 Cow Bowling
有一个金字塔,一颗球只能滚到他的下面左边的那一个或右边的那一个,问经过的最大数值总和是多少经典 DP:dp[i][j] 表示到达第 i 层的第 j 个数字后的最大总和dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j]const int N=350+5; int n,m,t; int i,j,k; int a[N][N]; int dp[N][N]; int main(){ //IO...原创 2020-08-12 22:21:01 · 116 阅读 · 0 评论 -
POJ 3268 Silver Cow Party(SPFA)
有 n 个点 m 条单向边,起点为 x,问从每一个点 i 到 x 的距离 + 从 x 到 i 的距离最大是多少开始建一个有向图,再将有向图的起点与终点置换,两次以 x 为起点的 SPFA 即可const int M=1e5+5;const int N=1000+5; int n,m,t; int i,j,k; vector<Pair> E[M]; bool inq[N]; int d[N]; void init()...原创 2020-08-09 14:58:04 · 165 阅读 · 0 评论 -
POJ 2387 Til the Cows Come Home(带 vector 的 SPFA)
const int N=1000+5; int n,m,t; int i,j,k; vector<Pair> E[N]; bool inq[N]; int d[N]; void init(){ for(i=0;i<N;i++) { E[i].clear(); inq[i]=0; d[i]=inf; }}void SPFA(int s){ queue...原创 2020-08-08 22:10:44 · 172 阅读 · 0 评论 -
POJ 3259 Wormholes(spfa 判断负环)
有 n 个点,m 条无向边,t 条有向边,判断图是否存在负环const int N=1e4+5; int n,m,t; int i,j,k; int head[N],all=0; int d[N]; //点 i 到起点的距离 int cnt[N]; //点 i 的入队次数 bool vis[N];struct node{ int to,next; int w;}G[N];void add(int u,int v,...原创 2020-08-07 11:29:12 · 203 阅读 · 0 评论 -
POJ 2253 Frogger(dij)
有两只青蛙,分别在第 1,2,个位子上,其他的位子都是石头,现在青蛙 1 出发找 2,但是他的体力有限,所以要求你寻找一条路径,使得能够到达 2 号点的最短路径 并且 相邻的两块石头的最大距离尽可能的短const int N=200+5; int n,m,t; int i,j,k; double d[N];//源点到任一点 i 的最长距离 double f[N][N]; bool vis[N];int x[N],y[N];double dis(i...原创 2020-08-06 18:03:13 · 263 阅读 · 0 评论 -
POJ 3522 Slim Span(Kruskal)
有 n 个点,m 条边,求 n 个点连接起来时最大边与最小边差的最小值按照边的权值进行排序,这样只需要遍历每 n-1 条边,寻找出答案即可const int N=2e5+5; int n,m,t; int i,j,k; int fa[N];struct node{ int u,v,w;}G[N];bool cmp(node a,node b){ if(a.w!=b.w) return a.w<b.w; if(a.u...原创 2020-08-05 17:34:46 · 195 阅读 · 0 评论 -
P1886 滑动窗口(单调队列)
我们以求最大值为例,构造一个单调递减的序列,我们要求队尾尽量大,假设 ai<aj && i<j,那么 aj 能放到队列尾部,因为此队列队首元素为我们要求的最大值,区间再向右移动时,永远不可能是 ai 的值,换句话说,aj 的持续时间比 ai 强,且更有可能成为最大值const int N=1e6+5; int n,m,t; int i,j,k; int a[N]; int q[N]; int id[N];void...原创 2020-07-28 11:42:25 · 228 阅读 · 0 评论 -
POJ 2800 && UVa 1363 Joseph‘s Problem(分块求余)
给出 n,k 求 (k mod i)原创 2020-07-25 15:01:45 · 146 阅读 · 0 评论