首页 > TAG信息列表 > 1e9

CF1710D Recover theTree

题意: 给定每个区间是不是连通块,还原这棵树。(\(n\leqslant 2000\)) 题解: 我肯定是做不出来,也不理解是怎么想的。不如直接讲做法,然后证明正确性,也是对 wc 题解的补充。 先贴个代码: #include<bits/stdc++.h> using namespace std; const int maxn=2e5+10; const int mod=1e9+7; #def

Codeforces Round #813 (Div. 2) (C~D)

C. Sort Zero 最开始写了个n2的 TLE了以后 不知道咋优化 只好观察性质 发现我们要维护一个后缀 很多人说要维护前缀 其实也就少跑了60ms 我们维护一个mp[]记录的是哪个数不合法了 然后后面维护后缀时细节有点多 就没啥了 #include <bits/stdc++.h> using namespace std; const int

CF1699C The Third Problem

思路: 找规律。 实现: 1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[100005]; 4 int main(){ 5 //freopen("in.txt","r",stdin); 6 int t;cin>>t; 7 while(t--){ 8 int n;cin>>n; 9 vecto

cf468 B. Two Sets

题意: 给定 \(n\) 个两两不同的正整数,问能否把它们不重不漏地分为两个集合 \(A,B\)。要求: \(x\in A\implies a-x\in A\) \(x\in B\implies b-x\in B\) 思路: 法一:很傻很暴力 先假定所有数都属于 \(A\) 检查所有数,对某数 \(x\),若 \(a-x\notin A\),则把 \(x\) 推入待处理队列 \(q\) 检

基础算法

区间合并: #include <bits/stdc++.h> using namespace std; typedef pair <int,int> pii; vector<pii>pos; void merge(vector<pii>&pos) { vector <pii>ans; sort(pos.begin(),pos.end()); int st=-1e9+10,ed=-1e9+10; for

ARC130 题解

A. Remove One Character 容易发现 \(i,j\) 产生贡献当且仅当 \(\forall k\in[i,j],a_i=a_k=a_j\),于是对于每个连通块分别计算贡献即可。 #include<bits/stdc++.h> using namespace std; #define inf 1e9 const int maxn=2e5+10; const int mod=1e9+7; inline int read(){ int x=

算法第一次作业(递归)

A Fibonacci 题目描述 定义一个数列f(i) = f(i-1)+f(i-2), f(0) = 0, f(1) = 1. 求f(n) mod (1e9+7) 输入数据 一个正整数n,n<=1e5 输出数据 f(n) mod (1e9+7) 标准斐波那契问题,可以递归可以循环;可以数组保存可以直接变量保存 使用递归会超时 注意mod(1e9). 为什么是1e

CF327E

状压好题。 题意 给你一个长度为n的正整数序列 \(S\),再有 \(k\) 个正整数。 求有多少种 \(S\) 的排列方式使得其前缀和不会成为那 \(k\) 个数里的任意一个。答案对 \(1e9+7\) 取模。 \(0 \le k \le 2,1 \le n \le 24\)。 题解 因为 \(n \le 24\),明显是状压。 假设 \(f_i\) 表示

P1991无线通讯网

一、题目描述       二、解题思路   首先预处理出路径长度,标记点。然后,因为只能装s个,所以答案就在前面p - s条路径中最长的那条,因为我后面那p - s + 1之后的只会导致答案变大,这里有点点贪心的思想,所以答案就只能是前面p - s中最大的那条就行了。 三、代码实现 1 #inclu

【刷题】【cf】D1. Game on Sum (Easy Version)

搜索不行,结论推不出,就试图dp 设f[i][j]为第i轮,加入了j个元素 则Bob选择  f[i][j] <= min( f[i-1][j-1]+x , f[i-1][j]-x ) 设 a=f[i-1][j-1]+x , b=f[i-1][j]-x 而A则应该最大化 f[i][j] = (a+b - |a-b| ) /2 a+b为定值,则最小化|a-b|=|2x| 由于x为所选的数,x可以为任何【0,k】中的

Atcoder 试题选做

[ARC087D] Squirrel Migration 瞎扯:考虑 \(dis(x,y)=dep_x+dep_y-2dep_{lca(x,y)}\),于是让 \(lca\) 最小即可。 易知如果根节点的最大的子树不超过一半,那么所有的 \(lca\) 都可以在根。如果大于一半呢,递归这棵子树吗?好像不太好做的样子。 正解:我在想马呢。直接选中心做根,完事了。

885. 求组合数 I

885. 求组合数 I 给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cbamod(1e9+7) 的值。 输入格式 第一行包含整数 n。 接下来 n 行,每行包含一组 a 和 b。 输出格式 共 n 行,每行输出一个询问的解。 数据范围 1≤n≤1e4, 1≤b≤a≤2e3 输入样例: 3 3 1 5 3 2 2 输出样例: 3 10

剑指 Offer 10- I. 斐波那契数列

剑指 Offer 10- I. 斐波那契数列 这里需要注意的地方有两个: ①.这里要求的是第n项,但是有有第一项是F(0),所以也就是说要求的第n项也就是F(n-1); ②.对于结果需要对1e9+7取模; 所以写代码的时候需要注意,循环多少次,从哪里开始循环,循环的过程中怎么取模。 我们要a代表F(n-2),b代

CF754D Fedor and coupons(优先队列)

题目传送门 思路 这道题我刚开始的思路,是按照l为第一关键字,r为第二关键字从小到大排完序以后,二分答案,后来wa掉了,其实就是排完序的结果未必能够连续使用。 因为如果区间非常长的小 比如k=3 1 9 5 6 5 9 6 10 如果是用二分的话5 6是没有办法排掉的 因此我们可以用优先队列,将l从

傻逼的自我修养

本文谨记纯粹意义上的傻逼事件,这些事情的发生都只能指向一个结果:我是大傻逼 原来听说好多牛逼的话,现在感觉除了证明我不配之外啥都证明不了 2021-01-13 1e9+7写作998244353 2022-01-14 积分没有除指数

53. 最大子序和【DP常见的模型】

https://leetcode-cn.com/problems/maximum-subarray/ 状态表示: f[i]表示以i结尾的最大子段和 即f[i]=max(f[i-1]+nums[i],nums[i]) => f[i]=max(f[i-1],0)+nums[i] class Solution { public: int f[100100]; int maxSubArray(vector<int>& nums) { f

子数组最小乘积的最大值

题目 一个数组的最小乘积定义为这个数组中最小值乘以数组的和 。 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (3+2+5) = 2 * 10 = 20 。 给你一个正整数数组 nums ,请你返回 nums 任意非空子数组的最小乘积的最大值。由于答案可能很大,请你返回答案对1e9+7取余的结果。 请注意,

CF1550D Excellent Arrays(完全会了更新)

CF1550D Excellent Arrays 题意: 定义一个长度为n的整数序列a是好的仅当对于任意整数i∈[1,n],都有 a i ! = i

无向图的最小环问题

一道很有意思的题。 算法要素:floyd+利用过程量 核心思想:算法可以利用的部分不只有结果量,过程量也会起到一些意想不到的作用。 洛谷题面传送门 题目分析: 一、先说Floyd的本质: 用多了f[i][j]的定义,就会忘了其实它是压掉一维的结果。 最初的定义是f[i][j][k],意为从i到j,只经过1~k之间

【字符串】字符串多项式哈希 - 第2节

昨天看群里讨论哈希使用自然溢出被卡的问题,突然想到一个问题,就是为什么需要使用双模去做字符串哈希才能有效保证正确率呢? 把n个元素放进m个桶里面,不发生冲突的概率: \[P = e^{\frac{-n(n-1)}{2m}) \]求解这个式子可以得知,要求正确率达到1e-9级别的话,m大概需要n的平方的量级。但是

卡特兰数例题

例题 1.满足条件的01序列 1.满足条件的01序列 给定 n 个 0 和 n 个 1,它们将按照某种顺序排成长度为 2n 的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。 输出的答案对 109+7 取模。 输入格式 共一行,包含整数 n。 输

2021牛客暑期多校训练营4 J.Average (二分答案,前缀和维护动态区间)

题意:给你两个长度分别\(n\)和\(m\)的序列\(a\)和\(b\),构造一个\(n\)x\(m\)的矩阵,每个单位的权值\(w_{i,j}=a_i+b_j\),现在要选一个长宽至少为\(x\)x\(y\)的子矩阵,求所选矩阵的最大平均值. 题解:这题不难转化为在\(a\)中找长度最小为\(x\)的区间最大平均值和在\(b\)中找长

离散化问题

  离散化,作为一种较为基础的算法,可以说极其常见。那么何为离散化呢?根据百度百科说法,离散化就是将无限空间的有限元素映射到有限空间上。通俗地说,就是在不改变数据相对大小的情况下,对数据进行缩小操作。举个例子,给定一串数据1,99,72,72,6,100.我们可以先对其排序,变为1,6,72,72,99,100.接着

状压DP

1.填方格 class Solution { public: int M; int MOD=1e9+7; int dp[1006][255];//3*3*3*3*3=243 bool check(int t)//同一列上的状态不可以相同 { int last=-1;//对第一行,上一个状态为-1 for(int i=0;i<M;i++) { if(t%3

2019.7.9 义乌模拟赛 T3 C

这个显然是最长上升子序列长度。 考虑怎么求这个东西。 我们设\(dp_{i,j}\)表示在\(A\)中到了\(i\),已经使用了\(j\)次的在\(B\)中最大能到达的位置。 然后考虑两种转移,一种是\(A\)后移,一种是\(B\)跳到最近的位置。 时间复杂度\(O(nk)\),然而第二个包最后一个点过不去,特判了qwq code