10 2017 档案

摘要:【题意概述】 给出一个01序列,初始时序列全为0,每次有修改操作或询问操作,修改操作要求把L~R区间中的0变成1,1变成0,查询操作要求输出L~R区间的1的个数 【题解】 线段树。 每次区间修改把区间的$sum$改为$len-sum$即可。 阅读全文
posted @ 2017-10-31 22:01 Driver_Lao 阅读(200) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 给出N个数(10^6),求出最短的包含1~M(M≤2000)的连续子序列 【题解】 Two Pointer~~~ 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=10000 阅读全文
posted @ 2017-10-30 19:52 Driver_Lao 阅读(210) 评论(0) 推荐(0) 编辑
摘要:直接写一波Lca就好了 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1010; 6 int n,m,x,y,z,ans=0,tot=0,dis[m 阅读全文
posted @ 2017-10-30 16:20 Driver_Lao 阅读(152) 评论(0) 推荐(0) 编辑
摘要:洛谷3383 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 const int maxn=10000010; 6 int n,m; 7 bool a[maxn]; //a[i]为 阅读全文
posted @ 2017-10-27 16:36 Driver_Lao 阅读(359) 评论(0) 推荐(0) 编辑
摘要:洛谷3367 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int maxn=10010; 5 int n,m,x,y,k,fa[maxn]; 6 void read(int &k){ 7 k=0; int 阅读全文
posted @ 2017-10-27 16:16 Driver_Lao 阅读(143) 评论(0) 推荐(0) 编辑
摘要:【题解】 对于不同的最小生成树,每种权值的边使用的数量是一定的,每种权值的边的作用是确定的 我们可以先做一遍Kruskal,求出每种权值的边的使用数量num 再对于每种权值的边,2^num搜索出合法使用方案,把每种权值的边的方案用乘法原理乘起来就是答案了 1 #include<cstdio> 2 # 阅读全文
posted @ 2017-10-27 07:47 Driver_Lao 阅读(259) 评论(0) 推荐(0) 编辑
摘要:【题解】 先预处理出模N意义下的前缀和sum[i]。 1.如果sum[i]=0,那么1~i的数之和就是N的倍数 2.sum[i]%N总共有0~N-1这N种情况;根据1,如果sum[i]为0则必定有解;如果不存在sum[i]=0,那么根据抽屉原理,有N个前缀和,N-1种情况,那么一定存在sum[i]= 阅读全文
posted @ 2017-10-26 16:48 Driver_Lao 阅读(236) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 给出一个x(x≤10^6),求出任意一个满足十进制中包含0~9十个数字并且是x的倍数的数 【题解】 思维题。。。 我们可以强制让这个数的开头是1234567890,这个数可以表示为1234567890000000+a 那么当这个数为x的倍数时,这个数为1234567890000000+ 阅读全文
posted @ 2017-10-26 16:13 Driver_Lao 阅读(178) 评论(0) 推荐(0) 编辑
摘要:洛谷3366 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=5010,maxm=200010; 5 int n,m,fa[maxn],tot=0,ans=0; 6 struct edg 阅读全文
posted @ 2017-10-26 10:41 Driver_Lao 阅读(219) 评论(0) 推荐(0) 编辑
摘要:二分+特殊姿势的check:二分最小代价P,把边权小于等于P的边设为0,其他的设为1,跑一遍最短路,判断dis[n]是否大于K 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<queue> 5 using 阅读全文
posted @ 2017-10-26 08:16 Driver_Lao 阅读(170) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2017-10-25 20:39 Driver_Lao 阅读(8) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2017-10-24 21:57 Driver_Lao 阅读(4) 评论(0) 推荐(0) 编辑
摘要:用sum[i]表示前缀和模7的值,若存在i≤j,满足sum[i]==sum[j],则区间(i,j]的和为7的倍数。 O(N)扫出sum[0]~sum[6]第一次出现的位置first和最后一次出现的次数last,答案即为Max(last[i]-first[i]) 1 #include<cstdio> 阅读全文
posted @ 2017-10-23 18:47 Driver_Lao 阅读(239) 评论(0) 推荐(0) 编辑
摘要:【题意概述】 给出一个只有小写字母的序列,问最少把序列分成几段可以满足每一段可以通过变换成为回文串。变换指的是交换子序列中的字母的位置。 【题解】 我们把a~z分别设为2^0~2^25,每个子序列满足条件当且仅当子序列异或和为0或2的n次幂。 我们用sum[i]表示前缀异或和,用f[i]表示1~i的 阅读全文
posted @ 2017-10-23 16:35 Driver_Lao 阅读(285) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2017-10-20 21:54 Driver_Lao 阅读(5) 评论(0) 推荐(0) 编辑
摘要:我们先考虑第i大数,比它大的数有(n-i)个,显然要使i是Local Maxima,比它大的数必须放在它后面,那么它是Local Maxima的期望是; 那么n个数中Local Maxima个数的期望就是,即为,这个就是调和级数。 为了避免超时,再用分段打表的特殊姿势即可 正式代码(略去一堆赋值) 阅读全文
posted @ 2017-10-19 16:36 Driver_Lao 阅读(183) 评论(0) 推荐(0) 编辑
摘要:先把工作按照Deadline从小到大排序 然后按顺序取,deadline大于现在总用时就取,等于现在总用时就从前面已取的工作中找一个P最小的同它比较,取P较大的一个 用优先队列维护已取工作中P的最小值 1 #include<cstdio> 2 #include<algorithm> 3 #inclu 阅读全文
posted @ 2017-10-19 15:03 Driver_Lao 阅读(154) 评论(0) 推荐(0) 编辑
摘要:倒过来的合并果子? 做法与合并果子一样 维护一个小根堆,每次取出最小的两个数进行合并 1 #include<cstdio> 2 #include<algorithm> 3 #include<queue> 4 using namespace std; 5 int n; 6 long long ans= 阅读全文
posted @ 2017-10-19 10:34 Driver_Lao 阅读(202) 评论(0) 推荐(0) 编辑
摘要:直接模拟2333 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int n,ans; 5 void read(int &k){ 6 k=0; int f=1; char c=getchar(); 7 while ( 阅读全文
posted @ 2017-10-19 10:13 Driver_Lao 阅读(223) 评论(0) 推荐(0) 编辑
摘要:线段树 每个节点保存4个值,both表示左右端点都取,neither表示左右端点都不取,left表示只取左端点,right表示只取右端点。 维护的特殊姿势: $cur$的$both=max(ls.l+rs.r,ls.both+rs.r,ls.l+rs.both)$ $cur$的$neither=ma 阅读全文
posted @ 2017-10-19 09:22 Driver_Lao 阅读(296) 评论(0) 推荐(0) 编辑
摘要:两个认识的人不是朋友就是敌人,且满足: 1,朋友的朋友是朋友; 2,敌人的敌人是朋友。 一群朋友组成一个团伙,给出m个信息,求有多少个团伙。 用并查集,把一个点x拆成x和x’ 若a与b为朋友,则将a与b所在集合合并,这样就满足朋友的朋友是朋友; 若a与b为敌人,则将a’与b所在集合合并,将a与b’所 阅读全文
posted @ 2017-10-19 08:03 Driver_Lao 阅读(213) 评论(0) 推荐(0) 编辑
摘要:用线段数维护即可 1 #include<cstdio> 2 #include<algorithm> 3 #define ls (cur<<1) 4 #define rs (cur<<1|1) 5 #define mid ((a[cur].l+a[cur].r)>>1) 6 using namespa 阅读全文
posted @ 2017-10-19 07:19 Driver_Lao 阅读(144) 评论(0) 推荐(0) 编辑
摘要:Codevs 1036 商务旅行 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=100010; 6 int n,m,x,y,ans=0,tot=0, 阅读全文
posted @ 2017-10-19 07:13 Driver_Lao 阅读(167) 评论(0) 推荐(0) 编辑
摘要:洛谷3378 1 #include<cstdio> 2 #include<algorithm> 3 #define ls (cur<<1) 4 #define rs (cur<<1|1) 5 #define mid ((a[cur].l+a[cur].r)>>1) 6 #define len(x) 阅读全文
posted @ 2017-10-18 16:30 Driver_Lao 阅读(228) 评论(0) 推荐(0) 编辑
摘要:线段树区修区查,洛谷3372 1 #include<cstdio> 2 #include<algorithm> 3 #define ls (cur<<1) 4 #define rs (cur<<1|1) 5 #define mid ((a[cur].l+a[cur].r)>>1) 6 #define 阅读全文
posted @ 2017-10-18 15:32 Driver_Lao 阅读(154) 评论(0) 推荐(0) 编辑
摘要:题目大意 给出一个有n个数的序列 求符合 区间各数或起来的数大于区间最大数 的区间的个数 题解 预处理出每个数每一位是0的那位左边最近的1和右边最近的1,用单调栈找出每个最大值所在的区间的左右端点,统计答案即可。 #include<cstdio> #include<algorithm> #inclu 阅读全文
posted @ 2017-10-17 16:46 Driver_Lao 阅读(307) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2017-10-17 15:15 Driver_Lao 阅读(5) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2017-10-16 16:55 Driver_Lao 阅读(7) 评论(0) 推荐(1) 编辑