Codeforce 217 div2
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的更多相关文章
- Codeforce Round #217 Div2
e,妈蛋,第二题被hack了 没理解清题意,- -居然也把pretest过了,- -# A: 呵呵! B:包含任意一个子集的输出NO!,其他输出YES! C:贪心额,类似上次的Topcoder的500 ...
- codeforce 192 div2解题报告
今天大家一起做的div2,怎么说呢,前三题有点坑,好多特判.... A. Cakeminator 题目的意思是说,让你吃掉cake,并且是一行或者一列下去,但是必须没有草莓的存在.这道题目,就是判断一 ...
- Codeforce 287 div2 C题
题目链接:http://codeforces.com/contest/507/problem/C 解题报告:现在有一个满二叉树型的迷宫,入口在根结点,出口在第n个叶节点,有一串命令,LRLRLRLRL ...
- codeforce #339(div2)C Peter and Snow Blower
Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...
- Codeforce 220 div2
D 插入: 在当前指针位置sz处插入一个1,col[sz]记录插入的内容,sz++; 删除i: 找到第i个1的位置,赋为0; 于是转化为一个维护区间和的问题; trick: 如果是依次删除a[0],a ...
- Codeforce 218 div2
D 一开始想错了,试图用"前缀和-容量"来求从上层流下来了多少水",但这是错的,因为溢出可能发生在中间. 然后发现对于每层,溢出事件只会发生一次,所以可以用类似并查集的办 ...
- Codeforce 216 div2
D 只要搞清楚一个性质:确定了当前最大和次大的位置,局面就唯一确定了; 根据这个性质设计dp,统计到达该局面的方法数即可. E 询问的要求是: 求有多少个区间至少覆盖了询问的点集中的一个; 转化成逆命 ...
- codeforce 459 DIV2 D题
题意 在一个DAG上面有N个点M条边,每一条边上都有一个小写字母.两个人Max and Lucas 每个人一颗棋子,两个人轮流行棋,当前这一步选择的路上面的字母必须大于等于上一步路上面的字母,当轮 ...
- codeforce 382 div2 E —— 树状dp
题意:给一棵n个结点的无根树染色,求使每个结点距离为k的范围内至少有一个被染色的结点的总染色方法数目 分析:首先我们定义: 对于结点v, 如果存在一个黑色结点u距离v不超过k,则结点v被“控制” 首先 ...
随机推荐
- javascript中闭包的真正作用
参考阮一峰的文章:http://javascript.ruanyifeng.com/grammar/function.html#toc23 1. 读取函数内部变量,封装一些私有属性 function ...
- javascript 缓冲运动demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mac phpstorm破解版安装(简单,有效)
如果是公司作为商业用途的,还是希望你能购买正版的,如果是苦逼的穷学生,亦或是我这样的苦逼码农,那就往下看, 之前有个只需要在"License server address"里输入 ...
- 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。
1.服务器 #include<winsock2.h> //包含头文件#include<stdio.h>#include<windows.h>#pragma comm ...
- 我的创业劲儿,无可阻挡-JAVA学院张孝伟
导语:张孝伟,这个怀揣着创业梦想的农村小伙,为了报答父母的恩情,他开启了自己的逐梦之旅.友好的伙伴,火旺的生意.以前让他如鱼得水.就在他满足于现状的时候,一场突如其来的事故,让他一夜间倾家荡产.他是否 ...
- LaTeX笔记
1.上下标: $x^n$, $x^{123}$, $x_n$, $x_{123}$, $C_n^m$, $C_{100}^{50}$ $x^n$, $x^{123}$, $x_n$, $x_{123} ...
- 差别client、offset、scroll系列以及event的几个距离属性
element元素结点属性 一. offset系列 1.offsetWidth 和offsetHeight element.offsetWidth是一个仅仅读属性,它包含了: css width + ...
- IOS成长之路-Nsstring中搜索方法rangeOfString
NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1这个字符 ...
- 标准爬虫初探,来自Python之父的大餐!
首先不得不承认自己做了标题党.本文实质是分析500lines or less的crawlproject,这个project的地址是https://github.com/aosabook/500line ...
- license文件生成原理
byte解密weblogic加密oraclehex 现在很多J2EE应用都采用一个license文件来授权系统的使用,特别是在系统购买的早期,会提供有限制的license文件对系统进行限制,比如试 ...