自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)

原创 UVALive 4108(维护区间内以h为最高长度的左右区间范围长度)

UVALive 4108#include <bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=1e5+10;struct node{ int mx,col;}tree[maxn<<2];int n;int ans=0;void pushdown(int rt){ if(tree[rt].col>=tree[rt<<1].col){ tree[rt&l

2020-08-16 21:26:08 29

原创 The Chocolate Spree CodeForces - 633F(树形dp求树中两条不相交路径上点权和最大值)

CF 633F#pragma GCC optimize(3, "Ofast", "inline")#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL mod=998244353;const int maxn=1e5+10;LL w[maxn];vector<int> G[maxn];int n;LL f[maxn][2];LL g[maxn],h[maxn],down[

2020-08-12 22:20:15 38

原创 2020杭电多校七(Game)

hdu6850题解:从外层依次删去最远的点对,最后删到只剩余一个点的时候判断该点是否第一个点,是的话就必败,否则就必胜,因为如果先手一开始处于最远点对上的点的时候,那么每次先手均可在本层走走远点对距离,那么后手要想走就必须走更远的距离,那么后手就只能向上一层走,但是当后手向上走的时候他一定会位于最远的点对上的点,此时主动权又在先手的手里#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL mod

2020-08-12 16:28:00 55

原创 Sum HDU - 4407(查询时用容斥)

hdu4407题解:如果我们暴力去针对每一次查询就会超时,又发现题目中的修改最多不过1000次,所以我们在查询一段区间的时候可以先求出x到y这一段连续区间的等差数列的和,然后减去该区间和p互素的数的和(该部分值我们可以用先把p的素因子找出来然后在x到y区间容斥一下)#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL mod=1e9+7;const LL maxn=4e5+10;LL pri

2020-08-05 21:40:52 26

原创 Square-free integers SPOJ - SQFREE(求小于n的且没平方因子数的个数(n可到1e14))

Square-free integers SPOJ - SQFREE普通题解分块优化版(针对于n/(i*i)的分块)(i连续)#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL mod=1e9+7;const LL maxn=1e7+10;LL prime[maxn],tot,vis[maxn];LL mu[maxn];LL n;void init(){ tot=0;

2020-08-05 16:59:17 29

原创 C - Mophues HDU - 4746(莫比乌斯反演+分块)

hdu4746题解#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL maxn=5e5+10;LL c[maxn][20];LL prime[maxn],vis[maxn],tot,mu[maxn],sum[maxn];LL cnt[maxn];LL n,m,p;void init(){ tot=0; vis[1]=1; mu[1]=1; for(

2020-08-02 21:51:28 55

原创 C. Feast Coins(背包求方案数)

ICPC Arab Collegiate Programming Contest 2014 C题题解:转化为因子考虑,因为每一种选取相同的个数#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL maxn=5005+10;const LL maxm=55;const LL mod=1e9+7;LL S,N;LL V[maxn],C[maxn];LL f[maxm][maxn];in

2020-08-02 16:30:22 47

原创 2366 砍树(树形dp)

51nod 2366题解:我们定义dp[i][0]表示以i为根节点的子树白色点比黑色点最多的个数(可能会出现负数,具体实现看代码,dp[i][1]同理)#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=1e5+10;vector<int> G[maxn];int c[maxn];int n;int dp[maxn][2];int res;void dfs(

2020-07-28 21:53:39 33

原创 KiKi‘s K-Number HDU - 2852(树状数组+二分在整个数组里查找比x大的第k个数)

hdu2852题解:我们的c[i]维护的是值为i的个数,每次我们查询值小于i的数的个数我们可以借用树状数组里查询前缀和的思想进行query(i)便可,之后我们就可以在树状数组上进行二分。#include<bits/stdc++.h>//emuB167202003070038using namespace std;typedef long long LL;const int maxn=1e5+10;int c[maxn];int sum;void init(){ for(

2020-07-22 23:51:59 18

原创 51nod (1398 等公交)求期望

51nod 1398题解:我们开一个数组dp[i]表示第i时刻有车出发的概率为多少,我们可以先将数组求到dp[s],然后我们用i小于s时刻的dp[i]去求下一次时间大于s时有车出发的概率即可,然后将其概率乘上一个时间差(i+t[j]-s),具体实现见代码#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=2e5+10;double dp[maxn];//dp[i]表示在第i时刻有

2020-07-21 10:13:36 22

原创 51nod (2534,dp)

51nod 2534题解:本题我们定义dp[i][0]表示两个人当前都走过前i个点并且最后一个点第一个人走两个i中的其中一个位置的总和最小值,dp[i][1]类似。具体实现看代码#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=2e5+10;const LL mod=998244353;const LL inf=0x3f3f3f3f;LL dp[maxn][2];int

2020-07-19 10:45:52 38

原创 51nod 3061 (最大生成树+树上倍增求树上任意两点路径的边权最小值)

51nod3061题解:本题我们会发现如果询问的两点能够相互到达的时候,答案一定诞生在最大生成树的边上,为何?因为如果我们的答案不在最大生成树的边上,我们一定就可以取最大生成树上的边来构造更优的解,接下来就是树上倍增求两点之间的边权最小值,(其实和求两点的LCA是一个套路)具体实现见代码#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=1e4+10;const int inf=

2020-07-12 23:41:53 72

原创 The 2019 ICPC China Nanchang National (G题)

G题题解:建图+tarjan(有向图)#include<bits/stdc++.h>#define LL long longusing namespace std;const LL maxn=2e5+10;vector<int> G[maxn];struct node{ int id; int x;}col[maxn][4];int n,q;int dfn[maxn],low[maxn],cnt;stack<int> st;int

2020-07-10 22:05:02 22

原创 CodeForces - 600E(树上启发式合并)

CF600E题解:维护两个map,见代码#include<bits/stdc++.h>using namespace std; typedef long long LL;const LL maxn=1e5+10;int n;LL c[maxn];map<int,int> cnt[maxn];//cnt[x][i]=ko表示x节点子树颜色为i出现ko次 map<int,LL> sum[maxn];//sum[x][i]=ko表示x节点子树颜色出现次数为i次

2020-07-08 23:40:27 18

原创 The 2019 ACM-ICPC China Shannxi Provincial Programming Contest( J. And And And)

J题题解:该题有好多种做法,我的比较low,因为正向的去推是不可行的,我们可以反向考虑每一条边权异或值为0的路径所产生的贡献,我们先把整棵树的根节点固定为1,然后我们可以考虑将满足条件的路径再细分为两类:一类是该条路径的LCA不是它们中的一个,另一类是该条路径的LCA是它们中的其中一个,(之所以这样分类,是因为便于我们进行dfs统计贡献),对于第一类路径我们可以在dfs所有子树之后再将mp[pre]+=siz[u],这样可以按照dfs的便利顺序做到不重不漏的统计所有情况,对于第二种情况我们可以枚举深度较深

2020-07-07 23:21:26 42

原创 poj3764(树上边权异或+转化为字典树上找两个值使其异或和最大)

poj3764题解:先预处理每个节点到根节点的边权异或和,然后将这些值丢进字典树里,最后转化为找两个数使其异或值最大。数组开到3e5,而且要链式存图,否则会有各种WA和TLE#include <iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<string>#include<vector&g

2020-07-07 12:25:01 63

原创 异或的路径(牛客网)

异或路径+位运算+考虑贡献题解:我们要求所有点对构成的所有路径的异或权值总和,肯定不能暴力,我们可以知道,先搞一个数组d[i]表示i节点到根节点1的路径上边权异或和,所以对于一个点对(u,v),我们知道u,v之间的边权异或和=d[u]^d[v]因为它们公共的部分为0了,就无影响,然后我们再考虑如何统计所有路径的总和,我们考虑枚举一个点v,我们可以对d[v]的每一位二进制位考虑,如果d[v]的某一位为0,我们就看有多少其它节点,其该对应位上为1,如果d[v]的某一位为1,也类似,因此我们还需要定义一个数组

2020-07-07 10:22:29 45 2

原创 hdu5416(求树上有多少对点对使其路径上的结点的异或值为查询值S)

HDU5416题解:我们先预处理每个节点i到根节点1的路径上异或值d[i],然后我们发现两个节点i,j的路径上边权的异或值为d[i]^d[j],因为他们俩距离根节点重复的部分可以异或成0#include <bits/stdc++.h>using namespace std;typedef long long LL;const LL mod=1e9+7;const LL maxn=1e6+10;LL n,q;struct node{ LL to; LL w;};

2020-07-07 00:12:22 28

原创 HDU - 1796(容斥原理+特殊情况0)

hdu1796题解:在dfs之前不要刻意删去一些数(这些数是其它数的倍数),注意0,在输入的时候就删去它.#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=2e5+10;LL n;int m;LL a[25],b[25];int cnt;LL ans=0;void dfs(int pos,LL flag,LL t,int f){ if(t>n)retu

2020-07-06 12:17:07 19

原创 P2567(容斥原理+递归写法(类似于背包的递归写法))

P2567题解:先把幸运数全部筛出来,然后再把有些数是其他数的倍数的那些数再筛出来,接下来我们就可以容斥了,递归的时候从大的数先搞,因为这样我们对于一些超过R的数就可以尽快的跳出来,递归写法类似于背包问题的写法,每次我们对于当前的数可以有两种选择(取或 不取)#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=3e3+10;LL L,R;LL a[maxn],b[maxn];

2020-07-05 17:38:23 19

原创 The 2019 ICPC Asia Shanghai Regional Contest(重现赛)H题

题解:二分+贪心+树形dp+vector<>回溯时排序(时间复杂度不会爆)#pragma GCC optimize(2)#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=1e5+10;LL dp[maxn][2];LL n,k;vector<LL> G[maxn];LL w[maxn];struct node{ LL p1,p2;

2020-07-02 10:55:47 28

原创 数一数(牛客网kmp)

kmp+思维题解:仔细想想你会发现,当你求第i个字符串的时候,如果它不是所有字符串里最短的那个,那结果一定为0(因为是累乘,有一个为0全都为0),再然后你会发现,所有最短字符串的结果应该是相同的,因为如果两个最短字符串的结果不同,那么他们肯定不一样,但是如果不一样结果就会为0,所以其他所有最短字符串的结果均相同,我们只需要用最短的字符串去对所有的字符串跑一遍kmp即可,中间累乘不要忘记,还有取模,注意开long long.#include<bits/stdc++.h>using names

2020-06-30 22:04:06 31

原创 栗酱的数列(牛客网kmp)

题解:转化一下:(a[i]+b[i]-a[i+1]-b[i+1])%k==0#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=2e5+10;int a[maxn],b[maxn];int nxt[maxn];int n,m,k;int P[maxn],S[maxn];//(a[i]+b[i]-a[i+1]-b[i+1])%k==0void getnext(int s[m

2020-06-30 18:16:06 28

原创 Just A String(牛客网,kmp)

Just A String(kmp应用)题解:枚举后缀,然后按照kmp匹配的模板题去匹配所有的前缀,用col[]数组来存最长的匹配成功的公共部分:#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=2005;char s[maxn];int nxt[maxn];int col[maxn];int n;void getnext(char str[maxn]){ i

2020-06-30 17:23:54 57

原创 Portal HDU - 3938(并查集+最小生成树的思维应用)

hdu3938题解:本题题意是对于每一个查询,会给你一个值L,让你找图中有多少点对(u,v),使得该点对之间的所有的路径上的最大边权的最小值小于L,针对此类计数统计问题,我们一般要对于每一条边来考虑其贡献,假设我们用cnt[i]来维护每一个并查集合里的元素个数,当我们新加入一条边的时候,假设该条边的权值为w,在所有的查询里,L小于w的查询都不会由该边产生贡献了,前提查询和边都要先按边权排个序。#include<bits/stdc++.h>//(a+b)^n+(-a+b)^n可以保留a的次幂为

2020-06-26 17:36:11 29

原创 HDU 1811(拓扑排序判环+并查集缩点)

题解:处理相等的情况我们需要把相等的两个及其更多的点看成一个点(用并查集搞,用它们的祖先节点代表整个整体),然后建图跑拓扑排序,我们可以更具队列里的元素的个数来判断该图是不是关系信息完整,如果最后队列里还有元素就说明图中存在环(环中任意两个元素可以互相到达)#include<bits/stdc++.h>//(a+b)^n+(-a+b)^n可以保留a的次幂为偶数using namespace std;typedef long long LL;const LL mod=1e9+7;cons

2020-06-26 11:43:42 16

原创 2017(西安赛区)网络赛(B题)

题解:#include<bits/stdc++.h>//(a+b)^n+(-a+b)^n可以保留a的次幂为偶数using namespace std;typedef long long LL;const LL mod=1e9+7;const int maxn=1e6+10;int read() { int X=0,w=1; char c=getchar(); while (c<'0'||c>'9') { if (c=='-') w=-1; c=getch

2020-06-24 21:43:39 35

原创 https://ac.nowcoder.com/acm/problem/19782(换根树形dp求包含某个点的连通点集的数量(注意对0的讨论))

参考博客:#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL mod=1e9+7;const int maxn=1e6+10;int read() { int X=0,w=1; char c=getchar(); while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); } while (c>='0

2020-06-24 18:07:39 54

原创 https://ac.nowcoder.com/acm/problem/13249(树形dp)

牛客:黑白树题解:本题我们首先会意识到叶子结点必须要选,难在递归回溯的时候如何贪心使其结果最优,当我们选了一个结点,那么每当我们再向上回溯一层的时候,就会消耗该所选结点的一个值,即k[i]-1,而且每次我们还要不断更新通过该节点向上最远到达的长度,如果上一次选的结点已经消耗完,我们就从该节点子树的其他结点再找一个最大的k的结点来继续向上延续,主要是代码不好实现,在这里我们需要维护两个数组。#include<bits/stdc++.h>using namespace std;typedef

2020-06-24 14:04:13 40

原创 https://ac.nowcoder.com/acm/problem/14269(Sum 牛客网)

位运算+组合数学+树状数组:题解:我们如果直接计算操作2的话会很困难,我们可以直接考虑一个数的二进制位对答案做出的贡献,显然二进制位为0时就不会有任何贡献,当我们知道所有的数在二进制第i位上的总数目为x时,我们就可以直接计算出所有的子集所做出的贡献,我们会想到,会有2的x次幂减1个子集,然后再乘上个位权(1LL<<i),有一个地方不要忘记,就是每次对于1操作,我们不要忘记更新a数组里的元素:#include<bits/stdc++.h>typedef long long LL;

2020-06-22 21:47:12 116

原创 https://ac.nowcoder.com/acm/problem/14136(牛客网 监视任务)

题目链接:题解:本题我们不能一上来就用树状数组来统计每一位的贡献,我们需要先对区间进行一个排序,先按照区间的右端点由小到大排序,再按照区间的左端点从小到大排序,再按照区间的k值从大到小排序。坑点是再加入值的时候不能用连续的区间修改,因为我们要加入的一些位置可能离散而不连续#include<bits/stdc++.h>typedef long long LL;using namespace std;const int maxn=1e6+10;const LL mod=1e9+7;co

2020-06-22 17:28:39 129

原创 https://ac.nowcoder.com/acm/problem/13947(牛客网)

Contest:链接:https://ac.nowcoder.com/acm/problem/13947来源:牛客网n支队伍一共参加了三场比赛。一支队伍x认为自己比另一支队伍y强当且仅当x在至少一场比赛中比y的排名高。求有多少组(x,y),使得x自己觉得比y强,y自己也觉得比x强。(x, y), (y, x)算一组。输入描述:第一行一个整数n,表示队伍数; 接下来n行,每行三个整数a[i], b[i], c[i],分别表示i在第一场、第二场和第三场比赛中的名次;n 最大不超过200000输

2020-06-22 15:10:17 47

原创 The Trip On Abandoned Railway(牛客网)

区间加等差数列+单点修改+单点查询:参考博客链接#include<bits/stdc++.h>typedef long long LL;using namespace std;const int maxn=1e5+10;const LL mod=1e9+7;const double pi=acos(-1.0);inline LL read(){ LL X=0; bool flag=1; char ch=getchar(); while(ch<'0'||ch>'9

2020-06-22 10:52:26 19

原创 #10177. 「一本通 5.5 例 3」修剪草坪

libreoj10177#include<bits/stdc++.h>typedef long long LL;using namespace std;const int maxn=2e5+10;const LL mod=1e4+7;const double pi=acos(-1.0);LL n,k;LL a[maxn];LL dp[maxn];LL sum[maxn];int st[maxn];int main(){ scanf("%lld%lld",&amp

2020-06-22 10:48:21 24

原创 #10093. 「一本通 3.5 练习 1」网络协议(tarjan+度数分析)

libreoj10093:#include<bits/stdc++.h>typedef long long LL;using namespace std;const int maxn=1e3+10;const LL mod=998244353;inline int read(){ int X=0; bool flag=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar

2020-06-20 09:07:33 37

原创 #10092. 「一本通 3.5 例 2」最大半连通子图(tarjan+DAG上dp)

libreoj10092:题解:缩点之后借用拓扑排序的流程对DAG进行dp(类似于求最短路的方案数)#include<bits/stdc++.h>typedef long long LL;using namespace std;const int maxn=1e5+10;int n,m,x;inline int read(){ int X=0; bool flag=1; char ch=getchar(); while(ch<'0'||ch>'9') {if(ch

2020-06-19 17:59:42 33

原创 #10091. 「一本通 3.5 例 1」受欢迎的牛(强联通+度数结论)

libreoj10091:题解:首先简化一下,若欢迎关系图是一个DAG(有向无环图),则只要统计每个点的出度,出度为0的点即为受所有牛欢迎的点且只有唯一一个,因为若存在两个以上出度为0的点,它们之间不可能互相欣赏,满足不了题意。但实际情况可能存在环,环上的顶点互相之间欣赏。此时,若环外的一头牛欣赏环内某头牛,则它必定欣赏环内所有牛;而若环内某头牛欣赏环外一头牛,则环内所有牛也必定欣赏这头牛。则我们把一个环缩成一个新点,记录这个新点的大小(环的顶点数),这样最后还是等价为DAG,最后统计一下出度,若只有

2020-06-18 20:32:50 30

原创 #10051. 「一本通 2.3 例 3」Nikitosh 和异或(字典树+异或前缀和)

libreoj 10051:题解:先求出异或前缀和,当我们求[l,r]这一段区间的异或和时,我们只需要将异或前缀和sum[r]^sum[l-1]即可(由于异或的性质,自己异或自己为0,而0异或任何数都为任何数),然后题目就转化为:分别找两对数(在异或前缀和的基础上),使他们的和最大,分别用两个数组来求,l[i]表示以i为结尾的一对数的最大异或值,r[i]由后向前退。#include<bits/stdc++.h>typedef long long LL;using namespace st

2020-06-18 15:37:11 30

原创 #10050. 「一本通 2.3 例 2」The XOR Largest Pair 内存限制:512 MiB(字典树优化 O(n2)找最大异或值)

题目:题解:我们先把每一个整数按照从高位到低位,将其每一位放在字典树里,该题的字典树有点特殊,每一个节点上的分叉只有两个,然后我们针对每一个整数,我们从高位到低位进行贪心匹配(由于二进制位权的特点,如果高位匹配成功,就优先选高位,因为如果不选,就算低位全部匹配成功也赶不上高位),不过本题的匹配有点不一样,因为是异或运算,两个位相同为0,不同为1,所以我们就认为当匹配位上的两个值不同我们才能累加其贡献。#include<bits/stdc++.h>typedef long long LL;

2020-06-18 11:20:17 34

原创 #10049. 「一本通 2.3 例 1」Phone List(trie树应用)

POJ3630:给定 个长度不超过 的数字串,问其中是否存在两个数字串 ,使得 是 的前缀,多组数据.输入格式第一行一个整数 ,表示数据组数。对于每组数据,第一行一个数 ,接下来 行输入 个数字串。输出格式对于每组数据,若存在两个数字串 ,,使得 是 的前缀,则输出 NO ,否则输出 YES 。请注意此处结果与输出的对应关系!#include<bits/stdc++.h>using namespace std;const int maxn=200005;st

2020-06-17 12:44:25 35

空空如也

空空如也

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