07 2012 档案
摘要:sap+gap优化View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define maxn 105#define inf 1000000000int min(int a, int b){ return a < b ? a : b;}struct E{ int v, next, c;}edge[10003 << 1];int head[maxn], tot;int n, m;void add(int s, int t, in
阅读全文
摘要:最近比较懒,一种方法A了以后不想再去学习别的方法,诶,需要调整本题:邻接表 + bfs +优先队列 32MS还行View Code #include<stdio.h>#include<string.h>#include<queue>using namespace std;#define INF 100000000#define maxn 103#define maxm 10003struct node{ int c, l, w; node(int cc,int ll,int ww):c(cc),l(ll),w(ww) {} friend bool opera
阅读全文
摘要:把每种颜色看做是图的顶点,然后判定是否满足欧拉回路的条件,用并查集来判断图的各个点是否连通(即是否只用一颗树),用字典树记录颜色编号。1.字典树:本题数据比较大,有50W种颜色,如果用STL的map来记录颜色或人工处理的话都会超时(平均O(n/2));所以我们用字典树来记录颜色的编号(平均O(lgn)),大大节约了时间。2.欧拉回路判定:本题显然是单向图,用d[]数组来统计每种颜色的度,满足欧拉回路的条件:顶点的度为奇数的个数只能是2或0,其它点的度必须都为偶数;3.并查集:用并查集来判断图的各个点是否连通(即是否只用一颗树);View Code #include<stdio.h>
阅读全文
摘要:POJ 1300 ZOJ 1395 Door Man 欧拉回路的判定输入比较麻烦,其它感觉就是好水哦View Code #include<stdio.h>#include<string.h>int main(){ int i,j; char buf[128]; int n,m; int door[22]; while(gets(buf)!=NULL) { if(!strcmp(buf,"ENDOFINPUT"))break; if(buf[0]=='S') { sscanf(buf,"%*s %...
阅读全文
摘要:我靠,这么水的题目让我那么纠结,直到A了也不知道数据范围为多大。View Code #include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<queue>#define maxn 50005using namespace std;int cost[maxn],head[maxn];bool vis[maxn];long long dis[maxn];struct node{ int v,w,next;}list[maxn*2];in
阅读全文
摘要:字符串处理+dijkstra修改一下View Code #include<stdio.h>#include<string.h>#define maxn 201int n,m,num;int dis[maxn],adj[maxn][maxn];bool vis[maxn];int MIN(int a ,int b){ return a < b ? a : b;}int MAX(int a, int b){ return a > b ? a :b;}char str[201][35],s[35];int find(){ int i; for(i=0;i<n
阅读全文
摘要:写2个dijkstra,一个逆向一个顺向View Code #include<stdio.h>#include<string.h>#define maxn 1001#define INF 100000000int dis[maxn],adj[maxn][maxn],d[maxn];bool vis[maxn];int m, n;void dijkstra(int v) //顺向{ int i ,j ,k, u, min; for(i=0;i<=n;i++) { dis[i]=adj[v][i]; vis[i]=0; } vis[...
阅读全文
摘要:dijkstra略微做下修改View Code #include<stdio.h>#include<string.h>#define maxn 1001#define INF 100000000int MIN(int a, int b){ return a < b ? a : b;}int dis[maxn],adj[maxn][maxn];bool vis[maxn];int n, m;void dijkstra(int v){ int i, j, k, u, max; for(i=1;i<=n;i++) { dis[i]=adj[v][i]; ...
阅读全文
摘要:水题一枚数据规模不是很大,可以用floyd暴力过View Code #include<stdio.h>#include<string.h>#define INF 30#define maxn 101int dis[maxn][maxn];int n, m;void floyd(){ int i, j, k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(k!=i&&k!=j) if(dis[i][k]+dis[k...
阅读全文
摘要:HDU 1874 畅通工程续水dijkstraView Code #include<stdio.h>#include<string.h>#define INF 1000000#define maxn 201int adj[maxn][maxn],dis[maxn];//pre[maxn]bool vis[maxn];int n ,m;int dijkstra(int src, int dest){ int i ,j, k, u, min; for(i=0;i<n;i++) { vis[i]=0; dis[i]=adj[src][i]; ...
阅读全文
摘要:题意:求源点1到其它任意点的最小值 之中的最大值。题意理解后,dijkstra水题View Code #include<stdio.h>#include<string.h>#define maxn 101#define INF 100000000int n, m;int adj[maxn][maxn],dis[maxn];int max;bool vis[maxn];int dijkstra(int v){ int i,j,k,min,u; for(i=1;i<=n;i++) { dis[i]=adj[v][i]; vis[i]=0; } ...
阅读全文
摘要:典型的水floydView Code #include<stdio.h>#include<algorithm>#include<string.h>using namespace std;#define INF 1000000#define maxn 1001int adj[maxn][maxn],dis[maxn][maxn],pos[maxn];int n, m, num;void floyd(){ int i ,j ,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++) dis[i][j]=adj[i][j]; ...
阅读全文
摘要:最朴素最短路适用条件:边权必须为非负;以HDU2544为例View Code #include<stdio.h>#include<string.h>#define INF 100000000#define maxn 1001bool vis[maxn];int adj[maxn][maxn],dis[maxn],pre[maxn];//pre[]记录前驱int n, m;void dijkstra(int v){ int i, j, u , min; for(i=0;i<=n;i++) { dis[i]=adj[v][i]; vis[i]=0; ...
阅读全文
摘要:C语言位运算详解位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。C语言提供的位运算符列表:运算符含义描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0<< 左移 用来将一个数的各二进制位全部左移N位,右补
阅读全文
摘要:题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够了,将其分别映射到0,1,2,3,在于复杂度就大大的降下来了所以离散化要保存所有需要用到的值,排序后,分别映射到1~n,这样复杂度就会小很多很多而这题的难点在于每个数字其实表示的是一个单位长度(并非一个点),这样
阅读全文
摘要:POJ2828 Buy Tickets题意:插队问题;关键:如何插入这几个节点,每个节点储存什么信息。类型:很基本的单点更新线段树思路:这题想到了就水了,数据逆着插入,最先插入的一个数据的位置明显是题目给定的位置,可以确定,然后插入的几个数根据的位置前面插入的数据来决定,用sum[]数组表示改线段空位置的个数,满足 pos<=sum[rt<<1](即左儿子的空位多于插入数的位置序号)就访问左儿子,否则访问右儿子(访问右节点的时候注意pos要修改,改为pos-sum[rt],即整个线段的第pos个空位,在下一个右儿子那的第pos-sum[rt]个空位)。对自己的总结: 刚学线段
阅读全文
摘要:向这位努力了一年的大一就进总决赛的大牛学习。线段树专辑大全进入它的博客后 在右边推荐文章里点《完全版线段树》注意有些浏览器打不开这个网站,据我所知,谷歌浏览器,搜狗浏览器 可以用。大牛博客:www.notonlysuccess.com
阅读全文
摘要:这题是最大子序列和(hdu1003)的拓展。先复习一下最大子序列和(DP,hdu1003)吧:思路:用dp[i]表示以第i个数为结尾的子序列和最大值;状态转移方程:dp[i]=a[i] (dp[i-1]<0)dp[i]= dp[i-1]+a[i] (dp[i-1]>=0)这是有数组的做法。程序本人不提供下面提供一个无数组的代码,其实思想还是一样的hdu1003hdu1003#include<stdio.h>int main(){ int n,s,e,max,maxs,maxe,i,num,T,sum,u=0; scanf("%d",&T);
阅读全文

浙公网安备 33010602011771号