vis

0905膜你赛测试

六眼飞鱼酱① 提交于 2019-11-29 08:36:19
洛谷P3942 将军令 题目描述 又想起了四月。 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房。 凭君莫话封侯事,一将功成万骨枯。 梦里,小 F 成了一个给将军送密信的信使。 现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫。小 F 不因为自己的祸福而避趋之,勇敢地承担了这个任务。 不过,小 F 实在是太粗心了,他一不小心把两封密信中的一封给弄掉了。 小 F 偷偷打开了剩下的那封密信。他 发现一副十分详细的地图,以及几句批文——原来 这是战场周围的情报地图。他仔细看后发现,在这张地图上标记了 n 个从 1 到 n 标号的 驿站,n − 1 条长度为 1 里的小道,每条小道双向连接两个不同的驿站,并且驿站之间可以 通过小道两两可达。 小 F 仔细辨认着上面的批注,突然明白了丢失的信的内容了。原来,每个驿站都可以驻 扎一个小队,每个小队可以控制距离不超过 k 里的驿站。如果有驿站没被控制,就容易产 生危险——因此这种情况应该完全避免。而那封丢失的密信里,就装着朝廷数学重臣留下的 精妙的排布方案,也就是用了最少的小队来控制所有驿站。 小 F 知道,如果能计算出最优方案的话,也许他就能够将功赎过,免于死罪。他找到了你,你能帮帮他吗?当然,小F在等待你的支援的过程中,也许已经从图上观察出了一些可能会比较有用的 性质

No Smoking, Please Gym - 101518H

偶尔善良 提交于 2019-11-29 06:47:33
No Smoking, Please Gym - 101518H 最小割~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxv = 1000110; 4 const int maxe = 4000010; 5 const int inf = 0x3f3f3f3f; 6 struct Edge{ 7 int u, v, nex; 8 int cap, flow; 9 Edge(int u=0, int v=0, int nex=0, int cap=0, int flow=0): 10 u(u), v(v), nex(nex), cap(cap), flow(flow){} 11 }e[maxe<<1]; 12 int head[maxv]; 13 int cnt; 14 void init(){ 15 memset(head, -1, sizeof(head)); 16 cnt = 0; 17 } 18 19 void add(int u, int v, int cap){ 20 e[cnt] = Edge(u, v, head[u], cap, 0); 21 head[u] = cnt++; 22 e[cnt] = Edge(v, u, head[v], cap, 0); 23 head[v] =

luogu 2411 白银莲花池 && luogu 1606 Lilypad Pond

℡╲_俬逩灬. 提交于 2019-11-29 06:25:18
luogu 2411 : 题目背景 (Silver Lilypad Pond, USACO 2007 Feb) 题目描述 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘。这个长方形的池子被分成 了M行N列个方格(1 ≤ M, N ≤ 30)。一些格子是坚固得令人惊讶的莲花,还有一些格子是 岩石,其余的只是美丽、纯净、湛蓝的水。 贝西正在练习芭蕾舞,她站在一朵莲花上,想跳到另一朵莲花上去,她只能从一朵莲花 跳到另一朵莲花上,既不能跳到水里,也不能跳到岩石上。 贝西的舞步很像象棋中的马步:每次总是先横向移动一格,再纵向移动两格,或先纵向 移动两格,再横向移动一格。最多时,贝西会有八个移动方向可供选择。 约翰一直在观看贝西的芭蕾练习,发现她有时候不能跳到终点,因为中间缺了一些荷叶。 于是他想要添加几朵莲花来帮助贝西完成任务。一贯节俭的约翰只想添加最少数量的莲花。 当然,莲花不能放在石头上。 请帮助约翰确定必须要添加的莲花的最少数量。在添加莲花最少的基础上,确定贝西从 起点跳到目标需要的最少步数。最后,确定满足添加的莲花数量最少时,步数最少的路径条 数。 输入格式 第一行:两个用空格分开的整数:M和N 第二行到M + 1行:第i + 1行有N个用空格分开的整数,描述了池塘第i行的状态:0 为水,1 为莲花,2 为岩石,3 为贝西所在的起点,4 为贝西想去的终点。 输出格式 第一行

UCF Locals 2015

若如初见. 提交于 2019-11-29 06:06:44
一开始在搞什么贪心,其实这个数据量就应该是搜索。先确定中心点的位置有至多49个,而其中状态不能确定的只有25个。在搜索到已经被覆盖的状态时直接往下一步走就可以了。 #include<bits/stdc++.h> using namespace std; typedef long long ll; int n, m; char g[15][15]; char vis[15][15]; struct Cross { int x, y; int p; bool operator<(const Cross &c)const { return p < c.p; } } c[60]; int ctop; inline void update(const int &i, const int &j, int &rest) { ++vis[i][j]; if(vis[i][j] == 1) { rest -= 1; } } inline void unupdate(const int &i, const int &j, int &rest) { --vis[i][j]; if(vis[i][j] == 0) { rest += 1; } } inline void Update(const int &i, const int &j, int &rest) { update(i, j, rest);

2017 ICPC 北京站 E F J G H

让人想犯罪 __ 提交于 2019-11-29 05:16:04
Cats and Fish 题意: n只猫,m条鱼,第i只猫吃一只鱼需要 \(C_i\) ,每只猫吃完当前这条鱼立即去吃下一条,问 \(T\) 时刻还剩多少条鱼,有多少条鱼正在被吃 思路: 以为是贪心,但是wa了(不懂),要模拟,具体看注释吧 const int N = 2*1e5+10; int n,m,k; int a[N]; int v[N]; int main(){ while(scanf("%d%d%d",&m,&n,&k)==3){ int q = 0, p = 0 , t = m; // q 被猫拿走的鱼, p 被猫吃完的鱼, t 还剩多少条鱼 for(int i=1;i<=n;++i) scanf("%d",&a[i]); sort(a+1,a+1+n); // 吃的快的猫先拿 for(int i=1;i<=k;++i){ // 时间 for(int j=1;j<=n;++j){ if(t==0) break; if(i%a[j]==1 || a[j]==1){ // 余数是1或吃鱼时间为1,当前这只猫拿鱼 t--; q++; } if(i%a[j]==0){ // 整除,说明这只猫吃掉一条鱼 p++; } } } printf("%d %d\n",m-q,q-p);// m-q 没有被猫拿走的鱼, p-q 被拿走但没有被吃完的鱼 } return 0; }

网格照明

时光毁灭记忆、已成空白 提交于 2019-11-29 05:00:43
题目连接: https://leetcode-cn.com/problems/grid-illumination/ 题目大意: 一定要注意对角线的处理方法 ; 当前位置不会被照亮的时候,不需要再进行删点,因为不可能有满足的点 (结合题目条件) 具体思路: 判断某一个点是否满足题目条件,除了行坐标 和 纵坐标相等之外,还有这点 和 灯笼 的 横纵坐标之差相等。 A [ 0 ] - B [ 0 ] = A [ 1 ] - B [ 1 ] 或者 A [ 0 ] - B[ 0 ] = B [ 0 ] - A[ 1 ] 将A全部移到前面,然后记录行,纵,还有上述的两个值。然后对query的值进行遍历,看是否有满足题目条件的,如果有的话,就把这个点以及他周围的点进行处理 AC代码: 1 class Solution 2 { 3 public: 4 vector<int> gridIllumination(int N, vector<vector<int>>& lamps, vector<vector<int>>& queries) 5 { 6 7 vector<int>ans; 8 vector<map<int,int> > vis(4); // 定义了4个map<int,int>类型的向量 9 map< pair<int,int>,int >live; 10 int i, j , len ,

HDU 6628

心已入冬 提交于 2019-11-29 04:56:46
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6628 此题不难看出,n>8,第一位一定是n,后面的排序可以找规律得出;n<=8,暴力得出。 但看题解后,我发现可以直接对差值排序,然后进行暴力。 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define ll long long 5 ll sum[22]; 6 int ans[22],vis[22]; 7 int n,k; 8 /* 9 void Dfs(int id){ 10 if(id==n){ 11 for(int i = 0;i < n;i++){ 12 if(i) printf(" "); 13 printf("%d",ans[i]); 14 } 15 cout<<endl; 16 } 17 for(int i = 1;i <= n;i++){ 18 if(vis[i]) continue; 19 vis[i] = 1; 20 ans[id] = i; 21 dfs(id+1); 22 vis[i] = 0; 23 } 24 }*/ 25 int dfs(int id,int low,int high){ 26 if(id==n){ 27 k--; 28 if(!k){ 29 for

有向图的强联通分量相关例题(Korasaju算法和Tarjan算法)

纵然是瞬间 提交于 2019-11-29 03:22:07
有向图的强联通分量相关例题(Korasaju算法和Tarjan算法) 一、 poj 2186:Popular Cows 即:强连通分量+缩点 还是很菜,都是照着大佬的板子敲的,而且还不是很熟练 Korasaju算法 实现 /**korasaju算法*/ # include <cstdio> # include <cstring> # include <algorithm> # include <iostream> # include <vector> using namespace std ; const int maxn = 10010 ; vector < int > edge1 [ maxn ] ; //原图的邻接表 vector < int > edge2 [ maxn ] ; //逆图的邻接表 int End [ maxn ] ; //对原图搜索,顶点的序号 int vis [ maxn ] ; int out [ maxn ] ; //转化为DAG以后的每个缩点的出度 int belong [ maxn ] ; //每个顶点属于哪个集合,相当于染色,当前结点被染成了什么颜色 int setNum [ maxn ] ; //每个颜色包括多少顶点,也就是强联通分量的个数 int color ; //代表不同的颜色 int cnt ; //正向排序的编号 int n , m

AcWing - 95 - 费解的开关 = bfs

淺唱寂寞╮ 提交于 2019-11-29 02:42:59
https://www.acwing.com/problem/content/97/ 看了一下感觉可以暴力做,踩了一些坑终于过了。 #include<bits/stdc++.h> using namespace std; typedef long long ll; int cur; int set_ij(int u, int i, int j) { int cur = u; cur ^= 1 << (i * 5 + j); if(i - 1 >= 0) cur ^= 1 << ((i - 1) * 5 + j); if(j - 1 >= 0) cur ^= 1 << (i * 5 + j - 1); if(i + 1 < 5) cur ^= 1 << ((i + 1) * 5 + j); if(j + 1 < 5) cur ^= 1 << (i * 5 + j + 1); return cur; } char vis[1 << 25]; int Q[1 << 20], front, back; void bfs1() { vis[cur] = 0; front = 1; back = 0; Q[++back] = cur; while(front <= back) { int u = Q[front++]; if(vis[u] < 2) { for(int i = 0; i < 5

AtCoder Grand Contest 006 题解

拟墨画扇 提交于 2019-11-29 01:47:58
传送门 \(A\) 咕咕 const int N=105; char s[N],t[N];int n; inline bool eq(R int k){fp(i,1,k)if(s[n-k+i]!=t[i])return false;return true;} int main(){ scanf("%d%s%s",&n,s+1,t+1); fd(k,n,0)if(eq(k))return printf("%d\n",(n<<1)-k),0; return 233; } \(B\) 把 \(x\) 放在最中间,然后在它左边放一个比它大的数,右边放两个比它小的数就行了 具体证明在 \(D\) 题里 const int N=5e5+5; int vis[N],st[N],a[N],top,n,x; int main(){ scanf("%d%d",&n,&x); if(x==1||x==(n<<1)-1)return puts("No"),0; puts("Yes"); if(x!=2){ a[n]=x,a[n-1]=x+1,a[n+1]=x-1,a[n+2]=x-2; vis[x]=vis[x+1]=vis[x-1]=vis[x-2]=1; }else{ a[n]=x,a[n-1]=x-1,a[n+1]=x+1,a[n+2]=x+2; vis[x]=vis[x-1]=vis[x+1]