一道乱搞题并不能ac.

题目描述

传销组织 传销组织 GPLT的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的
宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟的 宗旨是“有志者事竟成”,他们最近在执行一项宏伟N人计划,以 人计划,以 人计划,以 人计划,以 构建科学有效的情报网。换句话说, 构建科学有效的情报网。换句话说, 构建科学有效的情报网。换句话说, 构建科学有效的情报网。换句话说, 构建科学有效的情报网。换句话说, 构建科学有效的情报网。换句话说, 构建科学有效的情报网。换句话说, 构建科学有效的情报网。换句话说,
构建科学有效的情报网。换句话说, GPLT组织希望建一个由 组织希望建一个由 组织希望建一个由 组织希望建一个由 组织希望建一个由 N个人和若干单向私有电话 个人和若干单向私有电话 个人和若干单向私有电话 个人和若干单向私有电话 个人和若干单向私有电话 个人和若干单向私有电话 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类:
线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类: 线构成的情报网,并使得满足一系列要求。这些分两类:

① 从第 a个人通过 个人通过 1条或多电话线 条或多电话线 条或多电话线 条或多电话线 可以 联系到第 联系到第 b个人。

② 从第 a个人通过 个人通过 1条或多电话线 条或多电话线 条或多电话线 条或多电话线 不能 联系到第 联系到第 b个人。

现在 GPLT组织的首脑 组织的首脑 组织的首脑 gluo请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这
请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 请你帮忙给出一个满足所有要求的情报网,或者告诉他这 样的情报网是不可能存在。 样的情报网是不可能存在。 样的情报网是不可能存在。 样的情报网是不可能存在。 样的情报网是不可能存在。 样的情报网是不可能存在。

输入格式

每个测试点包含若干组数据, 每个测试点包含若干组数据, 每个测试点包含若干组数据, 每个测试点包含若干组数据, 每个测试点包含若干组数据, 每个测试点包含若干组数据, 以 EOF结尾, 对于每组数据: 对于每组数据: 对于每组数据: 对于每组数据:

第一行 第一行 1个整数 N,表示情报网的人数。 ,表示情报网的人数。 ,表示情报网的人数。 ,表示情报网的人数。 ,表示情报网的人数。

第二行 第二行 1个整数 M,表示 ,表示 ①类要求的个数,接下来 ①类要求的个数,接下来 ①类要求的个数,接下来 ①类要求的个数,接下来 ①类要求的个数,接下来 ①类要求的个数,接下来 M行 每行 每2个整数 个整数 a, b。

第 M+3行 1个整数 个整数 T,表示②类要求的个数, , 表示②类要求的个数, 表示②类要求的个数, 表示②类要求的个数, 表示②类要求的个数, 表示②类要求的个数接下来 接下来 T行 每行 每2个整数 a, b。

输出格式

对于测试点中的每组数据, 对于测试点中的每组数据, 对于测试点中的每组数据, 对于测试点中的每组数据, 对于测试点中的每组数据, 对于测试点中的每组数据, 若不存在这样的情报网,输出 若不存在这样的情报网,输出 若不存在这样的情报网,输出 若不存在这样的情报网,输出 若不存在这样的情报网,输出 若不存在这样的情报网,输出 若不存在这样的情报网,输出 若不存在这样的情报网,输出 NO。否则在第一行输出 否则在第一行输出 否则在第一行输出 否则在第一行输出 YES, 在第二行输出情报网中电话线的数量 在第二行输出情报网中电话线的数量
在第二行输出情报网中电话线的数量 在第二行输出情报网中电话线的数量 在第二行输出情报网中电话线的数量 在第二行输出情报网中电话线的数量 在第二行输出情报网中电话线的数量 在第二行输出情报网中电话线的数量 P,接下来 ,接下来 ,接下来 ,接下来 P行 每行 每2个整数描述电话线 个整数描述电话线 个整数描述电话线 个整数描述电话线 个整数描述电话线 。由于资源有 由于资源有 由于资源有 限,要求 限,要求 P<=N+M+T。

样例输入

3

2

1 2

2 3

1

3 1

3

2

1 2

2 3

1

1 3

样例输出

YES

2

1 2

2 3

NO

样例 输入 输出 2

见试题文件夹下的 见试题文件夹下的 见试题文件夹下的 见试题文件夹下的 gplt.in/ans。

数据范围与约定

对于 20%的数据 的数据 ,1 ≤ N ≤ 100。

对于 60%的数据 的数据 ,1 ≤ N ≤ 25000。

对于 100%的数据 的数据 ,1 ≤ N, M, T ≤ 100000,1 ≤ a, b ≤ N,a≠b,要求输出的 要求输出的 要求输出的 P<=N+M+T。

首先这题第一步肯定是给m的要求直接连上有向边,感性上来说。它对第二种操作的影响会比较小。然后就是快速求有向图的连通性。然而似乎并没有什么低于n^2的做法。。。(事后好像标算不过是压了个位)。然后为了避免爆内存分了个块。。。也是有点玄学。

然而我显然不认为n^2是可以过得。。。于是我就写了个非常玄学的记忆化时间空间复杂度都非常深不可测。。。。第4个点跑了1.5秒。第五个点跑了5秒,第6个点144秒。。。然而这三个点大小其实差不多。。。其他点(包括数据更大的)都在1秒以内了。。。看上去似乎超出了我乱搞的预期。

但是我一开始却爆0了。。。因为多组数据是个坑啊。。。一般人做到no的时候就直接break了。。。然后继续读数据就会混乱掉。。。日狗。。。

#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>  

#include <set>
#include <stack>
#include <queue>
#include <vector>
#include<map>
#include<list>

#define pb push_back
#define lb lower_bound
#define sqr(x) (x)*(x)
#define lowbit(x) (x)&(-x)
#define Abs(x) ((x) > 0 ? (x) : (-(x)))
#define forup(i,a,b) for(int i=(a);i<=(b);i++)
#define fordown(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1]  

#define maxn 100005
#define maxm 100005
#define INF 1070000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull;  

template<class T> inline
void read(T& num){
    num = 0; bool f = true;char ch = getchar();
    while(ch < '0' || ch > '9') { if(ch == '-') f = false;ch = getchar();}
    while(ch >= '0' && ch <= '9') {num = num * 10 + ch - '0';ch = getchar();}
    num = f ? num: -num;
}
int out[100];
template<class T> inline
void write(T x,char ch){
 if (x==0) {putchar('0'); putchar(ch); return;}
 if (x<0) {putchar('-'); x=-x;}
 int num=0;
 while (x){ out[num++]=(x%10); x=x/10;}
 fordown(i,num-1,0) putchar(out[i]+'0'); putchar(ch);
}
/*==================split line==================*/
int n,m,t;
map<int,bool> f[maxn];
vector<int> g1[maxn],g2[maxn];
vector<int> s;
vector<int> G[maxn];
int cnt=0;
bool vis[maxn];
int id[maxn];
void  dfs1(int x)
{  vis[x]=1;
    for(int i=0;i<g1[x].size();i++)
     { int v=g1[x][i];
        if(!vis[v])
          {  dfs1(v);}
	 }
	 s.pb(x);
 }
void dfs2(int x)
{    id[x]=cnt;
    for(int i=0;i<g2[x].size();i++)
    {  int v=g2[x][i];
       if(!id[v])
           dfs2(v);
	}
}
bool work(int x,int y)
{   if(f[x].count(y)!=0)
     { return f[x][y];}
     for(int i=0;i<G[x].size();i++)
       { int v=G[x][i];
            f[x][y]=work(v,y);
		  if(f[x][y]==true)  return true;

	   }
	   return false;
}
void clearall()
{   forup(i,1,n)
   {f[i].clear(); g1[i].clear();g2[i].clear();}
    forup(i,1,cnt)  G[i].clear();
	s.clear();
}

int main()
{  freopen("gplt.in","r",stdin);
   freopen("gplt.out","w",stdout);

 while(scanf("%d%d",&n,&m)!=EOF)
 {  cnt=0; clearall();
    forup(i,1,m)
    { int x,y; read(x);read(y);
	  g1[x].pb(y);g2[y].pb(x);
	}
	memset(vis,0,sizeof(vis));
	forup(i,1,n)
  { if(!vis[i])
	dfs1(i);
  }

   for(int i=s.size()-1;i>=0;i--)
    { int v=s[i];
	  if(!id[v])
      {cnt++; dfs2(v);}
	}
	forup(i,1,n)
     for(int j=0;j<g1[i].size();j++)
	{   int v=g1[i][j];
	   f[id[i]][id[v]]=1;
	}
	forup(i,1,cnt)
     for(map<int,bool>::iterator j=f[i].begin();j!=f[i].end();j++)
     {int v=j->first;G[i].pb(v);}

	read(t);
	bool flag=1;
	forup(i,1,t)
	{ int x,y;read(x);read(y);
	   if(flag==0)  continue;
	  if(id[x]==id[y])
	    {   flag=0;printf("NO\n");
	        continue;
		}
	    bool ans=work(id[x],id[y]);
	    if(ans) {flag=0;printf("NO\n");continue;}
     }
	    if(flag==1)
		{printf("YES\n");
		 write(m,'\n');
	     forup(x,1,n)
	      for(int y=0;y<g1[x].size();y++)
	      {   int v=g1[x][y];
		      write(x,' ');write(v,'\n');
		  }
		 }
  }
	return 0;
 }
时间: 2024-11-07 17:28:51

一道乱搞题并不能ac.的相关文章

codeforces 653C C. Bear and Up-Down(乱搞题)

题目链接: C. Bear and Up-Down time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The life goes up and down, just like nice sequences. Sequence t1, t2, ..., tn is called nice if the following two

hdu-5676 ztr loves lucky numbers(乱搞题)

题目链接: ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 ztr喜欢幸运数字,他对于幸运数字有两个要求 1:十进制表示法下只包含4.7 2:十进制表示法下4和7的数量相等 比如47,474477就是 而4,744,467则不是 现在ztr想知道最小的但不小于n的幸运数字是多少 输入描述 有TT(1≤T≤10?5??)组数据,

HDU5764 After a Sleepless Night 树形乱搞题

分析(官方题解): 假设根已确定,可以发现新树若合法,需满足以下性质:根节点是n:儿子的值不大于父亲:具有相同值的节点形成一条链,并且链不会发生“分叉”(即有多个最低点).所以对于新树中有出现的值x,原树在新树x链的最低点应为x,而其他新值为x的点,原值应小于x.那么我们先将所有链的最低点放上对应值,而空着的点和还没用的值进行配对. 贪心使答案字典序最小:从大到小枚举未用的值,用大根堆维护该值可以填入的位置id,取最大id填入.(否则,若某一步的值a匹配了非最大id x,而最大id y在后面配了

hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题

题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给定的学生成绩都异或上一次的答案 先将学生按每一门成绩都排一次序 这里将学生分块成sqrt(n)的块数,然后在当前块中用bitset容器来记录含有学生的状态 这里可以记录状态的前缀和,因为比后面成绩好的,必然比前面的学生的成绩也好 查询的时候只要查到正好比他高的学生属于哪一块,这样只要访问sqrt(n

UVA 11853 [dfs乱搞]

/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边的入口和出口的坐标. 思路: dfs乱搞题.把炮弹辐射范围连在一起的炮弹看作一个整体,记录下它围起来的边界区域. 然后找到最北边的输出. */ #include<bits/stdc++.h> using namespace std; double x[1005],y[1005],r[1005];

hdu 5246 乱搞

题意:题目太长直接看链接 链接:点我 乱搞题 显然,一个人要想成功,必须大于等于最强的人的战斗力,所以我们从后往前看 这里直接拿例1解释,首先递减排个序 15,13,10,9,8 作差得2,3,1,1, 此时我们从10出发即可成功 同时也发现,战斗力逐渐递增和直接到某个值其实是等价的 于是我们假设战斗力是从15-13-10-9-8变化的,观察这种变化能否成功即可 由13到15,变化为2,则从13出发剩余战斗力至少得提高2 从10到13,战斗力要提高3,而k为3然后10小于m,即成功 看一下反例2

CodeForces - 1228D (暴力+思维+乱搞)

题意 https://vjudge.net/problem/CodeForces-1228D 有一个n个顶点m条边的无向图,在一对顶点中最多有一条边. 设v1,v2是两个不相交的非空子集,当满足以下条件时f(v1,v2)为真 v1中的点之间不存在边 v2中的点之间不存在边 对于在v1v2中的每一对顶点,x在v1中,y在v2中,xy之间有边 所有点集不为空,且不相交,是否有v1,v2,v3使得f(v1,v2).f(v2,v3).f(v3,v1)均为真 如果有输出每个点所在的点集(1,2,3),否则

hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10

题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <vector> 7 #include &

POJ 3077-Rounders(水题乱搞)

Rounders Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7697   Accepted: 4984 Description For a given number, if greater than ten, round it to the nearest ten, then (if that result is greater than 100) take the result and round it to th