首页 > TAG信息列表 > PII

交互题

1、Dragon Balls 暴力求解,把每次可能的值都求出来,然后逐个比较。 #include<bits/stdc++.h> #define int long long int using namespace std; int x, n; typedef pair<int, int> pii; vector<pii> vet; signed main(){ cin >> n; while(n -- ){ cout <

「codeforces - 1208F」Bits and Pieces

link。 考虑把原问题写成一个在 \(\left(\log_2 \max v \right) \times n\) 的矩阵里选出三列,我们首先预处理出 \(j \cap q\)。具体,我们需要对于每一个权值 \(v\) 求出一个最大的下标 \(p\)(\(1 \leqslant p \leqslant n\))满足存在极大的 \(q < p\) 且 \(v \cap a_p \cap a_q = v\)

洛谷-P3195 玩具装箱

玩具装箱 dp + 斜率优化 \(dp[i]\) 表示前 \(i\) 个物品的最小代价,\(pre[i]\) 代表前 \(i\) 个物品的长度前缀和 设 \(x = pre[i] - pre[j] + i - j - 1 - L\),容易看出状态转移方程: \[dp[i] = \min_{j=1}^{i-1}(dp[j] + x ^ 2) \]显然是一个 \(O(n^2)\) 的算法 可以设 \(x_i = pre

区间覆盖

C++ 区间覆盖 /* 问题描述: 给定 N 个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。 输出最少区间数,如果无法完全覆盖则输出 −1。 输入格式: 第一行包含两个整数 s 和 t,表示给定线段区间的两个端点。 第二行包含整数 N,表示给定区间

贪心算法: 区间选点

c++ 区间选点 /* 区间选点 题目描述: 题目搬运: 给定 N 个闭区间 [ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式: 第一行包含整数 N,表示区间数。 接下来 N 行,每行包含

Codeforces 1689C. Infected Tree

传送门 \(\texttt{Difficulty:1900}\) 题目大意 \(n\cdot m(1\le n,m\le1000)\) 的矩阵 \(A\) ,\(A_ij\) 为 W 或者 B 。设一个点到所有 B 点的曼哈顿距离的最大值为 \(x\) ,求 \(x\) 最小的点 \((i,j)\) 。 思路 考虑只有最右下,左上,左下,右上这 \(4\) 个黑点会起作用,其他的黑点一定

P8290 [省选联考 2022] 填树

先考虑第一问: 令 \(V_k(L)\) 为权值在 \([L,L+k]\) 中的答案。 注意到当极差为 \(d\) 时贡献会计算 \(k-d+1\) 次,利用这个特点答案可以表示为 \(\sum_{L}V_k(L)-V_{k-1}(L)\) , 下面不妨省去 \(k\)。 一条路径上的 \(V\) 为所有结点 \(V_i\) 的积,我们单独考察一下: \[V_i(L)=\max(0

LIS

友好城市 https://www.acwing.com/problem/content/1014/ 画一条河的上下两岸 建桥 要求不能交叉 问最多建立多少道桥 转化成对于任何下河道的桥 转化为数组下表 上河道第几个桥变成数组的值 那么就是看LIS的值 数据给出一对值 如果不能保证单调上升说明这么做不行 使用PII 来做 #

[AcWing 844] 走迷宫

BFS 使用STL中的queue 点击查看代码 #include<iostream> #include<cstring> #include<queue> using namespace std; typedef pair<int, int> PII; const int N = 100 + 10; int n, m; int g[N][N], d[N][N]; queue<PII> q; int bfs() { q.push({0,

L3-001 凑零钱

#include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; const int N = 10010, M = 110; int f[M]; int n, m; int w[N]; int pre[N]; bool g[N][M]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++

P1656 炸铁路

题目传送门 知识点 无向图边双连通分量模板 \(vector+PII\)的自定义排序 #include <bits/stdc++.h> using namespace std; const int N = 5010, M = 20010; typedef pair<int, int> PII; int n, m; int h[N], e[M], ne[M], idx; int dfn[N], low[N], timestamp; int stk[N], t

时间先后模拟类

负载均衡https://www.acwing.com/problem/content/3495/ 得到开始的时刻 判断{结束时刻 ,值} #include <iostream> #include <cstring> #include <algorithm> #include <queue> #define x first #define y second using namespace std; typedef pair<int, int>

wxy 3.31 牛客练习赛60重现

v> wxy 3.31 牛客练习赛60重现 5075 A 看到位运算,可以往二进制方面去想,可以把1-n所有的的每位放到相应的位置上,然后遍历所有的 数,每次都把他拆分成二进制和刚刚统计的那些数的每位进行与运算 C DP 设dp[ i ] [ j ]表示前i个,长度为j的本质不同的子序列有多少,那么dp[ i ] [ j ]=dp[

1625C - Road Optimization

#include <bits/stdc++.h> #define x first #define y second #define LL long long #define PII pair<int, int> using namespace std; const int N = 510; int n, l, m; PII a[N]; LL f[N][N]; int main() { scanf("%d%d%d", &n, &l, &am

【刷题】【pair】最大数

题面:   n个数中最大的那个数在哪里?输出其位置, 若有多个最大数则都要输出。 【输入】   第一行:n( 3 <= n <= 10)   第二行:空格 隔开的n个数 【输出】   输出若干个数,表示最大数的位置,每行一 个。 【样例输入】 5 1 2 6 3 6 【样例输出】 3 5   使用pair加vector解决 #inclu

AcWing2014. 岛

每当下雨时,农夫约翰的田地总是被洪水淹没。 由于田地不是完全水平的,所以一些地方充满水后,留下了许多被水隔开的“岛”。 约翰的田地被描述为由 N 个连续高度值 H1,…,HN 指定的一维场景。 假设该场景被无限高的围墙包围着,请考虑暴雨期间发生的情况: 最低处首先被水覆盖,形成一

unique去重

#include <iostream> #include <cstring> #include <algorithm> #define x first #define y second using namespace std; typedef pair<int, int> PII; const int N = 100010; int n; int h[N]; PII q[N]; int main() { scanf("%d&qu

值周 (区间合并 差分

添加链接描述 区间合并 首先按区间将按左端点从小到大排序 然后标记第一个区间左右端点为a和b 然后从第二个区间遍历 如果当前区间左端点小于等于a 说明包含在a到b中间 则判断是否需要扩大b 取max 如果当前区间左端点大于a 说明区间不包含 减去当前a到b的所有点 要+1 记录当

CF1006B 题解

题意 给定长度为n的序列,要求分成k段,最大化每段最大值的和 输入 第一行n和k(1 <= k <= n <= 2000) 第二行为序列a[1],a[2],a[3]....... 输出 第一行n和k 题解 1.排序排出前kk个数值 2.再把位置从低到高排一下,还原数组 3.碰到前kk个数中其中一个数就分割,分摊到每一组。 代码 #in

P3266 [JLOI2015]骗我呢

#include <cstdio> #include <iostream> using namespace std; #define pii pair< int , int > #define fi first #define sc second #define mp make_pair const int MAXN = 3e6 , Mod = 1e9 + 7; #define Add( x , y ) ( x + y >= Mod ? x + y - Mod

AtCoder Beginner Contest 226 (A~E)

AtCoder Beginner Contest 226 A - Round decimals 给你一个小数让你输出四舍五入后的整数,我直接%.0f输出wa了一个点,用字符串判断过了。。。 B - Counting Arrays 给你\(n\)个数组,问你有多少种数组 直接map输出size就好 C - Martial artist 你需要学习\(n\)个步伐,学习第\(i\)个步

H. AND = OR 题解(线段树+思维)

题目链接 题目思路 官方题解如下 一个比较容忽视的点,就是如果k位只有一种并且有多个,那么就可以分给两组 代码 #include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define debug cout<<"I AM HERE"<<endl; using namespace std; typedef lon

P1208 [USACO1.3]混合牛奶 Mixing Milk

哈夫曼编码之后做的第二个贪心题... #include<iostream> #include<algorithm> using namespace std; const int N = 5010; #define PII pair<int, int> #define int long long PII a[N]; int n, m; signed main(){ cin >> n >> m; for(int i

洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)

洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问。显然一个连通块符合条件当且仅当它能够包含所有颜色。我们注意到这里的 \(k\) 数据范围很小,因此考虑状压 \(dp\)。\(dp_{x,y,S}\) 表示包含 \((x,y)\) 且囊

「CEOI2014」The Wall 题解

[CEOI2014] The Wall 题解 题意 \(~~~~\) 求在二维平面上选择一些有权值的线段并将给定的格子围住的最小权。 \(~~~~\) \(1\leq n,m\leq 400\) 。 题解 \(~~~~\) 神仙结论题目。 \(~~~~\) 首先这道题的结论是:将每个方格四周的点按照权值连边后,所有关键格子左上角的点到最左上角