vis

Educational Codeforces Round 65 (Rated for Div. 2)

倖福魔咒の 提交于 2020-02-11 05:22:58
题目大意:给定你t个长度为N的字符串,问你能否通过删除字符串得到长度为11位且首位位8的电话号码。 思路:若N<11直接输出NO,N>=11 则枚举前 0 - (N-11)位,若其中有8出现则输出YES,否则是NO。 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 #include<vector> 7 #include<cmath> 8 #include<map> 9 #include<set> 10 using namespace std; 11 typedef long long LL; 12 const int maxn = 1e5+10; 13 LL n,t; 14 string str; 15 int main() 16 { 17 cin>>t; 18 while(t--){ 19 cin>>n; 20 cin>>str; 21 string ans = "NO"; 22 for(int i=0;i<n-10;i++){ 23 if(str[i]=='8'){ 24 ans = "YES"; 25 break; 26 } 27 } 28 cout<<ans<<endl; 29 } 30 return 0; 31 }

HZNU-ACM寒假集训Day11小结 贪心

守給你的承諾、 提交于 2020-02-10 19:35:25
1.刘汝佳紫书区间问题三大情况 1.选择不相交区间 贪心策略:一定要选择第一个区间 2.区间选点问题 贪心策略:取最后一个点 3.区间覆盖问题: n个闭区间,选择尽量少的区间覆盖一条指定线段[s,t] 贪心策略:预处理掉[s,t]之外的区间,闭区间从最左向右开始覆盖 应用 Open Judge 1328 要求建在x轴半径d的雷达覆盖所有已知点 #include<iostream> #include<cstdio> #include<string> #include<algorithm> #include<queue> #include<deque> #include<set> #include<map> #include<cmath> #include<stack> const double PI = acos(-1.0); #define eps 1e-6 #define INF 0x3f3f3f3f typedef long long ll; using namespace std; struct P { double a; double b; friend bool operator <(const P& x, const P& y) { if (x.b != y.b) return x.b < y.b; else return x.a > y.a; } }; P p

hdu 3631 Shortest Path(Floyd)

淺唱寂寞╮ 提交于 2020-02-10 11:09:03
#include<stdio.h> #include<algorithm> #include<string.h> const int N=305; using namespace std; int main() { int cas=0,n,m,q,i,j,k,x,y,t,g[305][305],vis[305],inf=1<<30; while(~scanf("%d%d%d",&n,&m,&q)) { if(n==0) break; if(cas) printf("\n"); memset(vis,0,sizeof(vis)); for(i=0; i<N; i++) for(j=0; j<N; j++) if(i==j) g[i][j]=0; else g[i][j]=inf; for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&t); if(g[x][y]>t) g[x][y]=t; } printf("Case %d:\n",++cas); for(k=0;k<q;k++) { scanf("%d",&t); if(t) { scanf("%d%d",&x,&y); if(vis[x]==0||vis[y]==0) printf("ERROR! At path %d to %d\n",x,y); else if(g[x][y]>=inf)

CF1073G Yet Another LCP Problem

两盒软妹~` 提交于 2020-02-09 17:38:43
一、题目 点此看题 二、解法 先对原串的反串建后缀自动机,然后两个后缀的 l c p lcp l c p 就是它们在自动机上的 l c a lca l c a 长度。 然后就可以在后缀自动机 d p dp d p ,设 s a [ u ] sa[u] s a [ u ] 为 u u u 子树内 A A A 集合元素个数, s b [ u ] sb[u] s b [ u ] 意义差不多,那么答案就可以这样算: ( s a [ u ] − s a [ v ] ) ∗ s b [ v ] ∗ l e n [ u ] (sa[u]-sa[v])*sb[v]*len[u] ( s a [ u ] − s a [ v ] ) ∗ s b [ v ] ∗ l e n [ u ] 注意此时 s a , s b sa,sb s a , s b 没把本节点是不是集合元素算进去,所以还要继续算贡献: ( a [ u ] ∗ b [ u ] + a [ u ] ∗ s b [ u ] + b [ u ] ∗ s a [ u ] ) ∗ l e n [ u ] (a[u]*b[u]+a[u]*sb[u]+b[u]*sa[u])*len[u] ( a [ u ] ∗ b [ u ] + a [ u ] ∗ s b [ u ] + b [ u ] ∗ s a [ u ] ) ∗ l e n [ u ]

浅谈康托展开和其逆运算

北战南征 提交于 2020-02-07 22:41:42
康托展开,是一种在 \(\mathcal{O}(n^2)\) ( \(n\) 为排列元素个数)时间复杂度求解某一排列在全排列中的次序的算法。 我们以一道例题引入: 排列的序号 题目描述: 给定一个数 \(n\) 和一个 \(n\) 个数的排列 \(a\) ,求 \(a\) 在 \(n\) 的全排列中的序号。 输入描述: 第一行一个整数 \(n\) ,第二行一个排列 \(a\) 。 输出描述: 求 \(a\) 在 \(n\) 的全排列中的序号。 输入输出样例: 输入 3 123 输出 1 数据范围 \(n\le 15\) 根据排列组合、加法原理等等,得出一个式子: \[ans=\sum_{i=1}^n(a_{n+1-i}(n-i)!)\] ( \(a_i\) 表示原数的第 \(i\) 位在当前未出现的元素中是排在第几个) 此为康托展开,代码如下: ull Cantor(int n,int a[15]) //对于n的一个排列a进行康托展开 { ull ans=0; //因答案可能很大所以用ull for (int i=0;i<n;i++) { int x=0; //x代指公式中a[i],节省空间 for(int j=i+1;j<n;j++) //计算公式中a[i] if (a[j]<a[i]) ++x; ans+=x*fact[n-i-1]; } return ans+1; //答案要

搜索专题总结

早过忘川 提交于 2020-02-07 06:55:21
搜索专题总结 第七章的例题做得差不多了,还有一道枚举二叉树和一道比较难的搜方块的没过,另外有一道火柴的用IDA*水过,并没有过大数据,由于这道可以用dancing links过,所以留着dancing links一坑。接下来总结下这章的收获,首先最重要的当然是不需要判重的高效率的IDA*以及估价函数的设计技巧;然后是bfs+hash写得更熟练了,如果hash需要erase那么就只能用指针版的,但是效率会很慢,否则就用数组版的。 做搜索题的几个要点: 1,估算最坏复杂度。 2,寻找合适的剪枝策略,估计剪枝的效果,根据情况选择IDA*还是bfs,最坏复杂度高但剪枝效果明显的优先IDA*。 3,想清楚代码的大致框架。 4,想清楚代码实现困难的细节以及可能出错需要注意的地方。 5,大胆快速的写吧。 下面是第七章的例题: A题: 输出所有的 xxxxx / xxxxx = N 只要枚举上面的数字就行了,复杂度<10^5,直接循环枚举。 #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef

$vjudge-$搜索专题题解

本秂侑毒 提交于 2020-02-07 06:47:35
退役了,刷点儿无脑水题$bushi$放松下$QwQ$ 然后先放个 链接 ,,,$QwQ$ $A$ 虽然是英文但并不难$get$题目大意?就说给定一个数独要求解出来,$over$ 昂显然直接$dfs$加剪枝就成?显然就是个考剪枝技巧的题呗$QwQ$ 首先显然在$dfs$的过程中每次一定是找到可能的取值最少的那个格子填? 然后考虑怎么记录每个格子的取值数量? 昂可以考虑给每行每列每个九宫格分别开个二进制数存哪些数被用了,然后对每个格子就把它这行这列这九宫格或起来,剩下的就是能用的了$QwQ$.而且因为是个$dfs$所以可以设成全局变量$QwQ$ $over$ 还有一个方法是$dlx$,老年退役选手不配拥有脑子不想学不写了$QwQ$ 阿还有就我没想到很好的方法找可能的取值最少的格子,,,所以我决定先不写,,,发现能过于是就不写了$QwQQQQQ$ 然后因为我是用$lowbit$找可能取值,所以找到的都是1嘛,所以在这题里面我都是1表示还没用0表示用了$QwQ$ #include<iomanip> #include<cstdio> #include<map> using namespace std; #define il inline #define gc getchar() #define ri register int #define rb register bool #define

hdu入门搜索题

痴心易碎 提交于 2020-02-07 06:09:09
新人们加油,就优先队列有点难度,其它对新手很有学习价值 下面是我今晚刚刚刷的几道基本搜索题 hdu 1010 Tempter of the Bone 经典搜索入门题,DFS,本题考查要点:剪枝,奇偶性剪枝 View Code #include<stdio.h> #include<stdlib.h> int m,n,t; char map[8][8]; int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; int ex,ey,sx,sy,ok;//e表示end,终点,s表示start,出发点,ok用来判断是否在规定时间到达 void dfs(int x,int y,int cnt) { int i; if(cnt==t)//剪枝1:到时间了符合条件ok=1再退出,不符合条件直接退出。 { if(ex==x&&ey==y)ok=1; return; } if(ok)return;//找到解后还有部分在继续搜索,这条是为了让其它搜索停止 int temp=abs(x-ex)+abs(y-ey)-abs(cnt-t);//剪枝2:((((要点)))) //奇偶性剪枝 ,起点和终点确定以后就可以确定走的步数是奇数还是偶数,通过这个特点来剪枝 if(temp>0||temp&1)return;//temp&1相当于temp%2,运算位。 for(i=0;i<4

【NOI赛前训练】——专项测试1·网络流

天大地大妈咪最大 提交于 2020-02-06 05:51:33
T1: 题目大意:    传送门   给一个长度为$n(n<=200)$的数列$h$,再给$m$个可以无限使用的操作,第$i$个操作为给长度为花费$c_i$的价值给长度为$l_i$的数列子序列+1或-1,求将数列变为不下降数列的最小花费。 题解: 第一部分(上下界最小费用可行流):     设$h_0=-inf,h_{n+1}=inf$,令$a$为$h$的差分数组,即$a_i=h_{i}-h_{i-1}$。考虑当对于区间$[l,r]$操作时(比如+1 ),相当于$a_{r+1}$减少1,$a_{l}$增加1。若将$a$数组看做点集,这个变化相当于从$r+1$到$l$的一条流量为$1$的有向边,反之(-1)亦然。   显然问题相当于把$a$数组元素均变为 不为0。那么我们由S向$a_{i}>0$的位置连$flow=[0,a_{i}],cost=0$的边,表示${i}$可以减少流量上下界,对于$a_{i}<0$的位置,我们至少要使其增加$-a_i$所以我们向$T$连$flow=[-a_i,inf],cost=0$的边。对于每个操作我们由于可无限使用我们就给所有合法位置连$flow=[0,inf],cost=c_{i}$的边,然后我们可以跑一个上下界解决问题。   等等,这样的确解决了问题,不过我们观察一下这个图,会发现上下界源点只连向了$T$,而上下界汇点只被那些$a_{i}<0

KM算法

前提是你 提交于 2020-02-06 02:52:43
KM算法 KM算法用来求二分图最大权完美匹配 一般对KM算法的描述,基本上可以概括成以下几个步骤: (1) 初始化可行标杆 (2) 用匈牙利算法寻找完备匹配 (3) 若未找到完备匹配则修改可行标杆 (4) 重复(2)(3)直到找到相等子图的完备匹配 入门题:HDU2255,复杂度应该是O(N^3) 现在有N男N女,有些男生和女生之间互相有好感,我们将其好感程度定义为好感度,我们希望把他们两两配对,并且最后希望好感度和最大。 1 int love[MAXN][MAXN]; // 记录每个妹子和每个男生的好感度 2 int ex_girl[MAXN]; // 每个妹子的期望值 3 int ex_boy[MAXN]; // 每个男生的期望值 4 bool vis_girl[MAXN]; // 记录每一轮匹配匹配过的女生 5 bool vis_boy[MAXN]; // 记录每一轮匹配匹配过的男生 6 int match[MAXN]; // 记录每个男生匹配到的妹子 如果没有则为-1 7 int slack[MAXN]; // 记录每个汉子如果能被妹子倾心最少还需要多少期望值 8 9 bool dfs(int girl){ 10 vis_girl[girl] = true; 11 for (int boy = 0; boy < N; ++boy) { 12 if (vis_boy[boy]