随笔分类 -  Codeforces

摘要:求补集。题意:给出一列长为n(n 2 int a[1000010],vis[1= 0;i--){11 if(vis[i]) continue;12 for(int j = 0;j < 22;j++){13 if(vis[i|(1<<j)]){14 vis[i] = vis[i|(1<<j)];15 break;16 }17 }18 }19 for(int i = 0;i < n;i++){20 if(v... 阅读全文
posted @ 2013-11-20 21:44 浙西贫农 阅读(243) 评论(0) 推荐(0)
摘要:题意:城市中有从左到右排列起来的高度为hi的n个塔。现在要求作出一些改变使得景观更美丽,也就是要从左到右排列起来的塔呈非递减序列。你可以用吊车吊起一座塔然后叠加到左右相邻的任意一座塔上,这样新塔的高度等于两座塔之和,每次做这样的操作,塔的总数都会减少1(废话)。问最少进行几次这样子的操作可以使得景观美丽。dp(i)表示使得前i个塔美丽的最小操作次数,sum(i)表示前i座塔的前缀和,last(i)表示使得前i个塔美丽操作次数最小的情况下,最右侧一座塔最小的塔高。那么就有状态转移方程:dp(i)=min{dp(j)+i-j+1},sum(i)-sum(j)>=last(j). 1 #inc 阅读全文
posted @ 2013-11-20 13:10 浙西贫农 阅读(265) 评论(0) 推荐(0)
摘要:题意:在一张地图上,有N(N 2 #include 3 #include 4 using namespace std; 5 typedef long long LL; 6 double dp[1010]; 7 struct Node{ 8 int x,y,t; 9 double p;10 }node[1010];11 12 int cmp(Node a,Node b){13 return a.t = 1;i--){32 dp[i] = 0;33 for(int j = i+1;j ans ? dp[i] : ans;39 }... 阅读全文
posted @ 2013-11-18 21:35 浙西贫农 阅读(336) 评论(0) 推荐(0)
摘要:题意:有7个人从m个数中任选一个不重复的,其中4和7是幸运数,一个人的幸运值等于他所选的数字中所有'4'的个数+'7'的个数。求一个人的幸运值比其他6人幸运值总和大的方案数。 1 #include 2 #define MOD 1000000007 3 using namespace std; 4 typedef long long LL; 5 LL dp[11][11]; 6 LL f[11],ans; 7 int bit[11],len; 8 void init(){ 9 dp[1][0] = 8;dp[1][1] = 2;10 for(int i = 2;i 阅读全文
posted @ 2013-11-06 18:37 浙西贫农 阅读(366) 评论(0) 推荐(0)
摘要:敲完此题我在想,或许我的智商不适合再搞下去了。。题意:有一组OX序列(长度 2 #include 3 using namespace std; 4 5 int main() 6 { 7 double ans = 0.0,pre = 0.0,now; 8 int n; 9 cin>>n;10 while(n--){11 cin>>now;12 pre *= now;13 ans += 2*pre+now;14 pre += now;15 }16 cout<<fixed<<setpr... 阅读全文
posted @ 2013-11-05 10:52 浙西贫农 阅读(434) 评论(1) 推荐(0)
摘要:题意:给出一张n个点m条边的无向图,然后又q组查询,询问从s节点走到m节点至少要经过多少条桥思路:先dfs找桥,并给所有边-双连通分量蓝色。根据找到的桥以及桥的两端的节点的颜色,重新建图(每个节点代表一个双连通分量,其实就是形成一棵树),dfs一遍求各个点的深度,然后就是离线的求LCA,距离就是dis[u]+dis[v]-2*dis[LCA(u,v)] 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define maxn 100010 7 using namespace std; 8 9 int... 阅读全文
posted @ 2013-08-06 08:53 浙西贫农 阅读(310) 评论(0) 推荐(0)
摘要:看了chenxing老湿的代码,我真心为自己智商捉鸡啊。。一遍dfs搞定啊。。 1 #include 2 #include 3 #define maxn 110 4 int first[maxn],v[maxn*2],next[maxn*2]; 5 int len,e; 6 inline int max(int a,int b){ 7 return a > b ? a : b; 8 } 9 10 void init(){11 e = 0;12 memset(first,-1,sizeof(first));13 }14 15 void add_edge(int a,i... 阅读全文
posted @ 2013-08-05 18:06 浙西贫农 阅读(245) 评论(0) 推荐(0)
摘要:我也搞不懂为什么我每次做这种明明很简单清晰的题目总是会想出那么操蛋的办法,诶。贴个正常的: 1 #include 2 typedef long long LL; 3 LL a[20]; 4 LL count(LL num){ 5 int bit[20],cnt = 0; 6 LL tmp = num; 7 while(tmp > 0){ 8 bit[cnt++] = tmp % 10; 9 tmp /= 10;10 }11 if(cnt == 1) return num - 1;12 LL ans = 9;... 阅读全文
posted @ 2013-08-05 15:02 浙西贫农 阅读(257) 评论(0) 推荐(0)
摘要:最近发现,不写题解不长记性。题意:给出一张带权无向图,然后询问该图的每条边进行询问,若这条边出现在该图的所有最小生成树中,输出any;若这条边可以出现在这张图的某几个最小生成树中,输出at least once;若这条边不会出现在这张图的任意一个最小生成树中,输出none。解法:跟求最小生成树的方法类似,首先将所有边按照权值从小到大排序,一次取出所有边长相等的边,查询每条边的两个节点是否在同一集合中,若不在同一集合中,则在这两个集合间添加一条无向边,同时认为这些边有可能出现在该图的最小生成树中。再做tarjan找桥,找到桥将一定出现在该图的最小生成树中。然后将所有的边的两个端点合并到同一集合, 阅读全文
posted @ 2013-08-02 15:41 浙西贫农 阅读(587) 评论(0) 推荐(0)