C

  假设每种颜色的个数都相同,可以用轮换的方式,让答案达到最大n,当不同的时候,可以每次从每种颜色中取出相同个数的手套来操作;

  一直迭代下去直到只剩下1种颜色;

  再将这一种颜色与之前交换过的交换就行了,只要保证不会交换出同色手套即可.

  

 bool cmp(node x,node y) {return x.t<y.t;}
void add2ans(int l,int r,int t)
{
// printf("add:l=%d r=%d t=%d\n",l,r,t);
rep(i,t) ans.push_back((node){l,r});
}
int modify(int c,int t,int& res)
{
vector<node>tmp;
tmp.clear();
// printf("c=%d t=%d\n",c,t);
rep(i,(int)ans.size()) if (ans[i].t!=c && ans[i].c!=c)
{
tmp.push_back((node){c,ans[i].t});
// printf("ans[%d].l=%d ans[%d].r=%d\n",i,ans[i].c,i,ans[i].t);
ans[i].t = c;
if ((int)tmp.size()==t) break;
}
rep(i,(int)tmp.size()) ans.push_back(tmp[i]);
// rep(i,(int)tmp.size()) printf("l=%d r=%d\n",tmp[i].c,tmp[i].t);
res = (int)ans.size();
return (int)tmp.size();
}
int main()
{
// freopen("test","r",stdin);
scanf("%d%d",&n,&m);
rep(i,n)
{
int t;
scanf("%d",&t);
cnt[t]++;
}
rep(i,m+) if(cnt[i]) rcd.push_back((node){i,cnt[i]});
sort(rcd.begin(),rcd.end(),cmp);
int res=-;
rep(i,(int)rcd.size()) if(rcd[i].t)
{
int use = rcd[i].t;
if (i==(int)rcd.size()-) use -= modify(rcd[i].c,rcd[i].t,res);
// printf("i=%d use=%d c=%d t=%d\n",i,use,rcd[i].c,rcd[i].t);
rcd[i].t -= use;
add2ans(rcd[i].c,rcd[rcd.size()-].c,use);
for (int j=i+ ; j<(int)rcd.size() ; j++ )
{
rcd[j].t -= use;
add2ans(rcd[j].c,rcd[j-].c,use);
}
}
if (res==-) res = (int)ans.size();
printf("%d\n",res);
rep(i,(int)ans.size()) printf("%d %d\n",ans[i].c,ans[i].t);
return ;
}

D

  找到所有w的位置就可以确定正方形的变长,然后枚举左下角,用"部分和"的办法o(1)检查是否合法即可.

E

  首先发现:如果"第a天是看i本书的第x天,第b天是看j本书的第y天"成立时,当且仅当(b-a)属于某个区间[l,r];

  l,r可以O(1)计算,于是根据输入的n条信息,可以推出f[i][j]=true/false,它表示第i天,是看某本书的第j天.

  其中f[1][1]=true,至于这是第几本书,可以根据输入计算出来,然后枚举最后一本书的编号即可.

  

 #define maxn 200010
#define INF 100000
struct node
{
int day,id;
};vector<node>p;
int n,arr[maxn];
bool f[maxn][];
bool check(node a,int x,node b,int y)
{
if (a.id==b.id) return b.day-a.day==y-x;
else
{
int k = b.id-a.id,dif=b.day-a.day;
int l,r;
if (x==) l=+(k-)*+y,r=+(k-)*+y;
else l=(k-)*+y,r=(-x)+(k-)*+y;
return (l<=dif && dif<=r);
}
}
void printans()
{
for (int i= ; i<=n ; i++ ) printf("%d%c",arr[i],i==n?'\n':' ');
}
void getans(int book,int day,int read,int i)
{
int t;
for ( t= ; t<read ; t++ ) arr[day-t]=book;
while(i>=&&p[i].day>=day-t+)i--;
if (i<) return;
t = day-read;
node a = (node){t,book-};
for (int x= ; x<= ; x++ )
for (int y= ; y<= ; y++ ) if (f[p[i].day][x] && check(p[i],x,a,y))
{
getans(a.id,a.day,y,i);
return;
}
}
void solv()
{
if (arr[]>) {printf("-1\n"); return;}
arr[]=;
for (int i= ; i<=n ; i++ ) if(arr[i]) p.push_back((node){i,arr[i]});
f[][]=true;
rep(i,(int)p.size()-)
{
node a=p[i],b=p[i+];
for (int j= ; j<= ; j++ ) if(f[a.day][j])
for (int k= ; k<= ; k++ )
if (check(a,j,b,k)) f[b.day][k]=true;
}
for (int ans=INF ; ans>= ; ans-- )
{
node x = p[p.size()-];
for (int i= ; i<= ; i++ )
{
for (int j= ; j<= ; j++ )
if(f[x.day][j] && check(x,j,(node){n,ans},i))
{
getans(ans,n,i,p.size()-);
printf("%d\n",ans);
printans();
return;
}
}
}
printf("-1\n");
}

Codeforce 217 div2的更多相关文章

  1. Codeforce Round #217 Div2

    e,妈蛋,第二题被hack了 没理解清题意,- -居然也把pretest过了,- -# A: 呵呵! B:包含任意一个子集的输出NO!,其他输出YES! C:贪心额,类似上次的Topcoder的500 ...

  2. codeforce 192 div2解题报告

    今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判.... A. Cakeminator 题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在.这道题目,就是判断一 ...

  3. Codeforce 287 div2 C题

    题目链接:http://codeforces.com/contest/507/problem/C 解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRL ...

  4. codeforce #339(div2)C Peter and Snow Blower

    Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...

  5. Codeforce 220 div2

    D 插入: 在当前指针位置sz处插入一个1,col[sz]记录插入的内容,sz++; 删除i: 找到第i个1的位置,赋为0; 于是转化为一个维护区间和的问题; trick: 如果是依次删除a[0],a ...

  6. Codeforce 218 div2

    D 一开始想错了,试图用"前缀和-容量"来求从上层流下来了多少水",但这是错的,因为溢出可能发生在中间. 然后发现对于每层,溢出事件只会发生一次,所以可以用类似并查集的办 ...

  7. Codeforce 216 div2

    D 只要搞清楚一个性质:确定了当前最大和次大的位置,局面就唯一确定了; 根据这个性质设计dp,统计到达该局面的方法数即可. E 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...

  8. codeforce 459 DIV2 D题

    题意   在一个DAG上面有N个点M条边,每一条边上都有一个小写字母.两个人Max and Lucas 每个人一颗棋子,两个人轮流行棋,当前这一步选择的路上面的字母必须大于等于上一步路上面的字母,当轮 ...

  9. codeforce 382 div2 E —— 树状dp

    题意:给一棵n个结点的无根树染色,求使每个结点距离为k的范围内至少有一个被染色的结点的总染色方法数目 分析:首先我们定义: 对于结点v, 如果存在一个黑色结点u距离v不超过k,则结点v被“控制” 首先 ...

随机推荐

  1. Truncate Table 用法

    TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作. 语法 TRUNCATE TABLE name 参数 name 是要截断的表的名称或要删除其全部行的表的名称. 注释 TRUNC ...

  2. Oracle_Q&A_02

    Step02: Import SQL FILE Step02: QUESTION & ANSWER --1查询员工姓名和职位字数相等的员工 --2查询e_name以s结尾的员工(不用like) ...

  3. Thinkphp中distinct的用法

    Thinkphp中distincat的用法 TP中distinct()的用处主要是去除重复的值 在Thinkphp手册中也详细说明了(链接:http://document.thinkphp.cn/ma ...

  4. Python模拟登录实战(二)

    目标:1.模拟登录豆瓣,2.自动更改签名和发表说说. 代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'ziv·chan ...

  5. (3)选择元素——(15)总结(Summary)

    With the techniques that we have covered in this chapter, we should now be able to locate sets of el ...

  6. HDU 1015 Safecracker 解决问题的方法

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST ===  "The item is locked in a Kl ...

  7. 内容提供者 ContentResolver 数据库 示例 -2

    MainActivity public class MainActivity extends ListActivity {     // 访问内容提供者时需要的主机名称     public stat ...

  8. .call()和.apply()相同点与不同点

    .call()和.apply()相同点与不同点 function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } add.call ...

  9. css单位rem---移动端至宝

    1.rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem大 家一定会想起em单位em(font  ...

  10. 使用OpenXml实现生成数据字典文档(beta)

    最近项目在走验收流程,之前没有仔细看SOW文档,发现需要补好多份文档,其中就有数据字典,项目组不愿意花时间太多的时间弄这些文档,也不希望以后还要重复劳动力,最终决定做一个工具,方便自己生成数据字典文档 ...