cstring

CDQ分治学习笔记

你。 提交于 2020-11-06 05:09:46
数据结构中的一块内容:$CDQ$分治算法。 $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一定是由"更改""查询"操作构成的,显然,有些“更改”会改变"查询的结果",而有些不能 如果我们合理安排一个次序,把每一个查询分成几个部分,分别计算值,最后合起来就是原来询问的值。 离线算法和在线算法的概念不用过多解释. 接下来通过几个例题将基本的$CDQ$分治算法解释明白. A. 从逆序对开始的 二维偏序 问题 下面将给出逆序对的题目: 例题·A1: 逆序对的定义是对于序列a[],取第$l$个元素和第$r$个元素,满足$l <r$且$a[l]>a[r]$,对于这样数对$(l,r)$被称为一对逆序对 求解给定序列a中有多少对逆序对,你需要输出对数. 对于100%的数据 $a \leq 5 \times 10^5 $ 我们都知道可以用树状数组和归并排序两种方法做,这里我们只讲归并排序(默认树状数组大家都会) 不断把$[l,r]$细分,每次取$mid=\frac{l+r}{2}$ 然后指针$i$和$j$分别指向区间$[l,mid]$和$[mid+1,r]$并且单调 先确定$i$不动,把$j$右移归并,如果满足$a[i]>a[j]$记录逆序对个数加$mid-i+1$意味着a[i],$i \in [i,mid]$和

CodeForces1073E 数位dp+状压dp

≯℡__Kan透↙ 提交于 2020-11-04 04:58:59
http://codeforces.com/problemset/problem/1073/E 题意 给定K,L,R,求L~R之间最多不包含超过K个数码的数的和。 显然这是一道数位dp,在做的过程中会发现为了统计数码是否出现过这个状态需要用到状态压缩 因为不同位置出现的数贡献不同,除了传统的dp数组之外还需要记录一个tot来统计这个位置之后出现数字的个数方便后面计算答案。 仔细对比了一下为什么我要开五维数组而网上的题解只需要开二维的数组,发现一是因为网上的题解不对前导0和limit的情况进行记忆化搜索,仔细想了一下这两种情况确实分支的情况比较小,为了他开两倍的空间的确不那么值得。 二是因为dp除了记录位置和是否出现过这个state之外,每个位置是什么数事实上是不需要记录的,对于一个位置和一个状态事实上后续就有固定的答案,不需要额外开一个数字来记录,对于后效答案的更新可以放在进入记忆话搜索之前,因而数字这位数字也可以省略掉。 #include <map> #include < set > #include <ctime> #include <cmath> #include <queue> #include <stack> #include <vector> #include < string > #include <cstdio> #include <cstdlib>

2018ICPC 北京

不羁的心 提交于 2020-11-03 07:26:09
A.0:27:15 solved by hl 感人的数据范围,每次连上边之后dfs一下前者看能不能找到自己就行 #include <iostream> #include < string > #include <map> #include <vector> #include <cstdio> using namespace std; int N; const int maxn = 110 ; map < string , int > Hash; vector < int > P[maxn]; bool vis[maxn]; int s; bool dfs( int t){ vis[t] = 1 ; for ( int i = 0 ; i < P[t].size(); i ++ ){ int v = P[t][i]; if (v == s) return false ; if (vis[v]) continue ; if (!dfs(v)) return false ; } return true ; } int main() { while (~scanf( " %d " ,& N)){ int cnt; cnt = 0 ; Hash.clear(); for ( int i = 0 ; i < maxn; i ++ ) P[i].clear(); int flag = 0 ;

从0开始学算法--数学(4.1矩阵)

扶醉桌前 提交于 2020-11-03 02:27:48
1,概念 以下词条解释来自百度百科:代数,代数系统,线性代数,矩阵 代数   代数是研究数、数量、关系、结构与代数方程(组)的通用解法及其性质的数学分支。 初等代数 一般在中学时讲授,介绍代数的基本思想:研究当我们对数字作加法或乘法时会发生什么,以及了解变量的概念和如何建立 多项式 并找出它们的根。代数的研究对象不仅是数字,而是各种抽象化的结构。在其中我们只关心各种关系及其性质,而对于“数本身是什么”这样的问题并不关心。常见的代数结构类型有群、 环 、域、模、 线性空间 等。 代数系统   非空集合A和A上k个一元或二元运算f1,f2,…,fk组成的系统称为一个代数系统,简称代数,记作(A,f1,f2,…,fk)。由定义可知,一个代数系统需要满足下面3个条件:(1)有一个非空集合A;(2)有一些建立在集合A上的运算;(3)这些运算在集合A上是封闭的。有的书上对代数系统定义时不要求运算的封闭性,而是把具有封闭性的代数系统定义为一个新的概念- 广群 。 线性代数   线性代数是数学的一个分支,它的研究对象是 向量 , 向量空间 (或称线性空间), 线性变换 和有限维的 线性方程组 。向量空间是 现代数学 的一个重要课题;因而,线性代数被广泛地应用于 抽象代数 和 泛函分析 中;通过解析几何,线性代数得以被具体表示。线性代数的理论已被泛化为算子理论。由于科学研究中的 非 线性模型

Problem D. Country Meow 2018ICPC南京

…衆ロ難τιáo~ 提交于 2020-11-03 02:26:45
n个点求出最小圆覆盖所有点 退火算法不会,不过这题可以用三分套三分写 x轴y轴z轴各三分 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <algorithm> 6 #include < set > 7 #include <iostream> 8 #include <map> 9 #include <stack> 10 #include < string > 11 #include <vector> 12 #define pi acos(-1.0) 13 #define eps 1e-8 14 #define fi first 15 #define se second 16 #define rtl rt<<1 17 #define rtr rt<<1|1 18 #define bug printf("******\n") 19 #define mem(a,b) memset(a,b,sizeof(a)) 20 #define name2str(x) #x 21 #define fuck(x) cout<<#x" = "<<x<<endl 22 #define f(a) a*a 23 #define sf(n) scanf("%d", &n) 24

MFC之CString操作1

孤街醉人 提交于 2020-11-02 16:00:34
本文章参考: CString CString 对象可以被认为是 字符数组 . 将 CString 看作实际的 字符串 ,而不是指向字符串的 指针 . CString 位于头文件 afx.h 中。 CString 对象的 Format() 方法,完胜 sprintf() 函数或 wsprintf() 函数格式化字符串操作 前话:_T()宏与Unicode意识 CString s;   s.Format(_T("The total is %d"),total); CString s;   s.Format(_T("%d"),total);// 把一个整数转化成 CString 类型 // 在 Unicode 环境下,它的效果就相当于: s.Format(L"%d",total); // 此时,不要用 sizeof() 操作符来获得字符串的长度,因为在 Unicode 环境下就会有 2 倍的误差。我们可以用一些方法来隐藏 Unicode 的一些细节,比如当需要获得字符长度的时候,用一个叫做 DIM 的宏,定义在 dim.h 文件中:    #define DIM(x) (sizeof((x)) / sizeof((x)[0])) 区分真实字符长度 || 字节长度。 1)CString类的构造函数 CString 类有很多构造函数,这里只介绍几个比较常用的: CString(const

MFC之CString与const char* string 转换

巧了我就是萌 提交于 2020-11-02 14:52:35
MFC开发时经常会遇到CString、string/std::string、char*等类型相互转换的问题,现将一些思考与心得记下来与大家分享: 一、CString强制类型转换为const char*,在变量前加上:(char *)(LPCTSTR),这样做虽不会报错,但其转换后的值可能是乱码,不推荐这样做! 二、利用中间变量(string类型),原理: 1)CString类型不能自动装换为const char*。 2)const char*类型可自动装换为CString。 3)std::string类型调用c_str()方法就可轻松转换为const char*。 4)CString与std::string相互转换: CString cs("Hello"); std::string s((LPCTSTR)cs); std::string s("Hello"); CString cs(s.c_str()); 三、CString可能是unicode编码(CString通过宏来确定到底是CStringA还是CStringW),因此应该先将之转化为mbcs编码,也就是CStringA CString s = _T ( "abc" ); std :: string str = CStringA ( s ); 来源: oschina 链接: https://my.oschina.net/u

2018ICPC 南京 训练赛

六月ゝ 毕业季﹏ 提交于 2020-11-02 14:34:00
赛后总结: 1.补字符串 2.前期交题看三遍 3.认真听取zcz兄弟的意见 最后时间该冲的时候就要冲 A.分情况讨论一下 K > 2先手必胜 N可能是0 solved by gbs 00:17:41(-2) 没有考虑0 WA2发 #include <iostream> #include <stack> #include <math.h> #include <stdlib.h> #include < string .h> #include < string > #include <ctime> #include <complex> #include <stdio.h> #include <algorithm> #include <map> #include <deque> using namespace std; typedef long long LL; int main() { int n,k; while (cin >>n >> k) { if (n == 0 ) { printf( " Austin\n " ); } else if (k == 1 ) { if (n& 1 ) printf( " Adrien\n " ); else printf( " Austin\n " ); } else { printf( " Adrien\n " ); } } return 0 ;

Codeforces 1245 E. Hyakugoku and Ladders

为君一笑 提交于 2020-11-02 06:26:12
传送门 显然这个图是个 $DAG$ ,那么就可以考虑跑 $dp$ 了 先考虑没有梯子的情况,首先把每个位置标号,越后面的位置编号越小,终点位置编号为 $1$ 那么从终点往起点 $dp$ ,枚举当前位置摇到的数字,那么有 $f[x]=\frac{\sum_{i=1}^{6}(f[x-i]+1)}{6}$,并且 $f[1]=0$ 但是这是在 $x>6$ 的情况下成立的,因为如果 $x<=6$ 那么有可能不走,特殊考虑一下 首先 $f[2]$ ,那么有 $5/6$ 的概率原地不动,$1/6$ 的概率走到终点,即 $f[2]=\frac{5(f[2]+1)}{6}+\frac{f[1]+1}{6}=(\frac{5}{6}+\frac{f[1]+1}{6}) / (1-5/6)$ 然后 $f[3]$ 也差不多考虑,$f[3]=\frac{4(f[3]+1)}{6}+\frac{f[1]+1}{6}+\frac{f[2]+1}{6}=(\frac{4}{6}+\frac{f[1]+1}{6}+\frac{f[2]+1}{6}) / (1-4/6)$ 发现对于 $x\in [2,6]$ ,$f[x]=\frac{(\sum_{i=1}^{x-1}f[x-i]+1)/6+(7-i)/6}{1-(7-i)/6}$ 现在来考虑有梯子的情况,设位置 $x$ 有一个梯子通往位置 $y$ ,那么 $f[x

Codeforces Round #481 (Div. 3) C. Letters

帅比萌擦擦* 提交于 2020-11-02 03:02:32
题目地址:http://codeforces.com/contest/978/problem/C 题解:有n个宿舍,每个宿舍人不一样多,有m封信,每封信送给对应的第m间房间,问这封信是给第几个宿舍,第几间房的。 方法:做题目的时候没有看到信的编号是不断升高的,把题目想复杂了,wa了两次。这题把寝室的房间累加在一起,然后设一个现在送到那个寝室的变量,逐步累加算法会快很多。 代码:(代码较丑,欢迎大佬们批评指正) 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstring> 5 #include< string > 6 #include<iostream> 7 #include<map> 8 #include<vector> 9 #include< set > 10 #include<queue> 11 using namespace std; 12 const int inf = 0x3f3f3f3f ; 13 long long int a[ 250000 ]; 14 int main() 15 { 16 int n, m; 17 scanf( " %d %d " , &n, & m); 18 a[ 0 ] = 0 ; 19 for ( int i = 1 ; i <= n; i++ )