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被“控制” 首先 ...
随机推荐
- (转)Android签名详解(debug和release)
1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被替换 2) 保证信息传输的完整性 签名对于包中的每个文 ...
- [Angular 2] Interpolation: check object exists
In Angular2, sometime we use @Output to pass data to parent component, then parent may pass the data ...
- hdu 4940 无源汇有上下界最大流
/* <img src="http://img.blog.csdn.net/20140823174212937?watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- Find命令简介
Find命令主要用于目标的搜索,尽量做到少使用,因为find会消耗大量的系统资源. 使用该命令时,需要避开服务器运行高峰期,最好在指定的小范围内进行搜索,不要轻易使用全盘搜索. Find命令常用的参数 ...
- HTML5 Canvas显示本地图片实例1、Canvas预览图片实例1
1.前台代码: <input id="fileOne" type="file" /> <canvas id="canvasOne&q ...
- C# XML流操作简单实例
这里我们先介绍操作XML文件的两个对象:XmlTextReader和XmlTextWriter打开和读取Xml文件使用到的对象就是XmlTextReader对象.下面的例子打开了与程序在同一路径下的一 ...
- H3 BPM 笔记
先通过流程设计器设计流程 注意 审批:1个人 会签: 多人用 同意时: 若为有一个同意就通过 则 审批选项卡 的同意出口 设为1 如果需要所有人同意才通过 则 审批选项卡 的同意出口 设为100% ...
- 《第一行代码》学习笔记37-服务Service(4)
一个比较完整的自定义AsyncTask写成如下: class DownloadTask extends AsyncTask<Void, Integer, Boolean> { @Overr ...
- C++安装JSONCPP
VS2013里新建一个空的控制台程序(用作测试jsoncpp是否可用),名为: TestJSON 解压下载好的文件:jsoncpp-src-0.5.0.tar.gz 利用VS2008打开jsoncpp ...
- css3中的提供的元素变化属性
通过 CSS3 提供的2d元素转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. css3中为我们 提供了: translate() rotate() scale() skew() matrix( ...