cstring

【icpc2019网络赛南昌站】Yukino With Subinterval

≡放荡痞女 提交于 2021-02-12 09:10:54
傻b错误调一天系列 原题: 大意:给你一个数列a,字词两种操作: 1.把c[l]改成r 2.询问在区间[l,r]中,有多少个极大子区间满足子区间里的数全部一样,且在[x,y]范围内 (对于满足条件的区间A,若不存在满足条件的区间B使得A包含于B,则称A为极大子区间) 序列问题,要求复杂度O(nlogn),联想cdq分治 值域可以容斥拆成[1,l-1]和[1,r]两个询问,即把询问转化为区间中数小于等于x的数有多少个 可以把初始数列看成0,然后用修改操作代替初始数列 那么现在就存在偏序:若修改A的时间小于询问B,且A的值小于B的值,则A可以给B提供贡献 对于计算贡献,我们建一个线段树,字词单点修改,并查询有多少个不同的非0极大子区间,这个比较好写 初始按时间排序,然后按值域分治 然后这题就做完了马 反例: 6 3 1 1 4 5 1 4 2 1 6 2 5 1 6 1 2 1 6 2 5 上面的做法会输出3 3,正确答案却是3 2 考试的时候我写这个做法然后深度自闭 出错的原因是因为我们按值域分治,那么当第6个数(被视为操作1 6 4)和第三个操作(2 1 6 2 5)分到一个分治区间时,因为操作2(1 6 1)被分到左边的分治区间了,所以不会把代表第6个数的操作覆盖掉,这时第6个数就给第3个操作产生了贡献(尽管第三个操作进行时它已经被覆盖掉了) 更换提供贡献的顺序是不行的

Educational Codeforces Round 64 (Rated for Div. 2)

喜你入骨 提交于 2021-02-12 03:45:57
题目链接: https://codeforces.com/contests/1156 A. Inscribed Figures 题目大意:假设1代表圆形,2代表正三角形,3代表正方形,那么如例一所示2 1 3就代表正三角形内接圆形,同时内接圆的内部再内接正方形。那么现在所需要求的就是通过不断内接图形最终有多少个交点,如果在这个过程中内接的图形与之有边重合则 Infinite 解题思路:分别画出1 2 3 、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1,就可以得出规律如下 1中内接2或者2中内接1,则有3个交点 1中内接3或者3中内切1,则有4个交点 2和3相连一定存在边重合的现象,所以2和3之间一定要有1,否则 Infinite 特殊情况 3 1 2,存在重合点,需要特别判断 #include<cstdio> #include <iostream> using namespace std; // zhicheng // May,2,2019 int main() { int n,ans= 0 ,a[ 105 ]; scanf( " %d " ,& n); for ( int i= 0 ;i<n;++ i) { scanf( " %d " ,& a[i]); if (i== 0 ||ans==- 1 ) continue ; if (a[i]*a[i- 1 ]== 6

数独

十年热恋 提交于 2021-02-12 00:53:12
问题描述: 这个游戏只有一个规则:将格子填满使得, 每一行,每一列,和每一个小的九宫格恰好包含1-9 这9 个数字是由于规则简单而又变化多端,数独一时间风靡全球。 现在,我们希望你能编写一个程序解决数独问题。 输入数据 输入数据一共9 行,每行有9 个字符。 输入数据描述了一个待解决的数独,其中,“?”表示数独中的空缺。 我们的输入数据总保证有唯一解。 输出数据 输出一共9 行,每行9 个数字,表示你的答案。 样例输入 5????7??6 ?6????5?4 ?834????? ???182?4? ??1???9?? ?7?369??? ?????543? 1?5????9? 7??2????1 样例输出 514927386 967831524 283456179 659182743 321574968 478369215 892615437 135748692 746293851 这道题别想太多,爆搜就行。每一步找到一个是'?' 的的格子,然后尝试填入1到9,若成功填入,就递归找下一个'?' 的格子。 这道题的重点是在于判断这个格子是否能填这个数。 我们要判断这个数在该行,该列和该九宫格的合法性。因为数字只有1到9,所以开二维数组标记就行,vis[i][j] = 1代表在第 i 行(列)已经有数字 j 了。这样行和列的判断就完成了。 重点是九宫格的判断。他之所以不好表示

分治优化决策单调性

眉间皱痕 提交于 2021-02-11 23:20:13
<!--more--> 分治优化决策单调性 在我们了解的DP方程中,经常会有$f[i]=sum_{max}/sum_{min}/min/max{f[j]+calc(i,j)}$,并且calc(i,j)满足四边形不等式,这种方程存在,而通常情况下,calc(i,j)可以非常轻松的得出,比如说$x^q$,或者sum[i][j],又或者是什么其他的东西。但是,有些时候,我们并不能在$O(logn)/O(1)$的时间内得出,这种情况下,正常通过维护单调队列并且二分的方法就没办法完成了。 这种情况下,我们就需要考虑calc(i,j)的求法了,这种时候,如果我们发现calc(i,j)可以通过分治来均摊$O(nlogn)$处理出来的时候,我们就可以通过整体二分来维护决策单调性来转移,保证整体时间复杂度的正确性。 例题时间 BZOJ 5125: [Lydsy1712月赛]小Q的书架 这道题很显然,我们要将序列分成$K$段使得这$K$段的逆序对和最小。 正常DP方程,f[i][j]=f[i-1][k]+calc(k+1,j); 我们发现calc(k+1,j)满足$calc(i,j)+calc(i-1,j+1) \ge calc(i,j+1)+calc(i+1,j)$所以这个具有决策单调性,但是,我们虽然将DP方程的时间复杂度减少到$O(nklogn)$但是,我们发现,每次计算calc(i,j)还是

POJ 2559 Largest Rectangle in a Histogram (单调栈)

给你一囗甜甜゛ 提交于 2021-02-11 17:28:52
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles: Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned

2019河北省大学生程序设计竞赛(重现赛) L题-smart robot(深度优先搜索)

南笙酒味 提交于 2021-02-11 15:42:37
题目链接: https://ac.nowcoder.com/acm/contest/903/L 题意:给你 n * n的方阵,你可以从任意一个数字开始走,可以走上下左右四个方向,走过的数字会被拼合,拼合的数字没有前导0,问最小不能拼合出来的数字是多少? 思路:开始就认为是一道深搜题,后面自己想太多就没去试,醉了orz! 这题就是把每个数字作为起点开始搜索,把已经搜索过的数字进行标记,然后从0开始检索,输出第一个未出现的数字就是答案。搜索的话我代码是搜5位数的所有组合,事实上这道题搜索3位数的所有组合就能过,搜索6位数就会TLE。下图是我的测试图: AC代码: 1 #include<cstdio> 2 #include<iostream> 3 #include< set > 4 #include<cstring> 5 using namespace std; 6 int n; 7 int vis[ 60 ][ 60 ]; 8 int dx[ 4 ] = { 0 , 1 , 0 ,- 1 }; 9 int dy[ 4 ] = {- 1 , 0 , 1 , 0 }; 10 set < int > st; 11 bool check( int x, int y) 12 { 13 if (x >= 0 && x < n && y >= 0 && y < n) return true ; 14

2019河北省大学生程序设计竞赛(重现赛)

故事扮演 提交于 2021-02-11 15:19:52
G 点我 X腿与队友到河北省来参加2019河北省大学生程序设计竞赛,然而这场比赛的题目难度实在是太高了。比赛开始一个小时后,X腿仍然没有做出一个题。这时候,X腿惊讶的发现电脑屏幕上出现了一个神奇按钮,按钮上写着”点我签到“。X腿非常兴奋,于是他点击了这个按钮,只见屏幕上的题目状态由“未提交”转变成了“答案错误”。他又点击了一下这个按钮,题目状态由“答案错误”变成了“通过”! 当题目状态为“通过”时,我们认为X腿签到成功了。 通过多次实验,X腿总结出以下经验: 当题目状态为”未提交“时,点击按钮后题目状态将变为”答案错误“。 当题目状态为”答案错误“时,点击按钮后题目状态将变为”通过“。 当题目状态为”*通过“时,点击按钮后题目状态将变为”答案错误“。 现在,已知初始的题目状态为”未提交“。由于X腿过于兴奋,点击了 n 次按钮。请问X腿签到成功了吗? 输入描述: 一行一个正整数 n,代表X腿点击了 n 次按钮。 0 ≤ n ≤ 100000 0≤n≤100000 输出描述: 输出一行。如果X腿签到成功,请你输出“ qiandaochenggong ”;否则输出" qiandaoshibai ”。(输出均不含引号) 示例1 输入 复制 3 输出 复制 qiandaoshibai 。 1 #include <iostream> 2 #include <algorithm> 3

矩阵乘法

为君一笑 提交于 2021-02-11 03:13:24
  关于矩阵乘法的定义我 就不再多说 关键是考验的还是建模能力 和 问题的转换问题。 我自认没有学长做的好但是我想 也具有一般的建模能力了(莫名自信)。 入坑矩阵是这样的故事 %15000 这种大法我不屑使用 所以入坑矩阵乘法当时学的很基础只知道其 能加速递推(利用快速幂) 现在的话是大概学会了建模 就是构造矩阵进行 乘法 当然 一般矩阵乘法都是要进行矩阵快速幂的。。 放上我年轻时青涩的代码: #include<bits/stdc++.h> #include <cstdio> #include <cstring> #include < string > #include <ctime> #include <cmath> #include <iostream> #include <iomanip> #include <vector> #include <stack> #include <map> #include <queue> #include <algorithm> #define mod 10000 using namespace std; inline int read() { int x= 0 ,f= 1 ; char ch= getchar(); while (ch< ' 0 ' ||ch> ' 9 ' ){ if (ch== ' - ' )f=- 1 ;ch=

[贪心][前缀和] JZOJ P1795 教主的别墅

淺唱寂寞╮ 提交于 2021-02-11 02:14:31
Description 【题目背景】   LHX教主身为宇宙第一富翁,拥有一栋富丽堂皇的别墅,由于别墅实在太大了,于是教主雇佣了许许多多的人来负责别墅的卫生工作,我们不妨称这些人为LHXee。 【题目描述】   教主一共雇佣了N个LHXee,这些LHXee有男有女。   教主的大别墅一共有M个房间,现在所有的LHXee在教主面前排成了一排。教主要把N个LHXee分成恰好M个部分,每个部分在队列中都是连续的一段,然后分别去打扫M个房间。   教主身为全世界知识最渊博的人,他当然知道男女搭配干活不累的道理,以及狼多羊少,羊多狼少的危害之大。所以教主希望一个分配方式,使得所有小组男女个数差的最大值最小。   教主还希望你输出从左到右,每个组的人数。   如果有多种人数组合都能达到最优值,教主希望你分别告诉他这些方案中字典序最小和最大的方案。换句话说,你需要找到两种方案,这两种方案满足所有组男女个数差最大值最小的前提下,第一种方案(字典序最小)要越靠前的组人数越少,也就是让第一个小组人尽量少,并且在第一个小组人尽量少的前提下,让第二个小组的人尽量少,依此类推;第二种方案(字典序最大)则要让越靠前的组人数越多。 Input   输入的第1行为两个正整数N与M,用空格分隔。   第2行包含一个长度为N的串,仅由字符组成,第i 个字符为0表示在这个位置上的LHXee为女生,若为1则为男生。

[HNOI2010] 弹飞绵羊

白昼怎懂夜的黑 提交于 2021-02-10 18:36:07
传送门:> Here < 题意:有N个弹力装置,第i个弹力装置能够把绵羊从i弹到i+k[i],如果i+k[i]仍然在N之内则接着弹,如果超出N则绵羊被弹飞。现有两种询问:1. 输出从i位置弹几次被弹飞 2.把弹力装置i的k[i]修改为y 解题思路 考虑用LCT来维护弹力装置之间的关系。如果第$i$个弹力装置的弹力系数为$k[i]$,则$link(i, i+k[i])$。如果$i+k[i] > N$,则需要增加虚拟节点$N+1$,可以形象的用来表示被弹飞 因此从$i$出发几次被弹飞也就可以转化为节点$i$到$N+1$之间路径的长度。要求路径长度只需要动态维护链的长度即可——即$split(x, N+1)$,并且用splay维护size。 对于修改弹力系数,也就等于修改了LCT的构建方式。此时我们需要断开旧边,重新连接新边。先$cut$再$link$即可 Code   编号是从0开始的(调了1小时),pushup的时候不要把size[ch[x][0]]打成了ch[x][0](调了40多分钟) /* By DennyQi */ #include <cstdio> #include <queue> #include <cstring> #include <algorithm> #define r read() #define Max(a,b) (((a)>(b)) ? (a) : (b))