題意:隨機從n個數中取3個數構成三角形的概率是多少。
注意到每個數的範圍是1到10^5,可以借鑑生成函式的思想,把任意兩個數的和看作多項式的係數用多項式乘法乘出來。可是一般的乘法的時間很作急,就要用到傅利葉變換了。
#include #include #include #include #include using namespace std;
typedef long long lng;
const int maxn = (1 << 18) + 100;
const double pi = acos(-1.0);
struct fft
void fill(int m, int d, int c)
}void calc(double oper, int c)}}
}void multi()
id = 0; fill(1, 0, 0); calc(1.0, 0);
id = 0; fill(1, 0, 1); calc(1.0, 1);
for(int i = 0; i < len; ++i)
id = 0; fill(1, 0, 2); calc(-1.0, 2);
for(int i = 0; i < len; ++i) p[2][i].first /= len;
}}f;int num[maxn], sum[maxn], n;
lng ans[maxn], len;
void prework()
f.init(len, sum);
f.multi();
for(int i = 0; i < len; ++i) ans[i] = f.p[2][i].first + 0.1;
for(int i = 1; i <= n; ++i) ans[2 * num[i]]--;
for(int i = 1; i < len; ++i)
for(int i = 1; i < len; ++i) sum[i] += sum[i - 1];
}void solve()
for(int i = 1; i < len; ++i)
}printf("%.7f\n", cnt * 1.0 / tot);
}int main()
return 0;
}
hdu 6299 多校第一場
題意 給出一些字串,重新組合,使括號的匹配數量最多 這道題場上沒能出,當時看了一眼,關於括號的,以為是個dp,就沒有再去做這道題。這道題事實上是個貪心,先把已經匹配好的括號數量統計出來。剩下的括號往兩邊堆,右括號往左邊堆,左括號往右邊堆。然後就是排序。左括號比右括號多的這種情況肯定要排在右括號比左括...
HDU6299(2018多校第一場)
bryce1010模板 兩個字串的排序可以分成四種情況 1 str1左少右多 vs str2 左多右少 str2排在str1前面 2 str1 左多右少 vs str2 左少右多 str1排在str2前面 3 str1 左少右多 vs str2 左少右多 按左括號的數量排序 4 其他情況按右括號的數...
2019HDU多校第一場
1002.operation 傳送 題意 給定乙個長度為 n 的數列,m 次操作,每次操作如下 0 l r 查詢區間 l,r 內若干個數的最大異或和。1 x 給數列末尾新增乙個數 x 資料範圍 1 n,m 5e5,1 a i 2 分析 開始直接考慮用線段樹維護區間線性基的並,然後每次查詢求區間線性基...