您的位置:首页 > 其它

区间的交并(80-th Level Archeology,cf 731D)

2016-10-17 16:31 441 查看
为区间的交并苦恼了很久,看了别人代码才过。

要求n个字符串变成字典序,而不是每一位都非降。

一开始处理方法就错了,问题在于没有好好思考自己的解法是否能正确完成题目要求。

代码

#include<bits/stdc++.h>
#define maxn 500010
#define maxc 1000010
using namespace std;

int n,c;
vector<int>vec[maxn];
int qj[maxc];

void get()
{
scanf("%d %d",&n,&c);
int temp;
for(int i=1;i<=n;i++)
{
scanf("%d",&temp);
vec[i].push_back(temp);
for(int j=1;j<=vec[i][0];j++)
{
scanf("%d",&temp);
vec[i].push_back(temp);
}
}
}

void add(int l,int r)
{
qj[l]++;
qj[r+1]--;
}

int pre()
{
for(int i=1;i<n;i++)
{
bool ok=false;
int MIN=min(vec[i][0],vec[i+1][0]);
for(int j=1;j<=MIN;j++)
{
int x=vec[i][j];
int y=vec[i+1][j];
if(x!=y)
{
if(x<y) add(c-y+1,c-x);
else if(x>y)
{
add(0,c-x);
add(c-y+1,c-1);
}
ok=true;
break;
}
}
if(!ok&&vec[i][0]>vec[i+1][0]) return -1;
}
int temp=0;
for(int i=0;i<c;i++)
{
temp+=qj[i];
if(!temp) return i;
}
return -1;
}

int main()
{
get();
printf("%d\n",pre());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: