vis

set和迭代器失效总结

寵の児 提交于 2020-02-18 19:43:35
set 的相关知识点:重点是 去重 和 排序 !!! 默认按照 升序 排列!!! set 的常见操作: 1. 定义:set<数据类型>name; 2. 与map不同,count使用来 判别一个元素是否存在在set中 name.count(x); 3. name.insert(x); 4. name.erase(x);//插入和删除都要注意迭代器失效!!! erase函数返回被删除元素的下一个元素的迭代器。 erase(iterator) ,删除定位器iterator指向的值 erase(first,second),删除定位器first和second之间的值 erase(key_value),删除键值key_value的值 5. name.size(); 1. http://acm.nefu.edu.cn/contestShow.php 第一点要设置集合数组!!! 第二点找两个集合中相同数目的个数的方法: int k=0; for(set::iterator it=vis[num1].begin(); it!=vis[num1].end(); it++) if(vis[num2].count(*it)) k++; # include <bits/stdc++.h> using namespace std ; set < int > vis [ 52 ] ; int main ( )

八数码的八境界

﹥>﹥吖頭↗ 提交于 2020-02-17 11:36:01
以下理论部分转自 http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html ,自己就是一步一个境界地做,把每境界的代码记录下来。 研究经典问题,空说不好,我们拿出一个实际的题目来演绎。八数码问题在北大在线测评系统中有一个对应的题,题目描述如下(POJ 1077): Eight Time Limit: 1000MS Memory Limit: 65536K Special Judge Description The 15-puzzle has been aroundfor over 100 years; even if you don't know it by that name, you've seen it. Itis constructed with 15 sliding tiles, each with a number from 1 to 15 on it,and all packed into a 4 by 4 frame with one tile missing. Let's call themissing tile 'x'; the object of the puzzle is to arrange the tiles so that theyare ordered as: 1 2 3 4 5

Prime Path POJ - 3126

点点圈 提交于 2020-02-17 09:21:16
题目链接 题目:给出一个数n,求把n变成另一个数m最少需要多少次且每一个数都必须为质数。 思路: 1.质数的话个位应为奇数,并且题目说明了千位不可以为0,也就是说百位,、十位是从1到9。 2.利用bfs进行搜索,先把n压入队列,如果n本身就等于m,就直接输出步数;否则分别个位、十位、百位、千位分别搜索,判断是否该值是否跟以前的不一样(一样就不用再重复压入队列了)、该值是否用过了、该值是否为质数。如果中间出现等于m就直接输出结果,否则到队列为空了就输出Impossible。 note:以下加粗斜体处为wa的地方!!! # include <iostream> # include <cstdio> # include <queue> # include <cmath> # include <cstring> using namespace std ; int vis [ 100000 ] ; struct node { int x , step ; } st , en ; int m ; bool judge ( int x ) //判断是否为质数 { if ( x == 0 || x == 1 ) return false ; if ( x == 2 || x == 3 ) return true ; for ( int i = 2 ; i <= * * * sqrt ( (

繁忙的Bush SWUSTOJ141

ⅰ亾dé卋堺 提交于 2020-02-17 05:27:32
题目链接: 繁忙的Bush 思路: 数据可能会很多,所以采用二分查找+向量数组 ( 因为是多组数据,vector数组需要在每次测试结束清空,我这里采用了清空数据+释放空间的方法 ) 代码: # include <bits/stdc++.h> using namespace std ; vector < int > vis ; bool cmp ( int a , int b ) { return a < b ; } int fnd ( int x ) { int h = vis . size ( ) - 1 ; int l = 0 ; while ( l <= h ) { int mid = ( l + h ) / 2 ; if ( vis [ mid ] == x ) return mid ; else if ( vis [ mid ] < x ) l = mid + 1 ; else h = mid - 1 ; } } int main ( ) { int T ; cin >> T ; while ( T -- ) { int m , n , x ; cin >> m >> n ; while ( m -- ) { cin >> x ; vis . push_back ( x ) ; } sort ( vis . begin ( ) , vis . end ( ) , cmp

HDU 4460 Friend Chains --BFS

人走茶凉 提交于 2020-02-17 04:48:46
题意:问给定的一张图中,相距最远的两个点的距离为多少。 解法:跟求树的直径差不多,从1 开始bfs,得到一个最远的点,然后再从该点bfs一遍,得到的最长距离即为答案。 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <queue> #include <map> using namespace std; #define N 100007 map<string,int> mp; vector<int> G[1006]; int vis[1006],n,m,Maxdis,Maxtag; struct node{ int dis,u; }; void dfs(int u) { vis[u] = 1; for(int i=0;i<G[u].size();i++) { int v = G[u][i]; if(!vis[v]) dfs(v); } } void bfs(int u) { queue<node> que; memset(vis,0,sizeof(vis)); node now; now.dis = 0;

大一寒假训练九(vector , map, set)【更新完成】

有些话、适合烂在心里 提交于 2020-02-17 02:08:54
本次训练共10题,本文附AC代码和题目链接。 洛谷 P1918 保龄球 (map) # include <bits/stdc++.h> using namespace std ; map < int , int > a ; //实际上就是定义了一个int a[1e9]的数组,但是普通数组开不到1e9那么大 int main ( ) { int n , x1 , x2 , k ; ios :: sync_with_stdio ( false ) ; cin >> n ; for ( int i = 1 ; i <= n ; i ++ ) { cin >> x1 ; a [ x1 ] = i ; } cin >> k ; while ( k -- ) { cin >> x2 ; printf ( "%d\n" , a [ x2 ] ) ; //如果x2之前没出现过,会自动输出0 } return 0 ; } nefu 1678 查字典 (map) # include <bits/stdc++.h> using namespace std ; map < string , int > a ; int main ( ) { string word , inquire ; //inquire为要查询的单词 int m , n , page ; ios : : sync_with_stdio

[AHOI2014/JSOI2014]支线剧情

旧时模样 提交于 2020-02-17 00:06:57
题目 有源汇上下界最小费用可行流 首先注意到要求是每一条边都经过至少一次,所以对于每一条边我们设成 \([1,\infty]\) 就好了 另外所有点都能结束剧情,所有点都要向汇点 \(t\) 连一条 \([0,\infty]\) 的边 我们根据有源汇可行流的方式建图就好了 定义 \(d_i\) 为流入这个点的所有边的下界和减去流出这个点的所有边的下界和 对于图中的一条边 \((u,v,[b,c],w)\) ,我们连一条从 \(u\) 到 \(v\) 流量为 \(c-b\) 费用为 \(w\) 的边 我们再从汇点向源点连一条容量为 \(\infty\) 费用为 \(0\) 的边 对于 \(d_i>0\) 的点,我们从超级源点 \(S\) 向这个点连一条容量为 \(d_i\) 费用为 \(0\) 的边 对于 \(d_i<0\) 的点,我们让这个点向超级汇点连一条容量为 \(-d_i\) 费用为 \(0\) 的边 我们在这张图上跑一个最小费用最大流就好了 最后别忘了把答案加上原图里所有边的流量下界乘以费用的和 代码 #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define re register #define LL long long #define

bzoj2039

两盒软妹~` 提交于 2020-02-16 23:25:16
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 1791 Solved: 869 [ Submit ][ Status ][ Discuss ] Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司。这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即当经理i和经理j同时被雇佣时,经理i会对经理j做出贡献,使得所赚得的利润增加Ei,j。当然,雇佣每一个经理都需要花费一定的金钱Ai,对于一些经理可能他做出的贡献不值得他的花费,那么作为一个聪明的人,小L当然不会雇佣他。 然而,那些没有被雇佣的人会被竞争对手所雇佣,这个时候那些人会对你雇佣的经理的工作造成影响,使得所赚得的利润减少Ei,j(注意:这里的Ei,j与上面的Ei,j 是同一个)。 作为一个效率优先的人,小L想雇佣一些人使得净利润最大。你可以帮助小L解决这个问题吗? Input 第一行有一个整数N<=1000表示经理的个数 第二行有N个整数Ai表示雇佣每个经理需要花费的金钱 接下来的N行中一行包含N个数,表示Ei,j,即经理i对经理j的了解程度。(输入满足Ei,j=Ej,i) Output 第一行包含一个整数,即所求出的最大值。 Sample

【BZOJ1999】树网的核

我们两清 提交于 2020-02-16 12:13:23
题目大意:题目过长,无法简单描述。。。 题解: 由于树网的核一定是树直径的一段,因此考虑先将直径取出,通过两次 BFS 即可。要求的东西是树上任意一点到这条取出的线段的距离的最大值,发现这个最大值有可能为三个值构成,首先是给定段到树直径的两个端点的距离,其次是树直径外的点到给的给定段的距离的最大值。到直径端点的值和直径外的点到给定段的值都可以 \(O(n)\) 预处理出来,最后采用双指针扫一遍取出的直径序列即可求出答案,总时间复杂度为 \(O(n)\) 。 代码如下 #include <bits/stdc++.h> #define pb push_back using namespace std; const int maxn=5e5+10; int n,s,d[maxn],pre[maxn],st,ed; int dia[maxn],cnt,dmax; bool vis[maxn]; queue<int> q; struct node{ int nxt,to,w; }e[maxn<<1]; int tot=1,head[maxn]; inline void add_edge(int from,int to,int w){ e[++tot]=node{head[from],to,w},head[from]=tot; } int bfs(int start){ memset(d

独自空忆成欢 提交于 2020-02-16 09:26:36
1.定义:利用一组地址连续的存储单元依次自栈底到栈顶存放栈的数据元素. (而栈顶是随着插入和删除而变化的,可以用一个整形变量top存放栈顶的指针,数据入栈或出栈时使整形变量 top分别加1或减1。) 2.栈的基本操作: (1)初始化栈 stackvis ,定义一个栈 (2)入栈 vis.push(x) (3)出栈 vis.pop() (4)判断是否为空 vis.empty() (5)判断栈中元素的数量vis.size() (6)得到栈的栈顶元素 vis.top() 综上: #include 用<bits/stdc++.h>则无需考虑头文件. 题目 problem A:栈-程序员输入问题 nefu 1624 # include <iostream> # include <bits/stdc++.h> using namespace std ; int main ( ) { stack < char > s1 ; stack < char > s2 ; char a [ 100 ] ; int i , n ; gets ( a ) ; n = strlen ( a ) ; for ( i = 0 ; i < n ; i ++ ) { if ( a [ i ] == '@' ) { while ( ! s1 . empty ( ) ) s1 . pop ( ) ; continue ;