C题就是一个简单的模拟。首先给每一个人两个。然后把剩下的都给一个人就好了。

给的时候蛇形给。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define LL __int64
#define maxn 330000
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
int leap=1;
int stx=1;
int sty=1;
int ms=n*m-(k*2)+2;
printf("%d",ms);
while(ms--)
{
printf(" %d %d",stx,sty);
sty+=leap;
if(sty<1||sty>m)
{
if(sty<1)sty=1;
if(sty>m)sty=m;
stx++;leap=-leap;
}
}
cout<<endl;
k--;
while(k--)
{
printf("%d ",2);
printf("%d %d ",stx,sty);
sty+=leap;
if(sty<1||sty>m)
{
if(sty<1)sty=1;
if(sty>m)sty=m;
stx++;leap=-leap;
}
printf("%d %d\n",stx,sty);
sty+=leap;
if(sty<1||sty>m)
{
if(sty<1)sty=1;
if(sty>m)sty=m;
stx++;leap=-leap;
}
}
}
return 0;
}

D:首先依据环。把每个环分成一组。记录下此时至少须要交换all次,才干回归到恒等排列。

1。假设all大于p。

那么我们就应该把all降低。

对于一个环。随意两个点交换都能够把环分成两份。all-1;

对于每次降低,我们寻找环的最小值最小的环,然后在这个环中寻找最小值,然后交换这两个点。

2,假设all小于p。那么我们应该把all增大。

那么我们就能够把1号节点和随意节点交换。来达到增大all的目的。

注意,1号节点不和本身的环交换。

而且1号节点和随意一个环仅仅交换一次。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define LL __int64
#define maxn 3300
int a[maxn];
int b[maxn];
int vis[maxn];
vector<int>vec;
vector< vector<int> >ans;
struct list
{
int x,y;
} node;
vector<list>pr;
bool cmp(vector<int>a,vector<int>b)
{
return a[0]<b[0];
}
struct listt
{
int x;
int index;
int l,r;
friend bool operator <(const listt &a,const listt &b)
{
return a.x>b.x;
}
}tt;
priority_queue<listt>que;
int main()
{
int n,m;
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
scanf("%d",&m);
memset(vis,0,sizeof(vis));
vec.clear();
ans.clear();
int all=0;
for(int i=1; i<=n; i++)
{
if(vis[i])continue;
int j=i;
vec.clear();
while(b[j]!=j&&vis[j]==0)
{
vec.push_back(j);
vis[j]=1;
j=b[j];
}
if(vec.size())
{
// sort(vec.begin(),vec.end());
ans.push_back(vec);
all+=vec.size()-1;
} }
sort(ans.begin(),ans.end(),cmp);
pr.clear();
if(all<=m)
{
all=m-all;
if(ans.size()==0)
{
node.x=1;
for(int i=2; i<=all+1; i++)
{
node.y=i;
pr.push_back(node);
}
}
else
{
node.x=1;
int j=0;
if(ans[0][0]==1)j++;
for(int i=2; i<=n&&all>0; i++)
{
if(b[i]==i)
{
all--;
node.y=i;
pr.push_back(node);
}
if(ans.size()>j&&ans[j][0]==i)
{
all--;
node.y=i;
j++;
pr.push_back(node);
}
}
}
}
else
{
int qian=all;
all=all-m;
int i=0;
while(!que.empty())que.pop();
for(i=0;i<ans.size();i++)
{
tt.index=i;
tt.x=ans[i][0];
que.push(tt);
}
while(all)
{
tt=que.top();
que.pop();
i=tt.index;
node.x=ans[i][0];
int minn=9999;
int st=0;
for(int j=1;j<ans[i].size()&&all>0;j++)
{
if(minn>ans[i][j])
{
minn=ans[i][j];
st=j;
}
}
node.y=minn;
all--;
pr.push_back(node);
vec.clear();
minn=9999;
vec.push_back(ans[i][st]);
for(int j=1;j<st;j++)
{
vec.push_back(ans[i][j]);
}
if(vec.size()>1)
{
ans.push_back(vec);
tt.index=ans.size()-1;
tt.x=vec[0];
que.push(tt);
}
vec.clear();
vec.push_back(ans[i][0]);
for(int j=st+1;j<ans[i].size();j++)
{
vec.push_back(ans[i][j]);
}
if(vec.size()>1)
{
ans[i]=vec;
tt.index=i;
tt.x=vec[0];
que.push(tt);
}
i++;
}
}
cout<<pr.size()<<endl;
for(int i=0; i<pr.size(); i++)
{
printf("%d %d\n",pr[i].x,pr[i].y);
}
}
return 0;
}

Codeforces Round #252 (Div. 2)-C,D的更多相关文章

  1. Codeforces Round 252 (Div. 2)

    layout: post title: Codeforces Round 252 (Div. 2) author: "luowentaoaa" catalog: true tags ...

  2. Codeforces Round #252 (Div. 2) B. Valera and Fruits(模拟)

    B. Valera and Fruits time limit per test 1 second memory limit per test 256 megabytes input standard ...

  3. Codeforces Round #252 (Div. 2) D

    http://codeforces.com/problemset/problem/441/D 置换群的基本问题,一个轮换内交换成正常顺序需要k-1次,k为轮换内元素个数 两个轮换之间交换元素,可以把两 ...

  4. codeforces Round #252 (Div. 2) C - Valera and Tubes

    贪心算法,每条路径最短2格,故前k-1步每次走2格,最后一步全走完 由于数据比较小,可以先打表 #include <iostream> #include <vector> #i ...

  5. Codeforces Round #252 (Div. 2) B. Valera and Fruits

    #include <iostream> #include <vector> #include <algorithm> #include <map> us ...

  6. Codeforces Round #252 (Div. 2) A - Valera and Antique Items

    水题 #include <iostream> #include <set> #include <vector> #include <algorithm> ...

  7. CodeForces 441E(Codeforces Round #252 (Div. 2))

    思路:dp[i][now][mark][len]   i 表示当前第i 次now存的是后8位,mark为第9位为0还是1 len第九位往高位还有几位和第9位相等.  只存后8位的原因:操作只有200次 ...

  8. Codeforces Round #252 (Div. 2) 441B. Valera and Fruits

    英语不好就是坑啊.这道题把我坑残了啊.5次WA一次被HACK.第二题得分就比第一题高10分啊. 以后一定要加强英语的学习,要不然就跪了. 题意:有一个果园里有非常多树,上面有非常多果实,为了不然成熟的 ...

  9. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

随机推荐

  1. HDU 2732 Leapin&#39; Lizards(拆点+最大流)

    HDU 2732 Leapin' Lizards 题目链接 题意:有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是不管怎样都逃不出来的. ...

  2. Tween动画TranslateAnimation细节介绍

    Tween动画有下面这几种: Animation   动画 AlphaAnimation 渐变透明度 RotateAnimation 画面旋转 ScaleAnimation 渐变尺寸缩放 Transl ...

  3. cocos2dx3.2 android平台搭建开发环境纠错备忘录

    平台:win32 + android cocos2d版本号:3.2 搭建cocos2d-x android 常见问题: 问题1: Android platform not specified, sea ...

  4. jsp不通过form和Ajax提交

    在页面里面我们一般都通过form表单和Ajax向后台提交请求,但是我如今页面没有form表单,也不想通过ajax异步提交. 解决方式例如以下:location.href="${rootPat ...

  5. Linux以下基于TCP多线程聊天室(client)

    不怎么会弄这个博客的排版,就直接将代码附上: 主要是使用多线程去等待接受数据和发送数据.以下是client的代码: tcpsed.h文件 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  6. Java-MyBatis-杂项:MyBatis根据数组、集合查询

    ylbtech-Java-MyBatis-杂项:MyBatis根据数组.集合查询 1.返回顶部 1. foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的 ...

  7. Spark RDD概念学习系列之如何创建RDD

    不多说,直接上干货! 创建RDD 方式一:从集合创建RDD (1)makeRDD (2)Parallelize 注意:makeRDD可以指定每个分区perferredLocations参数,而para ...

  8. WPF MVVM 从Prism中学习设计模式之Event Aggregator 模式

    Prism简介 Prism是由微软Patterns & Practices团队开发的项目,目的在于帮助开发人员构建松散耦合的.更灵活.更易于维护并且更易于测试的WPF应用或是Silverlig ...

  9. eclipse 配置 tomcat 时候的一些注意事项(随机更新)

    1,一些常用的设置,如下图,不特别说明了,看标记应该就知道注意事项了 2,配置文件的问题.eclipse里面如下图的配置文件里如果有所改动,那么在eclipse里启动Tomcat的时候,Tomcat的 ...

  10. js滑动提示效果

    js代码 漂亮的动画效果:在靠右上角:背景颜色为红,字体颜色为白色  滑动 变大 上移  缓慢渐变消失 function tishi() { $("#tishi").attr(&q ...