[CEOI2017]One-Way Streets】的更多相关文章

题目描述 给定一张 \(n\) 个点 \(m\) 条边的无向图,现在想要把这张图定向. 有 \(p\) 个限制条件,每个条件形如 \((xi,yi)\) ,表示在新的有向图当中,\(x_i\) 要能够沿着一些边走到 \(y_i\) ​​. 现在请你求出,每条边的方向是否能够唯一确定.同时请给出这些能够唯一确定的边的方向. 输入格式 第一行两个空格隔开的正整数 \(n,m\) . 接下来 \(m\) 行,每行两个空格隔开的正整数 \(a_i,b_i\) ,表示 \(a_i,b_i\) 之间有一条边…
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一张 n 个点 m 条边的无向图,现在想要把这张图定向. 有 p 个限制条件,每个条件形如 \((x_i, y_i)\),表示在新的有向图当中,\(x_i\) 要能够沿着一些边走到 \(y_i\). 现在请你求出,每条边的方向是否能够唯一确定.同时请给出这些能够唯一确定的边的方向. 输入格式 第一行两个空格隔开的正整数 n, m. 接下来 m 行,每行两个空…
传送门 题意:给出$N$个点.$M$条无向边的图,现在你需要给它定向,并满足$Q$个条件:每个条件形如$(x_i,y_i)$,表示定向之后需要存在路径从$x_i$走向$y_i$.问每条边是否都有唯一定向方式.$N,M,Q \leq 10^5$ 图论总是涉及的算法不难,但是就是脑子生锈想不出来 可以知道一个边双联通分量里面的所有边的方向都是一定不能确定的,因为如果存在一种方式满足所有条件,将这个边双联通分量里的所有边取反之后也一定满足条件.所以我们只需要考虑割边. 不妨在原图中找到一棵树,这棵树上…
边双无法确定 缩完边双就是一棵树 树上差分随意弄一下吧... #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> namespace remoon { #define re register #define de double #define le long double #define ri registe…
题目大意: 给你一个无向图,现在告诉你一些点对(u,v), 要你在保证从u到v的所有路径都不变的情况下,尽可能把所有的边变成单向边, 问你可以唯一确定哪些边的方向,以及方向是从u到v还是从v到u. 思路: 首先不难发现环上的边都不能确定方向,所以我们可以先缩环. 缩环以后剩下的图就变成了一棵树,考虑对树进行一些操作来确定边的方向. 我们可以树链剖分,用线段树维护边的方向, 但是树上边的方向不一定都是同一种,因此我们可以先不考虑从u到v还是从v到u. 我们只需要先维护从上到下还是从下到上. 如果维…
One-Way Streets (oneway) 题目描述 Once upon a time there was a country with nn cities and mm bidirectional roads connecting  them. Technical development led to faster and larger road vehicles which presented a problem-the roads were becoming too narrow f…
Luogu4655 [CEOI2017]Building Bridges 有 \(n\) 根柱子依次排列,每根柱子都有一个高度.第 \(i\) 根柱子的高度为 \(h_i\) . 现在想要建造若干座桥,如果一座桥架在第 \(i\) 根柱子和第 \(j\) 根柱子之间,那么需要 \((h_i-h_j)^2\) 的代价. 在造桥前,所有用不到的柱子都会被拆除,因为他们会干扰造桥进程.第 \(i\) 根柱子被拆除的代价为 \(w_i\) . 现在政府想要知道,通过桥梁把第 \(1\) 根柱子和第 \(…
Streets and Avenues in Berhattan 我们首先能发现在最优情况下最多只有一种颜色会分别在行和列, 因为你把式子写出来是个二次函数, 在两端取极值. 然后我们就枚举哪个颜色会分别在行和列. 然后枚举这种颜色在行的个数, 再求出需要在列放的最少的这种颜色的个数. 这个我们可以用dp来check, dp[ i ] 表示 完整地加入若干种颜色能否恰好为 i , 然后再把dp[ i ]转成, 能组成大于等于 i 的最小值. #include<bits/stdc++.h> #d…
loj#2483. 「CEOI2017」Building Bridges 链接 https://loj.ac/problem/2483 思路 \[f[i]=f[j]+(h[i]-h[j])^2+(sum[i-1]-sum[j])\] \[f[i]=f[j]+h[i]^2+h[j]^2-2*h[i]*h[j]+sum[i-1]-sum[j]\] \[sum[j]-f[j]-h[j]^2=(-2*h[j])*h[i]+sum[i-1]+h[i]^2-f[i]\] \[f[j]+h[j]^2-sum[…
[CEOI2017]Palindromic Partitions 题目大意: 给出一个长度为\(n(n\le10^6)\)的只包含小写字母字符串,要求你将它划分成尽可能多的小块,使得这些小块构成回文串. 思路: 哈希以后从两侧往里贪心,尽量取短的. 时间复杂度\(\mathcal O(n)\). 源代码: #include<cstdio> #include<cctype> #include<cstring> inline int getint() { register…
P4654 [CEOI2017]Mousetrap 博弈论既视感 身临其境感受耗子和管理的心理历程. 以陷阱为根考虑.就要把耗子赶到根部. 首先一定有解. 作为耗子,为了拖延时间,必然会找到一个子树往下走. 如果耗子从子树往下走的话, 那么一定会走到一个叶子被自己卡住. 作为管理,堵路比清理容易的多.否则耗子进去了还得清理把它轰出来. 所以,耗子进入一个子树,管理先手,必定堵住花费最大的子树,耗子会到次大的子树 然后耗子还要赶回来,赶回来之前,一定先把沿途其他的路堵住,再放耗子回来 所以树形dp…
Building Bridges(build) 题目描述 A wide river has nn pillars of possibly different heights standing out of the water. They are arranged in a straight line from one bank to the other. We would like to build a bridge that uses the pillars as support. To ac…
$ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法求出它在各个图上是处于左上,右上,左下,右下中的哪一个. inline void bijin(int i,int v){ if(i==0)return ; rg x=1<<(i*2-2),y=1; while(v>x)v-=x,++y; t[i]=y; bijin(i-1,v); } 然后我…
Fractal Streets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 445   Accepted: 162 Description With a growing desire for modernization in our increasingly larger cities comes a need for new street designs. Chris is one of the unfortunat…
[CEOI2017]Building Bridges 有 \(n\) 个桥墩,高 \(h_i\) 重 \(w_i\).连接 \(i\) 和 \(j\) 消耗代价 \((h_i-h_j)^2\),用不到的桥墩被拆除,代价为 \(w_i\).求使 \(1\) 与 \(n\) 联通的最小代价. 数据范围:\(2\le n\le 10^5\),\(0\le h_i,|w_i|\le 10^6\). 非常经典的李超线段树维护 \(\texttt{dp}\) 的题目,小蒟蒻来分享一下. 很明显 \(w_i\…
题意 题目链接 Sol \[f[i], f[j] + (h[i] - h[j])^2 + (w[i - 1] - w[j]))\] 然后直接套路斜率优化,发现\(k, x\)都不单调 写个cdq就过了 辣鸡noi.ac居然出裸题&&原题 #include<bits/stdc++.h> #define Pair pair<double, double> #define MP(x, y) make_pair(x, y) #define fi first #define…
分形街道 我干,这个毒瘤. 想起来就头痛. 首先看题就是一大难题...... 说一下题目大意吧. 每当n+1时,把n阶图复制为4份.2*2排好. 右边两个不动.左上顺时针旋转90°,左下逆时针旋转90° 求n阶图中a和b的直线距离. 考虑递归解决:这TM怎么递归啊!!! 仿佛可以......我一开始带了十多个变量,后来缩减到了8个,自觉很ok了 标答带了两个变量.我:................ 我们不管标答,继续钻研中国特色射惠主义. 然后我以为每次旋转完之后内部遍历顺序不会变,于是自信W…
LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_j-s_j+h_j^2\),横坐标不单调可以\(CDQ\)分治或\(Splay\).具体见这里. 然后差不多就是个模板了. 注意算斜率乘1.0啊mmp. //645ms 8.14MB #include <cstdio> #include <cctype> #include <cs…
题目传送门:LOJ #2483. 题意简述: 有 \(n\) 个数,每个数有高度 \(h_i\) 和价格 \(w_i\) 两个属性. 你可以花费 \(w_i\) 的代价移除第 \(i\) 个数(不能移除第 \(1\) 个和第 \(n\) 个数). 这之后,没有被移除的数中,相邻两个数 \(i\) 和 \(j\) 会产生 \((h_j-h_i)^2\) 的代价. 求最小代价. 题解: 斜率优化 DP. 考虑 \(\mathrm{f}[i]\) 表示只考虑前 \(i\) 个数的最小代价,易得转移 \…
DP的数组f其实开得不够大,应该开200000,但是它在cf上就是过了... 题意是把一堆字母分别分配到行和列. 分析一下,答案实际上只和n行中和m列中每种字母分配的个数有关.而且答案只和"在行和列都出现的字母有关" 结论1:最优方案中如果答案不为0,那么存在一种最优方案,满足只有一种字母在行和列都出现,其他字母要么只在行出现,要么只在列出现 假设有两种字母,分别在行和列都出现了,那么就可以通过在行/列之间交换这两种字母使得只有一种字母在行和列中都出现,且答案变小 结论2:如果最优方案…
菜菜只能靠写简单字符串哈希维持生活. 题目传送门:LOJ #2484. 题意简述: 题面讲得很清楚了. 题解: 很显然从两边往中间推,能选的就选上这个贪心策略是对的. 如何判断能不能选上,直接字符串哈希吧. 有一个小细节:中间那块要不要选,即ans要不要加1?判一下串长即可. #include <cstdio> #include <cstring> typedef unsigned long long UL; const int B = 79; int T, N; char str…
给出两点编号,求如图所示的图中两点间欧氏距离*10取整 递归处理由编号求出坐标 #include<cstdio> #include<cmath> int T,n,s,t; void get(int n,int p,int&x,int&y){ if(!n){ x=y=; return; } <<n*-,L=<<n-; int w=p/D; ,p&(D-),x,y); ){ int x0=x,y0=y; x=y0,y=x0; }){ x+…
题目 斜率优化思博题,不想写了 之后就一直\(95\)了,于是靠肮脏的打表 就是更新了一下凸壳上二分斜率的写法,非常清爽好写 就当是挂个板子了 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #define re register #define LL long long #define max(a,b) ((a)>(b)?(a):(b)) #defin…
题目大意: 你有$k$个数,分为$26$种 对于每个数,你可以选择选进$A$集合或者$B$集合或者不选 要求$A$集合中必须有$n$个数,$B$集合中必须有$m$个数 记第$i$种数在$A$集合中的个数为$a_i$,$B$中个数为$b_i$ 试最小代价$\sum a_i * b_i$ $k \leqslant 200000$,$n, m \leqslant 30000$ 首先,我们打表得出一个结论,代价一定只由一种数得出 考虑证明: 我们不妨设代价由$A$得出,且集合$S_A$和$S_B$中分别…
题目大意:一个长度为$n$的字符串,要求把它分成尽可能多的小块,使得这些块构成回文串 题解:贪心,从两边从找尽可能小的块使得左右的块相等,判断相等可以用$hash$ 卡点:无 C++ Code: #include <cstdio> #include <cstring> #define maxn 1000010 const long long base = 233, mod = 1000000007; int Tim; int n, mid; long long pw[maxn],…
点此看题面 大致题意: 有一棵树,树上编号为\(i\)的节点上有\(F_i\)个铁球,逃亡者有\(V\)个磁铁,当他在某个节点放下磁铁时,与这个节点相邻的所有节点上的铁球都会被吸引到这个节点.然后一个追逐者会顺着同样的路去追逐逃亡者.问追逐者遇到的铁球数减去逃亡者遇到的铁球数的最大值. 一个暴力\(DP\) 我们先来考虑一个暴力的树形\(DP\). 不难发现,经过一个节点所能得到的收益应该是它的所有子节点的权值之和,即:\[f_{x,i}=max(f_{fa_x,i},f_{fa_x,i-1}+…
有意思的可做dp题:细节有点多,值得多想想 题目描述 在逃亡者的面前有一个迷宫,这个迷宫由 nnn 个房间和 n−1n-1n−1 条双向走廊构成,每条走廊会链接不同的两个房间,所有的房间都可以通过走廊互相到达.换句话说,这是一棵树.逃亡者会选择一个房间进入迷宫,走过若干条走廊并走出迷宫,但他永远不会走重复的走廊.在第 iii 个房间里,有 FiF_iF​i​​ 个铁球,每当一个人经过这个房间时,他就会受到铁球的阻挡.逃亡者手里有VVV个磁铁,当他到达一个房间时,他可以选择丢下一个磁铁(也可以不丢…
传送门 表示想不到二分答案qwq 将树看作以陷阱为根.先考虑陷阱和起始点相邻的情况,此时老鼠一定会往下走,而如果管理者此时不做操作,那么一定会选择让操作次数变得最大的一棵子树.设\(f_i\)表示当前老鼠在第\(i\)个点.管理者先手,老鼠往下然后被逼回第\(i\)个点的最小操作次数.那么管理者一定会封掉儿子中\(f\)最大的,然后老鼠进入\(f\)次大的:当老鼠走到子树中一个点不能动的时候,管理者一定会把这个点的其他没有被封住的子树全部封住,这样显然是最优的.所以\(f_i = cmx\{f_…
传送门 当我打开Luogu题解发现这道题可以Hash+贪心的时候我的内心是崩溃的-- 但是看到这道题不都应该认为这是一道PAM的练手好题么-- 首先把原字符串重排为\(s_1s_ks_2s_{k-1}s_3s_{k-2}...\)之后,我们不难发现:在一种对原串的回文划分中,对应的一对字符串在新的字符串上对应了一个长度为偶数的回文串. 那么设\(dp_i\)表示将新字符串的长度为\(i\)的前缀划分为若干个长度为偶数的回文串,最多划分多少份.在回文树上可以进行转移.使用"一个长度为\(n\)串的…
题目链接:https://codeforc.es/contest/1070/problem/J 题意:给出一个长度为 k 的字符串,选出 n 个和 m 个不同位置的字符构成两个字符串,使得两个字符串相同字母的对数最少. 题解:在最优解的情况下,两个字符串相同的字母只有一个(假设有两种相同的字母,调换他们的位置变得只有一种相同字母的时候更优,可以自行草稿纸上写下不等式证明),可以枚举相同的字母,剩下的字母做 01 背包判断可以构成的最大长度即可. #include <bits/stdc++.h>…