<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CoderFly的博客]]></title><description><![CDATA[四年青春年华]]></description><link>https://blog.youkuaiyun.com/CoderFly</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CoderFly]]></copyright><item><title><![CDATA[读入挂]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/68059344</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/68059344</guid><author>CoderFly</author><pubDate>Wed, 29 Mar 2017 09:14:05 +0800</pubDate><description><![CDATA[static inline int Rint() {
    struct X{
        int dig[256];
        X() {
            rep(i,'0','9'){
                dig[i]=1;dig['-']=1;
            }
        }
    };
    static X fuck;
    int s]]></description><category></category></item><item><title><![CDATA[中国(北方)大学生程序设计训练赛(第一周)]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/60574411</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/60574411</guid><author>CoderFly</author><pubDate>Mon, 06 Mar 2017 13:13:41 +0800</pubDate><description><![CDATA[Problem D: 数学题题目链接：DDDDDD 
取个倒数就可以变成乘法了… 二分答案 然后chick的时候 双指针 
卡精度…要用 long double#include <bits/stdc++.h>
#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 pb p]]></description><category></category></item><item><title><![CDATA[求组合数]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/60126813</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/60126813</guid><author>CoderFly</author><pubDate>Fri, 03 Mar 2017 09:48:35 +0800</pubDate><description><![CDATA[const int maxn=2e5+10;
ll fac[maxn],inv[maxn];
void init()
{
    fac[0]=1;
    for(int i = 1; i <= maxn-10; ++i) fac[i]=fac[i-1]*i%mod;
    inv[maxn-10]=powmod(fac[maxn-10],mod-2);
    for(int i = maxn]]></description><category></category></item><item><title><![CDATA[O(N)求1~N逆元]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/59109504</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/59109504</guid><author>CoderFly</author><pubDate>Wed, 01 Mar 2017 15:46:14 +0800</pubDate><description><![CDATA[ll inv[N];
void init(){
    inv[1] = inv[0] = 1;
    for(int i = 2;i < N;i++)
        inv[i] = inv[mod%i]*(mod-mod/i)%mod;
}]]></description><category></category></item><item><title><![CDATA[组合数取模（待补充）]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/53726466</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/53726466</guid><author>CoderFly</author><pubDate>Sun, 18 Dec 2016 12:35:46 +0800</pubDate><description><![CDATA[const ll M=1e5+3;ll fac[100005];            //阶乘
ll inv_of_fac[100005];        //阶乘的逆元ll qpow(ll x,ll n)
{
    ll ret=1;
    for(; n; n>>=1)
    {
        if(n&1) ret=ret*x%mod;
        x=x*x%mod;]]></description><category></category></item><item><title><![CDATA[UVa11525 康托展开+二分+树状数组]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/53246725</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/53246725</guid><author>CoderFly</author><pubDate>Sun, 20 Nov 2016 22:32:35 +0800</pubDate><description><![CDATA[n其实就是排列的康托展开形式
s[i]就是未出现的数中 第s[i]+1小的数
树状数组存小于x的数的个数
#include<bits/stdc++.h>using namespace std;
int c[50010],k;
inline int lowbit(int x)
{
    return x&(-x);
}
int sum(int x)
{
    int ans=0;
    whil]]></description><category></category></item><item><title><![CDATA[UVA1492 LA5694 线段树扫描线（矩形面积合并）]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/53246457</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/53246457</guid><author>CoderFly</author><pubDate>Sun, 20 Nov 2016 22:26:10 +0800</pubDate><description><![CDATA[我们考虑 每个新机器往右放的起始点（1*1的块）
那么我们只要求出哪些位置不可以放就可以了，比如说 3*3 的矩阵 新机器长为2  旧机器在2 2 那么 1 1这个点就不可以放新机器（考虑机器往右放的起始点）
再考虑右边界，右边界左边m-1个位置也不可以放
再考虑往下放的起始点，同理了
综上我们只要分别求出 哪些点不可以放 再用所有点减去就可以了
其实这就转化成了求矩形面积合并的问题了
注意特判m=]]></description><category></category></item><item><title><![CDATA[LA4730 UVA1455 线段树+并查集]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/53245878</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/53245878</guid><author>CoderFly</author><pubDate>Sun, 20 Nov 2016 22:14:02 +0800</pubDate><description><![CDATA[以y轴建线段树 把坐标*2 初始化各节点 洲，城市 数目为0 
并查集维护每一个连通块的 y坐标最大值最小值（x坐标没用）城市数目 
合并时 如果是一个洲（城市数大于1） 线段树对应区间减掉该洲城市数 
然后将两个洲合并，再在线段树对应区间增加大洲的城市数 
（区间城市数不等于子区间城市数之和）#include <bits/stdc++.h>using namespace std;
const in]]></description><category></category></item><item><title><![CDATA[LA4108&UVA1232 线段树]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/53245182</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/53245182</guid><author>CoderFly</author><pubDate>Sun, 20 Nov 2016 21:56:47 +0800</pubDate><description><![CDATA[大体思路 
维护区间最大值最小值，当新建的建筑物高度大于等于区间最大值时更新同时更新答案，小于最小值忽略. 
(x+1是因为 区间1~5可以看成 2，3，4，5 四个点 
只写x 更新会出错 是因为 更新1~10更新一遍10 更新10~15又会更新一遍10事实上只要更新一遍)#include<bits/stdc++.h>using namespace std;
const int maxn=1e5+]]></description><category></category></item><item><title><![CDATA[POJ 3321 树状数组，树转化为线性结构]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/53192488</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/53192488</guid><author>CoderFly</author><pubDate>Wed, 16 Nov 2016 22:14:32 +0800</pubDate><description><![CDATA[题目链接 
测试数据中边是 从上往下给的，也就是从根往叶子给的大体思路 
将树形结构变为线性结构 
后序遍历整棵树，记录下遍历这个点的时间和结束遍历的时间，那么[a,b]就可以代表这棵子树。 
我们用一个节点的结束时间来标识树状数组中的c[]。即sum(i)表示 所有 遍历结束的时间小于i的节点的权值和#include <iostream>
#include<cstdio>
#include<cst]]></description><category></category></item><item><title><![CDATA[CF722C倒序并查集]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52983356</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52983356</guid><author>CoderFly</author><pubDate>Mon, 31 Oct 2016 16:18:38 +0800</pubDate><description><![CDATA[题目大意 
    给你n个正数以及一个排列  让你按照排列中的顺序依次摧毁这n个数 每摧毁一次求一下连通块的最大和 
思路 
    倒着并查集：先将所有点摧毁，再倒序连接，维护最大和。#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int Max=1e5+10;
ll a[Max],ans[Max]]]></description><category></category></item><item><title><![CDATA[CF 721D贪心]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52974860</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52974860</guid><author>CoderFly</author><pubDate>Sun, 30 Oct 2016 21:58:22 +0800</pubDate><description><![CDATA[——————题目链接——————题目大意  
    n个数 k次操作 每次可以将n个数中任意一个数加或减x 使得k次操作后这n个数乘积最小 求每个数 
思路 
    贪心，每次取出绝对值最小的数，如果当前负数个数为奇数个，那就将这个数背离0前进，如果负数个数为偶数个，那就将这个数朝0前进#include <bits/stdc++.h>using namespace std;
typedef lo]]></description><category></category></item><item><title><![CDATA[CF723E 欧拉回路]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52946357</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52946357</guid><author>CoderFly</author><pubDate>Thu, 27 Oct 2016 15:44:11 +0800</pubDate><description><![CDATA[题目大意 
将无向图转为有向图，并且出度等于入度的点的数目最大。无重复边有孤立点 
题解 
将度数为奇数的点连接 跑欧拉回路 将 原来的边输出#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
#include <vector>
using namespace std;
const int maxn=2]]></description><category></category></item><item><title><![CDATA[LA6910Cutting Tree 逆向并查集]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52877133</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52877133</guid><author>CoderFly</author><pubDate>Thu, 20 Oct 2016 21:28:27 +0800</pubDate><description><![CDATA[先拆边，再倒着加边保存答案 注意记录某条边拆了几次就可以了#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int f[20010],a[20010];
int ans[5010];
struc]]></description><category></category></item><item><title><![CDATA[UVA11732 左儿子右兄弟 Trie]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52740393</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52740393</guid><author>CoderFly</author><pubDate>Wed, 05 Oct 2016 20:30:09 +0800</pubDate><description><![CDATA[tot[i]记录每个以i为根的树的叶子节点的数目
注意插入的时候要插入‘\0’   为了分辨 前缀和相同的串
对于叶子节点  ans+=tot[u]*(tot[u]-1)/2*2*depth;
即相同的串两两一对的对数 *（2*深度）
对于非叶子节点 统计以其为根节点的串 两两一对的对数
           for(int v=head[u];v;v=next[v]){
      ]]></description><category></category></item><item><title><![CDATA[UVA11488 Trie]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52740376</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52740376</guid><author>CoderFly</author><pubDate>Wed, 05 Oct 2016 20:26:56 +0800</pubDate><description><![CDATA[组织一棵Trie
记录每个节点有多少串经过
统计最大值
#include 
#include
#include
#include
using namespace std;
const int maxn=50010*2+10;
typedef long long ll;
struct Trie
{
    int ch[maxn][2];
    int tot[maxn];
    int ]]></description><category></category></item><item><title><![CDATA[UVA1401&LA3942 Trie+DP]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52737571</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52737571</guid><author>CoderFly</author><pubDate>Wed, 05 Oct 2016 10:14:15 +0800</pubDate><description><![CDATA[题目大意
将给定长度为L的字符串S 用字典中单词分解 单词可重复使用 问有多少分解方案数
大体思路
dp[i]表示从i开始的字符串（后缀）的分解方案数 dp[i]=∑dp[i+len(x)]  x为字符串S[i...L]的前缀 
将单词组成Trie 然后在Trie中查找前缀 找到后递推dp[i]即可
#include 
#include
#include
#include
#includ]]></description><category></category></item><item><title><![CDATA[UVA12232加权并查集 加点]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52736420</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52736420</guid><author>CoderFly</author><pubDate>Wed, 05 Oct 2016 00:29:12 +0800</pubDate><description><![CDATA[#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#define INF 0x3f3f3f3f  
#define MAXN 20010  
#define MAXM 3010  
using namespace std;  
int N,Q,bug,]]></description><category></category></item><item><title><![CDATA[UVA11987 并查集]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52736395</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52736395</guid><author>CoderFly</author><pubDate>Wed, 05 Oct 2016 00:27:45 +0800</pubDate><description><![CDATA[第一、三个操作 直接带权并查集就可以解决关键是第二个


第二个问题在于合并两个节点的时候 第一个节点的子节点会跟着合并到第二个节点中  这提示我们 只要1~n都不作为父节点就可以了
所以初始化的时候将 每个节点的父亲节点设为 n+i 这样无论怎样合并节点1~n都不可能成为父节点  那么进行第二个操作的时候只要 将p节点合并到q节点父节点下就可以了
具体看代码 第一个操作和第二个操作合并]]></description><category></category></item><item><title><![CDATA[LA2191&UVA12086树状数组]]></title><link>https://blog.youkuaiyun.com/CoderFly/article/details/52736366</link><guid>https://blog.youkuaiyun.com/CoderFly/article/details/52736366</guid><author>CoderFly</author><pubDate>Wed, 05 Oct 2016 00:12:40 +0800</pubDate><description><![CDATA[裸树状数组……不能再裸了……
更改值得时候 别忘了该原数组就可以了
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=200010]]></description><category></category></item></channel></rss>