seg

P5840 [COCI2015]Divljak【AC自动机+fail树+树上乱搞】

泄露秘密 提交于 2020-01-10 06:23:28
https://www.luogu.com.cn/problem/P5840 题意:中文题,给你n个串,然后m次操作,两种操作。 1操作,集合T加入一个串。2操作,询问集合T中出现上面的n个串的第i个几次。 首先听说解法挺多的,如果有幸学会了,后来补上吧。 做法:这里用AC自动机做吧,首先对n个串建立AC自动机,建立fail树,然后每一次往T集合中加入一个字符串,就让他到AC自动机中跑,跑到的点对应到fail树上点到根上的串表示都出现了,但不过一次加入中只每个点最多只能加1,因此需要去重,同时对于同一条链上点,需要利用DFS序加LCA处理一下。统计的时候就用树状数组吧。 下面这份代码可能写丑了,不开O2勉强卡过去。 # include "bits/stdc++.h" using namespace std ; inline int read ( ) { int x = 0 ; bool f = 1 ; char c = getchar ( ) ; for ( ; ! isdigit ( c ) ; c = getchar ( ) ) if ( c == '-' ) f = 0 ; for ( ; isdigit ( c ) ; c = getchar ( ) ) x = ( x << 3 ) + ( x << 1 ) + c - '0' ; if ( f ) return x ;

Hello 2020 题解

心已入冬 提交于 2020-01-07 08:37:25
新年第一场。 开场 2min 写了 A,再 5min 写了 B,再 4min 写了 C。 然后由于脑子一抽,没想清楚就开始码 D,花了 18min 写完。 然后发现好友列表里的人好像切四题的不多,还能玩。 然后开始想 E。 一开始先去问了个是否必须是凸多边形和一个组成凹多边形(会有三种情况)的点集要被算多少次。 看到三种情况只能算一次,心态就崩了…… 5min 后才发现如果合法,恰好一种是合法的,白白浪费了一堆时间…… 然后开码。比想象中的好码。但由于计算几何,所以还是用了很长时间,大概 1h。 然后 WA9。 对拍也不太想写,就静态查错,死都查不出来。 弃疗了,水群去了。 …… 然后天真的以为 long double 就够了,又送一发罚时。 最后还是重构成了叉积+判象限的写法,终于在 2:09 过掉了。 E 的得分比 C 还少。 看起来发挥还不错,上 IM 了。 (戏剧性的一幕:tourist 最后 2min 切了 G 翻上了 rk1,predictor 显示 dls 将仍是榜二,然后 tourist 的 G FST 了) (祝贺 dls 登基,今年是 MiFaFaOvO 元年) A 入门模拟。 代码 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int>

线段树 & 题目

夙愿已清 提交于 2020-01-05 03:11:29
首先说下我写的线段树吧。 我是按照线段树【完全版】那个人的写法来写的,因为网上大多数题解都是按照他的写法来写。 确实比较飘逸,所以就借用了。 节点大小是maxn是4倍,准确来说是大于maxn的2^x次方的最小值的两倍。 lson 和 rson 用宏定义写了。因为是固定的量。 线段树不必保存自身的区间,因为一边传递过去的时候,在函数里就有区间表示,无谓开多些无用的变量。 pushUp函数,更新当前节点cur的值,其实就是,线段树一般都是处理完左右孩子,然后再递归更新父亲的嘛,这个pushUp函数就是用来更新父亲的。感觉不用这个函数更加清楚明了。 pushDown函数,在lazy--upDate的时候有用,作用是把延迟标记更新到左右节点。 多次使用sum不用清0,add要。build的时候就会初始化sum数据。但其他用法就可能要 1 #define lson L, mid, cur << 1 2 #define rson mid + 1, R, cur << 1 | 1 3 void pushUp(int cur) { 4 sum[cur] = sum[cur << 1] + sum[cur << 1 | 1]; 5 } 6 void pushDown(int cur, int total) { 7 if (add[cur]) { 8 add[cur << 1] += add[cur]

HDU 4325 线段树离散化

谁都会走 提交于 2020-01-05 03:07:14
线段树离散化 1.输入完所有数据,对开花时间离散化 2.区间更新,点查询,LAZY操作。。 View Code #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> using namespace std; #define MAXN 51000 struct node { int left, right; int num; int sum; int lazy; }seg[500010]; int N, M; struct flower { int a,b; }p[101000]; int v[200010]; int hashx[201000]; void build(int l, int r, int root) { int mid = (l + r) / 2; seg[root].left = l; seg[root].right = r; seg[root].num = 0; seg[root].lazy = 0; seg[root].sum = 0; if( l == r ) { return; } build(l,mid,root*2); build(mid+1,r,root*2+1); seg[root].sum = seg[root*2]

数码管、按键、定时器、ds18b20综合应用

断了今生、忘了曾经 提交于 2020-01-01 00:53:01
利用 8051 单片机设计秒表,包括 3 个按键、3 位数码管。按键分别用于启动、暂停、 显示学号,显示温度,时间用数码管显示。开始后显示学号后 3 位。按启动键下后,显示 0.00 以 0.01 秒的频率从 0.00 递增,期间按暂停键时暂停,再次按暂停继续递增,当递增到 9.99 以后循 环。按显示学号键,显示学号。 1、电路仿真: 2、程序设计: (1)项目结构: (2)主函数: #include <reg52.h> #define uchar unsigned char #define uint unsigned int #include<display.c> #include<key.c> #include<DS18B20.C> unsigned int cp; void display(void); void key(void); /*Timer0中断服务函数*/ void timer0_isr(void) interrupt 1 { TH0=(65535-2000)/256; //重装初值 TL0=(65535-2000)%256; //重装初值 cp++; //2000代表2ms,1000ms=1s if(mode == 2)cp=0;//按下暂停按键后,mode为2 else{ if(cp>=5) //0.01s到了 { cp=0; xiaoshu++; } if

并发编程—6ConcurrentHashMap1.7 & 1.8

隐身守侯 提交于 2019-12-26 20:41:47
目录 6 ConcurrentHashMap jdk1.7 6.1 预备知识 6.2 jdk1.7原理和实现 6.3 源码 6.3.1 构造方法 6.2.2 get方法 6.2.3 put方法 8.ConcurrentHashMap jdk1.8 8.1与1.7相比的重大变化 8.2 主要数据结构和关键变量 8.3sizeCtl: 8.4 源码 8.4.1 初始化做了什么事? 8.4.2 在get和put操作中,是如何快速定位元素放在哪个位置的? 8.4.3 扩容操作 6 ConcurrentHashMap jdk1.7 hash算法的介绍 构造方法做了什么 get方法做了什么 put方法做了什么 动态扩容逻辑 6.1 预备知识 hash算法: 就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。在jdk1.7为了使得hash出来的值更加均匀,在concurrentHashMap里面使用了Wang/Jenkins hash算法再做了一次hash。 HashMap和HashTable的缺陷:

题解 SP8073 【CIRU - The area of the union of circles】

你离开我真会死。 提交于 2019-12-18 18:59:41
题目链接 Solution 圆的面积并 题目大意:给定 \(n\) 个圆, \(n \leq 1000\) 求这些圆的面积并 自适应辛普森 求圆的面积并我们不好求,但是我们可以 \(O(nlogn)\) 求出 \(n\) 条线段的并,于是我们可以用 \(f(X)\) 表示直线 \(x = X\) 与每个圆的切线的并,然后我们求 \(\int_{-\infty}^{\infty} f(x)\;dx\) 即可 直接上自适应辛普森,不过要注意,如果朴素算法及其容易炸精度(比如圆分布的比较稀疏,你辛普森算法第一层取的 \(5\) 个点全都是 \(0\) 就gg了,可以分段做辛普森) #include <algorithm> #include <iostream> #include <iomanip> #include <vector> #include <cmath> #include <cstdio> #include <map> using namespace std; const int maxn = 1024; double eps = 1e-4; struct Seg{ double l,r; bool operator < (const Seg &rhs)const{return l < rhs.l;} }seg[maxn]; struct Round{ double x,y

Educational Codeforces Round 58 (Rated for Div. 2) 题解

可紊 提交于 2019-12-18 01:08:47
Educational Codeforces Round 58 (Rated for Div. 2) 题目总链接: https://codeforces.com/contest/1101 A. Minimum Integer 题意: 多组数据,给你三个数l,r,d,要求在区间[l,r]之外找一个最小的x,使得x%d==0。 题解: 当d<l or d>r的时候,直接输出d就好了。 当l<=d<=r的时候,找到最小的t,使得t*d>r就行了。 具体操作见代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; int q; ll l,r,d; int main(){ cin>>q; while(q--){ cin>>l>>r>>d; if(d<l || d>r) cout<<d<<endl; else{ ll now = r/d; cout<<(now+1)*d<<endl; } } return 0; } View Code B. Accordion 题意: 给出一个字符串,要求删去一些数后它由以下几个部分组成,[ : .... : ],这其中"...."指的是0个或多个“ | ”。 问满足上面条件时,留下的字符串的最大长度为多少。 题解: 模拟一下就好了,从左往右遍历找 [ 以及 :

How To Determine The Cause Of Lots Of Redo Generation Using LogMiner (Doc ID 300395.1)

家住魔仙堡 提交于 2019-12-09 13:19:11
How To Determine The Cause Of Lots Of Redo Generation Using LogMiner (Doc ID 300395.1) APPLIES TO: Oracle Database - Enterprise Edition - Version 8.1.7.4 to 10.2.0.5 [Release 8.1.7 to 10.2] Oracle Database - Enterprise Edition - Version 11.2.0.1 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle Database Exadata Express Cloud Service - Version N/A and later Oracle Database Exadata Cloud Machine - Version N/A and later Information in this document applies to any platform. NOTE: In the images and/or the document content below, the user information and data used

2019icpc银川站 复现赛

这一生的挚爱 提交于 2019-12-06 07:07:49
打了计蒜客上的银川重现赛,总体感觉难度上确实比平时区域赛要低上一些。 这里补一下F题和G题的思路和代码。 F题 做法,玩一下n=10的样例就出来啦!   解释:显然a^x的反函数为log a x,我们先固定外层的求和的a,然后看内层求和的b,b从a开始加到n,注意到对于后半个向上取整的log b a,b>=a,所以始终都是1,而对于前半个式子,只有当b经过a^i时才增加,举个例子就是log 2 2~log 2 3向下取整都为1,log 2 4~log 2 7向下取整都为2,log 2 8~log 2 10都为3. 对于n=10的样例,a=2就可以这样玩出来,在玩a=3,同理,b从3~10的过程中,9和10的时候出来2。 而对于4和4以后的值,我们发现后面求和的值都是n-i+1个1,就是从i到n中有多少个数,这部分我们就可以用公式算。咋算呢? Σi(n-i+1),显然 i 从sqrt(n)+1到n,把这个式子拆开来,就可以得到公式,此处注意 1 2 +2 2 +……+n 2 =n*(n+1)*(2n+1)/6; 至此,我们就可以发现规律了!n最大到1e12,我们就可以对前sqrt(n)个数暴力的去算。后面部分的完美地去用公式算。 不过比赛的时候,取模写炸了,导致10几分钟就推出来的结论,爆炸搞了2个小时,取模要每步取模,由于这里的n本身就很大,每个数本身都要取模,而更重要的是对于除法