vis

2019杭电多校第八场

↘锁芯ラ 提交于 2019-11-27 09:35:44
比赛记录 lfw写1011贪心,WA,改成nlogn T,加上freadinlineregister ,T,想出正解后,WA,shl写了才过 lfw写1009几何分类,WA,shl改成离散化dfs才过 lfw和byf oeis出1003,打表过了,lfw终于过了今天第一题 都是byf究极毒奶,中午吃饭的时候跟llg说lfw做水题又快又猛,然后下午lfw键盘冒奶 晚上byf奶rng必不可能输,然后rng 0:2 题解 1001 Acesrc and Cube Hypernet 1002 Acesrc and Girlfriend 1003 Acesrc and Good Numbers oeis后打表 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int d;long long x; 6 long long a[10][545]; 7 int cnt[10]; 8 9 inline void init() 10 { 11 cnt[1]=84;cnt[2]=14;cnt[3]=36;cnt[4]=48;cnt[5]=5; 12 cnt[6]=72;cnt[7]=49;cnt[8]=344;cnt[9]=9; 13 a[1][1]=0; 14 a[1][2]=1; 15 a[1][3]=199981; 16 a[1][4]

【UOJ#3】白鸽

限于喜欢 提交于 2019-11-27 07:07:55
题面 http://uoj.ac/problem/389 题解 当我刚学欧拉回路的时候,刚刚把网络流学完,就知道欧拉回路的题可以用网络流来做,这道题就是啦。 可以说欧拉回路是一类特殊网络流的调整问题(和上下界网络流)差不多。 所以我曾经开过脑洞,有上下界最小流可以用费用流做,但是由于太慢被自己$D$了。 首先,判断存在性直接用欧拉回路的理论去判就行了, 最后已经知道是绕圈圈了,所以我们考虑如何来计算绕行的圈数。 我们把$x$轴正半轴看成圆点的射线,每正着(从上到下)经过一次,就把答案$+1$,反着经过,就把答案$-1$(为什么?因为说明原来算在里面的一圈假了,所以要$-1$) 答案就是原来的费用加上最大费用最大流。 然后再把每条边随意定向,我发现了$2$个问题。 要是定向之后直接符合了判定,就假了。 所以我们直接让编号小的向编号大的联就好了。 权值有正有负,很麻烦。这样我们直接定向就假设费用都能取到,这样每条边都是负的了,$spfa$就能跑到快一点了(躲开负边就行了)。。。。 #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 20500 #define S 0 #define T (n+1)

图论 test solution

旧巷老猫 提交于 2019-11-27 07:01:09
图论 test solution T1:潜伏 题目背景 小悠回家之后,跟着母亲看了很多抗日神剧,其中不乏一些谍战片。 题目描述 解放前夕,北平城内潜伏着若干名地下党员,他们居住在城市的不同位置。现在身为地下党第一指挥官的你,想知道地下党员之间的最小通信距离,即从某一地下党员住处前往另一地下党员住处的距离的最小值。 我们可以将北平城视为一张N个点M条边的无向图,每条边连接两个点 ,且长度为 \(w_i\) 。 输入格式 每个测试点包含多组数据。 第一行,给出数据组数 ,之后依次输入每组数据。 每组数据的第一行,N,M,K,分别表示点数,边数,地下党员数。 之后M行,每 \(u_i,v_i,w_i\) 表示第i条边。 之后一行,K个整数代表地下党员所在结点。 结点编号为1到N,保证N>=K。 输出格式 对于每组数据,输出一行一个整数,表示地下党员之间的最小通信距离。 如果最小通信距离为∞,请输出-1代替。 样例输入 3 5 10 3 1 3 437 1 2 282 1 5 328 1 2 519 1 2 990 2 3 837 2 4 267 2 3 502 3 5 613 4 5 132 1 3 4 10 13 4 1 6 484 1 3 342 2 3 695 2 3 791 2 8 974 3 9 526 4 9 584 4 7 550 5 9 914 6 7 444 6 8

P1638 逛画展

邮差的信 提交于 2019-11-27 06:38:03
题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画。 wangjy想到博览馆去看这几位大师的作品。 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票 的价钱就是一张图画一元。 为了看到更多名师的画,wangjy希望入场后可以看到所有名师的图画(至少各一张)。 可是他又想节省金钱。。。 作为wangjy的朋友,他请你写一个程序决定他购买门票时的 a 值和 b 值。 输入输出格式 输入格式: 第一行是 N 和 M,分别代表博览馆内的图画总数及这些图画是由多少位名师的画 所绘画的。 其后的一行包含 N 个数字,它们都介于 1 和 M 之间,代表该位名师的编号。 输出格式: a和 b(a<=b) 由一个空格符所隔开。 保证有解,如果多解,输出a最小的。 输入输出样例 输入样例#1: 复制 12 5 2 5 3 1 3 2 4 1 1 5 4 3 输出样例#1: 复制 2 7 说明 约定 30%的数据N<=200 , M<=20 60%的数据N<=10000 , M<=1000 100%的数据N<=1000000 , M<=2000 思路: 只需记录满足条件的一个区间的初始端点(h, t),不断删掉左端点h,不断更新右端点t; 那么怎样保证找到的这个区间符合题意呢?

CF #579 (Div. 3) E.Boxers

假装没事ソ 提交于 2019-11-27 06:29:53
E.Boxers time limit per test2 seconds memory limit per test256 megabytes inputstdin outputstdout There are 𝑛 boxers, the weight of the 𝑖-th boxer is 𝑎𝑖. Each of them can change the weight by no more than 1 before the competition (the weight cannot become equal to zero, that is, it must remain positive). Weight is always an integer number. It is necessary to choose the largest boxing team in terms of the number of people, that all the boxers' weights in the team are different (i.e. unique). Write a program that for given current values ​𝑎𝑖 will find the maximum possible number of boxers in a

POJ 2114 (点分治)

ⅰ亾dé卋堺 提交于 2019-11-27 05:59:53
题目: https://vjudge.net/contest/307753#problem/B 题意: 求树中路径和=k的点对是否存在 思路: 点分治,这个题其实和上一题洛谷一样,只是这个数据强,我们不能直接预处理所有可能的路径长度,预处理所有路径长度复杂度 O(n^2) ,我们改为直接每次查询都分治一遍,我们只要把solve在O(n)求出来,那时间复杂度就是 O(n*logn*logn),时间上快了很多,其实等于k这个可以使用我们之前的方法。直接把不大于k的路径-小于k的路径=等于k的路径,然后搞一搞就可以了 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #include<vector> #define maxn 100005 #define mod 1e19 using namespace std; typedef long long ll; ll da; vector<pair<ll,ll> > mp[maxn];//存下图 bool vis[maxn];//标记曾经使用过的重心 ll maxsize[maxn],dis[maxn],d[maxn];//maxsize 当前节点的最大子树 ll siz[maxn],e[maxn];// dis

洛谷 P3806 (点分治)

孤者浪人 提交于 2019-11-27 05:34:46
题目: https://www.luogu.org/problem/P3806 题意: 一棵树,下面有q个询问,问是否有距离为k的点对 思路: 牵扯到树上路径的题都是一般都是点分治,我们可以算出所有的路径长度然后保留下来,点分治无非就是几步一直递归,点分治就是在树上递归 1,找树的重心 2,算出所有点到重心距离,找出当前重心的所有合法路径 3,递归到子树 然后反复执行这三步 其实点分治唯一思考的地方就是 solve函数,其他都是一样的 https://www.cnblogs.com/guoshaoyang/p/10994997.html https://www.cnblogs.com/PinkRabbit/p/8593080.html #include<bits/stdc++.h> #define maxn 100005 #define mod 1000000007 using namespace std; typedef long long ll; vector<pair<ll,ll> > mp[maxn];//存下图 bool vis[maxn];//标记曾经使用过的重心 ll maxsize[maxn],dis[maxn],d[maxn];//maxsize 当前节点的最大子树 ll siz[maxn],e[maxn];// dis 到重心的距离 d 出现过的距离 ll n

题解小合集——第八弹

喜夏-厌秋 提交于 2019-11-27 04:55:05
(转载于 我的洛谷博客 ) 索引: 第一题:P2564 生日礼物 第二题:P3084 照片 第三题:P4878 布局 第四题:P2736 “破锣摇滚”乐队 第五题:P4568 飞行路线 第六题:P1284 三角形牧场 第七题:P3959 宝藏 第八题:P1197 星球大战 第九题:P1337 平衡点 第十题:P1325 雷达安装 第一题:P2564 生日礼物 题解思路:单调队列(尺取法) 这题和P1638 逛画展 很像,唯一的区别就是可能同一个位置上可能都有多个"彩珠" 然而有多个"彩珠"这点有和P2698 花盆 这题一样 所以我们可以继承两题的思路,用P1638的单调队列和P2698里的结构体来解决这个题。显然,我们的结构体要记录两个数据:位置,种类。然后我们对位置排序,以便于维护单调序列。 我们用一个指针l指向区间的最左端的珠子,然后遍历所有珠子(不用去循环右端点,因为在彩带上会有地方没有珠子,把右端点放在没有珠子的地方是没有意义的),每增加一颗i种类的珠子,kind[i]就记录i种类的珠子的最近出现的位置。如果又找到了一颗和 区间最左端的珠子 相同的珠子,那么最左端的珠子就没有存在的必要了,把它出队即可。当区间包含所有种类的珠子时,我们更新并记录最优答案,在遍历完之后输出即可。 请结合代码加深理解…… #include<cstdio> #include<cstring>

「训练日志17」 (8.12) 崩盘

吃可爱长大的小学妹 提交于 2019-11-27 04:31:58
T1 引子   大模拟,很恶心的一道题,做了我俩小时。   这道题纯属考如何输入,解决问题代码十行,输入一百多行。   考试上错了几个点: 对题意理解不全,多考虑了很多无用情况。 没有用心思考,连样例都不能手玩出来。 桶的编号和桶的数量没分清。 没有考虑到桶的数量大于数组容量的情况。    然后,0分。   小弟不才。 1 #include<cstdio> 2 #define HZOI std 3 using namespace HZOI; 4 const int N=1003; 5 struct node{ 6 int s,x,z,y; 7 }pos[N*N]; 8 int n,m; 9 char a[N][N]; 10 int tot,be[N][N],num[N*N],vis[N][N]; 11 int when,gt[N<<6][N],ans[N]; 12 int tt,first[N*N]; 13 int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0}; 14 void Dfs(int ); 15 inline char read(); 16 int main() 17 { 18 scanf("%d%d",&n,&m); 19 for (int i=1; i<=n; ++i) 20 for (int j=1; j<=m; ++j) 21 a[i][j]

出现或者反转后出现在每个字符串中的最长子串

戏子无情 提交于 2019-11-27 04:12:54
题目链接: https://cn.vjudge.net/contest/318888#problem/M 思路: 1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 #include <string.h> 5 #include <stdlib.h> 6 #include <math.h> 7 #include <queue> 8 #include <set> 9 10 #define INF 0x3f3f3f3f 11 #define pii pair<int,int> 12 #define LL long long 13 using namespace std; 14 typedef unsigned long long ull; 15 const int MAXN = 2e5 + 10; 16 int t; 17 int wa[MAXN], wb[MAXN], wv[MAXN], ws_[MAXN]; 18 void Suffix(int *r, int *sa, int n, int m) 19 { 20 int i, j, k, *x = wa, *y = wb, *t; 21 for(i = 0; i < m; ++i) ws_[i] = 0; 22 for(i = 0; i < n; +