https://codeforces.com/contest/1304/problem/D #include<bits/stdc++.h> using namespace std; void solve(){ int n; string s; cin>>n; cin>>s; int Min[n]; int t = n; ;i<s.length();i++){ ,indx = i; if(s[i] == '<'){ while(s[i]=='<'){ l…
根据题目,我们可以找最短的LIS和最长的LIS,找最短LIS时,可以将每一个increase序列分成一组,从左到右将最大的还未选择的数字填写进去,不同组之间一定不会存在s[i]<s[j]的情况,保证满足题意,找最长LIS,可以找补集,将每个decrease序列分成一组,找到后取反即可 #include<bits/stdc++.h> using namespace std; #define lowbit(x) ((x)&(-x)) typedef long long LL; vec…
Codeforces Round #620 (Div. 2) D. Shortest and Longest LIS 题解: 贪心即可,对于最短序列,我们尽可能用可用的最大数字放入序列中,对于最长序列,我们尽可能用可用的最小数组放入序列即可,再处理序列时,当满足当前防止变化规律的符号直接防止,如果不满足则向后遍历直到遇到满足条件的符号,然后倒序放直到放完.eg. "><<>" 我们从大向小取,第一个为大于号所以直接填入,第二为小于号暂时不填,第三为小于号暂时不填…
看样例,>><>><,要构造 LIS 最短的,我们需要找最小链划分的方案,即包含最少的下降列 很容易想到把连续 < 的看成一段,比如样例就是 .|.|. .|.|. . 每一段内必须上升,考虑让它连续,然后让段末取当前没取过的最大值即可 要构造 LIS 最长的,同理,我们把连续 > 的堪称一段,比如样例就是 . . .|. . .|. 每段内必须下降,考虑让它连续,然后让段膜取当前没去过的最小值即可 #include <bits/stdc++.h>…
前置扯淡 %%@\(wucstido\),思路是在是巧妙---link Description 给一个长度为\(n\)由 \(<\) 和 \(>\)组成的字符串,表示序列中相邻位置的数的大小关系 求构造两种排列,使得其在满足上述条件的情况下的 \(LIS\) 分别最长\(/\)最短 Solution 直接考虑构造最短的排列,然后最长的同理(真的是把符号改改就可以了) 整个排列\(LIS\)的最小值在最长的一段\("<"\)中取得,然后我们考虑构造 先把整个排列逆序过来…
A B /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a,b) make_pair(a,b) #define pb push_back ][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }}; using namespace std; typedef long long ll; inline v…
题意:给一个\(n\)X\(m\)的矩阵,矩阵中某个数字\(k\)表示其四周恰好有\(k\)个不为0的数字,你可以使任意位置上的数字变大,如果操作后满足条件,输出新矩阵,否则输出NO. 题解:贪心,既然能使任意位置加大任意数值,那么我们可以将所有位置都给他填满,这样的话,只要是满足条件的情况就都能这样输出,所以我们遍历每个位置,然后判断周围能填多少个,如果某个数大于周围能填的个数,那么就不满足条件. 代码: int t; int n,m; int a[400][400]; int dx[4]={…
A. Two Rabbits (手速题) #include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ int t; cin>>t; while(t--){ ll x,y,a,b; cin>>x>>y>>a>>b; ll sum = a+b; ){ cout<<(y-x)/sum<<endl; } else{ cou…
[Codeforces 1205B]Shortest Cycle(最小环) 题面 给出n个正整数\(a_i\),若\(a_i \& a_j \neq 0\),则连边\((i,j)\)(注意i->j的边和j->i的边看作一条.问连边完图的最小环长度 \(n \leq 10^5,0 \leq a_i \leq 10^{18}\) 分析 我们按位考虑.显然满足第i位为1的所有数两两之间都有边,构成一个完全图. 统计第i位为1的数,如果第i位为1的数超过2个,就直接输出3(这3个构成一个最小环…
题意 给定$n$个数,求最长上升子序列的方案数 根据数据范围要求是$O(n\log n)$ 朴素的dp方程式$f_i=max(f_j+1),a_i>a_j$,所以记方案数为$v_i$,则$v_i=v_i+v_j,(f_i=f_j+1)$,利用lis的$O(n\log n)$树状数组做法同时维护长度和方案数 从通酱博客里还看到更详尽的解释:stackoverflow 时间复杂度$O(n\log n)$ 代码 #include <bits/stdc++.h> using namespace…