LA-4255 Guess (拓扑排序+构造)
2024-08-27 05:43:21
题目大意:一个未知的整数序列,给出其任意一个区间和的正负,还原这个序列。任意一个满足条件的序列即可。
题目分析:将连续区间和转化为前缀和之差,sumx-1与sumy的大小关系已知,以此建立一条有向边,做拓扑排序。根据sum0=0,可以构造出所有的前缀和,再取两前缀和之差便得答案。
代码如下:
# include<iostream>
# include<cstdio>
# include<queue>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std; char p[15][15];
int in[15],ans[15],mp[15][15],mp1[15][15];
vector<int>v;
queue<int>q; void kahn(int n)
{
v.clear();
while(!q.empty()) q.pop();
for(int i=0;i<=n;++i)
if(in[i]==0)
q.push(i);
while(!q.empty())
{
int u=q.front();
q.pop();
v.push_back(u);
for(int i=0;i<=n;++i){
if(mp[u][i]){
mp[u][i]=0;
--in[i];
if(in[i]==0)
q.push(i);
}
}
}
} void solve(int n)
{
ans[0]=0;
int pos;
for(int i=0;i<=n;++i){
if(v[i]==0){
pos=i;
break;
}
}
for(int i=pos-1;i>=0;--i){
if(!mp1[v[i]][v[i+1]])///如果跟相邻点没有明确的大小关系,则取相等。。下同。。。
ans[v[i]]=ans[v[i+1]];
else
ans[v[i]]=ans[v[i+1]]-1;
}
for(int i=pos+1;i<=n;++i){
if(!mp1[v[i-1]][v[i]])
ans[v[i]]=ans[v[i-1]];
else
ans[v[i]]=ans[v[i-1]]+1;
}
} int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
memset(in,0,sizeof(in));
memset(mp,0,sizeof(mp));
memset(mp1,0,sizeof(mp1));
scanf("%d",&n);
getchar();
for(int i=0;i<n;++i){
for(int j=i+1;j<=n;++j){
p[i][j]=getchar();
if(p[i][j]=='+'){
mp1[i][j]=mp[i][j]=1;
++in[j];
}
if(p[i][j]=='-'){
mp1[j][i]=mp[j][i]=1;
++in[i];
}
}
}
kahn(n);
solve(n);
for(int i=1;i<=n;++i)
printf("%d%c",ans[i]-ans[i-1],(i==n)?'\n':' ');
}
return 0;
}
最新文章
- OEL上使用yum install oracle-validated 简化主机配置工作
- MySQL入门04-MySQL主从配置
- 解析ActionResult子类JsonResult
- C#数组
- android 入门-控件 测量状态栏高度
- MVC 区域功能
- [转]分布式文件系统FastDFS架构剖析
- winform自定义文件程序-- 不允许所请求的注册表访问权(ZSSQL)
- phpcms V9 数据模型基类(转)
- 如何在局域网安装Redmine(转贴)
- CodeForces 722A
- Oracle添加含有脏数据的约束
- javascript计算对象的长度
- 原生 JS 实现一个瀑布流插件
- javascript小记一则:今天在写VS2005——.NET程序时,写的一个JS图片示例案例
- 自定义编写js格式化数字的函数
- MySQL数据库分区操作【RANGE】
- 用django实现一个资产管理的系统
- Chromium网页Layer Tree创建过程分析
- [转]python新手必碰到的问题---encode与decode,中文乱码--转载