【UVALive 7334】Kernel Knights
题意
有两个队的骑士1到n和n+1到2n,每个骑士只能互相攻击对手队的一个骑士。kernel的意思是在这个kernel里的骑士不会互相攻击,在kernel外的骑士被kernel里的骑士攻击。
现在告诉你所有骑士攻击的骑士,求一个kernel。
分析
没人攻击的骑士一定在kernel里,把没人攻击的加入队列,然后被他攻击的骑士一定在kernel外。
kernel外的骑士的攻击无效,因为如果一个骑士如果只被外面的骑士攻击,他就是kernel里的。
于是 被 外面的骑士攻击 的骑士 的被攻击次数 -1,如果被攻击次数为0了就加入队列。
某个导致我WA的地方:被攻击次数 -1 这个操作不能重复,所以要判断当前这个“外面的骑士”是不是已经处理过。
反例:
4
5 5 8 7
3 3 4 4
正确答案:1 2 6 7 8
重复操作的错误答案:1 2 3 6 7 8
处理完后,剩下的就是一个边数为偶数的环,只要输出它的一边就好了。
这题也可以DFS。
代码
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=2e5+;
int n,a[maxn],d[maxn],k[maxn];
queue<int> q; int main()
{
while(~scanf("%d",&n))
{
while(!q.empty()) q.pop();
memset(d,,sizeof(d));
memset(k,,sizeof(k));
for(int i=; i<=*n; i++)
{
scanf("%d",&a[i]);
d[a[i]]++;
}
for(int i=; i<=*n; i++)
{
if(d[i]==)q.push(i);
}
while(!q.empty())
{
int p=q.front();
q.pop();
k[p]=;
if( k[ a[p] ]==- )continue;//没有它而让我WA的地方
k[a[p]]=-;
d[a[a[p]]]--;
if(d[a[a[p]]]==)q.push(a[a[p]]);
}
for(int i=; i<=*n; i++)
{
if(i<=n&&k[i]>=)printf("%d ",i);
else if(k[i]==)printf("%d ",i);
}
printf("\n");
}
return ;
}
【UVALive 7334】Kernel Knights的更多相关文章
- 【Uvalive 2531】 The K-League (最大流-类似公平分配问题)
[题意] 有n个队伍进行比赛,每场比赛,恰好有一支队伍取胜.一支队伍败.每个队伍需要打的比赛场数相同,给你每个队伍目前已经赢得场数和输得场数,再给你一个矩阵,第 i 行第 j 列 表示队伍 i 和队伍 ...
- 【Uvalive 5834】 Genghis Khan the Conqueror (生成树,最优替代边)
[题意] 一个N个点的无向图,先生成一棵最小生成树,然后给你Q次询问,每次询问都是x,y,z的形式, 表示的意思是在原图中将x,y之间的边增大(一定是变大的)到z时,此时最小生成数的值是多少.最后求Q ...
- 【UVAlive 3989】 Ladies' Choice (稳定婚姻问题)
Ladies' Choice Teenagers from the local high school have asked you to help them with the organizatio ...
- 【 UVALive - 2197】Paint the Roads(上下界费用流)
Description In a country there are n cities connected by m one way roads. You can paint any of these ...
- 【UVALive - 5131】Chips Challenge(上下界循环费用流)
Description A prominent microprocessor company has enlisted your help to lay out some interchangeabl ...
- 【UVALive - 3487】 Duopoly(网络流-最小割)
Description The mobile network market in country XYZ used to be dominated by two large corporations, ...
- 【 UVALive - 5095】Transportation(费用流)
Description There are N cities, and M directed roads connecting them. Now you want to transport K un ...
- 【UVALive 4642】Malfatti Circles(圆,二分)
题 给定三角形,求三个两两相切且与三角形的一条边相切的圆的半径. 二分一个半径,可以得出另外两个半径,需要推一推公式(太久了,我忘记了) #include<cstdio> #include ...
- 【系统移植】kernel分析
内核启动流程 第二阶段 starte_kernel: | rest_init: | kernel_init | do_basic_setup(); // 加载驱动 | do_i ...
随机推荐
- HDU 4045 Machine scheduling --第二类Strling数
题意: n个数(1~n)取出r个数,取出的数相差要>=k, 然后分成m个可空组,问有多少种情况. 解法: 先看从n个数中取r个相差>=k的数的方法数,可以发现 dp[i][j] = dp[ ...
- HDU 4455 Substrings --递推+树状数组优化
题意: 给一串数字,给q个查询,每次查询长度为w的所有子串中不同的数字个数之和为多少. 解法:先预处理出D[i]为: 每个值的左边和它相等的值的位置和它的位置的距离,如果左边没有与他相同的,设为n+8 ...
- POJ 3264 Balanced Lineup -- RMQ或线段树
一段区间的最值问题,用线段树或RMQ皆可.两种代码都贴上:又是空间换时间.. RMQ 解法:(8168KB 1625ms) #include <iostream> #include < ...
- 【转】${sessionScope.user}的使用方法
EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...
- 第16章 Windows线程栈
16.1 线程栈及工作原理 (1)线程栈简介 ①系统在创建线程时,会为线程预订一块地址空间(即每个线程私有的栈空间),并调拨一些物理存储器.默认情况下,预订1MB的地址空间并调拨两个页面的存储器. ② ...
- MySchool
USE [MySchool] GO /****** Object: Table [dbo].[Grade] Script Date: 08/06/2014 15:03:17 ******/ SET A ...
- man命令中的文本操作
转自:http://www.cnblogs.com/chengmo/archive/2010/10/26/1861809.html 下面说下less命令操作: 光标移动操作: e ^E j ^N ...
- js中的return,return true,return false小结
return 函数执行到这句时会终结,并返回调用函数,而且把表达式的值作为函数的结果返回 return false 可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转 ...
- typicalapp.js
/** * 1.找出数字数组中最大的元素(使用Math.max函数) 2.转化一个数字数组为function数组(每个function都弹出相应的数字) 3.给object数组进行排序(排序条件是每个 ...
- /etc/profile和~/.bash_profile的区别
/etc/profile是全局的,是私有的 /etc/profile用于整个系统所有用户, ~/.bash_profile, ~/.profile和~/.bashrc 用于各个用户,这里的" ...