tot

尺取法学习笔记

China☆狼群 提交于 2020-04-04 12:49:25
今天老师讲了提了下尺取,于是就有了这篇笔记 PS:我觉得我们老师形容得很贴切,尺取就像虫子蠕动一样 例题: 给出一个序列,求区间和大于或者等于S的最短区间长度. 我们假设序列长度为10,S为15,序列为 3 2 8 10 5 3 8 4 2 9 尺取法的思路大概就是,我们使用三个变量L,R,tot, 表示区间的左右两边和区间权值和 先初始L=R=1,tot=0 然后开始 蠕动 过程: i: 1 2 3 4 5 6 7 8 9 10 ai: 3 2 8 10 5 3 8 4 2 9 L: + R: + 计算区间tot+=a[R] 再将R向前移动一位 得出tot=3,比S小,所以我们将R向后移动 i: 1 2 3 4 5 6 7 8 9 10 ai: 3 2 8 10 5 3 8 4 2 9 L: + R: + 计算区间tot+=a[R] 再将R向前移动一位 得出tot=5,比S小,继续移动R i: 1 2 3 4 5 6 7 8 9 10 ai: 3 2 8 10 5 3 8 4 2 9 L: + R: + 计算区间tot+=a[R] 再将R向前移动一位 得出tot=13,比S小,继续移动R i: 1 2 3 4 5 6 7 8 9 10 ai: 3 2 8 10 5 3 8 4 2 9 L: + R: + 计算区间tot+=a[R] 再将R向前移动一位 得出tot=13,比S小

hdu4635 有向点双

微笑、不失礼 提交于 2020-03-06 18:12:42
题:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给n个点m条边的有向图,问最多还能添加多少条边,让此图还不能形成强连通图; 分析:tarjan缩点后,我们知道要是点双的个数是1那么肯定不符合条件,就直接输出-1;    那么剩下的情况就是,我们挑出一个点双,让剩余的点双全连通起来,当前点的点双也全连通起来,就剩下俩个点双,俩个点双之间也要尽可能连边;    我们假设当前点双为 i ,剩下的点双 为 j (已经全连通过了),那么要是一开始 j 中的俩个点双分为对 i 有入边和出边,那么 i 和 j 就肯定能连通,就不满足条件了,所以我们要挑那些要么入度为0要么出度为0要么度数为0的点点双来考虑;    对于每一个点双,答案贡献有三部分:1、当前点双 i 还能添加多少条边达到全连通;                     2、剩下点双 j 还能添加多少条边达到全连通;                     3、i 和 j 之间还能添加多少条边让i 和 j 不连通(i 和 j 之间的边要么全是出边要么全是入边) #include<bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back const int M=1e5+5;

BZOJ4541[HNOI2016]矿区(对偶图)

风格不统一 提交于 2020-03-03 07:21:46
题目链接 洛谷 BZOJ 前置知识 平面图转对偶图 简单理解“对偶图”就是,原图边把平面切成了很多块,对偶图中的点代表这些块(最外面的无穷域也可以算作一个块),相邻的块(即有公共边)之间连边,如下图(左边原图,右边对偶图): 不难发现原图中的每条边都对应了新图中的一条边 那么如何将一个平面图转成对偶图呢 先把无向边拆成两条有向边,这样每条边都可以被分配到一个块里 我们发现若一个点的入边 \(i\) 和出边 \(j\) 同属一个“块”,那么对这个点连出的边极角排序后, \(i\) 的反向边一定和 \(j\) 相邻,那么我们可以借助极角排序先求出一个 \(next\) 数组, \(next[i]\) 表示和边 \(i\) 同属一个块,且紧跟在 \(i\) 后的那条边 随后我们枚举每条未分配边,不断跳 \(next\) ,把经过的边和这条边自身分配给一个新“块”,显然会有一个时刻跳回这条边自己,这时退出,继续枚举未分配边,直到把所有边分配 接下来枚举每条边,把它和它的反向边所分配的“块”连边即可 代码在最下方题解代码中 解析 先求对偶图 然后以无穷域为根求出一棵生成树,每个节点维护子树内面积和、面积的平方和 枚举所求区域的边界,若一个块在边界的父亲位置,减去儿子的贡献,若在儿子位置,加上儿子的贡献 结合画图比较好理解 (其实是我不知道怎么讲比较清楚) 代码 PS.注意开long long

2020-02-26

萝らか妹 提交于 2020-02-26 14:52:05
pandas中Series类型add方法使用 先生成空Series对象tot,然后tot=tot.add(这里是一个series类型),必须add后赋给tot 在这里插入代![在这里插入图片描述](https://img-blog.csdnimg.cn/20200226114820288.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzk3Njkw,size_16,color_FFFFFF,t_70)码片 来源: CSDN 作者: qq_41797690 链接: https://blog.csdn.net/qq_41797690/article/details/104513782

数据结构——线性表

折月煮酒 提交于 2020-01-18 00:50:15
线性表——栈,队列,链表 目录 一.栈 1.函数实现栈 2.宏定义实现栈 3.STL实现栈 例题1:P1241 括号序列 例题2:P1449 后缀表达式 二.队列 实现队列 例题1.约瑟夫问题 三.双端队列 链表 一.栈 栈(stack) (last in first out);后进先出 1.函数实现栈 # include <cstdio> using namespace std ; int s [ 10005 ] ; int tot ; void push ( int x ) { s [ ++ tot ] = x ; } void pop ( ) { tot -- ; } void print ( ) { for ( int i = 1 ; i <= tot ; i ++ ) printf ( "%d " , s [ i ] ) ; puts ( "" ) ; } void top ( ) { printf ( "top=%d\n" , s [ tot ] ) ; } int main ( void ) { push ( 1 ) ; print ( ) ; top ( ) ; push ( 2 ) ; print ( ) ; top ( ) ; push ( 3 ) ; print ( ) ; top ( ) ; pop ( ) ; print ( ) ; top ( ) ;

CSP-S2019题解

天大地大妈咪最大 提交于 2019-12-07 07:48:28
代码先贴上,题解咕咕咕 D1T1 判断每一位是否超过一半,如果超了就把后面的反过来 注意 #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #define fo(a,b,c) for (a=b; a<=c; a++) #define fd(a,b,c) for (a=b; a>=c; a--) using namespace std; unsigned long long p[64]; unsigned long long m; int n,i,j,k,l; int main() { freopen("code.in","r",stdin); freopen("code.out","w",stdout); p[0]=1; fo(i,1,63) p[i]=p[i-1]*2; cin>>n>>m; fd(i,n-1,0) if (m<p[i]) printf("0"); else printf("1"),m=p[i]-(m-p[i])-1; printf("\n"); fclose(stdin); fclose(stdout); return 0; } D1T2 #include <algorithm> #include <iostream>

【整体二分】洛谷P3242接水果

北城余情 提交于 2019-12-06 06:28:24
整体二分 就是把序列中答案在 \([l,mid]\) 的划到一个序列中,在 \([mid+1,r]\) 的划到另一个序列中,再对新生成的序列重复上述操作 容易发现最多只会划分log次 路径 \((u,v)\) 覆盖路径 \((x,y)\) = \(u\) 在 \(x\) 子树中, \(v\) 在 \(y\) 子树中 \(x\) 为 \(y\) 祖先要特殊讨论 这样就可以转成二维偏序 二分答案 \(mid\) ,把权值 \(>mid\) 都塞进树状数组,套个整体二分就没了 #include <bits/stdc++.h> #define N 40005 #define ll long long #define For(i,x,y) for(int i=(x);i<=(y);++i) #define Rof(i,x,y) for(int i=(x);i>=(y);--i) using namespace std; struct qwq{ int U,V,W; } pl[N]; struct ques{ int x,ly,ry,val,id; } q[N<<2]; struct owo{ int x,y,k,id; }fr[N]; vector<owo> v[N<<2]; vector<ques>pr[N<<2]; vector<int> g[N]; int c[N],d[N],lg[N

洛谷P5021 赛道修建

旧街凉风 提交于 2019-12-04 01:44:31
题目 首先考虑二分,然后发现最小长度越大的话,赛道就越少。所以可以用最终的赛道个数来判断长度是否合理。问题转化为给定一个长度,问最多有多少条互不重叠路径比这个给定长度大。 考虑贪心,毕竟贪心也是二分check函数的常用做法。原图毕竟为一棵树,每条路径都由一个端点一个终点和他们的 \(LCA\) 之间的连边组成。我们直接枚举lca,然后枚举lca的子链且该链上无被找到的链,对于没有找到的链,都匹配上子链上最小的、浪费最少的,考虑这样做为什么是对的,因为如果不练子链上,而去连父亲的话,最底下的链肯定就浪费了。所以可以贪心直接用递归子树,然后找到每个子树中的选择的链,不选择的链。就行了,匹配操作可以用二分优化。 #include <bits/stdc++.h> #define N 1000101 using namespace std; struct edg { int to, nex, len; }e[N]; int n, m, cnt, root = 1, ha, lin[N], dp[N], temp[N], vis[N], tot;//dp[i]表示i的点权 inline void add(int f, int t, int l) { e[++cnt].len = l; e[cnt].to = t; e[cnt].nex = lin[f]; lin[f] = cnt; }

gym101480

时光毁灭记忆、已成空白 提交于 2019-12-04 01:36:03
A. ASCII Addition 模拟 #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <cmath> #include <set> #include <map> #include <queue> #include <string> #include <cstring> #include <bitset> #include <functional> #include <random> #define REP(_i,_a,_n) for(int _i=_a;_i<=_n;++_i) #define PER(_i,_a,_n) for(int _i=_n;_i>=_a;--_i) #define hr putchar(10) #define pb push_back #define lc (o<<1) #define rc (lc|1) #define mid ((l+r)>>1) #define ls lc,l,mid #define rs rc,mid+1,r #define x first #define y second #define io std::ios::sync_with_stdio(false) #define endl '\n'

Kindergarten(网络流解法)

Deadly 提交于 2019-12-03 20:54:14
题意: http://acm.hdu.edu.cn/showproblem.php?pid=2458 问你二分图的最大团是多大。 1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa system("cls") 4 #include <iostream>//pair 5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\Input.txt","r",stdin); 6 #include <bitset> 7 //#include <map> 8 //#include<unordered_map> 9 #include <vector> 10 #include <stack> 11 #include <set> 12 #include <string.h>//strstr substr 13 #include <string> 14 #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9; 15